在实践中,为什么我们要将分类类标签转换为整数进行分类

机器算法验证 分类 scikit-学习
2022-04-01 04:04:48

这可能是一个幼稚的问题,但我想知道为什么我们(或者可能只是我)在将分类类标签提供给软件包中的分类器(如 Python 的 scikit-learn ML 库)之前将它们转换为整数?

让我们以简单的 Iris 数据集为例,为什么我们要将类别标签从“Setosa”、“Virginica”和“Versicolor”转换为例如 0、1 和 2?

当我在协作开展一个项目时出现了这个问题,而我的一位同事没有使用标签编码器将类标签从字符串转换为整数。它起作用了(她正在使用 scikit-learn);我直觉地“纠正”了它(插入了一个标签编码器),她问我为什么:嗯,除了“大多数机器学习算法以这种方式工作得更好”之外,我真的没有很好的答案(这是我前一段时间在某处读过的东西) .

现在我想了想:它背后的理由是什么?由于在典型的分类任务中,类标签是名义变量,而不是序数变量,它是计算效率(存储和处理更少的“数据”)吗?

4个回答

Scikit learn 只处理我相信的实数。所以你需要做一些类似热编码的事情,其中​​ n 个数字维度用于表示类别中的成员资格。如果你只是传入字符串,它们会以不可预知的方式转换为浮点数。

某些方法(如 svm)需要浮点数是有数学原因的。即它们仅在实数空间中定义。在单个方法中将 3 个类别表示为值 1,2,3 可能有效,但与一种热编码相比,它也可能产生次优性能,因为拆分 (1,3) 与 (2) 很难接受,除非该方法可以捕捉非常非线性的行为。

可以使其他方法(例如随机森林)直接作用于分类值。即在决策学习期间,您可以将潜在的拆分建议为不同的类别组合。对于这样的方法,使用整数表示类别通常很方便,因为整数数组比计算级别的字符串数组更易于使用。您还可以通过查看正在递增的 n 位整数的位值来生成所有可能的 n 类别组合,这可以更快且内存效率更高,然后在 n 浮点数上搜索拆分。

这只是实用的问题。对于二进制分类,最简单的方法是使用布尔值,对于多类,它是整数。大多数后端库都是用静态类型语言 (C/C++) 编写的,并且通常使用可以在不丢失信息的情况下完成工作的最基本类型。

对于二进制分类,您通常使用 0/1 或 -1/1。由于对称性,哪个标签对应于哪个类并不重要。对于多类分类,例如对于 3 类分类,您不能使用 0、1 和 2,因为这种标记方式意味着一个顺序(虽然我不熟悉 Iris 数据集)并且不能用于分类数据。对分类标签进行编码的一种方法是使用 (1 0 0)、(0 1 0) 和 (0 0 1)。您可以将这些标签视为 3-D 中等边三角形的顶点。因此,没有暗示顺序。但是,如果您使用的是二元分类器(例如 SVM)而不是真正的多类分类器,我们将无法使用此标签。相反,训练了多个二元分类器,并且它们的结果以某种方式相互结合。例如,如果你有 N 个类别,你可以训练(N2)分类器,并且对于每一对,您使用标签 0/1 来指示您正在相互训练的两个类(N 个)。在测试时,所有分类器之间的多数投票可用于进行预测。(N2)

如果您使用的是接口,它可能会在与分类器交互之前转换您的 0/1/2 标签,具体取决于分类器是什么。

一些算法只能处理数字输入,这可能是主要原因,尽管存储是其他原因。

当然,有些算法可以隐式进行转换。