如何正确使用带有 MinMaxScaler + NMF 的 Pipleline 来预测数据?

How can I correctly use Pipleline with MinMaxScaler + NMF to predict data?

这是一个非常小的 sklearn 片段:

logistic = linear_model.LogisticRegression()

pipe = Pipeline(steps=[
    ('scaler_2', MinMaxScaler()),
    ('pca',  decomposition.NMF(6)),     
    ('logistic', logistic),
])

from sklearn.cross_validation import train_test_split   

Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.2)

pipe.fit(Xtrain, ytrain)    
ypred = pipe.predict(Xtest)

我会得到这个错误:

    raise ValueError("Negative values in data passed to %s" % whom)
ValueError: Negative values in data passed to NMF (input X)

根据这个问题: Scaling test data to 0 and 1 using MinMaxScaler

我知道这是因为

This is due to the fact that the lowest value in my test data was lower than the train data, of which the min max scaler was fit

但我想知道,这是一个错误吗? MinMaxScaler(所有缩放器)似乎应该在我进行预测之前应用,它不应该依赖于以前的拟合训练数据,对吗?

或者我怎样才能正确使用带有管道的预处理缩放器?

谢谢。

这不是错误。将缩放器添加到管道的主要原因是为了防止将信息从测试集泄漏到模型中。当您使管道适合您的训练数据时,MinMaxScaler 会保留训练数据的最小值和最大值。它将使用这些值来缩放它可能看到的用于预测的任何其他数据。正如您还强调的那样,这个最小值和最大值不一定是您的测试数据集的最小值和最大值!因此,当您的测试集的最小值小于训练集中的最小值时,您最终可能会在训练集中得到一些负值。您需要一个不会给您负值的定标器。例如,您可以使用 sklearn.preprocessing.StandardScaler。确保设置参数 with_mean = False。这样,它不会在缩放之前将数据居中,而是将数据缩放到单位方差。

如果您的数据是平稳的并且采样正确,您可以假设您的测试集在很大程度上类似于您的训练集。

因此,您可以预期 min/max over test set 接近 min/max over train set,少数 "outliers".

例外。

为了减少在测试集上使用 MinMaxScaler 产生负值的机会,只需将数据缩放到不在 (0,1) 范围内,但要确保您已经为您的转换器允许了一些 "safety space",如下所示:

MinMaxScaler(feature_range=(1,2))