Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

“拆分数据”和“特征缩放”的顺序 #41

Closed
zhyongquan opened this issue Aug 17, 2018 · 14 comments
Closed

“拆分数据”和“特征缩放”的顺序 #41

zhyongquan opened this issue Aug 17, 2018 · 14 comments
Labels
bug Something isn't working

Comments

@zhyongquan
Copy link
Contributor

刚看到有人提出这个问题:特征缩放要放在拆分数据之前。我觉得挺有道理,这样才能保证拆分后的训练集合测试集合一致。

@oraoto
Copy link

oraoto commented Aug 17, 2018

拆分数据是要在特征缩放前的,不需要保证训练集和测试集一致,只能假设测试数据集(或者模型部署后的生产数据)是近似的,然后做和训练数据同样的处理(例如减去训练集的均值)。

如果在拆分数据前就进行了特征缩放,测试集的特征就会被参杂到训练数据里了。

@wengJJ
Copy link
Contributor

wengJJ commented Aug 17, 2018

之前回答过英文版的问题,还是保持原来的观点-先拆分数据再特征缩放。
常用的特征缩放:归一化(Normalization)与标准化(Standardization)
归一化Normalization=(x-min)/(max-min)涉及样本的极大极小值
标准化Standardization=(x-μ)/(σ)涉及样本的均值μ标准差σ
先进行总体特征缩放,例如归一化的极大值max存在于测试集,这就会让测试集的数据影响到训练集的数据,而我们划分训练集测试集的原则就是彼此不受干扰,保证得出模型的效果准确性。
所以,个人观点还是得先拆分数据再特征缩放

@zhyongquan
Copy link
Contributor Author

我的理解,如果数据量足够大,先后都无所谓,但当数据不够多时,影响会变大。

@zhyongquan zhyongquan added the bug Something isn't working label Aug 18, 2018
@Huang-Jack
Copy link
Contributor

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

请教一个问题,为什么特征缩放时,对训练集用的是fit_transform,而对测试集用的是transform.
我尝试对测试集也用fit_transform结果发现数据会错误

@zhyongquan
Copy link
Contributor Author

哪个文件?

@Huang-Jack
Copy link
Contributor

day6 @zhyongquan

@zhyongquan
Copy link
Contributor Author

@Huang-Jack 原作者repo有人提过这个问题,都改成fit_transform,刚我试了下,没什么问题,你报什么错误?

@Huang-Jack
Copy link
Contributor

我试了都改成 fit_transform不会报错了,但是我不知道他们的区别是什么

@zhyongquan
Copy link
Contributor Author

摘自此文章的评论https://blog.csdn.net/appleyuchi/article/details/73503282
我觉得讲的比正文更清楚
每一个transform都需要先fit,比如把数据转为(0,1)分布,需要均值和标准差,fit_transform和transform的区别就是前者是先计算均值和标准差再转换,而直接transform则是用之前数据计算的参数转换。所以如果之前没有fit,是不能直接transform的。
在此例子中,前文已经用过一个fit_transform了,后面用fit_transform或transform都可以,因为已经fit过了。作者的用意是不是要用训练集合的fit参数,去transform测试集和?以此达到两者相同的变化。

@zhyongquan
Copy link
Contributor Author

@wengJJ
本issue讨论的顺序问题,作者在transform时考虑了?

@Huang-Jack
Copy link
Contributor

尝试了对测试集如果用fit_transform会造成F1 score低于对测试集用transform的情况,可能是对测试集做了新的fit就无法反映整体数据集的特征了 @zhyongquan
X_test = sc.transform(X_test)
precision recall f1-score support

      0       0.89      0.96      0.92        68
      1       0.89      0.75      0.81        32

avg / total 0.89 0.89 0.89 100

X_test = sc.fit_transform(X_test)
precision recall f1-score support

      0       0.90      0.93      0.91        68
      1       0.83      0.78      0.81        32

avg / total 0.88 0.88 0.88 100

@zhyongquan
Copy link
Contributor Author

所以train和test的transform,要使用同样的fit参数

@wengJJ
Copy link
Contributor

wengJJ commented Aug 21, 2018

进行特征缩放时我们的顺序是
1先fit获得相应的参数值(可以理解为获得特征缩放规则) 2再用transform进行转换
fit_transform方法就是先执行fit()方法再执行transform()方法,所以每执行一次就会采用新的特征缩放规则

@Huang-Jack 你提出的说测试集使用fit_transform效果变差是肯定的,因为你使用的是测试集的新的规则来进行转换。如果你使用的是transform,则会使用训练集的规则进行转换,效果会更好。
@zhyongquan 顺序问题还是不会冲突 作者是用训练集的特征缩放规则来应用到测试集的,所以还是先得先拆分数据集 再进行特征缩放

@zhyongquan
Copy link
Contributor Author

是的,这个issue算讨论明白了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

4 participants