文章目录

  • 1、什么是K折交叉验证
  • 2、为什么要引入K折交叉验证
  • 3、如何实现K折交叉验证
    • 3.1 导入必要的包:
    • 3.2 导入iris数据集并预处理
    • 3.3 设置KFold参数
    • 3.4 调参,寻找相对最优
    • 3.5 将最佳参数训练模型并查看结果
  • 4、分层交叉验证
  • 5、重复交叉验证
  • 6、参考文献

1、什么是K折交叉验证

定义:将训练集分成K份,每次用其中一份做测试集,其余的k-1份作为训练集,循环k次,取每次训练结果的平均值作为评分。
classsklearn.model_selection.KFold(n_splits=5,∗,shuffle=False,random_state=None)class sklearn.model\_selection.KFold(n\_splits=5, *, shuffle=False, random\_state=None) classsklearn.model_selection.KFold(n_splits=5,∗,shuffle=False,random_state=None)

n_splits:将训练集分成几份,一般设成10
shuffle:分数据的时候是否将原数据打乱,default=False
random_state:随机生成的种子

2、为什么要引入K折交叉验证

我们训练模型的时候,需要将一部分数据预留出来作为测试集,在某种程度上我们的数据集损失了一部分,为了充分利用这部分的数据集,那么我们引入的K折交叉验证起到了很好的作用。

3、如何实现K折交叉验证

这里我使用的是sklearn自带的iris数据集,和支持向量机SVC模型,当然,也可以用其他的分类器。另外,sklearn库为我们提供了能直接观察k折交叉验证以后的模型评分的方法cross_val_scorecross\_val\_scorecross_val_score
sklearn.model_selection.cross_val_score(estimator,X,y=None,∗,groups=None,scoring=None,cv=None,n_jobs=None,verbose=0,fit_params=None,pre_dispatch=′2∗n_jobs′,error_score=nan)sklearn.model\_selection.cross\_val\_score(estimator, X, y=None, *, groups=None, scoring=None, cv=None, n\_jobs=None, verbose=0, fit\_params=None, pre\_dispatch='2*n\_jobs', error\_score=nan) sklearn.model_selection.cross_val_score(estimator,X,y=None,∗,groups=None,scoring=None,cv=None,n_jobs=None,verbose=0,fit_params=None,pre_dispatch=′2∗n_jobs′,error_score=nan)

params:
estimator: 分类器
X:特征值
y:目标值
scoring:模型评价方式
cv:验证策略,默认使用5折交叉验证,int,用于指定(Stratified)KFold的折数,如果是分类器,则使用StratifiedKFold,其他一律使用KFold
n_jobs:等于-1时,调用所有处理器工作

returns:
每次交叉验证的得分数组,一般使用corss_val_score().mean()直接查看数组的平均值

步骤如下:

3.1 导入必要的包:

from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import KFold,train_test_split,cross_val_score
from sklearn.preprocessing import StandardScaler
import math

3.2 导入iris数据集并预处理

iris = load_iris()
X = iris.data
y = iris.target
std = StandardScaler()
X = std.fit_transform(X)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.33,random_state=0)

3.3 设置KFold参数

KF = KFold(n_splits=10,random_state=7,shuffle=True)

3.4 调参,寻找相对最优

indexi = -1
indexj = -1
indexk = -1
bestscore = -1for i in range(5, -18, -2):for j in range(-3, 18, 2):g = math.pow(3,i)c = math.pow(3,j)clf = SVC(C=c,gamma=g,kernel='rbf',probability=True,random_state=7)score = cross_val_score(clf,X_train,y_train,cv=KF,scoring='accuracy',n_jobs=-1).mean()if score > bestscore:indexi = iindexj = jbestscore = scoreprint(indexi,indexj,bestscore)

3.5 将最佳参数训练模型并查看结果

g = math.pow(3,indexi)
c = math.pow(3,indexj)
clf = SVC(C=c,gamma=g,kernel='rbf',probability=True,random_state=7)
clf.fit(X_train,y_train)
print(clf.score(X_test,y_test))

附件:
完整代码:

from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import KFold,train_test_split,cross_val_score
from sklearn.preprocessing import StandardScaler
import mathiris = load_iris()
X = iris.data
y = iris.target
std = StandardScaler()
X = std.fit_transform(X)X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.33,random_state=0)KF = KFold(n_splits=10,random_state=7,shuffle=True)
indexi = -1
indexj = -1
indexk = -1
bestscore = -1for i in range(5, -18, -2):for j in range(-3, 18, 2):g = math.pow(3,i)c = math.pow(3,j)clf = SVC(C=c,gamma=g,kernel='rbf',probability=True,random_state=7)score = cross_val_score(clf,X_train,y_train,cv=KF,scoring='accuracy',n_jobs=-1).mean()if score > bestscore:indexi = iindexj = jbestscore = scoreprint(indexi,indexj,bestscore)g = math.pow(3,indexi)
c = math.pow(3,indexj)
clf = SVC(C=c,gamma=g,kernel='rbf',probability=True,random_state=7)
clf.fit(X_train,y_train)
print(clf.score(X_test,y_test))

4、分层交叉验证

分层交叉验证主要针对二分类问题
下图是标准交叉验证和分层交叉验证的区别

核心代码为:

from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5,shuffle=True,random_state=0)
#在cross_val_score参数中cv赋为skf就是了

5、重复交叉验证

如果训练集不能很好地代表整个样本总体,分层交叉验证就没有意义了。这时候,可以使用重复交叉验证。

