Python/Sklearn

[Sklearn] 파이썬 ROC 커브, AUC 면적 구하기 예제

jimmy_AI 2022. 9. 16. 19:40
반응형

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 이상으로 측정되었습니다.