project11. 특정 데이터로 유방암 진단하기
1. 핵심 개념 이해
분류: 대표적인 지도 학습 유형의 머신러닝 기법
- 데이터에 주어진 클래스 값을 학습
- 각 클래스를 구별할 수 있는 패턴을 찾아 학습 모델 생성
- 새로운 데이터에 대한 클래스를 예측 및 분류
로지스틱 회귀
- 선형 회귀: 선형 함수를 사용하여 추세를 예측
- 로지스틱 회귀: S자 함수를 사용하여 참(True, 1)과 거짓(False, 0)을 분류
- S자 함수 방정식 (시그모이드 함수)
x값이 작아지면 y값이 0에 가까워지게 되고, x값이 커지면 y값은 1에 가까워져 S자 형태의 그래프가 된다.
y = 1 / (1+e^(ax+b))
로지스틱 회귀 모델의 성능 평가 지표
- 선형 회귀
실제값과 예측값이 오차에 기반한 지표
- 로지스틱 회귀
오차 행렬에 기반한 성능 지표인 정밀도, 재현율, F1 스코어, ROC_AUC를 사용
오차 행렬
TN: Negative가 참인 경우 FP: Positive가 참인 경우
FN: Negative가 거짓인 경우 TP: Positive가 참인 경우
사이킷런 제공 함수: confusion_matrix()
정확도 = 예측 결과와 실제값이 동일한 건수 / 전체 데이터 수 = (TN+TP) / (TN+FP+FN+TP)
정밀도
| TP / (FP + TP)
| 예측이 Positive인 것(FP+TP) 중에서, 참인 것(TP)의 비율을 의미
| 정밀도는 Positive 예측 성능을 더 정밀하게 평가하기 위한 지표로 사용
| 사이킷런 제공 함수: precision_score()
재현율
| TP / (FN + TP)
| 실제값이 Positive인 것(FN+TP) 중에서 참인 것(TP)의 비율을 의미
| 실제 Positive인 데이터를 정확히 예측했는지 평가하는 지표 (민감도 또는 TPR)
| 사이킷런 제공 함수: recall_score()
F1 스코어
| 2 / ((1/재현율) + (1/정밀도)) = 2 * 정밀도 * 재현율 / (정밀도 + 재현율)
| 정밀도와 재현율의 가중조화평균
| 정확한 평가를 위해 많이 사용
| 사이킷런 제공 함수: f1_score()
ROC 기반 AUC 스코어
| Receiver Operation characteristic Curve - Area Under Curve
| 오차 행렬의 FPR이 변할 때 TPR이 어떻게 변하는지를 나타내는 곡선
| FPR: 실제 Negative인 데이터를 Positive로 False 예측한 비율 (실제 N 중에서 P라고 예측해서 실패한 경우)
FP / (FP + TN)
| TPR: 실제 Positive인 데이터를 True로 예측한 비율 (재현율) (실제 P 중에서 P라고 예측해서 성공한 경우)
TP / (FN + TP)
| ROC 기반의 AUC 값은 ROC 곡선 밑의 면적을 구한 것으로 1에 가까울수록 좋은 성능을 의미
| 사이킷런 제공함수: roc_auc_score()
성능 평가 지표 한 눈에 보기
2. 데이터 수집
- 사이킷런에서 제공하는 유방암 진단 데이터셋 사용
#데이터 수집
!pip install sklearn #사이킷런 설치
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
b_cancer = load_breast_cancer()
print(b_cancer.DESCR) #데이터셋 설명 확인
Out:
3. 데이터 준비 및 탐색
- 데이터 탐색
#데이터 탐색
b_cancer_df = pd.DataFrame(b_cancer.data, columns=b_cancer.feature_names)
b_cancer_df['diagnosis'] = b_cancer.target
b_cancer_df.head()
Out:
print('유방암 진단 데이터셋 크기: ', b_cancer_df.shape)
b_cancer_df.info()
Out:
- 데이터 준비: 로지스틱 회귀 분석에 사용될 데이터 정규화
평균이 0, 분산이 1이 되는 정규 분포 형태로 변형
#데이터 준비
from sklearn.preprocessing import StandardScaler
#사이킷런의 전처리 패키지에 있는 정규 분포 스케일러 import
scaler = StandardScaler()
b_cancer_scaled = scaler.fit_transform(b_cancer.data)
print(b_cancer_scaled[0])
print(b_cancer.data[0]) #다시 확인 (b_cancer_data[0])
#print(b_cancer_scaled[0])
Out:
4. 분석 모델 구축
- 로지스틱 회귀를 이용해 분석 모델 구축
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# X, Y 설정하기
Y = b_cancer_df['diagnosis']
X = b_cancer_scaled
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
#훈련용 데이터와 평가용 데이터 분할하기
lr_b_cancer = LogisticRegression() #로지스틱 회귀 분석: (1) 모델 생성
lr_b_cancer.fit(X_train, Y_train) #로지스틱 회귀 분석: (2) 모델 훈련
Y_predict = lr_b_cancer.predict(X_test)
# 로지스틱 회귀 분석: (3) 평가 데이터에 대한 예측 수행 -> 예측 결과 Y_predict 구하기
5. 결과 분석
- 생성 모델 성능 확인
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score
confusion_matrix(Y_test, Y_predict) #오차 행렬
Out:
accuracy = accuracy_score(Y_test, Y_predict)
precision = precision_score(Y_test, Y_predict)
recall = recall_score(Y_test, Y_predict)
f1 = f1_score(Y_test, Y_predict)
roc_auc = roc_auc_score(Y_test, Y_predict)
print('정확도: {0:.3f}, 정밀도: {1:.3f}, 재현율: {2:.3f}, F1: {3:.3f}'.format(accuracy, precision, recall, f1))
print('ROC_AUC: {0:.3f}'.format(roc_auc))
Out:
- ROC 기반 AUC 스코어 시각화
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
Y_score = lr_b_cancer.predict_proba(X_test)[:, 1] #검증 데이터가 클래스 1에 속하는지 확인
fpr, tpr, thresholds = roc_curve(y_true=Y_test, y_score=Y_score)
plt.plot(fpr, tpr, label='roc curve (area = %0.3f)' %auc(fpr, tpr))
plt.plot([0,1], [0,1], linestyle='--', label='random')
plt.plot([0,0,1], [0,1,1], linestyle='--', label='ideal')
plt.legend()
plt.xlabel('false positive rate')
plt.ylabel('true positive rate')
plt.show()
Out:
FIN.
[빅데이터 분석] 10. 머신러닝 분류 분석 (0) | 2023.07.25 |
---|---|
[빅데이터 분석] 09. 지리 정보 분석 II (0) | 2023.07.25 |
[빅데이터 분석] 08. 지리 정보 분석 (0) | 2023.07.25 |
[빅데이터 분석] 07. 텍스트 빈도 분석 (0) | 2023.07.25 |
[빅데이터 분석] 06. 통계 분석II (1) | 2023.07.25 |
댓글 영역