核心代码为:

from sklearn.model_selection import RepeatedKFoldrkf = RepeatedKFold(n_splits=5,n_repeats=2,random_state=0)

6、参考文献

https://blog.csdn.net/Softdiamonds/article/details/80062638
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html?highlight=cross_val_score#sklearn.model_selection.cross_val_score
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html
https://blog.csdn.net/weixin_39183369/article/details/78953653
https://scikit-learn.org.cn/view/663.html
https://blog.csdn.net/WHYbeHERE/article/details/108192957#t9

(5)机器学习_K折交叉验证(iris数据集实例)相关推荐

  1. 5折交叉验证_数据集的划分——交叉验证法

    本文作者:王 歌 文字编辑:戴 雯 技术总编:张 邯 前面我们在举例时,通常是将所使用的数据集按照75%和25%的比例划分为训练集和测试集,这主要是为了我们举例方便,同时划分后的数据量也依然符合大样本 ...

  2. 机器学习--K折交叉验证(K-fold cross validation)

    K 折交叉验证(K-flod cross validation) 当样本数据不充足时,为了选择更好的模型,可以采用交叉验证方法. 基本思想:把给定的数据进行划分,将划分得到的数据集组合为训练集与测试集 ...

  3. k折交叉验证优缺点_k折交叉验证(R语言)

    "机器学习中需要把数据分为训练集和测试集,因此如何划分训练集和测试集就成为影响模型效果的重要因素.本文介绍一种常用的划分最优训练集和测试集的方法--k折交叉验证." k折交叉验证 ...

  4. 十折交叉验证pythoniris_数据集的划分——交叉验证法

    本文作者:王 歌 文字编辑:戴 雯 技术总编:张 邯Python云端培训课程火热招生中~重大通知!!!爬虫俱乐部于2020年7月11日至14日在线上举行为期四天的Stata编程技术定制培训,招生工作已 ...

  5. k折交叉验证python代码_K折交叉验证法原理及python实现

    本文为原创文章,转载请注明出处! 在训练数据的过程或者参加数据比赛的时候,常常会遇到数据量不够大的情况,在一次比赛过程我学到一个小技巧-K折交叉验证法(k-fold CrossValidation), ...

  6. 5折交叉验证_[Machine Learning] 模型评估——交叉验证/K折交叉验证

    首先区分两个概念:'模型评估' 与 '模型性能度量' 模型评估:这里强调的是如何划分和利用数据,对模型学习能力的评估,重点在数据的划分方法. Keywords: 划分.利用数据 模型性能度量:是在研究 ...

  7. python k折交叉验证,python中sklearnk折交叉验证

    python中sklearnk折交叉验证 发布时间:2018-06-10 11:09, 浏览次数:492 , 标签: python sklearnk 1.模型验证回顾 进行模型验证的一个重要目的是要选 ...

  8. 机器学习笔记:交叉验证

    1 交叉验证 训练集拆分成训练集和验证集 训练集训练模型,验证集选择模型(选择好的模型可以用训练集+验证集再训练一次) 不能再用测试集返回来训练模型!(这样可能导致模型过拟合,反而不准) 2 n折交叉 ...

  9. k折交叉验证(原理+python实现)

    交叉验证用于数据集的数据量不充足情况,将数据集分成训练集.验证集.测试集. k折交叉验证,将数据集先分为训练集与测试集,再把训练集分成k份(大小相等).其中,k-1份作为训练集训练模型,剩下的1份作为 ...

  10. 《机器学习》课后习题 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率.

    参考了han同学的答案,数据集也可在han同学的github上下载. 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率. import numpy as n ...

最新文章

  1. ArcEngine中的缩放地图
  2. 旷视5号员工陈可卿:1991生于绍兴、10岁买电脑改变命运,信息奥赛金牌保送清华...
  3. oracle表分区详解
  4. 批量ping 查看主机能否ping通,能否ssh上.md,
  5. 面向对象的程序设计-模块二课程总结
  6. [实验手册]MPLS/×××分解:防止PE-CE的路由环路
  7. 为什么c++要“在头文件中声明,在源文件中定义”?
  8. LEFT OUTER JOIN
  9. postman构造post请求用于接口测试
  10. DELPHI导出wps报错无效的类字符串
  11. [游戏开发]网络同步方式
  12. DELL G3 3690耳机插入不显示,没声音
  13. vue中.prevent.self 和.self.prevent修饰符
  14. 干货 | 云解析DNS之网站监控
  15. 在ThinkAdmin中增加显示数据表格汇总金额
  16. Vlink——虚链路
  17. 生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN
  18. 论文笔记-Vanilla Transformer:Character-Level Language Modeling with Deeper Self-Attention
  19. 利用Vivado进行MicroBlaze处理器应用教程
  20. Flink1.11 读取kafka数据写入hive,未完待续

热门文章

  1. 在lamp环境下搭建多种论坛(下)
  2. Objective-C中 copy, tetain, assign , readonly , readwrite, nonatomic区别
  3. 09月27日 pytorch与resnet(二)
  4. 2月11日 TensorBoard+DNN+CNN
  5. Python高性能计算库—Numba
  6. 在一线城市做Java开发如何月薪达到两万,需要技术水平达到什么程度?
  7. 如何用 R 语言的 Shiny 库编写 web 程序
  8. MySQL常用命令集锦
  9. linux 下网站压力测试工具webbench
  10. DNS解析错误解决办法