【问题标题】:How can I correctly use Pipleline with MinMaxScaler + NMF to predict data?如何正确使用 Pipleline 和 MinMaxScaler + NMF 来预测数据?
【发布时间】:2017-01-04 16:18:54
【问题描述】:

这是一个非常小的 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

我知道这是因为

这是因为我的测试数据中的最低值是 低于训练数据,其中最小最大缩放器适合

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

或者我怎样才能正确使用 Pipeline 的预处理缩放器?

谢谢。

【问题讨论】:

    标签: scikit-learn pipeline nmf


    【解决方案1】:

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

    【讨论】:

    • 我理解了你的一些观点,但我还是想不通,如果我使用 StandardScaler 来解决这个问题,数据与我想要的不完全一样。如果我改用 StandardScaler 或在 MinMaxScaler 之后添加它,是否会影响最终分类器的性能?谢谢。
    • @BearHuang,你必须使用MinMaxScaler吗?你的数据集中有负值吗?无法保证您的测试集中有一个比任何看不见的数据更小的最小值!如果您使用StandardScaler(with_mean=False),它会将您的数据除以标准差(X/ np.sqrt(var))。缩放后的数据不会介于 0 和 1 之间,但仍优于未缩放的数据。唯一的问题是,在扩展之前,您的所有数据都必须是正数。
    • 如果我必须让数据介于 0 和 1 之间,我该如何正确使用 sklearn?谢谢。
    【解决方案2】:

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

    因此,您可以预期测试集上的 min/max 接近于训练集上的 min/max,除了少数“异常值”。

    要减少在测试集上使用 MinMaxScaler 产生负值的机会,只需将数据缩放到 (0,1) 范围,但要确保为变压器留出一些“安全空间”,如下所示:

    MinMaxScaler(feature_range=(1,2))
    

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 2018-06-17
      • 2018-11-07
      • 2020-10-21
      • 1970-01-01
      • 2015-08-09
      • 2021-06-16
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多