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

python k折交叉验证,python中sklearnk折交叉验证python 中 sklearnk 折交叉验证发布时间 2018 06 1011 09 浏览次数 492 标签 pythonsklear 模型验证回顾进行模型验证的一个重要目的是要选出一个最合适的模型 对于监督学习而言 我们希望模型对于未知数据的泛化能力强 所以就需要模型验证这一过程来体现不同的模型对于未知数据的表现效果 最先我们用训练准确度 用全部数据进行训练和测试 来衡量模型的表现 这种方

python中sklearnk折交叉验证

发布时间:2018-06-10 11:09,

浏览次数:492

, 标签:

python

sklearnk

1.模型验证回顾

进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就需要模型验证这一过程来体现不同的模型对于未知数据的表现效果。

最先我们用训练准确度(用全部数据进行训练和测试)来衡量模型的表现,这种方法会导致模型过拟合;为了解决这一问题,我们将所有数据分成训练集和测试集两部分,我们用训练集进行模型训练,得到的模型再用测试集来衡量模型的预测表现能力,这种度量方式叫测试准确度,这种方式可以有效避免过拟合。

测试准确度的一个缺点是其样本准确度是一个高方差估计(high variance estimate),所以该样本准确度会依赖不同的测试集,其表现效果不尽相同。

交叉验证的过程

* 选择K的值(一般是10),将数据集分成K等份

* 使用其中的K-1份数据作为训练数据,另外一份数据作为测试数据,进行模型的训练

* 使用一种度量测度来衡量模型的预测性能

交叉验证的优点

* 交叉验证通过降低模型在一次数据分割中性能表现上的方差来保证模型性能的稳定性

* 交叉验证可以用于选择调节参数、比较模型性能差别、选择特征

交叉验证的缺点

* 交叉验证带来一定的计算代价,尤其是当数据集很大的时候,导致计算过程会变得很慢

高方差估计的例子

下面我们使用iris数据来说明利用测试准确度来衡量模型表现的方差很高。

from sklearn.model_selection import train_test_split from sklearn.datasets

import load_iris from sklearn.neighbors import KNeighborsClassifier from

sklearn import metrics data = load_iris() train = data.data test = data.target

for i in range(1,5): print(“random_state is “, i,”, and accuracy score is:”)

train_x, test_x, train_y, test_y = train_test_split(train, test,random_state=i)

knn = KNeighborsClassifier(5) knn.fit(train_x,train_y)

y_pred=knn.predict(test_x) print(metrics.accuracy_score(test_y,y_pred))

结果:

random_state is 1 , and accuracy score is: 1.0 random_state is 2 , and

accuracy score is: 1.0 random_state is 3 , and accuracy score is:

0.26315 random_state is 4 , and accuracy score is: 0.63158

上面的测试准确率可以看出,不同的训练集、测试集分割的方法导致其准确率不同,而交叉验证的基本思想是:将数据集进行一系列分割,生成一组不同的训练测试集,然后分别训练模型并计算测试准确率,最后对结果进行平均处理。这样来有效降低测试准确率的差异。

2. K折交叉验证

* 将数据集平均分割成K个等份

* 使用1份数据作为测试数据,其余作为训练数据

* 计算测试准确率

* 使用不同的测试集,重复2、3步骤

* 对准确率做平均,作为对未知数据预测准确率的估计

3.使用交叉验证的建议

* K=10是一个一般的建议

* 如果对于分类问题,应该使用分层抽样(stratified sampling)来生成数据,保证正负例的比例在训练集和测试集中的比例相同

4.交叉验证的例子

4.1用于参数调优

交叉验证的方法可以帮助我们进行调参,最终得到一组最佳的模型参数。下面的例子我们依然使用iris数据和KNN模型,通过调节参数,得到一组最佳的参数使得测试数据的准确率和泛化能力最佳。

from sklearn.datasets import load_iris from sklearn.neighbors import

KNeighborsClassifier # import warnings # warnings.filterwarnings(“ignore”) from

sklearn.model_selection import cross_val_score data = load_iris() train =

data.data test = data.target knn = KNeighborsClassifier(5) scores =

cross_val_score(knn,train,test,cv=10,scoring=’accuracy’) print(scores) [1.

0. 1. 1. 0. 0. 0. 1. 1. 1. ]

