程序员的知识教程库

网站首页 > 教程分享 正文

分类变量(类别变量Categorical Variables)

henian88 2024-10-22 11:47:36 教程分享 8 ℃ 0 评论

1.介绍

分类变量只接受有限数量的值。

(1)考虑一项调查,询问你吃早餐的频率,并提供四种选择:“从不”、“很少”、“大多数日子”或“每天”。在这种情况下,数据是可分类的,因为相应属于一组固定的类别。

(2)如果人们对一项关于他们拥有哪种品牌汽车的调查做出回答,那么他们的回答就会分为“本田”、“丰田”和“福特”等几类。在这种情况下,数据也是绝对的。

如果你试图将这些变量插入到Python中的大多数机器学习模型中,而不首先对它们进行预处理,则会出现错误。这儿将比较三种用于处理分类数据的方法。

2.三种方法

(1)删除分类变量

处理分类变量最简单的方法就是从数据集中删除它们。只有在列不包含有用信息的情况下,这种方法才能很好地工作。

(2)定序编码(Ordinal Encoding)

将每个唯一值分配给不同的整数。


这种方法假设类别的顺序是:“从不”(0)<“很少”(1)<“大多数天”(2)<“每天”(3)。

这个假设在这个例子中是有意义的,因为分类有一个无可争辩的排名。并非所有分类变量的值都有明确的顺序,但我们将其称为定序变量。对于基于树的模型(如决策树和随机林),定序编码能够很好地处理定序变量。

(3)独热编码(One-Hot Encoding)

独热编码创建新的列,指示原始数据中每个可能值的存在(或不存在)。为了理解这一点,我们将通过一个例子来说明。



在原始数据集中,“Color”是一个分类变量,有三个类别:“Red”、“Yellow”和“Green”。对应的one-hot编码为每个可能的值包含一列。如果原值是“Red”,我们都在“Red”列中加1;如果原始值为“黄色”,则在“黄色”列中输入1,依此类推。

与定序编码不同,独热编码并不假定类别的顺序。因此,如果在分类数据中没有明确的顺序(例如,“Red”既不大于也不小于“Yellow”),这种方法工作得特别好。我们把没有内在排序的分类变量称为名义变量(nominal variables)。

如果分类变量具有大量值,则独热编码通常不能很好地执行(即,通常不会将其用于具有15个以上不同值的变量)。

3.例子


接下来,我们得到训练数据中所有分类变量的列表。

我们通过检查每列的数据类型(或dtype)来实现这一点。object dtype表示一个列有文本(理论上它还有其他的内容,但这对于我们来说并不重要)。对于这个数据集,带有文本的列表示分类变量。


定义函数来衡量每种方法


(1)

(2)

在上面的代码单元中,对于每一列,我们将每个唯一的值随机分配给一个不同的整数。这是一种比提供自定义标签更简单的常用方法;然而,如果我们为所有定序变量提供更好的信息标签,可能性能会额外提升。

(3)我们使用scikit-learn的OneHotEncoder来获得独热编码。有许多参数可用于自定义

  • 我们设置handle_unknown='ignore'以避免验证数据包含训练数据中未表示的类时出错
  • 设置sparse=False可确保编码列作为numpy数组(而不是稀疏矩阵)返回。


4.总结

哪种方法最好?

在这种情况下,删除分类列(方法1)表现最差,因为它的MAE得分最高。至于其他两种方法,由于返回的MAE分数在价值上非常接近,因此一种方法比另一种方法似乎没有任何有意义的好处。

一般来说,独热编码(方法3)的性能最好,删除分类列(方法1)的性能最差,但具体情况会有所不同。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表