• 混淆矩阵

    机器学习中对于分类模型常用混淆矩阵来进行效果评价,混淆矩阵中存在多个评价指标,这些评价指标可以从不同角度来评价分类结果的优劣,以下内容通过简单的理论概述和案例展示来详细解释分类模型中混淆矩阵的评价指标及其用途。

    第十节:二分类ROC曲线 - 图1

    以上四类判别结果展示在混淆矩阵上是一个两行两列的交叉矩阵,行分别代表实际的正例和负例,列分别代表预测的正例和负例。那么在以上矩阵中:四个象限分别代表四种判别结果:

    左上角被称为真阳性(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。

    • 导入包
    1. %clear
    2. %reset -f
    3. # In[*]
    4. import numpy as np
    5. import matplotlib.pyplot as plt
    6. from sklearn import svm, datasets
    7. from sklearn.metrics import roc_curve, auc ###计算roc和auc
    8. from sklearn import cross_validation
    • 划分训练集和测试集
    1. # In[*]
    2. # Import some data to play with
    3. iris = datasets.load_iris()
    4. X = iris.data
    5. y = iris.target
    6. ##变为2分类
    7. X, y = X[y != 2], y[y != 2]
    8. # Add noisy features to make the problem harder
    9. random_state = np.random.RandomState(0)
    10. n_samples, n_features = X.shape
    11. X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
    12. # shuffle and split training and test sets
    13. X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=.3,random_state=0)
    • 建模(支持向量机)
    1. # In[*]
    2. # Learn to predict each class against the other
    3. svm = svm.SVC(kernel='linear', probability=True,random_state=random_state)
    4. ###通过decision_function()计算得到的y_score的值,用在roc_curve()函数中
    5. y_score = svm.fit(X_train, y_train).decision_function(X_test)
    • 计算AUC以及绘图
    1. # Compute ROC curve and ROC area for each class
    2. fpr,tpr,threshold = roc_curve(y_test, y_score) ###计算真正率和假正率
    3. roc_auc = auc(fpr,tpr) ###计算auc的值
    4. # In[*]
    5. plt.figure()
    6. lw = 2
    7. plt.figure(figsize=(10,10))
    8. plt.plot(fpr, tpr, color='darkorange',
    9. lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) ###假正率为横坐标,真正率为纵坐标做曲线
    10. plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
    11. plt.xlim([0.0, 1.0])
    12. plt.ylim([0.0, 1.05])
    13. plt.xlabel('False Positive Rate')
    14. plt.ylabel('True Positive Rate')
    15. plt.title('Receiver operating characteristic example')
    16. plt.legend(loc="lower right")
    17. plt.show()

    第十节:二分类ROC曲线 - 图2