如何处理训练和测试数据中因变量范围的差异

数据挖掘 机器学习 Python 回归 xgboost
2022-02-21 03:03:34

我正在训练一个用于预测应用程序数量的 XGBoost 模型,训练数据中的最小应用程序数为 40,最大应用程序数为 2000,而在测试集中,训练数据中的最小应用程序数为 400,最大应用程序数是 800。因此模型在预测值时会变得混乱。关于我应该如何解决这个问题的任何建议?

2个回答

监督 ML 中的假设是测试集遵循与训练集相同的分布。从您的描述中可以清楚地看出,您的数据不满足此假设,因此事情运行不佳也就不足为奇了。除了因变量范围的差异之外,如果训练集和测试集是独立收集的,那么特征的分布很可能也不同。

所以如何解决这个问题取决于任务的目标,特别是为什么测试集和训练集不遵循相同的分布:

  • 如果差异没有意义,即没有理由假设实际生产数据与训练集不同,则应在适当随机化训练集和测试集之间的分割后重做实验。
  • 如果差异是有意义的,即测试集故意不同于训练集,因为生产数据也会不同,那么应该重新设计设置以解决这个问题。例如,可以在测试集上进行半监督学习,这将使模型适应新的数据分布,同时利用来自训练数据的信息。

您可以尝试使用转换目标MixMaxScaler,使训练集和测试集的目标都在 0 和 1 之间。

from from xgb import XGBRegressor
from sklearn.compose import TransformedTargetRegressor
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler

regressor = XGBRegressor()



model = TransformedTargetRegressor(regressor= regressor,
                                        transformer = MinMaxScaler()
                                        ).fit(trainX,trainY)

pred = model.predict(testX)
print(pred)