什么是独热编码
独热编码是一种数据预处理步骤,用于将分类值转换为兼容的数值表示。
categorical_column | bool_col | col_1 | col_2 | label |
---|---|---|---|---|
value_A | True | 9 | 4 | 0 |
value_B | False | 7 | 2 | 0 |
value_D | True | 9 | 5 | 0 |
value_D | False | 8 | 3 | 1 |
value_D | False | 9 | 0 | 1 |
value_D | False | 5 | 4 | 1 |
value_B | True | 8 | 1 | 1 |
value_D | True | 6 | 6 | 1 |
value_C | True | 0 | 5 | 0 |
例如,在这个虚拟数据集中,分类列具有多个字符串值。许多机器学习算法要求输入数据为数值形式,因此需要某种方法将此数据属性转换为与此类算法兼容的形式,本文将分类列分解为多个二进制值列。
使用Pandas库进行独热编码
首先,将.csv
文件或任何其他相关文件读入Pandas数据帧。
df = pd.read_csv("data.csv")
为了检查唯一值并更好地理解数据,可以使用以下Panda函数。
df['categorical_column'].nunique()
df['categorical_column'].unique()
对于这些虚拟数据,函数会返回以下输出结果:
>>> 4
>>> array(['value_A', 'value_C', 'value_D', 'value_B'], dtype=object)
对于分类列,可以将其分解为多个列,为此本文使用pandas.get_dummies()
方法。它需要以下参数:
参数 | |
---|---|
data:类似数组、Series或DataFrame | Pandas的原始数据帧对象 |
columns:类似列表,默认为None | 要进行独热编码的分类列列表 |
drop_first:布尔值,默认为False | 移除分类标签的第一个级别 |
为了更好地理解这个函数,让我们来对这个虚拟数据集进行一次独热编码。
- 对分类列进行独热编码
我们使用get_dummies
方法,并将原始数据帧作为数据输入,在columns
中,我们传入一个只包含categorical_column
标题的列表。
df_encoded = pd.get_dummies(df, columns=['categorical_column', ])
以下命令删除了categorical_column
,并为每个唯一值创建了一个新列。因此,单个分类列被转换为4个新列,其中只有一个列的值为1,其他3个列的值为0,这就是为什么它被称为独热编码。
categorical_column_value_A | categorical_column_value_B | categorical_column_value_C | categorical_column_value_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 |
分类值和布尔值已转换为可以作为机器学习算法输入的数值。