机器学习【建模进阶指南】(二)

安稳与你 提交于 2021-01-21 05:04:41

https://zhuanlan.zhihu.com/p/108741050


在本篇中你将了解分类变量的内容,以及处理此类数据的三种方法。

什么是分类变量?

分类变量仅包含有限数量的值。

考虑一项调查,询问你吃早餐的频率,并提供四种选择:“从不”,“很少”,“大多数日子”或“每天”。 在这种情况下,数据是分类的,因为数据值都属于一组固定的类别。 如果人们回应一项关于他们拥有哪种品牌汽车的调查,那么回应将分为“本田”,“丰田”和“福特”等类别。 在这种情况下,数据也是分类的。 如果你尝试将这些变量放到Python中的大多数机器学习模型中而不先对其进行预处理,则会出现错误。 在本教程中,我们将比较三种可用于准备分类数据的方法。

三种处理方法


1)丢掉分类变量
这是最简单的方法,但是显然听上去不是太好的方法


2)标签编码 Label Encoding
标签编码就是把分类变量中的每一个类别给一个整数值



这种方法假定了类别的排序:“从不”(0)<“很少”(1)<“大多数日子”(2)<“每天”(3)。

这个假设在这个例子中是有意义的,因为对类别有一个无可争议的排名。 并非所有分类变量都在值中有明确的排序,但我们选择将那些变量作为有序变量。 对于基于树的模型(如决策树和随机森林),你可以期望基于有序变量的标签编码是靠谱的

3)一位有效编码 One-Hot Encoding

一位有效编码创建新列,用来标示原始数据中每个可能值的存在(或不存在)。 为了理解这一点,我们来看一个例子:

在原始数据集中,“颜色”是一个分类变量,有三个类别:“红色”,“黄色”和“绿色”。 相应的一位有效编码包含每个可能值的一列,以及原始数据集中每行的一行。 无论原始值是“红色”,我们在“红色”列中放置1; 如果原始值为“黄色”,我们在“黄色”列中放置1,依此类推。

与标签编码相反,一位有效编码不假设类别的排序。 因此,如果分类数据中没有明确的排序(例如,“红色”既不多于也不小于“黄色”),则可以期望这种方法特别有效。 我们将没有内在排名的分类变量称为名义变量。

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

案例

与上一个教程一样,我们将使用Melbourne Housing数据集。

点击这里 下载 数据集

我们不会关注数据加载步骤。 相反,你可以想象你已经拥有X_train,X_valid,y_train和y_valid中的训练和验证数据。


看一下训练数据:


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

我们通过检查每列的数据类型(或dtype)来完成此操作。 对象dtype表示列有文本(理论上可以有其他东西,但这对我们的目的来说并不重要)。 对于此数据集,带有文本的列表示可能是分类变量。

定义测量每种方法好坏的函数

我们定义一个函数score_dataset()来比较处理分类变量的三种不同方法。 此函数返回随机森林模型的平均绝对误差(MAE)。 一般来说,我们希望MAE尽可能低!

方法1的分数(删除分类变量)

我们使用select_dtypes()方法删除对象列。

方法2(标签编码)得分

Scikit-learn有一个LabelEncoder类,可用于获取标签编码。 我们循环分类变量并将标签编码器分别应用于每列。

方法3(一位有效编码)得分

我们使用scikit-learn中的OneHotEncoder类来获得一个一位有效编码。

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

要使用编码器,我们只提供我们想要进行一位有效编码的分类列。 例如,要编码训练数据,我们提供X_train[object_cols]。 (下面的代码单元格中的object_cols是带有分类数据的列名列表,而X_train[object_cols]包含训练集中的所有分类数据。)

哪种方法最好?

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

通常,一位有效编码(方法3)通常表现最佳,而丢弃分类列(方法1)通常表现最差,但它根据具体情况而变化。

结论

世界充满了分类数据。 如果你知道如何使用这种通用数据类型,那么你将成为一名更有效的数据科学家!

原文链接

Vitu.ai - 数据从不说慌 - 区块链的世界也不例外

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!