scikit-learn - 将管道预测转换为原始值/比例

Posted

技术标签:

【中文标题】scikit-learn - 将管道预测转换为原始值/比例【英文标题】:scikit-learn - Convert pipeline prediction to original value/scale 【发布时间】:2017-06-09 19:37:00 【问题描述】:

我创建了如下管道(使用Keras Scikit-Learn API)

estimators = []
estimators.append(('standardize', StandardScaler()))
estimators.append(('mlp', KerasRegressor(build_fn=baseline_model, nb_epoch=50, batch_size=5, verbose=0)))
pipeline = Pipeline(estimators)

并适应它

pipeline.fit(trainX,trainY)

如果我使用pipline.predict(testX) 进行预测,我(相信)我会得到标准化的预测。

我如何预测 testX 以使 predictedY 它与实际(未触及)testY 具有相同的规模(即不是标准化的预测,而是实际值)?我看到有一个inverse_transform method for Pipeline,但似乎只用于恢复转换后的X

【问题讨论】:

我可能误解了 fit 方法 - 我现在认为转换只发生在输入特征 Xnot Y (因此拟合模型是非标准化的Y),所以predict 方法会产生非标准化的预测? 【参考方案1】:

没错。管道中的 StandardScaler() 仅映射 pipeline.fit(trainX,trainY) 的输入 (trainX)。

因此,如果您将模型拟合到近似 trainY 并且还需要对其进行标准化,则应该将您的 trainY 映射为

scalerY = StandardScaler().fit(trainY)  # fit y scaler
pipeline.fit(trainX, scalerY.transform(trainY))  # fit your pipeline to scaled Y
testY = scalerY.inverse_transform(pipeline.predict(testX))  # predict and rescale

inverse_transform() 函数映射其值时会考虑 StandardScaler().fit() 中计算的标准偏差和平均值。

正如您所提到的,您始终可以在不缩放 Y 的情况下拟合您的模型,但这可能会很危险,具体取决于您的数据,因为它可能导致您的模型过度拟合。你必须测试它;)

【讨论】:

以上是关于scikit-learn - 将管道预测转换为原始值/比例的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 TransformedTargetRegressor 添加到 scikit-learn 管道中?

管道中的 Scikit-Learn FunctionTransformer 没有其他功能 - 不返回原始数据?

scikit-learn 改变 X 和 Y 的自定义转换器/管道

特征不匹配:通过 scikit-learn 管道进行预测

PySpark 将模型预测与未转换的数据对齐:最佳实践

使用 scikit-learn 训练线性回归模型后,如何对原始数据集中不存在的新数据点进行预测?