周志华西瓜书学习笔记----模型评估与选择



一、过拟合

在机器学习中过拟合是不可避免的,每种学习算法都有降低过拟合可能性的方法,例如决策树中可以通过限制树的层数和剪枝等方法降低过拟合。
请添加图片描述
直观来说,过拟合是学习能力太强,导致模型得到了较小数据集(训练集)中的特殊特征(不一般化的特征,由随机选取的训练集数据决定),也就是图中的锯齿。
请添加图片描述
从模型的角度出发,上图是一个线性回归模型,用来预测连续的值。左侧使用直线得到的结果是欠拟合的,右侧是关于x的5次方的曲线,它完美通过了所有训练集中的点,但是这条线的最左侧和最右侧趋近于无穷,可以想象如果测试集中的点不出现在中间的话会有多大的误差,这就是过拟合。

二、分割数据集得到训练集和测试集

1、留出法

留出法是将数据集分割成不相交的两个部分,多的部分作为训练集(常用0.7),少的部分作为测试集。

from sklearn.model_selection import train_test_split
Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,Y,test_size=0.3,random_state=1)

其中X,Y分别为是数据集的属性和label。

2、交叉验证法

一般来说将数据集分割成10个不相交的子集(保证这10个自己是随机抽取组成的)。然后每次取其中的9个子集作为训练集,剩下的一个作为测试集,重复10次。

三、查准率、查全率与Fl

下图为混淆矩阵
请添加图片描述

  • TP----True positive
  • TN----Ture negative
  • FP----False positive
  • FN----False negative
  • 其中的negative和positive表示预测结果为反例和正例,true和false表示预测正确与否
  • 查准率和查全率是一对矛盾的度量.一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低

使用混淆矩阵

代码如下(示例):

import pandas as pd #读取csv文件
from sklearn.preprocessing import LabelEncoder #将标签的文字格式转换成数字格式
from sklearn.model_selection import train_test_split #分割训练集,使用留出法
from sklearn import tree #引入树
from sklearn.metrics import confusion_matrix #引入混淆矩阵
from sklearn.metrics import precision_score,recall_score,f1_score

这里引入了需要使用的包


df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data',header=None)
print(df)

请添加图片描述
这是我们使用的数据集,来自网页http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/中的wdbc.data文件


X = df.loc[:,2:].values #得到第三列后的的子矩阵
Y = df.loc[:,1].values #得到第二列的label
le = LabelEncoder() #转化label格式
Y = le.fit_transform(Y)
print(Y)

Y的输出为
请添加图片描述
原始文件中的M和B转化成了0和1


Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,Y,test_size=0.3,random_state=1) #分割数据集的到训练集和测试集
clf = tree.DecisionTreeClassifier()
clf.fit(Xtrain,Ytrain)
score = clf.score(Xtest,Ytest)
print(score) #给出精确度
y_pred = clf.predict(Xtest)
confmat = confusion_matrix(Ytest,y_pred)
print(confmat) # 得到混淆矩阵

精确度为
请添加图片描述
混淆矩阵为
请添加图片描述
可以看见错误的预测有8个,总共有171个数据,则(171-8)/171 约等于0.9532


precision_score= precision_score(Ytest,y_pred)
print(precision_score)
recall_score = recall_score(Ytest,y_pred)
print(recall_score)

获得查准率和查全率,分别为0.98245和0.88888。

四、P-R曲线和ROC曲线

1、P-R曲线是这样定义的

请添加图片描述
也就是我们应该可以通过学习器获得这样的数据(?但我不清楚怎么获得),其中的score指的是某一个样本为正例的可能。
请添加图片描述

2、ROC曲线

ROC曲线也是基于上述的表格,我们不断选择阈值(threshold),例如0.85,那么大于0.85的样本应该是例,小于0.85的样本应该是反例。也就是,2、4、5、6、9等样本预测错误,这样我们就获得了一个混淆矩阵。 请添加图片描述
TPR是“真正例率”,FPR是"假正例率" 。
请添加图片描述

五、代价敏感错误率与代价曲线

之前我们提到了查准率和查全率是互斥的,此消彼长,那么在特殊情况下我们可以牺牲一方来获得更加优秀的另一方。在混淆矩阵中,FP指预测结果为正例但是预测错误,即反例预测成正例;FN指预测结果为反例但是预测错误,即正例预测成反例。
举个例子,若医院诊断癌症使用一种模型,阳性为正例,阴性为反例。这个模型应该尽可能减小FN,即增加查准率,因为如果患者身患癌症却没有诊断出来,那么这就是一起医疗事故(患者之后可能死亡)。为了减小查准率,我们可以容忍较低的查准率,因为即使患者没有癌症而被诊断出身患癌症,后续无非就是进一步进行检查。

六、假设检验

1、如果我们只有一个学习器:

其中μ是多个测试误差率的均值,泛化错误率为E0,σ是标准差,K是测试误差数目。
请添加图片描述

2、如果我们有多个学习器:

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python学习笔记》是由皮大庆编写的一本关于Python语言学习的教材。在这本书中,作者详细介绍了Python语言的基础知识、语法规则以及常用的编程技巧。 首先,作者简要介绍了Python语言的特点和优势。他提到,Python是一种易于学习和使用的编程语言,受到了广大程序员的喜爱。Python具有简洁、清晰的语法结构,使得代码可读性极高,同时也提供了丰富的库和模块,能够快速实现各种功能。 接着,作者详细讲解了Python的基本语法。他从变量、数据类型、运算符等基础知识开始,逐步介绍了条件语句、循环控制、函数、模块等高级概念。同时,作者通过大量的示例代码和实践案例,帮助读者加深对Python编程的理解和应用。 在书中,作者还特别强调了编写规范和良好的编程习惯。他从命名规范、注释风格、代码缩进等方面指导读者如何写出清晰、可读性强的Python代码。作者认为,良好的编程习惯对于提高代码质量和提高工作效率非常重要。 此外,作者还介绍了Python的常用库和模块。他提到了一些常用的库,如Numpy、Pandas、Matplotlib等。这些库在数据处理、科学计算、可视化等领域有广泛的应用,帮助读者更好地解决实际问题。 总的来说,《Python学习笔记》是一本非常实用和全面的Python学习教材。通过学习这本书,读者可以系统地学习和掌握Python编程的基础知识和高级应用技巧,为以后的编程学习和工作打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值