在 Python 中处理 ML 模型中的数值分类列
如果您不使用虚拟变量对数字类别进行编码,则某些模型最终会被训练为在其预测中使用数字排序(例如 1 < 2 < 3 < 4 < 5 < ...)。这是否可取或有用取决于上下文,特别是数字类别的含义以及所使用的模型和实现。
在您的示例中,如果 Pclass 类别的数字标签代表“贫困阶层”,数字越小代表收入越少,数字越大代表收入越高,那么整数的排序实际上与类别的有意义排序有关( “1 < 2 < 3”,相应地“贫困等级 1 比贫困等级 2 的富裕程度低于贫困等级 3”)。在这种情况下,按原样使用数字编码似乎没有任何害处,甚至可能对某些模型有所帮助。例如,决策树可以学习如下规则
if (Pclass >= 2):
prediction = "survive"
而如果类别是用虚拟变量编码的,则此规则将如下所示:
if ((Pclass_2 == True) or (Pclass_3 == True)):
prediction = "survive"
对于某些实现/模型,第一个规则可能比第二个规则更可能出现,更具成本效益(仅存储虚拟变量数据成本更高,更不用说它可能对模型性能产生的影响),更好地推广到新数据, ETC。
另一方面,如果 Pclass 类别的数字标签代表一个人在船上的房间位置(1 代表紧挨着冰山,2 代表有自己的超级豪华宴会厅逃生船,3 代表接近冰山撞击,4 代表中层等),那么整数的排序似乎与实际类的排序没有任何有意义的关系(无论如何我都可以看到!) . 如果要按原样使用数字类别的编码,那么许多模型实现可能会以“糟糕”的方式学习模式。例如,决策树可以了解到冰山撞击附近的人的生存率很低,并最终产生以下规则:
if Pclass <= 3:
prediction = "does not survive"
这是“坏的”,因为它假设靠近冰山撞击与小于 3 的数字编码有关(它可能不会,例如,未来的数据可能包括许多大于 3 的新类别标签,所有这些标签都对附近的房间进行编码冰山一角),并且因为该规则似乎可能对那些拥有Pclass=2. 如果类别是用虚拟变量编码的,则学习的规则可能是:
if ((Pclass_1 == True) or (Pclass_3 == True)):
prediction = "does not survive"
在这种情况下,这条规则“更好”,因为它不共享上一条规则所做的两个问题。
一般来说,我建议以下经验法则:
如果数字标签上的自然顺序对类别没有有意义的解释,则使用虚拟变量对数字标签类别进行编码。
在其他条件相同的情况下,当我有内存空间时,我倾向于默认使用虚拟变量,然后考虑使用整数编码是否有意义。在您的情况下,Pclass 代表什么,数字类别的顺序对您实际上有意义吗?如果没有,我建议使用虚拟变量。

