python实现交叉验证_kfold显示不可迭代

python实现交叉验证_kfold显示不可迭代KFold模块fromsklearn.model_selectionimportKFold为什么要使用交叉验证?交叉验证的介绍交叉验证是在机器学习建立模型和验证模型参数时常用的办法。交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

KFold模块

from sklearn.model_selection import KFold

为什么要使用交叉验证?交叉验证的介绍

交叉验证是在机器学习建立模型和验证模型参数时常用的办法。 交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。

那么什么时候才需要交叉验证呢?交叉验证用在数据不是很充足的时候。它的基本想法就是重复地使用数据:把给定的数据进行切分,将切分的数据集组合为训练集和测试集,在此基础上反复地进行训练、测试以及模型选择。 比如在我日常项目里面,对于普通适中问题,如果数据样本量小于一万条,我们就会采用交叉验证来训练优化选择模型。如果样本大于一万条的话,我们一般随机的把数据分成三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型再用于测试集,最终决定使用哪个模型以及对应参数。

交叉验证的目的是为了能有效地估计模型的泛化能力 (测试误差),从而进行模型选择。 评估模型,然后通过的出来的准确率,我们再进行模型选择。

K折交叉验证原理

这便是交叉验证的过程:

1、首先随机地将数据集切分为 k 个互不相交的大小相同的子集;

2、然后将 k-1 个子集当成训练集训练模型,剩下的 (held out) 一个子集当测试集测试模型;

3、将上一步对可能的 k 种选择重复进行 (每次挑一个不同的子集做测试集);

4、在每个训练集上训练后得到一个模型,用这个模型在相应的测试集上测试,计算并保存模型的评估指标,

5、这样就训练了 k 个模型,每个模型都在相应的测试集上计算测试误差,得到了 k 个测试误差。

对这 k 次的测试误差取平均便得到一个交叉验证误差,并作为当前 k 折交叉验证下模型的性能指标。

在模型选择时,假设模型有许多可以调整的参数可供调参,一组可以调整的参数便确定一个模型,计算其交叉验证误差,最后选择使得交叉验证误差最小的那一组的调整参数。这便是模型选择过程。

简而言之,就是我们通过交叉验证验证不同的模型,或者不同的参数组合,最终我们选择准确度高的作为我们的模型。

k 一般大于等于2,实际操作时一般从3开始取,只有在原始数据集样本数量小的时候才会尝试取2。

k折交叉验证可以有效的避免过拟合以及欠拟合状态的发生,最后得到的结果也比较具有说服性。

k折交叉验证最大的优点:

所有数据都会参与到训练和预测中,有效避免过拟合,充分体现了交叉的思想

交叉验证可能存在 bias 或者 variance。如果我们提高切分的数量 k,variance 会上升但 bias 可能会下降。相反得,如果降低 k,bias 可能会上升但 variance 会下降。bias-variance tradeoff 是一个有趣的问题,我们希望模型的 bias 和 variance 都很低,但有时候做不到,只好权衡利弊,选取他们二者的平衡点。

通常使用10折交叉验证,当然这也取决于训练数据的样本数量。

当我们的数据集小时,我们的数据无法满足模型的复杂度就会过拟合,使用交叉验证我们可以重复地使用数据:把给定的数据进行切分,将切分的数据集组合为训练集和测试集,在此基础上反复地进行训练、测试以及模型选择。相当于我们增加了我们的数据量(防止过拟合)。最后得到我们模型的准确率(性能)。

pipeline的流程案例-代码解释:

from sklearn.preprocessing import StandardScaler

from sklearn.decomposition import PCA

from sklearn.linear_model import LogisticRegression

from sklearn.pipeline import Pipeline

pipe_lr = Pipeline([(‘sc’, StandardScaler()),

(‘pca’, PCA(n_components=2)),

(‘clf’, LogisticRegression(random_state=1))

])

pipe_lr.fit(X_train, y_train)

print(‘Test accuracy: %.3f’ % pipe_lr.score(X_test, y_test))

