当我们训练模型的时候,首先得要有数据进行训练。
我们拥有一定的数据集的时候,我们不会用所有数据去训练,因为这样我们会不知道训练出的模型的繁华能力如何,而是习惯于划分为训练数据集和测试数据集,在训练集上训练处模型,拿到测试集去做测试。而这种方式也不一定是最好的,因为,这种方式选择数据集是随机的,也许我们调的参数只是该训练集下是最优的,或许只是在特定的训练集和测试集是最有的,换了个样本集,或者是划分出的训练集就不是。

为了避免这种因样本选择带来的随机性影响,我们需要额外设置一个验证集,当模型训练完成以后,先在验证集上对模型进行评估,然后选择评估分数最高的模型,再在测试集上进行最终的测试

这是比较标准的模型评估过程,但是这也不是最优的办法。虽然验证集的设置可以有效避免测试集出现过度拟合的情况,但是现在元数据被分为 3 部分:训练集、验证集和测试集,训练集的数据量会大大减少,这可能造成训练模型的效果很差。另外,由于验证集和测试集是一次选择,所以最后的模型评估结果有很大的随机性。

于是我们便引入了交叉验证(Cross-validation)
交叉验证(Cross-validation)多次选择测试集做评估,有效避免了随机性带来的误差。而且交叉验证不需要选择验证集,这样就避免了数据的浪费,使训练集中有足够的样本数量。
交叉验证最基本的方法是 K折交叉验证(K-fold Cross Validation),原理如图

黑色是测试数据集,白色是训练数据集合。

它将原始数据分成K组(K-Fold),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型。这K个模型分别在验证集中评估结果,最后的误差MSE(Mean Squared Error)加和平均就得到交叉验证误差。

测试代码如下:
交叉验证唯一的缺点就是计算代价相对较高。实现交叉验证可以调用 Scikit 中提供的 cross_val_score 辅助函数。

from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressorboston = load_boston()  # 这里使用boston数据集
regressor = DecisionTreeRegressor(random_state=0)
res = cross_val_score(regressor, boston.data, boston.target, cv=10)  # 默认是R平方分数
print(res)
print(res.mean())  # 一般用这些模型score的平均值来作为总的k折交叉验证评价regressor2 = DecisionTreeRegressor(random_state=0)
res = cross_val_score(regressor2, boston.data, boston.target, cv=10,scoring="neg_mean_squared_error")  # 指定为负的均方差分数
print(res)
print(res.mean())  # 一般用这些模型score的平均值来作为总的k折交叉验证评价

当我们把测试数据分成10分的时候,会有10个评估分数,默认是R平方分数,可以自己指定成负的均方差。一般把这K个结果的平均值作为评估的指标。

也就是说,当我们有了一部分数据集,划分出了训练集和测试集,辛辛苦苦调了一些参数,比如超参数这些,最大深度,最小划分节点啊,评估方式啊之类的。在训练集和测试集上表现很好也可能是过拟合了,也许换了个数据集和划分集合就表现很差,为了打消这种由于样本划分导致的随机性,我们一般使用交叉验证,经过多次不同的划分,训练出多个参数模型,取它的平均值作为参数模型的衡量指标,更具有说服力。之后的博文会讲解使用交叉验证来选择最优的参数。

至于训练处的K个模型嘛,可以做一些简单的结果合成,我们可以对每个子模型做平均,取多数等操作,这样会更加稳定。如下实例:

from sklearn.datasets import load_boston
from sklearn.model_selection import cross_validate
from sklearn.tree import DecisionTreeRegressor
import numpy as npcv_N = 10
boston = load_boston()  # 这里使用boston数据集
regressor = DecisionTreeRegressor(random_state=0)
cv_results = cross_validate(estimator=regressor, X=boston.data, y=boston.target, cv=cv_N, return_estimator=True)
print(cv_results['test_score'])# print(boston.target)
result = np.zeros(len(boston.data))
for i in range(cv_N):reg = cv_results['estimator'][i]result += reg.predict(boston.data)result = result / cv_N  # 取多个模型预测的平均值
print(result - boston.target)  # 看看预测的差异,大部分应该是非常接近于0

这段代码展示了通过交叉验证得到了K个子模型,分别对数据进行预测,便可以得到一个整体评估的结果。

