오랑우탄의 반란

[ML] (다중)로지스틱회귀 분류 분석 파이썬 실습 (VSCode) 본문

PYTHON/머신러닝

[ML] (다중)로지스틱회귀 분류 분석 파이썬 실습 (VSCode)

5&2 2024. 8. 12. 20:47
반응형

 

 

머신러닝 로지스틱회귀분석 실습

앞서 배원 로지스틱 회귀를 사용한 분석 분류를 직접 파이썬에서 데이터셋으로 실습해보겠습니다. 

캐글 타이타닉 예측 대회의 Titanic - Machine Learning from Disaster 데이터를 사용하겠습니다. 

 

Titanic - Machine Learning from Disaster | Kaggle

 

www.kaggle.com

 

 

대회 주제는 탑승한 승객의 정보를 바탕으로 생존 유무를 예측하는 분류 문제였는데요

종속변수 Y를 사망(0) / 생존(1)으로 두고 독립변수 X를 티켓등급, 성별, 요금 등으로 넣어보며 확인해보는 분류 분석을 아래의 단계에 따라 진행하겠습니다. (데이터 전처리 단계는 생략하고 바로 회귀분석만 진행한다는 점 참고) 

 

  1. 데이터 확인
  2. 변수 설정 및 로지스틱회귀 모델 훈련
    1차 모델: Fare
    2차 모델: Pclass, Sex, Fare
  3. 모델 평가
    accuracy
    f1_score

과정 자체는 선형회귀와 거의 동일해서 간단합니다. 

 

 

1. 데이터 확인 

우선 칼럼 설명과 1차 모델에서 사용할 데이터를 체크해둡니다. 

Column Details Datatype
PassengerId  승객 ID (PK)  
Survived  사망 (0) 생존 (1) 종속변수 
Pclass  티켓 등급 (1,2,3) 범주형
Name  이름  
Sex  성별 범주형
Age  나이 숫자형
SibSp  형제와 배우자 수 숫자형
Parch  부모와 자식 수 숫자형
Ticket  티켓 번호  
Fare  요금 숫자형, 1차 독립변수 
Cabin  객실 이름 범주형
Embarked 승선 항구 (C,Q,S) 범주형

 

그리고 필요한 라이브러리와 데이터 파일을 불러와서 데이터를 간단하게 확인해줍니다. 

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import sklearn 

titanic_df = pd.read_csv(r'C:\Users\김예진\data_python\ml\titanic\train.csv')
titanic_df.head(3)
titanic_df.info()
titanic_df.describe()

 

1차 모델에서 사용할 Survived, Fare 칼럼에 결측치가 없는 것을 확인했지만, Fare 의 분포를 보면 $500 의 이상치 데이터가 존재하긴 하지만 이번 포스트는 분류분석에 초점을 맞춘 것이기 때문에 이상치 처리는 생략합니다. 

 

 

2. 모델 훈련 - 1차 

Survived (Y) 와 Fare (X) 변수 설정을 해주고 모델을 불러와줍니다. 

X_1 = titanic_df[['Fare']]
y_true = titanic_df[['Survived']]

from sklearn.linear_model import LinearRegression, LogisticRegression
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('bias', x.intercept_)
    
get_att(model_lor)

 

 

3. 모델 평가 

이제 모델에 대한 예측값을 구하고 평가를 진행합니다. 

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)
get_metrics(y_true, y_pred_1)

 

 

 

머신러닝 다중로지스틱회귀분석 실습

X 변수가 여러 개일 때 사용하는 다중로지스틱회귀분석을 살펴봅시다. 

 

1. 데이터 확인 

이번에는 Fare 외에도 Sex, Pclass 로 분석을 진행하겠습니다. 

Column Details Datatype
PassengerId  승객 ID (PK)  
Survived  사망 (0) 생존 (1) 종속변수 
Pclass  티켓 등급 (1,2,3) 범주형, 2차 독립변수 X 
Name  이름  
Sex  성별 범주형, 2차 독립변수 X 
Age  나이 숫자형
SibSp  형제와 배우자 수 숫자형
Parch  부모와 자식 수 숫자형
Ticket  티켓 번호  
Fare  요금 숫자형, 2차 독립변수 
Cabin  객실 이름 범주형
Embarked 승선 항구 (C,Q,S) 범주형

 

Pclass 는 숫자 형태의 데이터지만 Sex 는 'Female', 'Male' 문자로 구성되어 있기 때문에 숫자로 변환하는 작업이 필요합니다. 기존 칼럼은 그대로 두고 Sex_en 칼럼을 생성해서 데이터를 변환해줍니다. 

def get_sex(x):
    if x == 'female':
        return 0
    else:
        return 1
titanic_df['Sex_en'] = titanic_df['Sex'].apply(get_sex)

 

 

2. 모델 훈련 - 2차 

모델을 훈련시켜주고 앞서 작성했던 함수로 속성을 확인합니다. 

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)
get_att(model_lor_2)

 

독립변수가 잘 들어간 것을 확인했습니다.

 

 

이제 예측값을 구합니다. 

각 데이터별 Y=1인 확률 (생존할 확률)을 추출해서 (사망할 확률, 생존할 확률) 쌍으로 array 가 출력됩니다. 

여기서 생존할 확률이 0.5 미만이면 0, 0.5 이상이면 1로 출력됩니다. 

# (사망확률, 생존확률) array 쌍 출력
model_lor_2.predict_proba(X_2)

# 0.5 기준 생존확률 출력
y_pred_2 = model_lor_2.predict(X_2)
y_pred_2

 

 

3. 모델 평가 

1차 모델과의 모델 평가를 비교해봅니다. 

# X변수 Fare
get_metrics(y_true,y_pred_1)

# X변수 Fare, Pclass, Sex
get_metrics(y_true,y_pred_2)

 

결과적으로 X변수를 여러 개에 대해 다중로지스틱회귀분석을 진행한 모델이 더 평가가 좋은 걸 확인할 수 있습니다. 

 

 

반응형