这个是每一次的的准确率,下面我们进行把这些准确率进行平均

print(scores.mean()) [1. 0. 1. 1. 0. 0. 0. 1.

1. 1. ] 0.66668

在上面的代码中,我们使用的是k=5这个值,但不一定是左右的,所以我们可以来进行选择,找到一个最优的k

from sklearn.datasets import load_iris from sklearn.neighbors import

KNeighborsClassifier # import warnings # warnings.filterwarnings(“ignore”) from

sklearn.model_selection import cross_val_score data = load_iris() train =

data.data test = data.target for i in range (1,30): knn =

KNeighborsClassifier(i) scores =

cross_val_score(knn,train,test,cv=10,scoring=’accuracy’) print(scores.mean())

结果:

0.96 0.33334 0.66666 0.66666

0.66668 0.66668 0.66668 0.66668

0.33334 0.66668 0.66668 0.33334

0.00001 0.33334 0.33334 0.33334

0.33334 0.00001 0.33334 0.00001

0.66666 0.66666 0.33334 0.96

0.66666 0.96 0.66666 0.33334 0.33334

4.2用于模型的选择

交叉验证也可以帮助我们进行模型选择,以下是一组例子,分别使用iris数据,KNN和logistic回归模型进行模型的比较和选择。

当阿然这里只是选择两个举个例子

knn = KNeighborsClassifier(n_neighbors=5) print (cross_val_score(knn, train,

test, cv=10, scoring=’accuracy’).mean()) lr = LogisticRegression()

print(cross_val_score(lr,train,test,cv=10,scoring=’accuracy’).mean())

0.66668 0.33334

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

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

(0)
上一篇 2026年3月16日 下午5:41
下一篇 2026年3月16日 下午5:41


相关推荐

  • FAT文件系统详解(一)

    FAT文件系统详解(一)一 前序每篇文章前都要说些什么吧 不然觉得有点尴尬 你问为什么要写这篇文章 我说是为了 虚拟文件系统 管理讲解做铺垫 我一直的想法就是 一定要知道原理 才能做的更远更好 因为你知道这其中的原理了 之后如果遇到问题了 就不好慌乱 一切让你心慌意乱的事儿都是一些你不能把握的事情 因为你不知道将会发生什么 掌握来原理 你就能掌握规律 你就能预判会发生什么 你也不会心慌了 二 硬盘的结构 1 硬

    2026年3月19日
    2
  • charles打断点有什么用_charles打断点后 如何执行

    charles打断点有什么用_charles打断点后 如何执行前言Charles是收费软件,可以免费试用30天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过30分钟,并且启动时将会有10秒种的延时。此时,我们只需网上找一个注册码即可解

    2022年8月6日
    8
  • 最优化算法之模拟退火算法(SA)

    最优化算法之模拟退火算法(SA)一 爬山算法 HillClimbing 介绍模拟退火前 先介绍爬山算法 爬山算法是一种简单的贪心搜索算法 该算法每次从当前解的临近解空间中选择一个最优解作为当前解 直到达到一个局部最优解 爬山算法实现很简单 其主要缺点是会陷入局部最优解 而不一定能搜索到全局最优解 如图 1 所示 假设 C 点为当前解 爬山算法搜索到 A 点这个局部最优解就会停止搜索 因为在 A 点无论向那个方向小幅度移动

    2026年3月17日
    2
  • Python静态代码检查工具Flake8

    Python静态代码检查工具Flake8flake8

    2025年11月7日
    5
  • python中单引号和双引号区别

    python中单引号和双引号区别单引号和双引号在使用上来说没什么区别 都可以表示字符串 先说 1 双引号与 3 个双引号的区别 双引号所表示的字符串通常要写成一行 nbsp 如 nbsp s1 hello world nbsp 如果要写成多行 那么就要使用 连行符 吧 如 nbsp s2 hello nbsp world nbsp s2 与 s1 是一样的 如果你用 3 个双引号的话 就可以直接写了 如下 nbsp s3 hello nbsp w

    2026年3月19日
    2
  • 什么是面向切面编程?

    什么是面向切面编程?学习完面向对象编程和面向接口编程 下一步就是面向切面编程 快来 mark

    2026年3月19日
    2

发表回复

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

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