티스토리 뷰

타이타닉 데이터와 BMI 데이터를 활용하여 하이퍼파라미터를 조정해보며, 로지스틱 회귀를 실습해본다.

 

로지스틱 회귀 주요 하이퍼파라미터

penalty: 사용될 규제(regularization) 유형을 지정하며, 기본값은 'l2'이다.

'l1': L1 규제(Lasso), 'l2': L2 규제(Ridge), 'elasticnet': L1과 L2의 결합, 'none': 규제 없음

 

dual: 듀얼 형식을 사용할지 여부를 지정하며, 기본값은 False이고, 주로 샘플 수가 특성 수보다 많은 경우에 False로 설정한다.

 

tol: 종료 기준을 설정하는 데 사용되는 허용 오차로, 기본값은 1e-4이다.

 

C: 규제 강도를 설정하며, 값이 작을수록 강한 규제를 의미하고, 기본값은 1.0이다.

 

fit_intercept: 절편을 추가할지 여부를 지정하며, 기본값은 True다.

 

intercept_scaling: fit_intercept=True일 때 절편 항에 대한 스케일링 값으로, 기본값은 1이다.

 

class_weight: 클래스 가중치를 지정하며, 기본값은 None이며, balanced로 설정할 수 있다.

 

random_state: 난수를 설정하며, 결과의 재현성을 위해 사용된다.

 

solver: 최적화 알고리즘을 지정하며, 기본값은 'lbfgs'이다.

'newton-cg': Newton의 방법 변형, 'lbfgs': Broyden-Fletcher-Goldfarb-Shanno (BFGS) 알고리즘 변형,

'liblinear': 작은 데이터셋에 적합, 'sag': 대규모 데이터셋에 적합, 'saga': 매우 대규모 데이터셋에 적합

 

max_iter: 최대 반복 횟수로, 기본값은 100이다.

 

multi_class: 다중 클래스 설정 방법을 지정하며, 기본값은 'auto'이다.

 

'auto': 이진 분류에서는 이진 로지스틱 회귀를 사용하고, 다중 분류에서는 OvR을 사용한다.

'ovr': 일대다(One-vs-Rest) 전략, 'multinomial': 다항 로지스틱 회귀

 

verbose: 출력할 로깅 정보의 양을 설정하며, 기본값은 0이다.

 

warm_start: 이전 학습의 결과를 초기화에 사용할지 여부를 지정하며, 기본값은 False이다.

 

n_jobs: 병렬 작업에 사용할 CPU 코어 수를 지정하며, 기본값은 None이다.

 

 

 

타이타닉 데이터를 활용한 로지스틱 회귀 실습

import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix, classification_report
df=sns.load_dataset('titanic')
df=df.dropna(subset=['age','embarked'])

df['sex'] = df['sex'].map({'male':0, 'female':1})
df =pd.get_dummies(df, columns = ['embarked'],drop_first=True)

X= df[['sex','age','fare','embarked_Q','embarked_S']]
y = df['survived']

X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=111)

scaler=StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.fit_transform(X_test)
#Base Model
model=LogisticRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)
y_pred_prob=model.predict_proba(X_test)[:,1]

##성능평가
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc =roc_auc_score(y_test, y_pred)

## 혼동행렬, 분류 보고서 출력
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print(conf_matrix)
print(class_report)
print(accuracy_score(y_test, y_pred))

'''
[[67 11]
 [20 45]]
              precision    recall  f1-score   support

           0       0.77      0.86      0.81        78
           1       0.80      0.69      0.74        65

    accuracy                           0.78       143
   macro avg       0.79      0.78      0.78       143
weighted avg       0.79      0.78      0.78       143

0.7832167832167832
'''

 

하이퍼파라미터 튜닝을 통해 성능을 개선시켜본다.

#Base Model
model_t1=LogisticRegression(
            penalty='l2',
            solver='liblinear',
            class_weight = 'balanced',
            max_iter = 100)
model_t1.fit(X_train, y_train)

# 예측
y_pred = model_t1.predict(X_test)
y_pred_prob=model_t1.predict_proba(X_test)[:,1]
##하이퍼파라미터 튜닝 한 성능평가
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc =roc_auc_score(y_test, y_pred)

## 혼동행렬, 분류 보고서 출력
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print(conf_matrix)
print(class_report)
print(accuracy_score(y_test, y_pred))

'''
[[67 11]
 [19 46]]
              precision    recall  f1-score   support

           0       0.78      0.86      0.82        78
           1       0.81      0.71      0.75        65

    accuracy                           0.79       143
   macro avg       0.79      0.78      0.79       143
weighted avg       0.79      0.79      0.79       143

0.7902097902097902
'''

 

 

 

BMI 데이터를 활용한 로지스틱 회귀 실습

df=pd.read_csv('heart_2020_cleaned.csv')
df2 =pd.get_dummies(df, columns = ['HeartDisease','Smoking','AlcoholDrinking','Stroke','DiffWalking','Sex','AgeCategory','Race','Diabetic','PhysicalActivity','GenHealth','Asthma','KidneyDisease','SkinCancer'], drop_first=True)

df_num = df2[['BMI','PhysicalHealth','MentalHealth','SleepTime']]
df_nom = df2.drop(['BMI','PhysicalHealth','MentalHealth','SleepTime'],axis=1)

scaler=StandardScaler()
df_scaler=scaler.fit_transform(df_num)

df_num2 =pd.DataFrame(data= df_scaler, columns= df_num.columns)
df_new=pd.concat([df_num2, df_nom], axis=1)
X = df_new.drop(['HeartDisease_Yes'], axis=1)
y = df_new[['HeartDisease_Yes']]

X_train, X_test, y_train, y_test =train_test_split(X,y, test_size=0.3, random_state=111)

print(len(X_train), 'train 수')
print(len(X_test), 'test 수')

#Base Model
model=LogisticRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)
y_pred_prob=model.predict_proba(X_test)[:,1]

##성능평가
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc =roc_auc_score(y_test, y_pred)

## 혼동행렬, 분류 보고서 출력
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print(conf_matrix)
print(class_report)
print(accuracy_score(y_test, y_pred))

'''
[[87019   729]
 [ 7355   836]]
              precision    recall  f1-score   support

           0       0.92      0.99      0.96     87748
           1       0.53      0.10      0.17      8191

    accuracy                           0.92     95939
   macro avg       0.73      0.55      0.56     95939
weighted avg       0.89      0.92      0.89     95939

0.9157381252670967
'''

 

accuracy가 높지만, recall, precision, f1 score는 상대적으로 낮다.

print('학습셋 모델 정확도', model.score(X_train, y_train))
print('테스트셋 모델 정확도', model.score(X_test, y_test))

'''
학습셋 모델 정확도 0.9159593667357587
테스트셋 모델 정확도 0.9157381252670967
'''

y.value_counts()

'''
HeartDisease_Yes
0                   292422
1                    27373
dtype: int64
'''

클래스에 대한 불균형으로 인해 정확도는 높게 나오더라도 다른 지표들은 그렇지 않을 수 있다.

 

 

 

 

로지스틱 회귀 관련 실습 코드

 

2024_B.D.A_Data-Analysis-Modeling/Data_Analysis_Modeling/13주차 로지스틱 회귀 실습.ipynb at main · SeonHoYoo/2024_B.D

Contribute to SeonHoYoo/2024_B.D.A_Data-Analysis-Modeling development by creating an account on GitHub.

github.com

 

공지사항
최근에 올라온 글
Total
Today
Yesterday