机器学习python实践——关于数据集划分和数据标准化的相关问题的思考

最近在跟着参考书利用python进行机器学习实践,但是在实践过程中对数据集划分和数据的标准化产生了一些疑惑,所以,本文想记录并分享一下个人关于这方面的思考,如果有误请见谅,欢迎大家前来一起进行探讨。当然,如果这篇文章还能入得了各位"看官"的法眼,麻烦点赞、关注、收藏,支持一下!

本文主要解释三个问题

1、为什么数据集划分要在数据标准化之前?

2、为什么数据标准化时要用训练集的fit结果对测试集进行transform?

3、是否可以分别对训练集和测试集进行fit?

话不多说,直接进入正文:

一、为什么数据集划分要在数据标准化之前?

举个例子,大家感受一下:

小明是一名光荣的人民教师,他现在手上有两种题,一种是学生平时练习的题目,学生做过,相当于是训练集 ,另一种是学生没做过得题目,相当于是测试集 ,两者所蕴含的知识点是否一致的,相当于训练集和测试集是否具有相同的分布

今天是1号,因为3号要出一张卷子对学生进行期末考试来检测学生的学习成果,所以小明计划在2号也出一张卷子来帮助学生巩固学习成果,其中3号的卷子中的题目全部来源于截止1号为止学生没做过的题目,为了更好的出好2号的卷子,小明今天会去搭建一个题库,并且要求题库中的题目所涉及的知识点全都处于教学大纲范围之内,这就相当于是对数据进行标准化处理

如果没有将训练集和测试集分开,两者杂糅,即题库中同时含有学生做过的和没做过的题,那么2号的卷子和3号的卷子就会有一部分的题目重合,也就说在期末考试前,考题泄露了,这就相当于网上很多文章中所说的"数据泄露 ",这样小明就无法真实准确的掌握学生的学习情况,因为要想准确的了解学生的学习情况,肯定是要用知识点相同,但是学生没做过的题目来对学生进行测试。因此,如果小明在搭建题库之前,把训练集和测试集分开,让题库中仅含有学生做过的题目,那么3号的试卷就可以真正的掌握学生的学习情况。

通过上述例子,我们可以知道,数据集划分要在数据标准化操作之前。

二、为什么数据标准化时要用训练集的fit结果对测试集进行transform?

个人理解是为了保证训练集和测试集具有相同的分布

先梳理一下StandardScaler方法,fit()函数,以及transform()函数三者的关系,对于三者的关系,个人理解有点类似于:蓝图、调研、落实

根据帮助文档,我们知道在使用StandardScaler方法分为两个步骤:

第一个步骤:通过fit()函数去获取数据的均值、标准差等信息

第二个步骤:依托fit()函数获取的数据信息,通过transform()来执行相关的操作

然后我继续延用上述的例子进行说明

通过上述的例子,小明知道了在构建数据库时要对数据进行划分,因此,上述例子中的标准化处理,就分成了两步,第一步通过fit函数将训练集中题目的知识点提取出来,第二步根据所提取出来的知识点,用transform函数对训练集中超纲的题目进行修正,让他变得不超纲,同时为了保证3号的试卷中的题目也不超纲,小明也就可以根据训练集的fit结果对测试集进行transform,这样也就保证了3号卷子不会超纲

三、是否可以分别对训练集和测试集进行fit?

我的答案是:不可以!!!

根据我之前写的《机器学习python实践过程中对数据预处理中StandardScaler标准化方法的一些个人思考》一文中可以知道数据标准化处理,其实就是对数据的平移和缩放,使的数据的均值为零,方差为1

假设数据集中有两个数据,我们将其拆分为训练集和测试集,且两者均只有一个数据,训练集中的数据是X1(1,0),测试集中的数据是X2(2,0),X2在X1的右侧。

如果对训练集进行fit,然后根据训练集的fit结果对训练集和测试集进行transform,那么训练集的数据X1(1,0)就变成了X1'(0,0),测试集中的数据X2(2,0)就变成了X2'(1,0),数据集的形态没有发生变化,仅仅是向左发生了平移,这样并不会影响模型的预测的准确性,比如说,我们利用变换后的训练集数据X1'(0,0)算出模型,模型认为X1'和X2'的相对位置就是X1和X2的相对位置,然后将变换后的测试集数据X2'(1,0)带入模型中,于是模型告诉我们X2在X1的右侧,对比原始数据可以知道模型预测结果准确。

但是,如果现在我们分别对训练集和测试集进行fit和transform,最后训练集的数据X1(1,0)就变成了X1'(0,0),测试集中的数据X2(2,0)变成了X2'(0,0),数据集的形态就被改变了,这时利用变换后的训练集数据X1'(0,0)算出的模型还是那个模型,但是我们再将变换后的测试集数据X2'(0,0)带入到模型中,模型告诉我们X2和X1重合,对比原始数据,不难发现,模型预测结果错误

因此,我们不可以分别对训练集和测试集进行fit

skleran官方文档: sklearn.preprocessing.StandardScaler

相关推荐
艾派森32 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
忘梓.2 小时前
划界与分类的艺术:支持向量机(SVM)的深度解析
机器学习·支持向量机·分类
Chef_Chen2 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
MarkHD3 小时前
第十一天 线性代数基础
线性代数·决策树·机器学习
打羽毛球吗️3 小时前
机器学习中的两种主要思路:数据驱动与模型驱动
人工智能·机器学习
小馒头学python3 小时前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
正义的彬彬侠3 小时前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
羊小猪~~4 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
正义的彬彬侠4 小时前
【scikit-learn 1.2版本后】sklearn.datasets中load_boston报错 使用 fetch_openml 函数来加载波士顿房价
python·机器学习·sklearn