这是在不泄露信息的情况下扩展机器学习目标的有效方法吗?

Is this a valid approach to scale your target in machine learning without leaking information?

考虑一个房价数据集,其目标是预测销售价格。

我想通过预测“每平方米的销售价格”来做到这一点, 因为它会产生更好的结果。

问题是如果我这样实现它 - 它是否会在测试集中引入信息泄漏?

当我在 scikit learn 中拆分我的数据集时:

df= read(Data)
target = df["SalePrice"]
df.drop(columns=["SalePrice"], inplace=True)

X_train, X_test, y_train, y_test = train_test_split(df, target, test_size=0.20)

然后缩放y_train:

# Scale target by LivingSpace and call fit()
y_train = target/X_train["LivingSpace"]
estimator.fit(X_train, y_train)

并使用预测和缩放 y_test 中的目标以获得每平方米的销售价格:

y_pred, y_true = estimator.predict(X_test), y_test/X_test["LivingSpace"]

我认为这是有效的,因为我只按已知值缩放目标。如果我直接预测 SalePriceSalePrice / LivingSpace,应该不会有什么不同,因为 LivingSpace 在我预测价格时无论如何都会给我。

如果是这样的话,我们也可以直接把这个目标变换应用到训练集和测试集上,最后把预测值变换回来,对吧?

这当然也适用于 X 中给出的任何特征。只要有关目标本身的信息不存在于 X 中,我认为这里没有问题。请记住,真正的目标只是销售价格,所以我的意图是将其从每平方米的销售价格中缩减。转换只是为了更好的训练结果。

您对此代码有何看法?

一切都很好。

1· 你没有泄密

2· 你可以直接将这个目标变换应用到训练集和测试集上,预测后再变换回去。

3· 您可以对X 中给出的任何功能执行此操作。您不需要对有关目标的信息进行备注。您可以随时使用 X 以任何您想要的方式转换 y,您唯一“泄漏”的是您自己对手头问题的理解,这绝对没问题。

4· 你的代码有bug,而不是

y_train = target/X_train["LivingSpace"]

你应该

y_train = y_train/X_train["LivingSpace"]
y_test = y_test/X_test["LivingSpace"]