Pipeline执行流程的分析

pipeline 的中间过程由scikit-learn相适配的转换器(transformer)构成,最后一步是一个estimator。

比如上述的代码,StandardScaler和PCA transformer 构成intermediate steps,LogisticRegression 作为最终的estimator。

当我们执行 pipe_lr.fit(X_train, y_train)时,首先由StandardScaler在训练集上执行 fit和transform方法,transformed后的数据又被传递给Pipeline对象的下一步,也即PCA()。和StandardScaler一样,PCA也是执行fit和transform方法,最终将转换后的数据传递给 LosigsticRegression。

from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import GridSearchCV

from sklearn.datasets import load_iris

from sklearn.pipeline import Pipeline

from sklearn.preprocessing import StandardScaler

# 创建随机森林模型

rf=RandomForestClassifier()

# 加载数据

data=load_iris()

# 定义参数调优的范围,randomforestclassifier__n_estimators __前面定义的是名字,后面定义的内容是参数

parameters={“randomforestclassifier__n_estimators”:range(1,11),

“randomforestclassifier__max_depth”:range(1,5)}

# 定义pipeline 流水线

pipeline=Pipeline([

(‘scaler’,StandardScaler()),

(‘randomforestclassifier’,rf)

])

# 使用GridSearchCV 进行参数调优

clf=GridSearchCV(estimator=pipeline,param_grid=parameters,cv=6)

# 进行数据集分类

clf.fit(data.data,data.target)

# 打印最优分数 给出不同参数情况下的评价结果

print(“最优分数:%.4lf”%clf.best_score_)

# 打印最优参数 描述了已取得最佳结果的参数的组合

print(“最优参数:%s”%clf.best_params_)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191426.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月1日 下午2:22
下一篇 2026年2月1日 下午3:01


相关推荐

  • Nano-Banana小白教程:从零开始制作说明书风格分解图

    Nano-Banana小白教程:从零开始制作说明书风格分解图

    2026年3月15日
    2
  • html渐变色CSS3 渐变_css3做渐变

    html渐变色CSS3 渐变_css3做渐变linear-gradient常用来制作渐变,如(色彩渣,我就随便找个颜色举例)css代码如下background:linear-gradient(45deg,#ff00000%,#ffb60011%,#fff60022%,#a5ff0033%,#00a9ff44%,#0400ff55%,#8a00fc66%,#ff00e977%,#ff005988%,#ff0000100%…

    2025年6月23日
    4
  • ajax例子详解_mapreduce实例解析

    ajax例子详解_mapreduce实例解析jQueryAjax实例全解析 jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到).

    2022年8月16日
    8
  • [数学建模] 大数据建模五步法「建议收藏」

    [数学建模] 大数据建模五步法「建议收藏」目录传送门概要第一步:选择模型或自定义模式第二步:训练模型第三步:评估模型第四步:应用模型第五步:优化模型最后语概要PS:本文转载自https://www.sohu.com/a/198093510_783844本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。第一步:选择模型或自定义模式这是建模的第一步,我们需要基于业务问题,来决定可以选择哪些可用的模型。比如,如果要预测产品销量,则可以选择数值预测模型(比如回归模型,时序预测……);如果要预测员工是否离职,则可以选择分类模型(比

    2022年6月9日
    78
  • MybatisCodeHelperNew-2.9.4-SNAPSHOT-183-204激活码【2022最新】2022.01.18

    (MybatisCodeHelperNew-2.9.4-SNAPSHOT-183-204激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    273
  • 数组截取方法-Arrays.copyOfRange()详解[通俗易懂]

    数组截取方法-Arrays.copyOfRange()详解[通俗易懂]Arrays.copyOfRange();publicstatic<T>T[]copyOfRange(T[]original,intfrom,intto){returncopyOfRange(original,from,to,(Class<?extendsT[]>)original.getClass());}入参:数组,开始下标,结束下标反参:数组功能描述:将一个原始的数组original,从下标from开始复制,复制到

    2022年5月20日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号