StandardScaler缩放结果不一致:如何让同一输入得到相同缩放结果?
解决StandardScaler缩放结果不一致的问题
这问题我太熟了!你遇到的是StandardScaler最容易踩的坑之一——它的fit()方法会计算当前数据集的均值和标准差,而fit_transform()是先执行fit获取统计量,再用这些值做缩放。
你第一次用整个大矩阵的时候,scaler计算了所有样本的均值和标准差,然后用这些统计量去缩放第一行;但第二次只给单个样本执行fit的时候,这个样本本身就是均值,标准差直接为0,所以缩放后自然全是0,这就导致同一个输入得到完全不同的结果,神经网络肯定没法正常工作。
正确的做法是:
- 只在训练数据集上调用一次
fit()(或者fit_transform()),把scaler的统计量固定下来 - 之后不管是训练集里的样本,还是新的测试/预测样本,都只调用
transform(),绝对不要再重新fit()
修改后的代码示例:
from sklearn.preprocessing import StandardScaler import numpy as np # 初始化scaler sc = StandardScaler() # 第一步:用完整的训练数据fit,得到统计量 AR = np.array([[1.0,2.0,3.0],[4.0,5.0,6.0],[4.0,11.0,12.0],[42.0,131.0,1121.0],[41.0,111.0,121.0]]) # 对训练集做fit+transform AR_scaled = sc.fit_transform(AR) print("训练集缩放后的第一行:") print([str(m) for m in AR_scaled[0]]) # 第二步:对单个样本(不管是旧的还是新的)只用transform,不要fit AR1 = np.array([[1.0,2.0,3.0]]) AR1_scaled = sc.transform(AR1) print("单个样本用训练集统计量缩放后的结果:") print([str(m) for m in AR1_scaled[0]])
输出结果:
训练集缩放后的第一行: ['-0.920854068785', '-0.88080603151', '-0.571888559111'] 单个样本用训练集统计量缩放后的结果: ['-0.920854068785', '-0.88080603151', '-0.571888559111']
这样就能保证同一个输入每次缩放结果都一致了!本质上就是要让scaler记住训练数据的分布特征,而不是每次都重新计算新的分布。
内容的提问来源于stack exchange,提问作者Brana
相关产品推荐
相关产品推荐

