在训练数据上使用MinMaxScaler生成用于测试数据的std,min和max

时间:2018-01-29 22:26:25

标签: python scikit-learn minmax

我如何使用scikit-learn plot_grid(plotlist = my_plots) 来标准化pandas数据帧训练数据集中的每一列,但是在我的测试数据集上使用完全相同的标准差,最小/最大公式?

由于模型未知我的测试数据,我不想标准化整个数据集,它不是未来未知数据的准确模型。相反,我想将0和0之间的数据标准化。 1使用训练集,并在测试数据上使用相同的std,min和max数字。

(显然我可以编写自己的min-max缩放器,但想知道scikit-learn是否可以执行此操作,或者是否有可用于此的库)

1 个答案:

答案 0 :(得分:2)

您应该可以fit在您的培训数据上,然后transform您的测试数据:

scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)  # or: fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

现在你的方法似乎是一种很好的做法。如果您要在整个X矩阵上调用fit(列车和测试组合),您将导致信息泄漏,因为您的训练数据会事先“看到”您的测试数据的比例。使用MinMaxScaler()的基于类的实现是sklearn如何专门解决这个问题,允许对象“记住”它所适合的数据的属性。

但是,请注意MinMaxScaler() 不能缩放到~N(0,1)。事实上,它被明确地称为这种扩展的替代方案。换句话说,它不保证你的单位差异或0均值。事实上,它实际上并不关心传统意义上的标准偏差。

来自docstring:

  

转变由下式给出:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max_ - min_) + min_

min_max_等于feature_range (0, 1) __init__的解包MinMaxScaler()(默认def scale(a): # implicit feature_range=(0,1) return (a - X_train.min(axis=0)) / (X_train.max(axis=0) - X_train.min(axis=0)) )。手动这是:

np.random.seed(444)

X = np.random.normal(loc=5, scale=2, size=(200, 3))
y = np.random.normal(loc=-5, scale=3, size=X.shape[0])
X_train, X_test, y_train, y_test = train_test_split(
    X, y, random_state=444)

所以说你有:     导入numpy为np     来自sklearn.model_selection import train_test_split

scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)

如果你打电话

scaler.scale_
# array([ 0.0843,  0.0852,  0.0876])

X_train.std(axis=0)
# array([ 2.042 ,  2.0767,  2.1285])

知道scaler.scale_

(1 - 0) / (X_train.max(axis=0) - X_train.min(axis=0))
# array([ 0.0843,  0.0852,  0.0876])

相反,它是:

const style = {
     // your styles here as an object  convert hyphenated css property names to camelCase and pass a string as the value
     backgroundColor: 'blue' 
}