7.7 分类模型评估

  “所有模型都是坏的,但有些模型是有用的”。建立模型之后,接下来就要去评估模型,以确定此模型是否“有用”。sklearn库的metrics模块提供各种评估方法,包括分类评估、回归评估、聚类评估和交叉验证等,本节主要介绍分类模型评估方法。
  评估分类是判断预测值时否很好的与实际标记值相匹配。正确的鉴别出正样本(True Positives)或者负样本(True Negatives)都是True。同理,错误的判断正样本(False Positive,即一类错误)或者负样本(False Negative,即二类错误)。
  注意:True和False是对于评价预测结果而言,也就是评价预测结果是正确的(True)还是错误的(False)。而Positive和Negative则是样本分类的标记。
  metrics模块分类度量有6种方法,如表1所示:

指标描述metrics方法
Accuracy准确度from sklearn.metrics import accuracy_score
Precision查准率from sklearn.metrics import precision_score
Recall查全率from sklearn.metrics import recall_score
F1F1值from sklearn.metrics import f1_score
Classification Report分类报告from sklearn.metrics import classification_report
Confusion Matrix混淆矩阵from sklearn.metrics import confusion_matrix
ROCROC曲线from sklearn.metrics import roc_curve
AUCROC曲线下的面积from sklearn.metrics import auc

7.7.1 准确度

  准确度是预测正确的数(包括正样本和负样本)占所有数的比例。在对模型进行评估前,要按照前面的章节所述步骤,对数据进行收集或创建、预处理、建模和预测等操作,示例代码:

# 创建数据集,其中矩阵X表示特征值,向量y表示所属类目标记值
import numpy as np
X=np.random.random((10,5))
y=np.array(['M','M','F','F','M','F','M','M','F','F'])
X[X<0.7]=0

# 对矩阵X特征值进行二值化处理
from sklearn.preprocessing import Binarizer
binarizer = Binarizer(threshold=0.0).fit(X)
binary_X=binarizer.transform(X)

# 对y标记值进行类条件编码
from sklearn.preprocessing import LabelEncoder
enc=LabelEncoder()
enc_y=enc.fit_transform(y)

# 数据切分为训练集和测试集
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test=train_test_split(binary_X,enc_y,random_state=0)

# 利用knn模型对数据进行拟合
from sklearn import neighbors
knn = neighbors.KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train,y_train)

# 对测试集数据预测
y_pred = knn.predict(X_test)
print(y_pred)
print(y_test)

运行结果

[0 1 1]   #预测标记值
[0 0 1]   #测试标记值

  经历过以上操作后,利用accuracy_score函数对预测数据进行模型评估,其中第一个参数是测试标记,第二个参数是预测标记值。示例代码:

from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)

运行结果

0.66666666666666663

  由结果可知,knn模型预测的准确率约为66.7%,其中测试标记值y_test的结果为array([0, 0, 1], dtype=int64),而y_pred结果为array([0, 1, 1], dtype=int64),由于数据量比较小,因此准确率为2/3即约等于66.7%。

7.7.2 查准率(Precision)和查全率(Recall)

  查准率和查全率应用在信息处理领域的多个子领域。为加深理解,先引入下图1,然后再具体分析。其中,用P代表Precision,R代表Recall。


图1 Precision和Recall

  查准率和查全率用来衡量搜索引擎的性能,查全率=(检索出的相关信息量/系统中的相关信息总量)x100%,查准率=(检索出的相关信息量/检索出的信息总量)x100%。一般来说,Precision 就是检索出来的条目中(比如:文档、网页等)有多少是准确的,Recall就是所有准确的条目有多少被检索出来了。为什么要引入这两个概念?
  假设有一个大小为1000的带布尔标签数据集,里面的“真”样本只有100不到,剩下都是假样本。假设训练一个模型,不管输入什么数据,它只给出“假”的预测,那么正确率依旧是90%以上,很明显,这个时候准确率accuracy就失去它的作用。因此,查全率和查准率一般用在倾斜数据集的时候。
  查全率是衡量检索系统和检索者检出相关信息的能力,查准率是衡量检索系统和检索者拒绝非相关信息的能力。
  实验证明,在查全率和查准率之间存在着相反的相互依赖关系--如果提高输出的查全率,就会降低其查准率,反之亦然。


