【笔记】【机器学习基础】交叉验证

这篇具有很好参考价值的文章主要介绍了【笔记】【机器学习基础】交叉验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(一)交叉验证

交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。在交叉验证中,数据被多次划分,并且需要训练多个模型。

最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。

5折交叉验证:
1、将数据划分为(大致)相等的 5 部分,每一部分叫作折(fold)
2、训练一系列模型,每折轮流作为测试集评估精度,其他作为训练集训练模型

mglearn.plots.plot_cross_validation()

【笔记】【机器学习基础】交叉验证
得到5个精度值

通常来说,数据的前五分之一是第 1 折,第二个五分之一是第 2 折,以此类推。

一、scikit-learn中的交叉验证

scikit-learn 是利用 model_selection 模块中的 cross_val_score 函数来实现交叉验证的。cross_val_score 函数的参数是我们想要评估的模型、训练数据与真实标签。

(1)对 LogisticRegression 进行评估

from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

iris = load_iris()
logreg = LogisticRegression()

scores = cross_val_score(logreg, iris.data, iris.target)
print("Cross-validation scores: {}".format(scores))

Cross-validation scores: [0.961 0.922 0.958]

(2)修改 cv 参数来改变折数

scores = cross_val_score(logreg, iris.data, iris.target, cv=5)
print("Cross-validation scores: {}".format(scores))

Cross-validation scores: [1. 0.967 0.933 0.9 1. ]
默认情况下,cross_val_score 执行 3 折交叉验证,返回 3 个精度值。可以通过修改 cv 参数来改变折数

(3)交叉验证精度的一种常用方法(计算平均值)

print("Average cross-validation score: {:.2f}".format(scores.mean()))

Average cross-validation score: 0.96

我们可以从交叉验证平均值中得出结论,我们预计模型的平均精度约为 96%。观察 5 折交叉验证得到的所有 5 个精度值,我们还可以发现,折与折之间的精度有较大的变化,范围为从 100% 精度到 90% 精度。这可能意味着模型强烈依赖于将某个折用于训练,但也可能
只是因为数据集的数据量太小。

二、交叉验证的优点

1、train_test_split 对数据进行随机划分,可能导致测试集将仅包含“容易分类的”样例或难以分类的样例都在训练集中,但如果使用交叉验证,每个样例都会刚好在测试集中出现一次:每个样例位于一个折中,而每个折都在测试集中出现一次。因此,模型需要对数据集中所有样本的泛化能力都很好,才能让所有的交叉验证得分(及其平均值)都很高。

2、对数据进行多次划分,还可以提供我们的模型对训练集选择的敏感性信息

3、是我们对数据的使用更加高效

缺点:增加了计算成本

重要的是要记住,交叉验证不是一种构建可应用于新数据的模型的方法。交叉验证不会返回一个模型。在调用 cross_val_score 时,内部会构建多个模型,但交叉验证的目的只是评估给定算法在特定数据集上训练后的泛化性能好坏

三、分层k折交叉验证和其他策略

将数据集划分为 k 折时,从数据的前 k 分之一开始划分(正如上一节所述),这可能并不总是一个好主意。

(1)iris 数据集

from sklearn.datasets import load_iris
iris = load_iris()
print("Iris labels:\n{}".format(iris.target))

Iris labels:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]

数据的前三分之一是类别 0,中间三分之一是类别 1,最后三分之一是类别 2。 1 折将只包含类别 0,所以在数据的第一次划分中,测试集将只包含类别 0,而训练集只包含类别 1 和 2。由于在 3 次划分中训练集和测试集中的类别都不相同,因此这个数据集上的 3 折交叉验证精度为 0。

使用分层 k 折交叉验证

(1)划分数据。当数据按类别标签排序时,标准交叉验证与分层交叉验证的对比

mglearn.plots.plot_stratified_cross_validation()

【笔记】【机器学习基础】交叉验证
使用分层 k 折交叉验证而不是 k 折交叉验证来评估一个分类器,这通常是一个好主意,因为它可以对泛化性能做出更可靠的估计。

对于回归问题,scikit-learn 默认使用标准 k 折交叉验证。也可以尝试让每个折表示回归目标的不同取值。

1. 对交叉验证的更多控制

可以利用 cv 参数来调节 cross_val_score 所使用的折数。但 scikit-learn允许提供一个**交叉验证分离器(cross-validation splitter)**作为 cv 参数,来对数据划分过程进行更精细的控制。

回归问题默认的 k 折交叉验证与分类问题的分层 k 折交叉验证的表现都很好,但有些情况下你可能希望使用不同的策略。比如说,在一个分类数据集上使用标准 k 折交叉验证来重现别人的结果。
(1)导入 KFold 分离器类,实例化

from sklearn.model_selection import KFold
kfold = KFold(n_splits=5)

(2)以将 kfold 分离器对象作为 cv 参数传入 cross_val_score

print("Cross-validation scores:\n{}".format(
      cross_val_score(logreg, iris.data, iris.target, cv=kfold)))

可以验证,在 iris 数据集上使用 3 折交叉验证(不分层)确实是一个
非常糟糕的主意:

(3)
kfold = KFold(n_splits=3)
print(“Cross-validation scores:\n{}”.format(
cross_val_score(logreg, iris.data, iris.target, cv=kfold)))

(4)
kfold = KFold(n_splits=3, shuffle=True, random_state=0)
print(“Cross-validation scores:\n{}”.format(
cross_val_score(logreg, iris.data, iris.target, cv=kfold)))

2. 留一法交叉验证

from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
scores = cross_val_score(logreg, iris.data, iris.target, cv=loo)
print("Number of cv iterations: ", len(scores))
print("Mean accuracy: {:.2f}".format(scores.mean()))

