본문 바로가기
[업무 지식]/Machine learning

[로지스틱회귀] 분류분석

by 에디터 윤슬 2024. 11. 19.

타이타닉 생존 분류 문제

  • 주제: 탑승한 승객의 정보를 바탕으로 생존 유무를 예측하는 분류 문제
  • 종속변수(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