- 混淆矩陣
機器學習中對於分類模型常用混淆矩陣來進行效果評價,混淆矩陣中存在多個評價指標,這些評價指標可以從不同角度來評價分類結果的優劣,以下內容通過簡單的理論概述和案例展示來詳細解釋分類模型中混淆矩陣的評價指標及其用途。
以上四類判別結果展示在混淆矩陣上是一個兩行兩列的交叉矩陣,行分別代表實際的正例和負例,列分別代表預測的正例和負例。那麼在以上矩陣中:四個象限分別代表四種判別結果:
左上角被稱爲真陽性(True Positive,TP):樣本實際爲正例,且模型預測結果爲正例; 右上角被稱爲假陰性(False Negative,FN):樣本實際爲正例,但模型預測爲負例;
左下角被稱爲假陽性(False Positive,FP):樣本實際類別爲負例,但模型預測爲正例; 右下角被稱爲真陰性(True Negative,TN):樣本實際類別爲負例,且模型預測爲負例。 混淆矩陣的四個象限有明顯的規律,左上角至右下角的對角線上是預測正確(以T開頭),另一條對角線則預測錯誤(以F開頭),左側上下象限是預測爲真的類別(以P結尾),右側上下象限爲預測錯誤的類別(以N結尾)。 這樣真個混淆矩陣看起來就清洗多了,圍繞着混淆矩陣有幾個比較重要的指標需要掌握。
- ROC曲線、AUC指標
ROC的全名叫做Receiver Operating Characteristic,主要通過平面座標系上的曲線來衡量分類模型結果好壞——ROC curve。橫座標是false positive rate(FPR),縱座標是true positive rate(TPR)。以上縱座標的TPR即是上述的指標召回率,FPR則指代負樣本中的錯判率(假警報率),FPR = FP/(FP + TN) 。
典型的ROC曲線是一個位於座標點(0,0)和(1,1)對角線上方的曲線,因爲對角線代表着隨機分類器的分類效果。ROC曲線只能通過圖形來進行視覺判別,取法具體量化分類器的性能,於是AUC便出現了,它用來表示ROC曲線下的三角形面積大小,通常,AUC的值介於0.5到1.0之間,較大的AUC代表了較好的performance。
- 導入包
%clear %reset -f # In[*] import numpy as np import matplotlib.pyplot as plt from sklearn import svm, datasets from sklearn.metrics import roc_curve, auc ###計算roc和auc from sklearn import cross_validation
- 劃分訓練集和測試集
# In[*] # Import some data to play with iris = datasets.load_iris() X = iris.data y = iris.target ##變爲2分類 X, y = X[y != 2], y[y != 2] # Add noisy features to make the problem harder random_state = np.random.RandomState(0) n_samples, n_features = X.shape X = np.c_[X, random_state.randn(n_samples, 200 * n_features)] # shuffle and split training and test sets X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=.3,random_state=0)
- 建模(支持向量機)
# In[*] # Learn to predict each class against the other svm = svm.SVC(kernel='linear', probability=True,random_state=random_state) ###通過decision_function()計算得到的y_score的值,用在roc_curve()函數中 y_score = svm.fit(X_train, y_train).decision_function(X_test)
- 計算AUC以及繪圖
# Compute ROC curve and ROC area for each class fpr,tpr,threshold = roc_curve(y_test, y_score) ###計算真正率和假正率 roc_auc = auc(fpr,tpr) ###計算auc的值 # In[*] plt.figure() lw = 2 plt.figure(figsize=(10,10)) plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) ###假正率爲橫座標,真正率爲縱座標做曲線 plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver operating characteristic example') plt.legend(loc="lower right") plt.show()