【问题标题】:Sklearn.pipeline producing incorrect resultSklearn.pipeline 产生不正确的结果
【发布时间】:2020-12-14 10:10:40
【问题描述】:

我正在尝试使用 StandardScaler() 和 LogisticRegression() 构建管道。当我使用和不使用管道进行编码时,我会得到不同的结果。这是我没有管道的代码:

clf_LR = linear_model.LogisticRegression()
scalar = StandardScaler()
X_train_std = scalar.fit_transform(X_train)
X_test_std = scalar.fit_transform(X_test)
clf_LR.fit(X_train_std, y_train)
print('Testing score without pipeline: ', clf_LR.score(X_test_std, y_test))

我的管道代码:

pipe_LR = Pipeline([('scaler', StandardScaler()), 
                    ('classifier', linear_model.LogisticRegression())
                   ])
pipe_LR.fit(X_train, y_train)
print('Testing score with pipeline: ', pipe_LR.score(X_test, y_test))

这是我的结果:

Testing score with pipeline:  0.821917808219178
Testing score without pipeline:  0.8767123287671232

在尝试调试问题时,数据似乎正在标准化。但是使用管道的结果与在我的原始 X_train 数据上训练模型的结果相匹配(没有应用 StandardScaler())。

clf_LR_orig = linear_model.LogisticRegression()
clf_LR_orig.fit(X_train, y_train)
print('Testing score without Standardization: ', clf_LR_orig.score(X_test, y_test))

Testing score without Standardization:  0.821917808219178

在管道建设中我缺少什么吗? 非常感谢!

【问题讨论】:

  • 我不确定,但我认为问题出在您的第一个 sn-p 上。尝试将X_test_std = scalar.fit_transform(X_test) 更改为transform 方法。你永远不应该让你的变压器适合你的测试数据。让我知道它是否有效,以便我更详细地描述它。
  • 您的测试数据在没有管道代码的情况下变得标准化。虽然不在管道中。导致结果不一样。在两个测试中使用相同类型的测试数据。

标签: python scikit-learn pipeline logistic-regression standardization


【解决方案1】:

正如 szymon-bednorz 评论的那样,通常我们不对测试数据进行 fit_transform,而是选择 fit_transform(X_train)transform(X_test)。当您的训练和测试数据来自相同的分布并且大小为X_train 大于 X_test

进一步您在调试时发现,通过管道进行拟合与拟合 X_trainX_test 已经缩放的逻辑回归提示具有相同的准确性。虽然我不确定。

【讨论】:

    猜你喜欢
    • 2015-10-12
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多