需要源码请点赞关注收藏后评论区留言私信~~~
构建的分类器总是希望有较好的性能,如何评估分类器性能,需要一些客观的指标进行评判。比如,如何评估分类器的准确率(模型评估)以及如何在多个分类器中选择“最好的”一个
分类器性能的度量
训练分类器的目的是使学习到的模型对已知数据和未知数据都有很好的预测能力,不同的学习方法会给出不同的模型,当给定损失函数时,基于损失函数的模型的训练误差和模型的测试误差则成为学习方法评估的标准,训练误差的大小,对判定给定问题是不是一个容易学习的问题是有意义的,但本质上不重要,测试误差反映了学习方法对未知的测试数据集的预测能力,通常将学习方法对未知数据的预测能力称为泛化能力
1. 混淆矩阵
根据实际类别与机器学习预测类别的组合(混淆矩阵,Confusion Matrix)可分为真正例(True Positive,TP)、假正例(False Positive,FP)、假负例(False Negative,FN)和真负例(True Negative,TN)四种情况
真正例指被分类器正确分类的正元组,令TP为真正例的个数
真负例指被分类器正确分类的负元组 令TN为真负例的个数
假正例指被错误的标记为正元组的负元组 令FP为假正例的个数
假负例指被错误的标记为负元组的正元组 令FN为假负例的个数
混淆矩阵是分析分类器识别不同类元组的一种有用工具
2.分类器常用评估量
(1)准确率和错误率 分类器在检验集上的准确率(Accuracy)被定义为被该分类器正确分类的元组所占的百分比
(2)灵敏性和特效性 敏感性又称真正类率(true positive rate ,TPR),它表示了分类器所识别出的正实例占所有正实例的比例。特效性是真负例率,即正确识别的负元组的百分比
(3)精度和召回率 精度和召回率也在分类中广泛使用。精度(Precision)定义为标记为正例的元组实际为正类的百分比,可以看作精确度的度量,也被称为查准率。召回率(Recall)定义为正元组标记为正的百分比,是完全性的度量,也被称为查全率
除了基于准确率的度量外,还可以在其他方面进行分类器的比较,主要因素有
速度:构建和使用分类器的计算开销
鲁棒性:对有噪声或缺失值数据分类器做出正确预测的能力。通常鲁棒性用噪声和缺失值渐增的一系列合成数据集进行评估
可伸缩性:对于给定大量数据有效构造分类器的能力。通常,可伸缩性用规模渐增的一系列数据集评估
可解释性:对分类器提供的理解和洞察水平。可解释性是主观的,因为很难评估。比如决策树和分类规则一般容易解释,但随着它们变得更复杂,其可解释性也随之消失
(5)P-R曲线
评价一个模型的好坏,不能仅靠精确率或者召回率,最好构建多组精确率和召回率,绘制出模型的P-R曲线
在绘制P-R曲线的横轴是召回率,纵轴是精确率。P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率
(6)接收者操作特征曲线
接收者操作特征曲线(Receiver Operating Characteristic Curve,ROC)是一种反映分类模型敏感性和特异性连续变量的综合指标,显示了给定模型的真正例率(TPR)和假正例率(FPR)之间的权衡。ROC通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性,并以TPR为纵坐标、FPR为横坐标绘制曲线,曲线下面积越大,诊断准确性越高。ROC曲线上每个点反映着对同一信号刺激的感受性,最靠近坐标图左上方的点为敏感性和特异性均较高的临界值
Python分类器评估实例
首先导入相关模块和数据
import numpy as np import matplotlib.pyplot as plt from sklearn import svm, datasets from sklearn.metrics import roc_curve, auc from sklearn import model_selection iris = datasets.load_iris() X = iris.data y = iris.target
iris数据取前2类数据并增加随机扰动
X, y = X[y != 2], y[y != 2] #增加噪声 random_state = np.random.RandomState(0) n_samples, n_features = X.shape X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
数据集划分并进行模型训练
绘制ROC曲线
代码如下
y_score = classifier.fit(X_train, y_train).decision_function(X_test) # Compute ROC curve and ROC area for each class fpr,tpr,threshold = roc_curve(y_test, y_score) #计算真正率和假正率 roc_auc = auc(fpr,tpr) ###计算auc的值 plt.rre() # lw = 2 plt.figure(figsize=(8,4)) plt.plot(fpr, tpr, color='darkorange', la正率为纵坐标做曲线 plt.plot([0, 1], [0, 1], color='navy', 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('ROC曲线示例') plt.legend(loc="lower right") plt.show()
创作不易 觉得有帮助请点赞关注收藏~~~