编码分类数据
2021-9-2
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

名义变量和有序变量

数值数据,涉及仅由数字组成的特征,例如整数或浮点值。
分类数据是包含标签值而不是数值的变量,可能值的数量通常被限制在一个固定的集合中。分类变量通常称为名义变量。
例如:
  • 一个“ pet ”变量,其值为:“ dog ”和“ cat ”
  • 一个“颜色”变量,其值为:“红色”、“绿色”和“蓝色”
  • 一个“ place ”变量,其值为:“ first ”、“ second ”和“ third ”
每个值代表一个不同的类别。某些类别可能彼此之间具有自然关系,例如自然排序,上面的“ place ”变量确实有一个自然的值顺序。这种类型的分类变量称为有序变量,因为可以对值进行排序或排序。
通过将数值变量的范围划分为bin并将值分配给每个bin,可以将数值变量转换为序数变量。例如,一个介于1和 10 之间的数值变量可以划分为具有5个具有序数关系的标签的序数变量:1-2、3-4、5-6、7-8、9-10,这称为离散化。
  • 名义变量(分类):变量包含一组有限的离散值,值之间没有关系
  • 有序变量:变量包括一组有限的离散值,这些值之间具有排序顺序
 
一些算法可以直接处理分类数据。例如,决策树可以直接从分类数据中学习,不需要数据转换(取决于具体的实现)。许多机器学习算法不能直接对标签数据进行操作,它们要求所有输入变量和输出变量都是数字的。一般来说,这主要是对机器学习算法有效实施的限制,而不是对算法本身的硬限制。机器学习算法的一些实现要求所有数据都是数字的,例如scikit-learn 就有这个要求。
这意味着必须将分类数据转换为数字形式。如果分类变量是输出变量,可能还希望将模型的预测转换回分类形式,以便在某些应用程序中呈现或使用它们。
 
将序数和分类变量转换为数值有三种常用方法:
  • 序号编码
  • One-Hot 编码
  • 虚拟变量编码
 

序号编码

在序号编码中,每个唯一的类别值都被分配一个整数值。例如“ red ”为 1,“ green ”为 2,“ blue ”为 3。通常使用从零开始的整数值,这称为序数编码或整数编码,并且很容易可逆。
对于某些变量,序数编码可能就足够了。整数值彼此之间具有自然的有序关系,机器学习算法可能能够理解和利用这种关系。
序数编码转换可通过OrdinalEncoder 类实现,默认情况下,按照在数据中观察到的顺序将整数分配给标签。如果需要特定顺序,可以通过“类别”参数将其指定为具有所有预期标签排名顺序的列表。
OrdinalEncoder 类用于组织成行和列的输入变量,例如矩阵。如果需要为分类预测建模问题对分类目标变量进行编码,可以使用LabelEncoder 类。它与 OrdinalEncoder 做同样的事情,尽管它期望单个目标变量的一维输入。
 
对于分类变量,序号编码强加了一种可能不存在这种关系的序数关系。这可能会导致问题,可以改为使用 one-hot 编码。
 

One-Hot 编码

对于不存在序数关系的分类变量,整数编码可能充其量是不够的,或者最坏的情况是误导模型。
通过序数编码强制建立序数关系并允许模型假设类别之间的自然排序可能会导致性能不佳或意外结果。
在这种情况下,可以将 one-hot 编码应用于序数表示。
 
如果新数据包含训练数据集中没有的类别,“handle_unknown ”参数可以设置为“ ignore ”以不引发错误,这将导致每个标签的值为零。
 
 

虚拟变量编码

one-hot 编码为每个类别创建一个二进制变量。问题是这种表示包括冗余。例如,如果知道 [1, 0, 0] 代表“蓝色”,而 [0, 1, 0] 代表“绿色”,不需要另一个二进制变量来代表“红色”,而是可以使用 0 值单独用于“蓝色”和“绿色”,例如 [0, 0]。
这称为虚拟变量编码,总是用 C-1 个二进制变量表示 C 类别。除了稍微减少冗余之外,某些模型还需要虚拟变量表示。例如,在线性回归模型(以及其他具有偏差项的回归模型)的情况下,one hot encoding 将使输入数据的矩阵变成奇异的,这意味着它不能反转,线性回归系数也不能使用线性代数计算。对于这些类型的模型,必须使用虚拟变量编码。
 
  • Scikit-Learn
  • 数据转换离散化变换
    目录