분류 모델의 평가
분류 모델은 다음과 같은 항목을 이용해 평가한다.

위의 오차행렬 (Confusion Matrix)을 이용해 정확도, 정밀도, 재현율 세 가지를 계산한다. 오차 행렬은 4가지 결과를 해석할 수 있다. 뒤의 알파벳은 예측값이고 앞의 알파벳이 그 값이 맞았는지를 나타낸다.
Accuracy(정확도)
Precision
Recall (재현율)
이진 분류
다중 클래스
ROC Curve
AUC
ROC 커브를 그린 후 재현율(Recall, TPR)과 위양성률(FPR)이 어떻게 변하는지 확인 후 이에 맞는 Treshold를 선정한다.

import pandas as pd
df = pd.read_csv("/kaggle/input/wine-quality-data-set-red-white-wine/wine-quality-white-and-red.csv")
df['color'] = df['type'].replace({'red':0,'white':1})
df['taste'] = [1 if i > 5 else 0 for i in df['quality']]
df.tail()

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 데이터 분리
X = df.drop(['type','taste', 'quality'], axis = 1)
y = df['taste']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 23, stratify = y)
#모델 학습
clf = DecisionTreeClassifier(max_depth = 2, random_state = 23)
clf.fit(X_train, y_train)
# 모델에 훈련용, 테스트용 데이터를 넣어 예측하고 정확도를 산출
y_pred_tr = clf.predict(X_train)
y_pred_ts = clf.predict(X_test)
accuracy_score(y_train, y_pred_tr), accuracy_score(y_test, y_pred_ts)
# 결과: (0.735039445834135, 0.7215384615384616)
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, roc_curve
# 지표
print("Acc", accuracy_score(y_test, y_pred_ts))
print("recall_score", recall_score(y_test, y_pred_ts))
print("precision_score", precision_score(y_test, y_pred_ts))
print("roc_auc_score", roc_auc_score(y_test, y_pred_ts))
print("f1_score", f1_score(y_test, y_pred_ts))
clf.predict_proba(X_train)

import matplotlib.pyplot as plt
# 1 (white)에 대한 probability만 가져온다.
pred_proba = clf.predict_proba(X_test)[:, 1]
fpr, tpr, threshold = roc_curve(y_test, pred_proba)
pd.DataFrame({'threshold':threshold,'fpr':fpr,'tpr':tpr})

# 시각화
plt.figure(figsize=(10,8))
plt.plot([0,1],[0,1],'r')
plt.plot(fpr,tpr)
plt.grid()
plt.show()