《scikit-learn》交叉验证相关推荐

  1. Scikit Learn: 在python中机器学习

    Warning 警告:有些没能理解的句子,我以自己的理解意译. 翻译自:Scikit Learn:Machine Learning in Python 作者: Fabian Pedregosa, Ga ...

  2. [转载]Scikit Learn: 在python中机器学习

    原址:http://my.oschina.net/u/175377/blog/84420 目录[-] Scikit Learn: 在python中机器学习 载入示例数据 一个改变数据集大小的示例:数码 ...

  3. 【时间序列】时间序列中如何进行交叉验证

    前言 交叉验证是帮助机器学习模型选择最优超参数的有用程序.它对于较小的数据集特别有用,因为这些数据集没有足够的数据来创建具有代表性的训练集.验证集和测试集. 简单地说,交叉验证将单个训练数据集拆分为训 ...

  4. scikit - learn 做文本分类

    文章来源: https://my.oschina.net/u/175377/blog/84420 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的句子,我以自 ...

  5. 11_模型的选择与调优,交叉验证,超参数搜索-网格搜索sklearn.model_selection.GridSearchCV

    1.交叉验证 交叉验证:为了让被评估的模型更加准确可信. 交叉验证:将拿到的数据,分为训练和验证集.以下图为例:将数据分成5份,其中一份作为验证集.然后经过5次(组)的测试,每次都更换不同的验证集.即 ...

  6. 遭遇棘手 交接_Librosa的城市声音分类-棘手的交叉验证

    遭遇棘手 交接 大纲 (Outline) The goal of this post is two-fold: 这篇文章的目标有两个: I'll show an example of implemen ...

  7. graphviz python_python中使用scikit-learn和pandas决策树进行iris鸢尾花数据分类建模交叉验证...

    原文链接: http://tecdat.cn/?p=9326​tecdat.cn 在这篇文章中,我将使用python中的决策树(用于分类).重点将放在基础知识和对最终决策树的理解上. 导入 因此,首先 ...

  8. 机器学习之路——KNN+交叉验证

    KNN分类模型 概念: 简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类(k-Nearest Neighbor,KNN) k值的作用 欧几里得距离(Euclidean Distance) ...

  9. python kfold交叉验证_Scikit Learn-使用KFold交叉验证的决策树

    我对scikit学习/机器学习比较陌生 . 我必须使用Titanic数据集创建决策树,并且需要使用5倍的KFold交叉验证 . 这是我到目前为止所拥有的: cv = KFold(n_splits=5) ...

最新文章

  1. OpenSSH7.0兼容性测试报告
  2. 16 个写代码的好习惯
  3. python界面开发pyqt_Python2.7+PyQt4进行界面开发
  4. mysql使用CONCAT()函数拼接字符串
  5. 万字长文剖析 APM 系统?如何设计与实现?
  6. 求最大公约数问题(信息学奥赛一本通-T1207)
  7. FreeMarker 日期转换
  8. POJ3159-Candies
  9. Android APK系列5-------修改APK中的内容
  10. (转)大多数2B企业一文不值(作者:北冥乘海生)
  11. 使用链接时间代码生成
  12. vector_capl
  13. 刘汝佳Dijkstra模板
  14. 怎么在gif表情包上添加文字?
  15. SpringBoot和Hprose集成开发
  16. Markdown博客系统的搭建与使用
  17. 云仓一件代发模式与即时分账,会碰撞出什么火花?
  18. 什么是差模干扰、共摸干扰?
  19. 02 离线安装管理ceph图形化界面calamari
  20. 【算法上车②】编译打包华为摄像头yolov3 狗识别demo

热门文章

  1. PHP安装imagemagick扩展imagick
  2. 【原创】线上环境 SYN flooding 问题排查
  3. Winform中用了皮肤控件之后,报错:容量超出了最大容量 参数名:capacity
  4. python logging简单使用
  5. 运用Axure6.5快速完成微信交互效果的简单办法
  6. 一起学习linux之lamp脚本
  7. 类与类关系的UML图与代码表现
  8. System.Collections深入探讨--如何创建自定义的集合类
  9. Java 9 中的 9 个新特性
  10. 【记录】jenkins 安装及环境配置(二)