타이타닉 생존 분류 문제
- 주제: 탑승한 승객의 정보를 바탕으로 생존 유무를 예측하는 분류 문제
- 종속변수(Y): 사망 - 0 / 생존 - 1
- 독립변수(X): 티켓 등급, 성별, 요금 등
-
- PassengerId: 승객 식별자(Primary Key)
- Survival : 사망(0) 생존(1)
- Pclass: 티켓 등급(1,2,3 등급)
- Name: 이름
- Sex: 성별
- Age: 나이
- SibSp: 승객의 형제와 배우자 수
- Parch: 승객의 부모님과 자식 수변수 설명
- Ticket: 티켓 번호
- Fare: 요금
- Cabin: 객실 이름
- Embarked: 승선한 항구 C(Cherbourg), Q(Queenstown), S(Southampton)
로지스틱회귀 이론
- Y가 범주형인 경우 선형함수의 한계
- X가 연속형 변수이고, Y가 특정 값이 될 확률이라면 왼쪽 그림과 같이 선형으로 설명하기는 어렵다.
- 이상적인 형태는 오른쪽 그림처럼 S자 형태의 함수를 적용하면 설명할 수 있다.
- Y가 0, 1 범주형인 경우 함수 적합
- 로짓의 개념 등장
- 오즈비(Odds ratio): 실패확률 대비 성공확률
- 성공 확률이 80%라면, 오즈비는 80/20 = 4로, 1번 실패하면 4번은 성공한다는 의미
- 하지만 오즈비는 P(확률)가 증가할수록 오즈비가 급격하게 증가하여 선형성을 따르지 않게 된다(좌측 그림). 따라서 로그를 씌워 완화(우측 그림)
- 오즈비와 확률의 관계 / 로짓과 확률의 관계
- 로짓의 그래프가 더 선형적인 그림을 나타내어 선형회귀의 기본식을 활용할 수 있게 됨
- 로지스틱”회귀”라고 불리는 이유가 이것
로지스틱함수
로지스틱함수는 가중치 값을 안다면 X값이 주어졌을 때 해당 사건이 일어날 수 있는 P의 확률을 계산할 수 있게 됩니다. 이때, 확률 0.5를 기준으로 그보다 높으면 사건이 일어남(P(Y) = 1), 그렇지 않으면 사건이 일어나지 않음(P(Y) = 0)으로 판단하여 분류 예측에 사용합니다.
분류 평가 지표
- 혼동 행렬(confusion Matrix): 실제 값과 예측 값에 대한 모든 경우의 수를 표현하기 위한 2x2 행렬
- 표기법
- 실제와 예측이 같으면 True / 다르면 False
- 예측을 양성으로 했으면 Positive / 음성으로 했으면 Negative
- 해석
- TP: 실제로 양성(암 환자)이면서 양성(암 환자) 올바르게 분류된 수
- FP: 실제로 음성(정상인)이지만 양성(암 환자)로 잘못 분류된 수
- FN: 실제로 양성(암 환자)이지만 음성(정상인)로 잘못 분류된 수
- TN: 실제로 음성(정상인)이면서 음성(정상인)로 올바르게 분류된 수
- 지표
- 정밀도(Precision): 모델이 양성 1로 예측한 결과 중 실제 양성의 비율(TP / TP + FP)
- 재현율(Recall): 실제 값이 양성인 데이터 중 모델이 양성으로 예측한 비율(TP / TP + FN)
- f1-score: 정밀도와 재현율의 조화 평균(2 * {정밀도 * 재현율} / {정밀도 + 재현율})
- 정확도(Accuracy): (TP + TN) / (TP + TN + FP + FN)
로지스틱회귀 실습
- 자주쓰는 함수
- sklearn.linear_model.LogisticRegression : 로지스틱회귀 모델 클래스
- 속성
- classes_: 클래스(Y)의 종류
- n_features_in_ : 들어간 독립변수(X) 개수
- feature_names_in_: 들어간 독립변수(X)의 이름
- coef_: 가중치
- intercept_: 바이어스
- 메소드
- fit: 데이터 학습
- predict: 데이터 예측
- predict_proba: 데이터가 Y = 1일 확률을 예측
- sklearn.metrics.accuracy: 정확도
- sklearn.metrics.f1_socre: f1_score
0. 라이브러리 호출
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression
1. 숫자형, 범주형 변수 구분
숫자: Age, SibSp, Parch, Fare
범주: Pclass, Sex, Cabin, Embarked
# X 변수 1개
# Y 변수 1개(Survived)
2. 변수 설정
# X변수: Fare, Y변수: Survived
X_1 = titanic_df[['Fare']]
y_true = titanic_df[['Survived']]
3. 데이터 시각화 확인
sns.scatterplot(titanic_df, x = 'Fare',y = 'Survived')
sns.histplot(titanic_df, x = 'Fare')
4. 모델 훈련
model_lor = LogisticRegression()
model_lor.fit(X_1, y_true)
5. x 모델 함수 설정
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.01519617]]
바이어스 [-0.94129222]
6. 모델 평가
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))
# 예측 확인
y_pred_1 = model_lor.predict(X_1)
y_pred_1[:10]
print('예측 확인:', len(y_pred_1))
예측 확인: 891
# 정확도, f1-score 확인
get_metrics(y_true, y_pred_1)
정확도 0.6655443322109988
f1-score 0.35497835497835495
다중로지스틱회귀 실습
1. 변수 설정
Y(Survived): 생존 / 사망
X(수치형): Fare
X(범주형): Pclass, Sex
2. 문자 value 변환
def get_sex(x):
if x == 'female':
return 0
else:
return 1
titanic_df['Sex_en'] = titanic_df['Sex'].apply(get_sex)
3. 모델 학습
X_2 = titanic_df[['Pclass','Sex_en','Fare']]
y_true = titanic_df[['Survived']]
model_lor_2 = LogisticRegression()
model_lor_2.fit(X_2,y_true)
4. 모델 확인
get_att(model_lor_2)
클래스 종류 [0 1]
독립변수 갯수 3
들어간 독립변수(x)의 이름 ['Pclass' 'Sex_en' 'Fare']
가중치 [[-8.88331324e-01 -2.53993425e+00 1.64019087e-03]]
바이어스 [3.02004403]
5. 예측
y_pred_2 = model_lor_2.predict(X_2)
y_pred_2[:10]
array([0, 1, 1, 1, 0, 0, 0, 0, 1, 1], dtype=int64)
6. 정확도 확인
# X변수가 Fare
get_metrics(y_true, y_pred_1)
정확도 0.6655443322109988
f1-score 0.35497835497835495
# X변수가 Fare, Pclass, Sex
get_metrics(y_true, y_pred_2)
정확도 0.7867564534231201
f1-score 0.7121212121212122
7. 각 데이터별 Y = 1인 확률 추출
model_lor_2.predict_proba(X_2)
array([[0.8977979 , 0.1022021 ],
[0.09546762, 0.90453238],
[0.40901264, 0.59098736],
...,
[0.40287202, 0.59712798],
[0.58880217, 0.41119783],
[0.89772263, 0.10227737]])
'[업무 지식] > Machine learning' 카테고리의 다른 글
[선형회귀] 회귀분석 (0) | 2024.11.18 |
---|