Hike News
Hike News

機器學習-分類模型評估

Introduction

  • 前面對兩種分類模型皆調用score()方法查看準確率,其就是一種對模型的評估,
    • 返回預測結果正確的百分比
  • sklearn還存在許多對預測模型評估的方法皆收錄在sklearn.metrics
  • 這一章節只著重在對分類模型的評估
  • 還有其他對分類模型評估的指標包括 精確率(precision)召回率(recall)

混淆矩陣(confusion matrix)

在分類任務下,預測結果(predicted condition)與正確標記(true condition)之間存在四種不同的組合,構成所謂的混淆矩陣(適用於多分類)
confusion matrix

  • 可使用sklearn.metrics.confusion_matrix搭配matplotlibseaborn.heatmap來繪製

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics.classification import accuracy_score
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns

iris_data = load_iris()

def ConfusinMatrix():
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target)

KNN = KNeighborsClassifier(n_neighbors=5)
KNN.fit(x_train, y_train)
y_predict = KNN.predict(x_test)

mat = confusion_matrix(y_test,y_predict)

print("accuracy score:", accuracy_score(y_test, y_predict))

sns.heatmap(mat,square= True, annot=True, cbar= False)
plt.xlabel("predicted value")
plt.ylabel("true value")
plt.show()

if __name__ == '__main__':
ConfusinMatrix()
  • 要是使用jupyter notebook進行繪製可在導入matplotlib.pyplot後添加以下code,取代plt.show()
    1
    %matplotlib inline
    可讓圖形不會在新視窗呈現

Result

1
accuracy score: 0.9736842105263158

heatmap plot

其他評估方法

精確率(precision)

預測值為True情況下真實值仍為True所佔的比例(查得準)

  • 一般較少使用精確率來評估模型

召回率(recall)

真實值為True的情況下預測值仍為True所佔的比例(查得全,對正樣本的區分能力)

  • 例如癌症的分析,寧願錯估沒有癌症的人得癌,也不能將得癌症的人錯估成沒有癌症
  • 上述案例我們會希望召回率越高越好甚至100%,而沒有那麼在乎準確率

F1-score

  • 是一種用來評估模型穩健程度的標準
  • 其公式如下

  • 其反應的是再提高召回率的同時是不是有維持一定的準確率

  • 仍是越大越好,是一個綜合的評判標準

分類模型評估的API

  • 使用sklearn.metrics.classification_report

classification_report

  • 調用classification_report(y_true,y_pred,target_names=None)
  • y_true: 真實目標值
  • y_pred: estimator預測的目標值
  • target_names : 目標不同類別的名稱
  • 返回每個類別precision及recall

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sklearn.datasets import load_iris
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics.classification import accuracy_score
from sklearn.metrics import classification_report

iris_data = load_iris()

def model_metrics():
x_train,x_test,y_train,y_test = train_test_split(iris_data.data,iris_data.target)

NB = GaussianNB()
NB.fit(x_train,y_train)
y_predict = NB.predict(x_test)

print("accuracy score:", accuracy_score(y_test,y_predict))
print("report:\n",classification_report(y_test,y_predict,target_names=iris_data.target_names))

if __name__ == '__main__':
model_metrics()

結果

1
2
3
4
5
6
7
8
9
accuracy score: 0.8947368421052632
report:
precision recall f1-score support

setosa 1.00 1.00 1.00 16
versicolor 0.77 0.91 0.83 11
virginica 0.89 0.73 0.80 11

avg / total 0.90 0.89 0.89 38