在XGboost中呈现数字分类数据(尤其是一天中的小时数)变量的正确方法是什么?

时间:2019-11-19 14:36:18

标签: machine-learning classification data-science prediction xgboost

一次编码还是将其保留为单个数字变量更好? 我正在网上阅读各种结论:

“对于高基数列和基于决策树的算法,请避免使用OneHot。” https://towardsdatascience.com/smarter-ways-to-encode-categorical-data-for-machine-learning-part-1-of-3-6dca2f71b159

相对

”(onehotencoded),这是xgboost或任何其他机器学习工具的分类变量的正确表示。” XGBoost Categorical Variables: Dummification vs encoding

1 个答案:

答案 0 :(得分:1)

有两个以上的思想流派:)。实际上,每种方法都有利弊,最佳方法取决于您的数据。因此,通常的做法是尝试所有可行的选择,然后选择最适合您的用例的选择(不仅在度量方面,而且在CPU / RAM方面(如果数据不是很小的话))

例如,OHE将添加多列,如果表很长,则可能会占用大量内存。同时,OHE会丢失序数信息(如果特征为序数)。但这可能不是问题,因为树木经常动态地标定目标的相关依赖性。另一方面,小时的简单有序数字表示会使内存不足,并保持值的有序序列。但是问题在于,它会在24小时后约1个小时内丢失信息,它将与xgboost中的树助推器一起使用,但不适用于xgboost中的线性助推器或xgboost之外的其他模型系列(线性,svm等),并且对于非常规功能,从理论上讲是不合理的(您的问题似乎很笼统)。

让我添加适用于此特定情况的第三种思路:您可以对具有重复周期(一年中的月份,一天中的小时等)的特征使用循环编码。 )。概念是使用 sin cos 函数以固定的时间段(一天中的小时数为24)对每个值进行编码。这允许在边缘上保持连续性,并使内存处于受控状态(仅2个功能而不是原始的数字顺序表示),并且已编码功能的数量不取决于基数。有很多讨论可以找到,例如,这个问题:https://datascience.stackexchange.com/q/5990/53060。而且我确信网络上有很多实现,我个人在python中使用了这个:https://github.com/MaxHalford/xam/blob/master/docs/feature-extraction.md#cyclic-features。当然,这通常不适用于数字分类数据,而具体适用于一天中的小时。

但是正如开头所说,我个人将尝试所有这些方法,然后看看哪种方法最适合当前的问题。从概念上讲,循环编码在一天中的某个小时中可能听起来最合理,但可能比其他方法更糟糕,并且对于“年龄组” 这样的功能将毫无意义。