查准率与查全率

  sklearn的metrics模块分别提供了precision_score和recall_score函数用来评估分类模型的查全率和查准率,示例代码:

from sklearn.metrics import precision_score      
print(precision_score(y_test, y_pred))
from sklearn.metrics import recall_score   
print(recall_score(y_test, y_pred))

运行结果:

0.5      # 查准率
1.0      # 查全率

  由结果可知,查准率为0.5,由于测试集中正确的正样本只有1个,预测的正样本有2个,所以依据查准率公式得1/2即0.5。而对于查全率,唯一的1个正确的正样本被预测样本涵盖,因此依据查全率公式得1/1即1.0。

7.7.3 F1值(F1-Measure)

  如上所述,P和R指标有的时候是矛盾的,F-Measure综合这二者指标的评估指标,用于综合反映整体的指标。F-Measure是Precision和Recall加权调和平均,公式如图2所示:


图2 F-Measure

  当参数a=1时,就是最常见的F1了,如图3所示:


图3 F1-Measure

  很容易理解,F1综合了P和R的结果,当F1较高时则比较说明实验方法比较理想。利用F1评估分类模型示例代码:

from sklearn.metrics import f1_score
f1_score(y_test,y_pred)

运行结果:

0.66666666666666663

7.7.4 分类报告(Classification Report)

  metrics模块的classification_report方法,综合提供了查准率(precision)、查全率(recall)和f1值三种评估指标。示例代码:

from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))

运行结果:

precision    recall  f1-score   support

          0       1.00      0.50      0.67         2
          1       0.50      1.00      0.67         1

avg / total       0.83      0.67      0.67         3

7.7.5 混淆矩阵(Confusion Matrix)

  混淆矩阵是一个N X N矩阵,N为分类的个数。假如我们面对的是一个二分类问题,也就是N=2,我们就得到一个2 X 2矩阵。在学习这个矩阵之前,我们需要知道一些简单的定义。
Accuracy(准确度):预测正确的数占所有数的比例。
Positive Predictive Value(阳性预测值) or Precision(查准率):阳性预测值被预测正确的比例。
Negative Predictive Value(阴性预测值):阴性预测值被预测正确的比例。
Sensity(灵敏度) or Recall(查全率):在阳性值中实际被预测正确所占的比例。
Specificity(特异度):在阴性值中实现被预测正确所占的比例。
  所有概念及运算方法如图4所示:


图4 混淆矩阵

  sklearn库的metrics模块提供了confusion_matrix方法,用来计算混淆矩阵值,示例代码:

from sklearn.metrics import confusion_matrix 
print(confusion_matrix(y_test, y_pred))

运行结果:

[[1 1]       # True Positives = 1, False Negatives = 1
 [0 1]]      # False Positives = 0, True Negatives = 1

7.7.6 ROC曲线

  ROC(receiver operating characteristic curve)曲线指受试者工作特征曲线或者是接收器操作特性曲线, 它是反映敏感性和特异性连续变量的综合指标,是用构图法揭示敏感性和特异性的相互关系,它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性,再以敏感性为纵坐标、(1-特异性)为横坐标绘制成曲线,曲线下面积越大,诊断准确性越高。在ROC曲线上,最靠近坐标图左上方的点为敏感性和特异性均较高的临界值。
  考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被 预测成正类,即为真正类(True positive),如果实例是负类被预测成正类,称之为假正类(False positive)。相应地,如果实例是负类被预测成负类,称之为真负类(True negative),正类被预测成负类则为假负类(false negative)。
