一种具有太多特征的热编码 (~ 10,000)

数据挖掘 编码
2021-10-11 06:10:30

我正在建立一个模型来预测特定员工的休假和病假。

从 2013 年 1 月 1 日到 2018 年 12 月 31 日,每个员工每天在数据集中有一行,标记为 0 或 1(如果那一天被视为休假或病假)。我正在使用位置、年龄、工作职位等信息。

我正在考虑使用员工 ID 作为训练模型的特征。一些用户有明显的模式,例如,连续几个星期在周一休假。另一方面,我觉得我没有足够的信息让每个员工都有一个模型,特别是如果他们最近被雇用。

经过一番研究,似乎对员工 ID 有意义的唯一编码是“One Hot Encoding”。但是,这将生成多达 10,000 个似乎不是非常理想的特征。

您有什么想法可以帮助我以更好的方式构建此模型吗?

提前致谢

3个回答

我认为你在正确的轨道上。您正在寻找的是计量经济学/统计学中所谓的固定效应您有一个模型,其中特征X决定结果y(所以y = bX + u)。最重要的是,您的模型中存在未观察到的异质性(每个员工)。对于每个员工,关系y <-> X可能略有不同(每个员工的固定效应),因此您的模型变为y = b1X + b2Z + u,其中Z表示员工。

有关概述请参见此处,有关 R 实现,请参见此处。

您可以通过为每位员工添加一个虚拟/指标/一个热点来解决此问题(称为最小二乘虚拟变量固定效应)。所以从技术上讲,每个员工在模型中都有自己的拦截。因此,Z上面是一个巨大的 one-hot 编码员工标签矩阵。

areg在 Stata ( ) 和 R ( )中有一些解决方案felm可以“吸收”大量虚拟变量集,因此在查看回归系数时不会打扰您。如果您对统计推断不感兴趣(但只对做出预测),那么您无论如何都不会查看系数。

我不知道您的数据的数据(即每位员工的观察结果),但根据您的说法,为每位员工添加一个虚拟变量(也称为 one-hot 功能)将是控制员工未观察到的异质性的正确方法.

您可以为员工创建嵌入。如果您使用的是 NN,只需为员工添加一个嵌入层。或者,您可以使用类似于协作过滤器的东西来查找员工的嵌入。例如,创建一个矩阵E = Employee x Day of the month,其中每一行是员工,每一列是一个月中的一天,并且

Eij=1if employee i worked at the day jEij=1if employee i got a time off or sick leave 
然后对于每个月,您可以使用例如 ALS(交替最小二乘法)为员工创建嵌入。您可以平均几个月的嵌入,并在您的主模型中使用它们。这种方法还可以为您的模型中使用的每个员工提供某种分数。

如果您有足够的相关数据,请尝试以无人监督的方式对员工进行聚类,以便将员工 ID 替换为他们的班级编号;然后,对类进行一次热编码(或使用另一种编码技术:也许是频率编码?)。控制类的数量可以让您控制 one-hot 编码后的特征数量,这肯定很方便。此外,可以轻松地将新员工分配到一个集群中,这样您就可以立即对他们进行预测(您不必收集新数据并重新训练模型)。

注意:一个天真的替代方案是设计一些功能。例如,您提到了星期一休息:只需创建一个功能来提供星期一的出席率。但这种方法可能会导致过度拟合。