什么是独热编码
独热编码是一种数据预处理步骤,用于将分类值转换为兼容的数值表示。
分类列 | bool列 | 列1 | 列2 | 标签 |
值A | 真 | 9 | 4 | 0 |
值B | 假 | 7 | 2 | 0 |
值D | 真 | 9 | 5 | 0 |
值D | 假 | 8 | 3 | 1 |
值D | 假 | 9 | 0 | 1 |
值D | 假 | 5 | 4 | 1 |
值B | 真 | 8 | 1 | 1 |
值D | 真 | 6 | 6 | 1 |
值C | 真 | 0 | 5 | 0 |
例如对于这个虚拟数据集,分类列有多个字符串值。许多机器学习算法要求输入数据以数值形式存在。因此,我们需要一种方法将此数据属性转换为与这些算法兼容的形式。因此,我们将分类列分解为多个二进制值列。
如何使用Pandas库进行独热编码
首先,将.csv文件或任何其他相关文件读入Pandas数据框。
df = pd.read_csv("data.csv")
为了检查唯一值并更好地了解我们的数据,我们可以使用以下Pandas函数。
df['分类列'].nunique()
df['分类列'].unique()
对于这个虚拟数据,函数返回以下输出:
>>> 4
>>> 数组(['值_A', '值_C', '值_D', '值_B'], dtype=对象)
对于分类列,我们可以将其拆分为多个列。为此,我们使用pandas.get_dummies()方法。它接受以下参数:
参数 | |
data:类似数组、Series或DataFrame | 原始的pandas数据帧对象 |
columns:类似列表,默认值为None | 要进行热编码的分类列的列表 |
drop_first:布尔值,默认为False | 删除分类标签的第一个级别 |
为了更好地理解该函数,让我们对虚拟数据集进行一次独热编码。
热编码分类列
我们使用get_dummies方法,并将原始数据帧作为data输入。在columns中,我们传递一个只包含分类列标题的列表。
df_encoded = pd.get_dummies(df, columns=['分类列', ])
以下命令删除分类列并为每个唯一值创建一个新列。因此,单个分类列被转换为4个新列,其中只有其中一个列的值为1,其他3个列的值为0。这就是为什么它被称为独热编码。
分类列_值_A | 分类列_值_B | 分类列_值_C | 分类列_值_D |
1 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 0 | 1 |
0 | 0 | 0 | 1 |
0 | 0 | 0 | 1 |
0 | 0 | 0 | 1 |
0 | 1 | 0 | 0 |
0 | 0 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 0 | 0 | 1 |
当我们想要对布尔列进行独热编码时,问题就出现了。这样会创建两个新的列。
独热编码二进制列
df_encoded = pd.get_dummies(df, columns=[bool_col, ])
bool_col_False | bool_col_True |
0 | 1 |
1 | 0 |
0 | 1 |
1 | 0 |
当我们可以只有一列,其中True被编码为1,False被编码为0时,我们没有必要增加一列。为了解决这个问题,我们使用drop_first参数。
df_encoded = pd.get_dummies(df, columns=['bool_col'], drop_first=True)
bool_col_True |
1 |
0 |
1 |
0 |
结论
虚拟数据集被独热编码,最终结果如下所示
col_1 | col_2 | bool | A | B | C | D | label |
9 | 4 | 1 | 1 | 0 | 0 | 0 | 0 |
7 | 2 | 0 | 0 | 1 | 0 | 0 | 0 |
9 | 5 | 1 | 0 | 0 | 0 | 1 | 0 |
8 | 3 | 0 | 0 | 0 | 0 | 1 | 1 |
9 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
5 | 4 | 0 | 0 | 0 | 0 | 1 | 1 |
8 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
6 | 6 | 1 | 0 | 0 | 0 | 1 | 1 |
0 | 5 | 1 | 0 | 0 | 1 | 0 | 0 |
1 | 8 | 1 | 0 | 0 | 0 | 1 | 0 |
分类值和布尔值已经被转换为可以用作机器学习算法输入的数值。Muhammad Arham是一名从事计算机视觉和自然语言处理的深度学习工程师。他曾参与部署和优化多个生成式人工智能应用,这些应用在Vyro.AI的全球排行榜上名列前茅。他对构建和优化智能系统的机器学习模型感兴趣,并坚信不断改进。