파이썬

[파이썬 실습] Logistic Regression 실습

Leesemo 2021. 5. 31. 21:39

Linear Regression(선형 회귀) 실습

로지스틱 회귀 모델 구축

 

1. 모듈 불러오기

 


2. 데이터 불러오기

 

- 357명의 정상 환자, 212명의 유방암 환자가 존재

 

- X 변수 및 Y 변수 확인

 

- breast_cancer.target ( 0 - 유방암, 1 - 정상)

 

★ 작업 편의 상

- 타겟 값이 0과 같으면 1로 변경하고 아닐 경우 0으로 변경한다는 조건문 실행

 


3. 데이터 전처리하기

- random seed를 넣어주는 이유는 train과 test를 나누는 것이 random으로 갖고 하기 때문에 고정시켜주고 작업을 시킨다는 의미!

- 각 변수 별 표준 정규화도 실시

 


4. 로지스틱 회귀 모델 구축하기

4.1 모델 학습하기

 

- 학습된 모델을 통해 베타값 도출하자.

 


4.2 β 확인하기

# 데이터 컬럼에 따른 beta, exp(beta) 체크

column_name = ['const'] + breast_cancer.feature_names.tolist()
beta = np.concatenate([model.intercept_, model.coef_.reshape(-1)]).round(2)
odds = np.exp(beta).round(2)
interpret = np.where(beta > 0, 'risky', 'protective')

beta_analysis = pd.DataFrame(np.c_[beta, odds, interpret], index=column_name,columns=['beta', 'exp(beta)', 'interpret'])
beta_analysis

- 각 변수 별 β값에 따라서 위험도 판단 정리(의미 파악), logit 값에 어떤 영향을 끼치는지!

 


 

 

- 첫 번째 컬럼이 Y = 0일 확률, 두 번째 컬럼은 유방암일 확률은 나타낸다.

- 또한 직접 계산하는 방법도 존재한다.


 

이제 성능을 평가해볼 시간이다. Cut off 값을 변화하면서 Accuracy의 성능을 관찰할 것이다.

Cut off란 로지스틱을 통해 유방암일 확률을 0, 1의 값으로 출력이 될 것이다. 두 개의 값 사이에 기준선이 되는 값이라고 할 수 있다.

이 0.6 값을 통해 실제로 유방암이다. 유방암이 아니라고 판별한 결과와 실제 결과값을 따라 정리한 것을 혼동행렬이라고 부른다. 혼동행렬을 통해 정확도, 민감도, 정밀도를 구할 수 있다.

혼동행렬

- 민감도 : 실제 유방암 환자 중에서 모델이 얼마만큼 유방암 환자를 잘 예측했는가를 파악할 수 있는 지표

- 정밀도 : 예측된 유방암 환자 내에서 실제 유방암 환자 비율은 얼마만큼 되는지를 파악할 수 있는 지표

 

 

위의 코드에서 Cut off 값을 0.01부터 0.99까지 다양하게 변화하면서 지정하게 하였고, 여러 Cut off 값에 대해서 Cut off 값보다 클 경우 유방암이고, 낮을 경우 유방암이 아니라는 예측 결과를 출력해주는 코드이다.

예측된 결과를 정확도, 민감도, 정밀도를 나타내는 코드이다.

 


5. ROC Curve

- ROC Curve는 앞에서 설명한 혼동행렬을 통해서 그릴 수 있는 그래프이다. X축은 FPR(실제 유방암이라고 예측한 것 중에서 유방암이 아니었던 비율), Y축 TPR(실제 유방암 환자 중에서 예측된 유방암 환자 비율이 얼마나 되는지)에 대한 것이다. 여기서 Threshold 값을 작은 값부터 큰 값까지 변화시켜주면서 FPR, TPR 값을 변화시켜주고 있다.

 

probs = model.predict_proba(X_test)[:, 1]

model_fpr, model_tpr, threshold1 = roc_curve(y_test, probs)
random_fpr, random_tpr, threshold2 = roc_curve(y_test, [0 for i in range(X_test.__len__())])

plt.figure(figsize = (10, 10))
plt.plot(model_fpr, model_tpr, marker = '.', label = 'Logistic')
plt.plot(random_fpr, random_tpr, linestyle = '--', label = 'Random')

plt.xlabel('False Positive Rate', size = 20)
plt.ylabel('True Positive Rate', size = 20)

plt.legend(fontsize = 20)

plt.title('ROC curve', size = 20)
plt.show()