百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

sklearn交叉验证 sklearn中的交叉验证

bigegpt 2024-09-29 09:21 3 浏览

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

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

一:常见的交叉验证方法

1,K-Folds cross-validator

K折交叉验证提供训练/测试索引来分割训练/测试集中的数据。将数据集分割为k个连续的折叠(默认情况下不进行洗牌)。然后,当k - 1剩余的折叠构成训练集时,每个折叠将被使用一次作为验证。

所谓K折就是将数据集通过K次分割,使得所有数据既在训练集出现过,又在测试集出现过,当然,每次分割中不会有重叠。相当于无放回抽样

from sklearn.model_selection import KFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_splits=2)
for train_index, test_index in kf.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1] TEST: [2 3]

每次划分时对数据进行均分,有没有可能会出现极端情况:数据集有5类,抽取出来的也正好是按照类别划分的5类,也就是说第一折全是0类,第二折全是1类,等等;这样的结果就会导致,模型训练时,没有学习到测试集中数据的特点,从而导致模型得分很低,为了消除这种情况,提供了其他交叉验证的方式

2,Stratified k-fold cross validation

分层交叉验证(Stratified k-fold cross validation):首先它属于交叉验证类型,分层的意思是说在每一折中都保持着原始数据中各个类别的比例关系,比如说:原始数据有3类,比例为1:2:1,采用3折分层交叉验证,那么划分的3折中,每一折中的数据类别保持着1:2:1的比例,这样的验证结果更加可信。类似无放回抽样

from sklearn.model_selection import KFold

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])

y = np.array([1, 2, 3, 4])

kf = KFold(n_splits=2)

for train_index, test_index in kf.split(X):

... print("TRAIN:", train_index, "TEST:", test_index)

TRAIN: [2 3] TEST: [0 1]

TRAIN: [0 1] TEST: [2 3]

3,Leave-one-out Cross-validation 留一法

留一法Leave-one-out Cross-validation:是一种特殊的交叉验证方式。顾名思义,如果样本容量为n,则k=n,进行n折交叉验证,每次留下一个样本进行验证。主要针对小样本数据。

注意:LeaveOneOut()等价于KFold(n_split =n)和LeavePOut(p=1),其中n是样本数量。

由于测试集数量较多(与样本数量相同),这种交叉验证方法可能非常消耗计算性能。对于大型数据集,应该选择KFold、ShuffleSplit或hierarchy fiedkfold。

from sklearn.model_selection import LeaveOneOut
X = np.array([[1, 2], [3, 4],[5,6])
y = np.array([1, 2])
loo = LeaveOneOut()
for train_index, test_index in loo.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [1 2] TEST: [0]
TRAIN: [0 2] TEST: [1]
TRAIN: [0 1] TEST: [2]

4,Shuffle-split cross-validation

控制更加灵活:可以控制划分迭代次数、每次划分时测试集和训练集的比例,随机分割并不保证所有折叠都是不同的(也就是说:可以存在既不在训练集也不再测试集的情况),类似有放回的抽样

from sklearn.model_selection import ShuffleSplit
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [3, 4], [5, 6]])
y = np.array([1, 2, 1, 2, 1, 2])
rs = ShuffleSplit(n_splits=5, train_size=0.5, test_size=.25,
 random_state=0)
for train_index, test_index in rs.split(X):
 print("TRAIN:", train_index, "TEST:", test_index)
 
TRAIN: [1 3 0] TEST: [5 2]
TRAIN: [4 0 2] TEST: [1 3]
TRAIN: [1 2 4] TEST: [3 5]
TRAIN: [3 4 1] TEST: [5 2]
TRAIN: [3 5 1] TEST: [2 4]

5,GroupKFold cross-validation

不重叠组的K-fold迭代器变体,相同的组不会出现在两个不同的折叠中(不同组的数量必须至少等于折叠的数量)。

数据是按照一定分组进行打乱的,即先分堆,然后把这些堆打乱,每个堆里的顺序还是固定不变的。

from sklearn.model_selection import GroupKFold
 X = [1, 2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10]
 y = ['a','a','b','b','c','c','c','d','d','d']
groups = [1,1,1,2,2,2,3,3,3,3]
gkf = GroupKFold(n_splits=3)
 for train, test in gkf.split(X,y,groups=groups):
 ...: print (train, test)
[0 1 2 3 4 5] [6 7 8 9]
[0 1 2 6 7 8 9] [3 4 5]
[3 4 5 6 7 8 9] [0 1 2]

二:使用交叉验证的最简单的方法是cross_val_score在估计器和数据集上调用 帮助函数。

1,cross_val_score

sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')

estimator :评估器,

cv可以是int类型,也可以是(KFold(n_splits=3))这样的策略生成器,当cv参数为整数时,默认情况下cross_val_score使用 KFold或StratifiedKFold策略

默认情况下,每个CV迭代计算的分数是score 估计量的方法。score 默认是以 scoring=’f1_macro’进行评测的,可以通过使用评分参数(scoring)来改变它:

from sklearn.datasets import load_iris
from sklearn.model_selection import KFold,cross_val_score
from sklearn.linear_model import LogisticRegression
iris = load_iris()
lr = LogisticRegression()
kf = KFold(n_splits=3,shuffle=False,random_state=0)
scores = cross_val_score(lr,iris.data,iris.target,cv=kf)
print("KFold cross validation scores:{}".format(scores))

