티스토리 뷰
타이타닉 데이터와 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
'B.D.A' 카테고리의 다른 글
[BDA 데이터 분석 모델링반 (ML 1) 15회차] 의사결정 트리(DT) 실습 (1) | 2024.08.08 |
---|---|
[BDA 데이터 분석 모델링반 (ML 1) 14회차] 의사결정 트리(DT) (6) | 2024.08.04 |
[BDA 데이터 분석 모델링반 (ML 1) 12회차] 로지스틱 회귀 (7) | 2024.07.24 |
[BDA 데이터 분석 모델링반 (ML 1) 11회차] 라쏘 회귀, 릿지 회귀 (3) | 2024.07.17 |
[BDA 데이터 분석 모델링반 (ML 1) 10회차] 다항회귀, 다중회귀 (1) | 2024.07.11 |
- Total
- Today
- Yesterday