3. 打乱划分交叉验证

mglearn.plots.plot_shuffle_split()

【笔记】【机器学习基础】交叉验证

from sklearn.model_selection import ShuffleSplit
shuffle_split = ShuffleSplit(test_size=.5, train_size=.5, n_splits=10)
scores = cross_val_score(logreg, iris.data, iris.target, cv=shuffle_split)
print("Cross-validation scores:\n{}".format(scores))

4. 分组交叉验证

mglearn.plots.plot_group_kfold()

【笔记】【机器学习基础】交叉验证文章来源地址https://www.toymoban.com/news/detail-436162.html

from sklearn.model_selection import GroupKFold

X, y = make_blobs(n_samples=12, random_state=0)

groups = [0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3]
scores = cross_val_score(logreg, X, y, groups, cv=GroupKFold(n_splits=3))
print("Cross-validation scores:\n{}".format(scores))

到了这里,关于【笔记】【机器学习基础】交叉验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习技术:如何使用交叉验证和ROC曲线提高疾病预测的准确性和效率?

    随着机器学习的普及,评估模型的性能越来越重要。交叉验证和ROC曲线是两种常见的评估模型性能的方法。本文将介绍这两种方法的基本原理和应用场景,并结合实际案例和技术实践,讲解如何使用交叉验证和ROC曲线来提高机器学习模型的性能。此外,文章也将提供一些最佳

    2024年02月11日
    浏览(58)
  • 【深度学习】实验04 交叉验证

    交叉验证是一种评估和选择机器学习模型性能的常用方法。它将数据集划分为训练集和验证集,并重复多次进行模型训练和性能评估,以获取更稳定和可靠的模型评估结果。 1.自定义划分 2.K折交叉验证 K-fold交叉验证是一种经典的模型选择方法,它主要用于评估机器学习模型

    2024年02月11日
    浏览(41)
  • 深度学习:交叉验证(Cross Validation)

    首先,交叉验证的目的是为了让被评估的模型达到最优的泛化性能,找到使得模型泛化性能最优的超参值。在全部训练集上重新训练模型,并使用独立测试集对模型性能做出最终评价。 目前在一些论文里倒是没有特别强调这样的操作,很多研究使用的都是第一种:简单交叉验

    2024年02月02日
    浏览(41)
  • 机器学习 基础 笔记 1

    train阶段就是正常的学习 validation是知道正确答案是啥,检查正确率 test是不知道正确答案是啥,看看有啥结果 训练的时候记得model.train 测试(后面两种都是)的时候要model.eval (有些模型两种阶段做的事不一样) 测试的时候记得with torch.no_grad(),一来省算力,一来防止自己学

    2024年04月13日
    浏览(15)
  • 机器学习基础笔记

    第一次看机器学习视频,很多公式都是懵的,上学时的高数忘记块差不多了。可能需要重新来补习缺失的知识了。 仅以此来记录学习的过程。 分类:识别图像动物 离散的 聚类: 发掘兴趣爱好 回归:预测股市价格 连续的 自然语言处理、数据挖掘、生物信息识别(人脸识别)、

    2024年02月13日
    浏览(19)
  • 我在ChatGPT上学深度学习01----K折交叉验证集的重新审视

    不得不说西瓜书中这个图有一定的误导性,有很多重要信息没有在图中说明,也没有在上下文中进行解释,可能是考虑到篇幅的原因吧,也可能是另外的原因,周老师在讲交叉验证这块时仅用了少量的篇幅,于是给我留下了诸多的疑问。 于是我查阅了一些相关的一些资料,对

    2023年04月27日
    浏览(40)
  • 《零基础实践深度学习》(第2版)学习笔记,(二)机器学习和深度学习综述

    **人工智能(Artificial Intelligence,AI)**是研发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 **机器学习(Machine Learning,ML)**是当前比较有效的一种实现人工智能的方式。 **深度学习(Deep Learning,DL)**是机器学习算法中最热门的一个分

    2024年02月13日
    浏览(39)
  • [学习笔记] [机器学习] 9. 朴素贝叶斯(概率基础、联合概率、条件概率、贝叶斯公式、情感分析)

    视频链接 数据集下载地址:无需下载 学习目标: 4. 说明条件概率与联合概率 5. 说明贝叶斯公式、以及特征独立的关系 6. 记忆贝叶斯公式 7. 知道拉普拉斯平滑系数 8. 应用贝叶斯公式实现概率的计算 9. 会使用朴素贝叶斯对商品评论进行情感分析 朴素贝叶斯算法主要还是用来

    2024年02月09日
    浏览(44)
  • Mqtt学习笔记--交叉编译移植(1)

    Mqtt目前在物联网行业的应用比较多,mqtt属于应用层的一个中间件,这个中间件实现消息的订阅发布机制。网上介绍Mqtt的实现原来的比较多,这里不细介绍。 其实在我们之前的产品中,自己也开发的有类似的中间件,除了具有订阅发布的功能,还有一对一通信,在Linux系统里

    2024年02月10日
    浏览(36)
  • 人工智能基础_机器学习006_有监督机器学习_正规方程的公式推导_最小二乘法_凸函数的判定---人工智能工作笔记0046

    我们来看一下公式的推导这部分比较难一些, 首先要记住公式,这个公式,不用自己理解,知道怎么用就行, 比如这个(mA)T 这个转置的关系要知道 然后我们看这个符号就是求X的导数,X导数的转置除以X的导数,就得到单位矩阵, 可以看到下面也是,各种X的导数,然后计算,得到对应的矩阵

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包