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


相关推荐

  • tfrecord文件生成与读取

    tfrecord文件生成与读取参考博客 tensorflow TFRecord 文件详解 1 生成 tfrecord 文件代码 1 创建 tfrecord 对象 tf record tf python io TFRecordWrit tf record name tf train Int64List value list data tf train FloatList tf train BytesList tf train Feature int64 list tf train Feature float l

    2026年3月17日
    2
  • 路由器5g启用视频网络_聚合路由器是什么

    路由器5g启用视频网络_聚合路由器是什么5G版聚合路由器加速释放超高清视频传输应用随着物联网5G商用步伐的加速和5G网络建设的突飞猛进,2022年无疑成为5G向千行百业拓展落地的关键之年。作为“新基建”的领头羊,5G已凝聚产业链力量,蓄势待发为行业的智能化和数字化转型赋能,为新一轮经济增长提速。作为5G技术在超高清视频传输领域应用的领先代表,推出了最新一代5G高速物联网QYT-X1S聚合路由器,可支持构建点对点安全传输链路,支持移动/联通/电信混用,实现多达7条2G/3G/4G/5G/卫星、有线聚合,成为5G应用落地的重点项目之一。5G要

    2022年10月4日
    6
  • hdu4336 Card Collector 概率dp(或容斥原理?)

    hdu4336 Card Collector 概率dp(或容斥原理?)

    2021年8月25日
    66
  • js获取request中的值_set协议工作原理

    js获取request中的值_set协议工作原理设置http请求头HttpURLConnection.setRequestProperty(Stringkey,Stringvalue); 这个我居然都忘记了,哎~真是岁数大了,心好累。。。 例如:下面就是一个完整的原始网络请求方式HttpURLConnectionconn=null;try{…

    2025年10月23日
    3
  • 数位DP,看这一篇就足够了!

    数位DP,看这一篇就足够了!数位 DP 用来解决什么问题 我们有时候会遇到这样一类题目 给你一个区间 l r 找区间上符合某种特定要求的数的个数 这个要求可能很简单 很好理解 但是由于区间范围太大 以至于对每个数进行遍历判别是不太可能的 对于这种情况 就需要用数位 DP 来解决了 朴素解法

    2026年3月17日
    2
  • QString与char *的相互转换

    QString与char *的相互转换在进行编程时,我们经常需要用到字符串这种类型,毫无疑问,Qt库中也对字符串类型进行了封装,QString类提供了你能想到的所有字符串操作方法,给开发者带来了极大方便。  但是我们在编写程序时,不可避免地会在Qt框架上使用第三方的开源库,由于库的类型基本上都是标准的类型,即使用char*来表示字符串类型。那么问题来了,QString和char*之间如何进行转换呢?  下面分两

    2022年5月12日
    35

发表回复

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

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