ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

评价模型的好坏

2019-11-17 23:03:38  阅读:314  来源: 互联网

标签:AUC 预测 阈值 模型 TPR test 评价 好坏 sklearn


目录:

一、数据拆分:训练数据集&测试数据集

二、评价回归结果:分类准确度、混淆矩阵、精准率、召回率、F1、ROC等

三、评价回归结果:MSE、RMSE、MAE、RSquared


 

一、数据拆分:训练数据集&测试数据集

顾名思义,训练数据集即为用于训练模型的子集。测试数据集即为 用于测试训练后模型的子集。

一般情况下对整个数据集按照0.8:0.2的比例进行拆分,但是如果遇到特殊情况:如有顺序的数据集,我们可以先打乱再进行拆分。

方法一:将X和y合并为同一个矩阵,然后对矩阵进行shuffle,之后再分解

方法二:对y的索引进行乱序,根据索引确定与X的对应关系,最后再通过乱序的索引进行赋值。

对于拆分数据集,sklearn中的train_test_split可以帮助我们做到。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

 

二、评价回归结果

分类准确度:

在划分出测试数据集后,我们就可以验证其模型准确率了。在这了引出一个非常简单且常用的概念:accuracy(分类准确度)

  • accuracy_score:函数计算分类准确率,返回被正确分类的样本比例(default)或者是数量(normalize=False) 在多标签分类问题中,该函数返回子集的准确率,对于一个给定的多标签样本,如果预测得到的标签集合与该样本真正的标签集合严格吻合,则subset accuracy =1.0否则是0.0

因accuracy定义清洗、计算方法简单,因此经常被使用。但是它在某些情况下并不一定是评估模型的最佳工具。精度(查准率)和召回率(查全率)等指标对衡量机器学习的模型性能在某些场合下要比accuracy更好。

#sklearn中的准确度
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train, y_train)
y_predict = knn_clf.predict(X_test)
accuracy_score(y_test, y_predict)

# 不看y_predict
knn_clf.score(X_test,y_test)

混淆矩阵:

对于二分类问题来说,所有的问题被分为0和1两类,混淆矩阵是2*2的矩阵:

* TN:真实值是0,预测值也是0,即我们预测是negative,预测正确了。
* FP:真实值是0,预测值是1,即我们预测是positive,但是预测错误了。
* FN:真实值是1,预测值是0,即我们预测是negative,但预测错误了。
* TP:真实值是1,预测值是1,即我们预测是positive,预测正确了。

from sklearn.metrics import confusion_matrix

confusion_matrix(y_test, y_log_predict)

 

精准率: 即精准率为8/(8+12)=40%。所谓的精准率是:分母为所有预测为1的个数,分子是其中预测对了的个数,即预测值为1,且预测对了的比例

_auto_0

为什么管它叫精准率呢?在有偏的数据中,我们通常更关注值为1的特征,比如“患病”,比如“有风险”。在100次结果为患病的预测,平均有40次预测是对的。即精准率为我们关注的那个事件,预测的有多准

from sklearn.metrics import precision_score

precision_score(y_test, y_log_predict)

 

召回率:即精准率为8/(8+2)=80%。所谓召回率是:所有真实值为1的数据中,预测对了的个数。每当有100个癌症患者,算法可以成功的预测出8个 。也就是我们关注的那个事件真实的发生情况下,我们成功预测的比例是多少

_auto_0

from sklearn.metrics import recall_score

recall_score(y_test, y_log_predict)

F1 Score:

如果要我们综合精准率和召回率这两个指标,我们可能会想到取平均值这样的方法。F1 Score的思想也差不多: F1 Score 是精准率和召回率的调和平均值_auto_0

什么是调和平均值?为什么要取调和平均值?调和平均值的特点是如果二者极度不平衡,如某一个值特别高、另一个值特别低时,得到的F1 Score值也特别低;只有二者都非常高,F1才会高。这样才符合我们对精准率和召回率的衡量标准。_auto_1

 

ROC曲线

 

在了解ROC曲线之前,先看三个概念:分类阈值、TPR和FPR

分类阈值,即设置判断样本为正例的阈值thr,

如果某个逻辑回归模型对某封电子邮件进行预测时返回的概率为 0.9995,则表示该模型预测这封邮件非常可能是垃圾邮件。相反,在同一个逻辑回归模型中预测分数为 0.0003 的另一封电子邮件很可能不是垃圾邮件。可如果某封电子邮件的预测分数为 0.6 呢?为了将逻辑回归值映射到二元类别,您必须指定分类阈值(也称为判定阈值)。如果值高于该阈值,则表示“垃圾邮件”;如果值低于该阈值,则表示“非垃圾邮件”。人们往往会认为分类阈值应始终为 0.5,但阈值取决于具体问题,因此您必须对其进行调整。

在sklearn中有一个方法叫:decision_function,即返回分类阈值

 

TPR:预测为1,且预测对了的数量,占真实值为1的数据百分比。很好理解,就是召回率_auto_0

 

FPR:预测为1,但预测错了的数量,占真实值不为1的数据百分比。与TPR相对应,FPR除以真实值为0的这一行所有的数字和 。_auto_0

TPR和FPR之间是成正比的,TPR高,FPR也高。ROC曲线就是刻画这两个指标之间的关系。

 

ROC曲线

ROC曲线(Receiver Operation Characteristic Cureve),描述TPR和FPR之间的关系。x轴是FPR,y轴是TPR。

我们已经知道,TPR就是所有正例中,有多少被正确地判定为正;FPR是所有负例中,有多少被错误地判定为正。 分类阈值取不同值,TPR和FPR的计算结果也不同,最理想情况下,我们希望所有正例 & 负例 都被成功预测 TPR=1,FPR=0,即 所有的正例预测值 > 所有的负例预测值,此时阈值取最小正例预测值与最大负例预测值之间的值即可。

TPR越大越好,FPR越小越好,但这两个指标通常是矛盾的。为了增大TPR,可以预测更多的样本为正例,与此同时也增加了更多负例被误判为正例的情况。

from sklearn.metrics import roc_curve

fprs, tprs, thresholds = roc_curve(y_test, decision_scores)
plt.plot(fprs, tprs)
plt.show()

 

 

AUC

一般在ROC曲线中,我们关注是曲线下面的面积, 称为AUC(Area Under Curve)。这个AUC是横轴范围(0,1 ),纵轴是(0,1)所以总面积是小于1的。

ROC和AUC的主要应用:比较两个模型哪个好?主要通过AUC能够直观看出来。

ROC曲线下方由梯形组成,矩形可以看成特征的梯形。因此,AUC的面积可以这样算:(上底+下底)* 高 / 2,曲线下面的面积可以由多个梯形面积叠加得到。AUC越大,分类器分类效果越好。

  • AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  • AUC = 0.5,跟随机猜测一样,模型没有预测价值。
  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

可以在sklearn中求出AUC值

from sklearn.metrics import roc_auc_score
roc_auc_score(y_test, decision_scores)

三、评价回归结果

待补充


 

参考链接:公众号数据科学家联盟文章

 

标签:AUC,预测,阈值,模型,TPR,test,评价,好坏,sklearn
来源: https://www.cnblogs.com/zym-yc/p/11879059.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有