失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 机器学习中 对于数据的预处理是否是测试集和训练集一起进行?

机器学习中 对于数据的预处理是否是测试集和训练集一起进行?

时间:2023-05-07 01:08:15

相关推荐

机器学习中 对于数据的预处理是否是测试集和训练集一起进行?

转载自:/question/312639136

机器学习中,对于数据的预处理是否是测试集和训练集一起进行?

最近在尝试训练和应用模型,遇上一个问题,就是针对数据的预处理过程,如归一化等等,测试集和训练集是否需要分开进行?网上查了很多资料众说纷纭,有人说应该分开进行,如果一起进行,训练模型就利用了测试集的信息;有人说要一起进行,模型预测效果更好;有人说分开进行,但是测试集归一化的参数 要使用原训练集的,如均值标准差等等。

个人的一点看法是,归一化相当原特征空间的点映射到新特征空间中,既然是在新特征空间中训练模型,就应当保证测试集和训练集同处于一个空间中,模型才有意义。所以不论是一起进行归一化,还是测试集应用训练集的参数,都是可以的。更进一步的,对于后期模型实际应用,新数据也就当运用旧数据的参数和映射方法进行归一化。

另外,本人也使用了主成分分析方法,认为主成分分析也就当是测试集和训练集一起进行,或是测试集使用训练集计算出的转换矩阵,才能保证测试集和训练集同处于一个特征空间。

以上纯属个人见解,如有错误,请各位大佬不吝指正,谢谢!

关注者

83

被浏览

9,223

关注问题​写回答

​邀请回答

​添加评论

​分享

收起​

4个回答

默认排序

Jon Lee

GEHC Senior Scientist

89 人赞同了该回答

这个问题有两点:

1. training data和test data是否应该使用相同的预处理

2. 归一化时,是否应该将training data和test data混合计算(如均值,方差,主成分,等)

第一点的回答是肯定的,第二点是否定的。

抛开domain adaptation不讲,一般的机器学习算法是建立在training和test data服从同一/类似分布的假设之上的。所以有一条准则:预处理对于training和test data要保持一致。如果预处理不同,那怎么还能保证training和test data分布一致?在machine learning中,test data原则上是与training data独立的数据集。它的目的是验证在training data上训练好的模型是否在完全独立的,未知的数据集上有相同的表现。做归一化时,如果将test data和training data混合一起计算了,那么归一化之后的training data就相包含了test data的信息。这样就打破了test data应该与training data独立的原则,实属作弊:哪怕得到的结果较好,也不能证明在未来某天新采集的数据上会有相同的表现。再者,你现在手里有一定数量的test data,你拿去跟training data一起计算做归一化了。但在真正的工业应用中,你的test data可能是在你模型部署之后一个个采集的:有可能今天来10个,明天来6个,后天来1个。这种情况下如果将training和test data一起用来计算做归一化,那岂不是每天采集一次数据都要计算一次,再重新训练?

综合以上两点,在做归一化时,普遍的做法是只用training data计算数据如均值,方差,主成分,等,然后用保存好的计算数据对test data进行归一化。

发布于 -02-18

​赞同 89​​12 条评论

​分享

​收藏​喜欢

疯猫子

数据分析/人工智能/人生项目投资人,执行人

9 人赞同了该回答

正确的处理流程是:

1、将清洗完的数据先进行样本内外拆分,将样本内数据再次进行训练集和测试集的拆分

2、对训练集进行特征工程,特征数据预处理->特征选择->生成训练集

3、使用训练集进行训练,固化模型

4、用测试集数据按照已固化的标准,先进行特征工程处理,之后带入模型进行测试

5、用样本外数据集,按照固化模型,单独生成特征数据集,进行数据预处理,带入模型看结果。

以上就是我常用的流程。

发布于 -02-18

​赞同 9​​1 条评论

​分享

​收藏​喜欢

二十二画生

泥腿子

6 人赞同了该回答

先划分训练集-测试集,然后在训练集上做预处理,最后将训练集上得到的预处理操作运用到测试集上。

就像你自己说的,训练模型是一定不能把测试集的信息带入的,要假设测试集不存在。因为你的模型不是要应用在测试集上,而是要应用在未知的新数据上的。

所谓的"训练集测试集一起归一化可以提高模型效果"是伪命题,因为模型效果好坏是要看在未来的新数据上的表现的,在测试集上即使准确率百分百也不能保证实际运行起来是完美的。

除非,在你按照上述原则得到模型参数,并在测试集上得到评价模型表现的报告后,可以把训练集、测试集再放到一起作为新的训练集,然后按照之前得到的模型参数重新训练,作为最后的模型。

编辑于 -02-18

​赞同 6​​3 条评论

​分享

​收藏​喜欢

小周周的爸爸

预处理大致分两类

1. 非监督的预处理: 可以一起处理。如标准 归一 等等。

2. 监督型的预处理:不能一起处理。如点击率,卡方分箱等。这类处理只能训练集合处理好,验证集合按照字典去查找对应的值。

发布于 -04-19

​赞同​​添加评论

​分享

​收藏​喜欢

===================================sklearn 示例==========================

https://scikit-/stable/modules/preprocessing.html#preprocessing

Thepreprocessingmodule further provides a utility classStandardScalerthat implements theTransformerAPI to compute the mean and standard deviation on a training setso as to be able to later reapply the same transformation on the testing set. This class is hence suitable for use in the early steps of asklearn.pipeline.Pipeline:

>>>

>>> scaler = preprocessing.StandardScaler().fit(X_train)>>> scalerStandardScaler()>>> scaler.mean_array([1. ..., 0. ..., 0.33...])>>> scaler.scale_array([0.81..., 0.81..., 1.24...])>>> scaler.transform(X_train)array([[ 0. ..., -1.22..., 1.33...],[ 1.22..., 0. ..., -0.26...],[-1.22..., 1.22..., -1.06...]])

The scaler instance can then be used on new data to transform it the same way it did on the training set:

>>>

>>> X_test = [[-1., 1., 0.]]>>> scaler.transform(X_test)array([[-2.44..., 1.22..., -0.26...]])

It is possible to disable either centering or scaling by either passingwith_mean=Falseorwith_std=Falseto the constructor ofStandardScaler.

heSimpleImputerclass provides basic strategies for imputing missing values. Missing values can be imputed with a provided constant value, or using the statistics (mean, median or most frequent) of each column in which the missing values are located. This class also allows for different missing values encodings.

The following snippet demonstrates how to replace missing values, encoded asnp.nan, using the mean value of the columns (axis 0) that contain the missing values:

>>>

>>> import numpy as np>>> from sklearn.impute import SimpleImputer>>> imp = SimpleImputer(missing_values=np.nan, strategy='mean')>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])SimpleImputer()>>> X = [[np.nan, 2], [6, np.nan], [7, 6]]>>> print(imp.transform(X))[[4.2. ][6.3.666...][7.6. ]]

TheSimpleImputerclass also supports sparse matrices:

>>>

>>> import scipy.sparse as sp>>> X = sp.csc_matrix([[1, 2], [0, -1], [8, 4]])>>> imp = SimpleImputer(missing_values=-1, strategy='mean')>>> imp.fit(X)SimpleImputer(missing_values=-1)>>> X_test = sp.csc_matrix([[-1, 2], [6, -1], [7, 6]])>>> print(imp.transform(X_test).toarray())[[3. 2.][6. 3.][7. 6.]]

如果觉得《机器学习中 对于数据的预处理是否是测试集和训练集一起进行?》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。