我在使用sklearn
中的StandardScalar
来缩放我的特征向量,但它似乎无法正确拟合训练特征向量。或者这可能是预期行为,如果是的话,有人能解释一下为什么吗(最好能提供一些数学上的解释)。
from sklearn.preprocessing import StandardScalerimport numpy as npscale_inst = StandardScaler()# 训练特征向量x1 = np.array([1, 2, 10, 44, 55])# 测试特征向量x2 = np.array([1, 2, 10, 44, 667])# 首先拟合scale_inst.fit(x1)# 然后转换训练向量和测试向量print scale_inst.transform(x1)print scale_inst.transform(x2)# 输出[-0.94627295 -0.90205459 -0.54830769 0.95511663 1.44151861][ -0.94627295 -0.90205459 -0.54830769 0.95511663 28.50315638]
为什么667被缩放到28.50315638,而不是像训练特征向量的最大值那样缩放到1.44151861?
回答:
根据StandardScaler
API的说明:
通过移除均值并缩放到单位方差来标准化特征
它是在x1
上训练的,因此在两种情况下都使用x1
的方差/均值。所以它所做的就是简单的:
>>> (x1 - np.mean(x1)) / np.std(x1)array([-0.94627295, -0.90205459, -0.54830769, 0.95511663, 1.44151861])>>> (x2 - np.mean(x1)) / np.std(x1)array([ -0.94627295, -0.90205459, -0.54830769, 0.95511663, 28.50315638])
你可能在寻找Sagar提出的方法。