Machine learning 什么';在XGboost中显示数字分类数据(特别是一天中的小时数)变量的正确方法是什么?

Machine learning 什么';在XGboost中显示数字分类数据(特别是一天中的小时数)变量的正确方法是什么?,machine-learning,classification,data-science,prediction,xgboost,Machine Learning,Classification,Data Science,Prediction,Xgboost,最好是一个热编码还是将其作为单个数值变量? 我在网上看到的结论好坏参半: “对于高基数列和基于决策树的算法,请避免使用OneHot。” 相对于 “(onehotencoded)这是xgboost或任何其他机器学习工具的分类变量的正确表示。” 有两种以上的思想流派:)。在实践中,每件事都有利弊,最佳方法将取决于您的数据。因此,通常的前进道路是尝试所有可行的选项,并选择最适合您的用例的选项(不仅在指标方面,而且在CPU/RAM方面,如果数据不太小的话) 例如,OHE将添加多个列,这在长表的情况下会

最好是一个热编码还是将其作为单个数值变量? 我在网上看到的结论好坏参半:

“对于高基数列和基于决策树的算法,请避免使用OneHot。”

相对于

“(onehotencoded)这是xgboost或任何其他机器学习工具的分类变量的正确表示。”
有两种以上的思想流派:)。在实践中,每件事都有利弊,最佳方法将取决于您的数据。因此,通常的前进道路是尝试所有可行的选项,并选择最适合您的用例的选项(不仅在指标方面,而且在CPU/RAM方面,如果数据不太小的话)

例如,OHE将添加多个列,这在长表的情况下会导致较大的内存占用。同时,OHE失去了顺序信息(如果特征是顺序的)。但这可能不是一个问题,因为树经常动态地勾选目标的相关依赖项。另一方面,小时的简单有序数字表示保持内存低,并保持值的有序顺序。但问题是,它在24小时后1小时内失去了信息,它将与xgboost中的树助推器一起工作,但与xgboost中的线性助推器或xgboost之外的其他模型族(线性、svm等)不一起工作,而且对于非顺序特征,它在理论上并不合理(您的问题似乎很笼统)

让我添加适用于此特定情况的第三个学派:您可以对具有重复周期(一年中的月份、一天中的小时等)的功能使用循环编码。其概念是使用sin和cos函数以固定的周期(一天中的小时为24)对每个值进行编码。这允许保持边上的连续性并控制内存(只有2个特征而不是原始的数字顺序表示),编码特征的数量不依赖于基数。在谷歌上可以找到许多讨论,例如,这个问题:。我确信在web上有很多实现,我个人在python中使用了这个:。当然,这并不适用于一般的数字分类数据,而是特别适用于一天中的小时数


但正如一开始所说,我个人会尝试所有这些方法,看看哪一种最适合当前的问题。循环编码在概念上最适合一天中的某个小时,但其性能可能比其他方法更差,对于“年龄组”这样的功能来说毫无意义。

“一天中的某个小时”有24个可能的类别级别,这可能还不是“高基数”领域?HoD的确切操作类型-连续、分类或顺序-也取决于数据集。我喜欢保持功能的数量较小,以减少过度拟合的可能性,增加23个功能对我来说感觉非常多。通常不会对序数变量进行一次热编码,例如,如果进行一次热编码,则会丢失2pm非常接近3pm的信息。我想你一定会从两者的尝试中学到一些东西!谢谢你的评论,但我正在寻找一个更一般的答案。从我发布的链接来看,似乎有两种思想流派彼此对立。