我写这篇文章是因为我自己在做一个手势识别项目的时候,所用的训练集是网上爬取的以及公开的数据集。但当我训练完成后使用我自己通过摄像头捕捉的实地拍摄的手势图片,得出的识别准确率非常的低!这些图片可能在光照、背景、手势姿势等方面与通过摄像头实地捕捉的手势图片存在差异。这让我对这句话有了更深的理解!
一、如何理解测试集、验证集必须和训练集来自于同一分布
(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
是一个可选参数,用于设置随机数生成器的种子,确保每次分割的结果都是一致的,这对于实验的可重复性很重要。