Python scikit-learn ROC curve, AUC
파이썬에서 사이킷런을 활용하여 이진 분류 문제의 ROC 커브를 그려보고
AUC 값을 구해보는 방법을 간단한 예제를 통해 알아보도록 하겠습니다.
데이터셋 로드 및 전처리
이번 예제에서는 사이킷런에서 제공하는 기본 데이터셋인
breast cancer 분류 데이터셋을 활용해보겠습니다.
먼저, 아래의 코드로 target class에 대한 정보(0 또는 1이며, 악성/양성 종양 여부 의미)를 포함한
데이터셋을 데이터프레임 형태로 불러오겠습니다.
import pandas as pd
from sklearn import datasets
# 유방암 데이터셋 로드
data = datasets.load_breast_cancer()
df = pd.DataFrame(data.data, columns = data.feature_names)
# 1이면 양성 종양, 0이면 악성 종양 라벨 컬럼 지정
df['target'] = data.target
불러온 데이터셋에 대하여 학습용 데이터와 테스트용 데이터를 분리하겠습니다.
여기서는 target 컬럼을 제외한 모든 열들을 feature로 사용하는 상황을 가정합니다.
from sklearn.model_selection import train_test_split
# train, test 셋 분리
X = df.iloc[:, :-1] # target column을 제외한 모든 column을 feature로 사용
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)
이번에 사용할 예시 분류 모델로 선형 회귀 모델을 고르고
분류기를 학습시켜보겠습니다.
from sklearn.linear_model import LinearRegression
# 선형 회귀 모델 학습
model = LinearRegression()
model.fit(X_train, y_train)
ROC 커브 그리기
테스트셋 예측 결과에 대한 ROC 커브를 그리기 위하여
우선, 테스트셋 데이터에 대한 라벨 예측 값을 받아오도록 하겠습니다.
y_score = model.predict(X_test) # 테스트 데이터셋에 대한 예측 값
# 앞 5개 값 출력 예시
print(y_score[:5]) # [0.62168355 0.17803853 0.27512068 1.1320503 1.11698318]
사이킷런의 roc_curve 함수로 예상 threshold별 FP rate 및 TP rate를 바로 구할 수 있습니다.
input은 (실제 라벨, 예측 값) 순서로 지정해주시면 되며,
출력 값은 순서대로 FP rate, TP rate, threshold value를 의미합니다.
(예측 회귀 값이 threshold보다 크면 1, 아니면 0으로 분류하는 원리입니다.)
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_test, y_score) # input 순서 : 실제 라벨, 예측 값
matplotlib 라이브러리를 이용하여 ROC curve를 그린 예제는 아래와 같습니다.
import matplotlib.pyplot as plt
plt.plot(fpr, tpr)
plt.xlabel('FP Rate')
plt.ylabel('TP Rate')
plt.show()
y = x 그래프와 ROC 커브를 아래의 코드처럼 같이 그리면 비교가 좀더 용이합니다.
plt.plot(fpr, tpr, color = 'red', label = 'ROC curve')
plt.plot([0, 1], [0, 1], color = 'blue', label = 'y = x') # y = x 직선 표시
plt.xlabel('FP Rate')
plt.ylabel('TP Rate')
plt.legend() # 그래프 라벨 표시
plt.show()
AUC 면적 구하기
AUC는 ROC 커브 아래의 면적을 의미하는데, 0 ~ 1 사이의 값을 가지며,
1에 가까울수록 모델 분류 성능이 좋음을 의미합니다.
AUC 면적에 대한 값은 사이킷런의 roc_auc_score 함수로 간단하게 구할 수 있습니다.
input은 roc_curve 함수와 마찬가지로 (실제 라벨, 예측 값) 순서로 지정해주시면 됩니다.
from sklearn.metrics import roc_auc_score
print(roc_auc_score(y_test, y_score)) # 0.985260399606944
해당 예제의 AUC 면적은 약 0.985 이상으로 측정되었습니다.
'Python > Sklearn' 카테고리의 다른 글
[Sklearn] 파이썬 feature selection 함수 RFE, RFECV 예제 (1) | 2022.09.24 |
---|---|
[Sklearn] 파이썬 단어 개수 세기 예제 : CountVectorizer 함수 (2) | 2022.08.29 |
[Sklearn] 파이썬 나이브 베이즈 분류기 구현 예제 (0) | 2022.06.13 |