如何使用 xgboost 对具有不同基数的未见数据进行预测

数据挖掘 xgboost 预言 分类数据 一热编码
2022-03-11 22:31:52

我正在一个特征集上训练一个 XGBoost 回归模型X包括一个功能xk具有高基数(~100)。首先,我使用 one-hot-encoding 进行转换xk然后将集合拆分为trainingtesting集合。该模型似乎运作良好。到目前为止,一切都很标准。

当我对看不见的数据进行预测时,问题就出现了。在看不见的数据中,基数xk略有不同。换个角度来看,说一下独特的价值观xk在训练和测试集中是{aa,ab,ac,...,ay,az}. 在看不见的数据中,基数集是{aa,ab,....,ay}. 所以az不会出现在看不见的数据中。为了能够使用我拥有的模型进行预测,我必须在看不见的数据中拥有与training. 为了解决这个问题,我尝试了两种方法:

  1. 在看不见的数据中创建一个与虚拟变量相对应的新列az, 并将 0 分配给所有行。在这里,我的逻辑是:“好吧,显然az很少观察到,因此创建一个全为零值的列将使集合保持一致,并且不应该对准确性造成如此严重的伤害”。确实如此。
  2. 通过删除虚拟变量对应的列来训练 XGBoost 模型az. 您可以将其视为对基数集应用 one-hot-encoding{aa,ab,....,ay}. 在这种情况下,testing集合和未见数据的准确性很好。但是,问题是我需要再次训练模型,而我不想在每次要进行预测时都这样做。

我知道除了 one-hot-encoding 之外的分类特征还有其他方法,但我很好奇如何解决这个特定问题。

1个回答

这里没有什么可深究的,为了让您的模型预测某个类的值,它必须在训练中看到该类。如果模型从未见过该类,它就无法预测它。所以你应该确保所有的类都出现在你的训练集中。如果稍后出现新类,则必须使用新类重新训练模型。

话虽如此,解决方法可能是有一个参考类,例如“其他”,您可以将所有不值得拥有自己的类或新类的类放在其中,并将该类用于任何新类不在训练中。但是,您可以预期结果不会很好。