import pandas as pd
titaninc_df = pd.read_csv('경로입력', encoding= 'utf-8')
titaninc_df.head(3)

"비상상황 특성 상 여성을 배려해 여성이 더 많이 생존했을 것이다."
pd.pivot_table(titaninc_df, index = 'Sex', columns = 'Survived',aggfunc='size')

import seaborn as sns
sns.countplot(titaninc_df, x = 'Sex', hue ='Survived')

하지만 Data-sceintific 하지 않으니 다른 도구를 배워보자.
X가 연속형 변수이고, Y가 특정 값이 될 확률이라고 설정한다면, 왼쪽 그림과 같이 선형으로 설명하긴 쉽지 않아 보인다. 확률은 0과 1사이 인데, 예측 값이 확률 범위를 넘어갈 수 있는 문제가 있음.
하지만 오른쪽 그림처럼 S자 형태의 함수를 적용하면 잘 설명한다고 할 수 있을 것이다.

패확률 대비 성공확률.

로짓의 장점: 어떤 값을 가져오더라도 반드시 특정 사건이 일어날 확률(Y값이 특정 값일 확률)이 0과 1 사이 값을 가짐
시그모이드 함수 중 하나로 딥러닝에서 활용.
값을 넣으면 확률이 도출된다.

로지스틱함수는 가중치 값을 안다면 X값이 주어졌을 때 해당 사건이 일어날 수 있는 의 확률을 계산할 수 있음. 이때, 확률 0.5를 기준으로 그보다 높으면 사건이 일어남(), 그렇지 않으면 사건이 일어나지 않음()으로 판단하여 분류 예측에 사용.
예) 암 예측 모델

실제 값과 예측 값에 대한 모든 경우의 수를 표현하기 위한 2*2 행렬
실제와 예측이 같으면 True, 다르면 False
예측을 양성으로 했다면 Positive, 음성으로 했다면 Negative
해석
- TP: 실제로 양성(암 환자)이면서 양성(암 환자) 올바르게 분류된 수
- FP: 실제로 음성(정상인)이지만 양성(암 환자)로 잘못 분류된 수
- FN: 실제로 양성(암 환자)이지만 음성(정상인)로 잘못 분류된 수
- TN: 실제로 음성(정상인)이면서 음성(정상인)로 올바르게 분류된 수


- 정밀도는 정의되지 않음(divsion by zero), 재현율은 0
- 결과적으로 f1-score는 0
값이 unbalance하지 못할 때에는 정확도가 제기능을 못할 수 있음. 따라서 이를 위해서 Y 범주의 비율을 맞춰주거나 평가 지표를 f1 score을 사용함으로써 이를 보완해야 함.
titaninc_df.head(3)

- 숫자형 데이터: Age, SibSp, Parch, Fare
- 범주형 데이터: Pclass, Sex, Cabin, Embarked
# info(): 데이터에 대한 결측치, 데이터전체 개수 등
titaninc_df.info()
결과:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
X 변수: Fare
Y 변수: Survived
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression
sns.scatterplot(titaninc_df, x = 'Fare',y = 'Survived')

sns.histplot(titaninc_df, x = 'Fare')

titaninc_df.describe()

X_1 = titaninc_df[['Fare']]
y_true = titaninc_df[['Survived']]
model_lor = LogisticRegression()
model_lor.fit(X_1, y_true)
# 함수 정의
def get_att(x):
#x모델을 넣기
print('클래스 종류', x.classes_)
print('독립변수 개수', x.n_features_in_)
print('들어간 독립변수(x)의 이름',x.feature_names_in_)
print('가중치',x.coef_)
print('바이어스', x.intercept_)
get_att(model_lor)
결과:
클래스 종류 [0 1]
독립변수 개수 1
들어간 독립변수(x)의 이름 ['Fare']
가중치 [[0.01519666]]
바이어스 [-0.94131796]
from sklearn.metrics import accuracy_score, f1_score
# 함수 정의하기
def get_metrics(true, pred):
print('정확도', accuracy_score(true, pred))
print('f1-score', f1_score(true, pred))
# Fare로 예측한 Survived
y_pred_1 = model_lor.predict(X_1)
get_metrics(y_true, y_pred_1)
결과:
정확도 0.6655443322109988
f1-score 0.35497835497835495
X 변수: Fare (수치형), Sex, Pclass (범주형)
Y 변수: Survived
# 문자열로 된 성별 데이터를 0, 1로 변경
def get_sex(x):
if x == 'female':
return 0
else:
return 1
titaninc_df['Sex_en'] = titaninc_df['Sex'].apply(get_sex)
X_2 = titaninc_df[['Pclass','Sex_en','Fare']]
y_true = titaninc_df[['Survived']]
model_lor_2 = LogisticRegression()
model_lor_2.fit(X_2,y_true)
get_att(model_lor_2)
결과:
클래스 종류 [0 1]
독립변수 갯수 3
들어간 독립변수(x)의 이름 ['Pclass' 'Sex_en' 'Fare']
가중치 [[-8.88331324e-01 -2.53993425e+00 1.64019087e-03]]
바이어스 [3.02004403]
y_pred_2 = model_lor_2.predict(X_2)
get_metrics(y_true, y_pred_2)
결과:
정확도 0.7867564534231201
f1-score 0.7121212121212122
model_lor_2.predict_proba(X_2)
결과:
array([[0.8977979 , 0.1022021 ], # [0으로 분류될 확률, 1로 분류될 확률]
[0.09546762, 0.90453238],
[0.40901264, 0.59098736],
...,
[0.40287202, 0.59712798],
[0.58880217, 0.41119783],
[0.89772263, 0.10227737]])
| 선형회귀(회귀) | 로지스틱 회귀(분류) | |
|---|---|---|
| Y(종속변수) | 수치형 | 범주형 |
| 평가척도 | Mean Square Error, R-square | Accuracy, F1-score |
| 모델 | sklearn.linear_model.LinearRegression | sklearn.linear_model.LogisticRegression |
| 평가 | sklearn.metrics.mean_squared_error, sklearn.metrics.r2_score | sklearn.metrics.accuracy_score, sklearn.metrics.f1_Score |