《Python机器学习基础教程 》笔记-第5章

github地址:点我

交叉验证

我们知道用训练集fit模型,用测试集验证泛化能力的套路。

单次划分数据集并不稳定和全面,因此我们需要对数据集进行多次划分,训练多个模型进行综合评估,这叫”交叉验证”。

K折交叉

最常见的就是”K折交叉验证”,将数据均匀划分成K份,每次用1份做测试集,剩余做训练集。

上述数据集分成3折,训练了3次模型,得到了3个精度,以及平均精度。

分层K折交叉

K折交叉划分数据的方式是从头开始均分成K份,如果样本数据的分类分布不均匀,那么就会导致K折交叉策略失效,比如:

显然样本数据的分类没有打散,可能测试集全是分类2,而训练集里压根没出现过分类2.

sklearn会根据模型是回归还是分类决定使用标准K折还是分层K折,不需我们关心,只需要了解。

其他策略

K折还有其他策略,通过cv参数控制即可,比如:留1验证。

通过cv参数控制策略,ShuffleSplit是运行10次,每次随机抽取50%的为训练集,50%的为测试集。

网格搜索

利用网格搜索,实现模型的自动化调参,找到最佳泛化性能的参数。

带交叉验证的网格搜索

实际上,X_train数据会被网格进一步切分成2部分,一部分是训练集、一部分是验证集。

最终,我们还是基于测试集X_test来看模型对于未知数据的泛化能力。

交叉验证+网格搜索的嵌套

可以采用先交叉划分数据集,再进行K折网格搜索,这就是嵌套的意思。

主要用来评估一下网格搜索到的最佳参数可以达到的最好泛化精度:

评估指标与评分

牢记最终目标

精度不是唯一目标,我们需要考虑商业指标,对商业的影响。

二分类指标

2分类一共有2种类型,一种称为正类(positive),一种称为反类(negative)。

根据样本分类与模型预测分类,可以产生4种组合:

  • TP:预测是正类,样本是正类
  • FP:预测是正类,样本是反类
  • TN:预测是反类,样本是反类
  • FN:预测是反类,样本是正类

混淆矩阵根据预测结果以及样本,统计出了TP,FP,TN,FN。

其分布如下:

score()精度就是预测的正确率:

精确率是预测为正类中有多少真的是正类:

精确率可以避免浪费,比如正类表示项目值得投资100万美元,如果把太多反类的预测为正类,那么就会让很多钱投资失败。

精确率的商业目标就是限制假正例的数量,可能因为假正例会带来很严重的影响。

召回率是有多少正类样本被预测为正类:

精确率和召回率是矛盾的,如果模型预测所有都是正类,那么召回率就是100%;此时,就会出现很多假正类,精确率就很差。

因此需要综合2个指标进行折衷,就是f1-分数:

精确度、召回率、f1-score比精度更具备商业指导价值。

我们可以打印出所有评估指标:

分别打印了反类和正类的准确率、召回率、f1-score指标,根据我们期望的商业指标,可以看出模型对正类与反类的表现如何。

接下来书中也提到,分类器大多提供predict_proba方法,分类器实际是通过每种分类的概率决定分类的,我们可以调整阈值来影响模型结果,进而影响到不同分类的指标,可以通过模型绘制出不同阈值下模型的精确率、召回率表现,感觉有点晦涩就不展开了。

多分类指标

用分类报告来观察各个分类的指标就很不错:

每个分类都可以看到其精确率、召回率、f1-score。

回归指标

对于回归问题来说,使用score方法评估即可,因为他没有分类的正反问题。

score底层使用的是R^2,它是评估回归模型的很好的指标。

模型选择中使用其他评估指标

网格搜索评估最佳模型参数默认是基于精度评判的,我们可以指定基于其他指标(精确度、召回率、f1)。

网格搜索以f1-score为依据找到了最佳参数,并且我们看到模型在测试集上的f1-score表现的确非常好。

K折交叉验证也是一样的,可以指定K折输出的评估指标,默认是精度。

总结

本章涉及:

  • 交叉验证
  • 网格搜索
  • 评估指标

在网格搜索中,数据分成3份:

  • 训练集:生成模型
  • 验证集:搜索参数
  • 测试集:模型评估

在实施网格搜索时,先切分train和test,再将train交给网格搜索进行参数搜索,网格搜索会在内部切分数据为训练集和验证集。

机器学习的目标一般不是构建一个高精度的模型,而是评估商业指标,例如:精确率与召回率。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~