TP:正确肯定的数目;
FN:漏报,没有正确找到的匹配的数目;
FP:误报,给出的匹配是不正确的;
TN:正确拒绝的非匹配对数;
  列联表如下表所示,1代表正类,0代表负类。

预测
10合计
实际1True Positive(TP)False Negative(FN)Actual Positive(TP+FN)
0False Positive(FP)True Negative(TN)Actual Negative(FP+TN)
合计Predicted Positive(TP+FP)Predicted Negative(FN+TN)TP+FP+FN+TN

  从列联表引入两个新名词。其一是真正类率(true positive rate ,TPR), 计算公式为TPR=TP/ (TP+ FN),刻画的是分类器所识别出的 正实例占所有正实例的比例。另外一个是假正类率(false positive rate, FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。还有一个真负类率(True Negative Rate,TNR),也称为specificity,计算公式为TNR=TN/ (FP+ TN) = 1-FPR。如图5所示:


图5 TPR和FPR

  如上图所示,两列True matches和True non-match分别代表应该匹配上和不应该匹配上的,两行Pred matches和Pred non-match分别代表预测匹配上和预测不匹配上的。
FPR = FP/(FP + TN) 负样本中的错判率(假警报率)
TPR = TP/(TP + TN) 判对样本中的正样本率(命中率)
ACC = (TP + TN) / P+N 判对准确率
  在一个二分类模型中,对于所得到的连续结果,假设已确定一个阀值,比如说 0.6,大于这个值的实例划归为正类,小于这个值则划到负类中。如果减小阀值,减到0.5,固然能识别出更多的正类,也就是提高了识别出的正例占所有正例 的比类,即TPR,但同时也将更多的负实例当作了正实例,即提高了FPR。为了形象化这一变化,在此引入ROC,ROC曲线可以用于评价一个分类器。
  ROC曲线其实就是从混淆矩阵衍生出来的图形,其横坐标为1-Specificity,纵坐标为Sensitivity。1-specificity=FPR(False positive rate),即假正类率。Sensitivity=TPR(True positive rate),即是真正类率。如图6所示:


图6 ROC曲线和它相关的比率

  上图说明,理想情况下,TPR应该接近1,FPR应该接近0。ROC曲线上的每一个点对应于一个threshold,对于一个分类器,每个threshold下会有一个TPR和FPR。比如Threshold最大时,TP=FP=0,对应于原点;Threshold最小时,TN=FN=0,对应于右上角的点(1,1)。在ROC空间,ROC曲线越凸向左上方向效果越好;越靠近对角线,分类器越趋向于随机分类器。
  利用metrics计算roc曲线,roc曲线有三个属性:fpr,tpr,和阈值,因此该函数返回这三个变量。示例代码:

import numpy as np  
from sklearn.metrics import roc_curve  
y = np.array([1,1,2,2])  
pred = np.array([0.1, 0.4, 0.35, 0.8])  
fpr, tpr, thresholds = roc_curve(y, pred, pos_label=2)

fpr,tpr,thresholds分别值为

array([ 0. ,  0.5,  0.5,  1. ])
array([ 0.5,  0.5,  1. ,  1. ])
array([ 0.8 ,  0.4 ,  0.35,  0.1 ])

7.7.7 AUC(ROC曲线下面积)

  ROC曲线是根据与那条参照线进行比较来判断模型的好坏,但这只是一种直觉上的定性分析,如果我们需要精确一些,就要用到AUC,也就是ROC曲线下面积。其判定方法是AUC应该大于0.5。如图7所示:


图7 AUC曲线

  如上图所示,参考线的面积是0.5,ROC曲线与它偏离越大,ROC曲线就越往左上方靠拢,它下面的面积(AUC)也就越大,这里面积是0.869。我们可以根据AUC的值与0.5相比,来评估一个分类模型的预测效果。如果AUC的值达到0.80,那说明分类器分类非常准确;如果AUC值在0.60~0.80之间,那分类器有优化空间,可以通过调节参数得到更好的性能;如果AUC值小于0.60,那说明分类器模型效果比较差。
  利用刚才求得的fpr和tpr的结果作为参数,可以求得AUC的值,示例代码:

from sklearn.metrics import auc  
auc(fpr, tpr)

运行结果

0.75
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
2017年最新机器学习入门与实战精品高清全套视频教程附讲义作业(anaconda2 4.3Pytyhon2.7 jupyter) 70课 课程介绍: 从基本的软件安装到必备的Python扩展讲起,然后对机器学习算法一一讲解,同时配合编程实操的实现过程,适合零基础系统学习,配套资料包括讲义作业软件数据都有。 课程目录: 第一章Numpy前导介绍 1.1、Anconda安装 1.2、JupyterNoteBook 1.3、Numpy介绍+ndarry 1.4、ndarry的shape属性巧算 1.5、ndarray的常见创建方式 1.6、NumPy中的数据类型 1.7、NumPy数据类型2 1.8、Numpy基本操作 1.9、索引和切片 1.10、索引和切片(2) 1.11、数组转制与轴兑换 1.12、通用函数 1.13、np.where函数 1.14、np.unique函数 1.15、数组数据文件读取 第二章Pandas前导课程 2.1、Pandas介绍 2.2、Series 2.3、索引对象 2.4、DataFrame 2.5、Pandas常用操作(1) 2.6、Pandas常用操作(2) 2.7、缺失值处理 2.8、pandas制图 2.9、Matplotlib(1) 2.10、Matplotlib(2) 2.11、Matplotlib中文输出解决 第三章机器学习(一) 3.1、01机器学习定义及理性认识 3.2、02机器学习商业应用场景、机器学习分类 3.3、03机器学习开发流程 3.4、04模型评估方法和部署 3.5、05线性回归原理推倒过程 3.6、06线性回归基础认识及原理讲解 3.7、07线性回归案例分析 第四章机器学习(二) 4.1、01_线性回归案例1、正则项、梯度下降 4.2、02_梯度下降方法及回归案例分析 4.3、03_线性回归、lasso、ridge、ElasitcNet以及案例分析 4.4、04_逻辑回归原理 4.5、05_逻辑回归及案例分析 4.6、06_softmax回归及案例分析 4.7、07_综合案例分析 第五章机器学习三-决策树 5.1、01决策树、属性分割、信息增益 5.2、02信息增益的计算、模型评估、ID3、C4.5、CART_ 5.3、03决策树案例分析1 5.4、04决策树案例分析二、过拟合、剪枝分析 5.5、05bagging、随机森林、随机森林案例分析 5.6、06GBDT、Adaboost原理讲解 5.7、07Adaboost案例分析、综合案例分析 第六章机器学习四-SVM支持向量机 6.1、svm讲解 6.2、核函数 6.3、代码讲解(一) 6.4、代码讲解(二 6.5、代码讲解(三) 6.6、代码讲解(四) 第七章机器学习五-聚类分析+贝叶斯 7.1、01-聚类的相似性度量(距离公式) 7.2、02-聚类思想、kmeans聚类、kmeans聚类应用案例 7.3、03-二分kmeans、kmeans++、kmeansII、canopy、mini-batchkm 7.4、04-聚类算法的衡量指标及案例实现 7.5、05-层次聚类及实现案例 7.6、06-密度聚类 7.7、07-密度聚类案例实现、谱聚类、谱聚类案例实现 7.8、08-不同聚类效果对比实现、文本案例、图片案例 7.9、09-朴素贝叶斯原理、案例1、案例2 7.10、10-贝叶斯网络 7.11、11-贝叶斯网络拓展 第八章机器学习六-EM-HMM-LDA-ML 8.1、01.EM算法讲解 8.2、02.HMM及中文分词 8.3、03.主题模型 8.4、04.spark机器学习安装环境 8.5、05.spark机器学习离线处理及训练和使用 8.6、06.机器学习实时新闻分类

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值