본문 바로가기
머신러닝/Logistic Regression

Logistic Regression - 실습

by 미생22 2024. 5. 6.
728x90

지난번에 했던 wine 데이터를 가지고 한번 logistic regression을 실습해보겠습니다.

import pandas as pd
wine_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/wine.csv'
wine = pd.read_csv(wine_url, index_col=0)
wine.head()

wine['taste'] = [1 if grade>5 else 0 for grade in wine['quality']]

X = wine.drop(['taste', 'quality'], axis=1)
y = wine['taste']

from sklearn.model_selection import train_test_split

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

 

여기까지는 기존에 많이 썻던 코드입니다.

그럼 이제 이제 간단한 logistic regression 테스트를 해보겠습니다.

여기서 logistic regression은 분류기이기 때문에 decision tree와 같이 성능을 측정할 수 있습니다.

따라서 accuracy_score도 같이 불러와줍니다.

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score #logistic regression은 분류기 즉 성능을 측정할 수 있습니다.

lr = LogisticRegression(solver='liblinear', random_state=13)
#solver=는 최적화 알고리즘을 무엇으로 잡을지 정하라는 것
#보통 데이터 수가 적으면 'liblinear'를 씁니다. library linear의 약자입니다.
lr.fit(X_train, y_train)

LogisticRegression()의 option 중에 solver=는 최적화 알고리즘을 무엇으로 잡을지 정하라는 것입니다.
보통 데이터 수가 적으면 'liblinear'를 씁니다. library linear의 약자입니다.

train 데이터들을 fit시켜줍니다.

이제 저번시간까지 주구장창 했던 pred를 만들고 참값과 accuracy를 비교해보겠습니다.

y_pred_tr = lr.predict(X_train)
y_pred_test = lr.predict(X_test)

print('Train accuracy : ', accuracy_score(y_train, y_pred_tr))
print('Test accuracy : ', accuracy_score(y_test, y_pred_test))

train과 test의 accuracy 차이가 별로 없네요.
저번에 배웠던 pipeline을 구축해보겠습니다.

 

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

estimators = [
    ('scaler', StandardScaler()),
    ('clf', LogisticRegression(solver='liblinear', random_state=13))
]

pipe = Pipeline(estimators)

 

기억하시나요, scaler와 classifier를 정하면 둘을 한꺼번에 처리해주는 Pipeline입니다.

내가 지정한 standard scaler와 logistic regression을 한번에 수행하게 됩니다.

이제 pipe를 통해 fit시켜줍니다.

pipe.fit(X_train, y_train)

 

y_pred_tr = pipe.predict(X_train)
y_pred_test = pipe.predict(X_test)

print('Train accuracy : ', accuracy_score(y_train, y_pred_tr))
print('Test accuracy : ', accuracy_score(y_test, y_pred_test))

거의 비슷하네요...
이번에는 Decision Tree 분류기와 Logistic regression의 차이를 알기위해 비교해보겠습니다.

from sklearn.tree import DecisionTreeClassifier

wine_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
wine_tree.fit(X_train, y_train)
models = {
    'logistic regression': pipe, #pipe를 통한게 더 높았으니까...
    'decision tree': wine_tree
}

pipe를 통한게 더 높았으니까... logistic regression에 pipe를 넣어줍니다.

이제 roc curve를 그려서 두 보델의 성능을 비교해보겠습니다.

 

from sklearn.metrics import roc_curve
plt.figure(figsize=(10,8))
plt.plot([0,1],[0,1], label='random_guess')

plt.grid()
plt.legend()
plt.show()

기본 틀을 이렇게 만들어주고요,

 

여기에 우리는 모델이 2개 있었으므로 이 모델 2개를 넣어줍니다.

from sklearn.metrics import roc_curve
plt.figure(figsize=(10,8))
plt.plot([0,1],[0,1], label='random_guess')

for model_name, model in models.items(): #dict형태에서 keys(), values(), items()를 상기시킬 것
    #predict 시키겠습니다.
    pred = model.predict_proba(X_test)[:, 1] #모든 행의 두번째 컬럼을 가져와야합니다. 첫번째 컬럼은 0일 확률, 두번째 컬럼은 1일 확률이었기 때문입니다.
    fpr, tpr, threshold = roc_curve(y_test, pred)

    plt.plot(fpr, tpr, label=model_name)
    
plt.grid()
plt.legend()
plt.show()

for문으로 plot을 돌리면 두개가 겹쳐서 나오는군요(...몰랐음)

roc_curve는 fpr, tpr, threshold를 반환합니다. 

다시 공부해보자면, FPR은 거짓 양성률(False Positive Rate)이고, TPR은 진짜 양성률(True Positive Rate)입니다.

- 거짓 양성률(FPR): 실제 음성인 데이터를 양성으로 잘못 분류한 비율을 나타냅니다. 즉, 실제로는 음성인데 모델이 양성으로 잘못 분류한 비율입니다. 

- 진짜 양성률(TPR): 실제 양성인 데이터를 양성으로 올바르게 분류한 비율을 나타냅니다. 즉, 실제로는 양성인 데이터를 모델이 양성으로 올바르게 분류한 비율입니다.

- ROC 곡선: FPR(거짓 양성률)을 x축으로, TPR(진짜 양성률 또는 재현율)을 y축으로 나타내는 그래프입니다. 이를 통해 모델의 분류 임계값을 변화시켰을 때 어떻게 FPR과 TPR이 변화하는지 시각적으로 확인할 수 있습니다. ROC 곡선은 이진 분류 모델에서 사용되며, 보통 양성 클래스에 속하는 샘플을 올바르게 예측한 비율인 TPR(진짜 양성률)을 높이고, 음성 클래스에 속하는 샘플을 잘못 예측한 비율인 FPR(거짓 양성률)을 낮추는 것이 목표입니다. 일반적으로 ROC 곡선 아래 영역(Area Under the ROC Curve, AUC)이 높을수록 모델의 성능이 좋다고 판단할 수 있습니다. 임계값(threshold)을 변화시키면서 그려지는 그래프입니다.

 

여기서 또 질문, 일반적으로 분류 모델에서는 .predict() 메서드를 사용하여 클래스 레이블을 예측합니다. 그러나 ROC 곡선을 그리기 위해서는 클래스 레이블이 아닌 각 클래스에 속할 확률을 예측해야 합니다. 따라서 .predict_proba() 메서드가 사용됩니다.

 

결과적으로 roc curve로 logistic regression이 decision tree보다 성능이 조금 더 좋다는 걸 확인할 수 있습니다.

728x90