【机器学习300问】90、怎么理解测试集、验证集必须和训练集来自于同一分布?

        我写这篇文章是因为我自己在做一个手势识别项目的时候,所用的训练集是网上爬取的以及公开的数据集。但当我训练完成后使用我自己通过摄像头捕捉的实地拍摄的手势图片,得出的识别准确率非常的低!这些图片可能在光照、背景、手势姿势等方面与通过摄像头实地捕捉的手势图片存在差异。这让我对这句话有了更深的理解!

一、如何理解测试集、验证集必须和训练集来自于同一分布

(1)不同分布的例子——考试成绩预测:

        假设有两个班级,一个班级是高级班,学生基础较好,另一个是初级班,学生基础较弱。你想预测其中初级班在下一场考试时的平均成绩,你拿来训练的数据都是初级班的,可最后让你预测试给你的数据却是高级班的。

        如果比较两个班级学生的考试成绩分布,很可能会发现它们是不同分布的。比如,高级班的平均分和成绩的分布可能偏向高分段,而初级班则可能更多集中在较低的分数段。

 (2)不同分布的例子——手写数字识别:

        假设训练集包含了大量清晰、标准的手写数字图片,如果测试集突然包含大量模糊、倾斜或者艺术字体风格的数字图片,这就偏离了原来的分布。模型在训练时学到的规律可能无法很好地泛化到这种新风格的数字上,导致测试结果不准确,尽管它可能在标准风格的数字识别上表现出色。

二、scikit-learin划分数据集的方法

        在scikit-learn库中,用来划分数据集的函数是train_test_split。这个函数可以方便地将数据集划分为训练集和测试集

from sklearn.model_selection import train_test_split

# 假设 X 是特征数据,y 是目标变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  • X_train 和 y_train 是用于训练模型的特征和目标变量子集。
  • X_test 和 y_test 是用于测试模型的特征和目标变量子集。
  • test_size=0.2 表示测试集占整个数据集的比例,这里设置为20%。
  • random_state=42 是一个可选参数,用于设置随机数生成器的种子,确保每次分割的结果都是一致的,这对于实验的可重复性很重要。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了让训练集测试集具有同一总体分布,可以采取以下方法: 1. 随机划分:最常见的方法是将数据集随机划分为训练集测试集,确保在划分时两个数据集的样本来自同一总体分布。通常情况下,可以将数据集划分为70%的训练集和30%的测试集。 2. 分层采样:当数据集中不同类别的样本比例不平衡时,可以采用分层采样的方法,确保训练集测试集中的样本类别比例相同。具体来说,可以按照不同类别的样本比例进行分层采样,然后在每个类别中按照一定比例划分训练集测试集。 3. 交叉验证:交叉验证是一种更加严格的数据集划分方法,它可以将数据集划分为多个训练集测试集,以更加全面地评估模型的性能。通常情况下,可以采用 k 折交叉验证的方法,将数据集划分为 k 个子集,然后依次将每个子集作为测试集,其余子集作为训练集进行模型训练和评估。 4. 数据增强:数据增强是一种有效的方法,可以通过对训练集进行旋转、翻转、缩放等变换操作,从而使训练集中的样本更加多样化,从而提高模型的泛化能力。 需要注意的是,训练集测试集具有同一总体分布机器学习中的一个重要前提条件,需要在数据集划分和模型评估等环节中进行充分的考虑。同时,还需要根据实际情况来确定数据集的划分比例和方法,以确保训练集测试集的质量和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值