除了分类的,还有针对回归和聚类的评分参数,如下:

2,除了cross_val_score,sklearn中还提供一个方法cross_val_predict,它的功能就是返回每条样本作为CV中的测试集时,对应的模型对于该样本的预测结果。这就要求使用的CV策略能保证每一条样本都有机会作为测试数据。

该函数与输入中的每个元素cross_val_predict具有类似的接口 cross_val_score,但返回,当该元素在测试集中时为该元素获得的预测。只有交叉验证策略才能将所有元素精确地分配给测试集一次(否则引发异常)。

然后可以使用这些预测来评估分类器:

from sklearn.model_selection import cross_val_predict
clf = svm.SVC(kernel='linear', C=1)
predicted = cross_val_predict(clf, iris.data, iris.target, cv=10)
metrics.accuracy_score(iris.target, predicted)
0.966...

注意,该计算的结果可能与使用cross_val_score的结果略有不同,因为元素以不同的方式分组。

相关推荐

有些人能留在你的心里,但不能留在你生活里。

有时候,你必须要明白,有些人能留在你的心里,但不能留在你生活里。Sometimes,youhavetorealize,Somepeoplecanstayinyourheart,...

Python学不会来打我(34)python函数爬取百度图片_附源码

随着人工智能和大数据的发展,图像数据的获取变得越来越重要。作为Python初学者,掌握如何从网页中抓取图片并保存到本地是一项非常实用的技能。本文将手把手教你使用Python函数编写一个简单的百度图片...

软网推荐:图像变变变 一“软”见分晓

当我们仅需要改变一些图片的分辨率、裁减尺寸、添加水印、标注文本、更改图片颜色,或将一种图片转换为另一种格式时,总比较讨厌使用一些大型的图像处理软件,尤其是当尚未安装此类软件时,更是如此。实际上,只需一...

首款WP8.1图片搜索应用,搜照片得资料

首款WP8.1图片搜索应用,搜照片得资料出处:IT之家原创(天际)2014-11-1114:32:15评论WP之家报道,《反向图片搜索》(ReverseImageSearch)是Window...

分享一组美图(图片来自头条)(头条美女头像)

...

盗墓笔记电视剧精美海报 盗墓笔记电视剧全集高清种子下载

出身“老九门”世家的吴邪,因身为考古学家的父母在某次保护国家文物行动时被国外盗墓团伙杀害,吴家为保护吴邪安全将他送去德国读书,因而吴邪对“考古”事业有着与生俱来的兴趣。在一次护宝过程中他偶然获得一张...

微软调整Win11 24H2装机策略:6月起36款预装应用改为完整版

IT之家7月16日消息,微软公司今天(7月16日)发布公告,表示自今年6月更新开始,已默认更新Windows1124H2和WindowsServer2025系统中预装...

谷歌手把手教你成为谣言终结者 | 域外

刺猬公社出品,必属原创,严禁转载。合作事宜,请联系微信号:yunlugongby贾宸琰编译、整理11月23日,由谷歌新闻实验室(GoogleNewsLab)联合Bellingcat、DigD...

NAS 部署网盘资源搜索神器:全网资源一键搜,免费看剧听歌超爽!

还在为找不到想看的电影、电视剧、音乐而烦恼?还在各个网盘之间来回切换,浪费大量时间?今天就教你如何在NAS上部署aipan-netdisk-search,一款强大的网盘资源搜索神器,让你全网资源...

使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建

前言回顾在上一篇文章《搭建持久化的INFINIConsole与Easysearch容器环境》中,我们详细介绍了如何使用基础的dockerrun命令,手动启动和配置INFINICon...

为庆祝杜特尔特到访,这个国家宣布全国放假?

(观察者网讯)近日,一篇流传甚广的脸书推文称,为庆祝杜特尔特去年访问印度,印度宣布全国放假,并举办了街头集会以示欢迎。菲媒对此做出澄清,这则消息其实是“假新闻”。据《菲律宾世界日报》2日报道,该贴子...

一课译词:毛骨悚然(毛骨悚然的意思是?)

PhotobyMoosePhotosfromPexels“毛骨悚然”,汉语成语,意思是毛发竖起,脊梁骨发冷;形容恐惧惊骇的样子(withone'shairstandingonend...

Bing Overtakes Google in China's PC Search Market, Fueled by AI and Microsoft Ecosystem

ScreenshotofBingChinahomepageTMTPOST--Inastunningturnintheglobalsearchenginerace,Mic...

找图不求人!6个以图搜图的识图网站推荐

【本文由小黑盒作者@crystalz于03月08日发布,转载请标明出处!】前言以图搜图,专业说法叫“反向图片搜索引擎”,是专门用来搜索相似图片、原始图片或图片来源的方法。常用来寻找现有图片的原始发布出...

浏览器功能和“油管”有什么关联?为什么要下载

现在有没有一款插件可以实现全部的功能,同时占用又小呢,主题主要是网站的一个外观,而且插件则主要是实现wordpress网站的一些功能,它不仅仅可以定制网站的外观,还可以实现很多插件的功能,搭载chro...