大部分机器学习算法是基于向量空间中度量来进行计算的,使用独热编码(One-hot encoding, 也称为哑变量 dummy variable)会让特征之间的距离计算更加合理。通过独热编码把类别变量转换为机器学习算法可使用的格式,其基本思想是对原始类别变量的每个值创建新的变量,并赋值为 1 和 0
示例说明
下图展示如何进行独热编码,把Team变量转为新的变量:
Team | Points |
---|---|
A | 25 |
A | 12 |
B | 15 |
B | 14 |
B | 19 |
B | 23 |
C | 25 |
C | 29 |
下面把原始变量转为独热编码形式:
Team_A | Team_B | Team_C | Points |
---|---|---|---|
1 | 0 | 0 | 25 |
1 | 0 | 0 | 12 |
0 | 1 | 0 | 15 |
0 | 1 | 0 | 14 |
0 | 1 | 0 | 19 |
0 | 1 | 0 | 23 |
0 | 0 | 1 | 25 |
0 | 0 | 1 | 29 |
R 语言实现
R 有多种方式很容易实现独热编码。可以使用工具包提供函数实现,也可以手动实现。下面定义演示数据:
# 定义数据框
df <- data.frame(team=c('A', 'A', 'B', 'B', 'B', 'B', 'C', 'C'),
points=c(25, 12, 15, 14, 19, 23, 25, 29))
# 查看数据
df
# team points
# 1 A 25
# 2 A 12
# 3 B 15
# 4 B 14
# 5 B 19
# 6 B 23
# 7 C 25
# 8 C 29
我们先看caret包中提供了dummyVars()函数,它可以方便实现独热编码:
library(caret)
# 定义独热编码函数
dummy <- dummyVars(" ~ .", data=df)
# 在数据框df上执行独热编码函数
final_df <- data.frame(predict(dummy, newdata=df))
# 查看结果
final_df
# teamA teamB teamC points
# 1 1 0 0 25
# 2 1 0 0 12
# 3 0 1 0 15
# 4 0 1 0 14
# 5 0 1 0 19
# 6 0 1 0 23
# 7 0 0 1 25
# 8 0 0 1 29
另外fastDummies包提供的dummy_cols也可以轻松完成:
library(fastDummies)
df2 <- dummy_cols(df, select_columns = "team")
df2
# team_A team_B team_C points
# 1 1 0 0 25
# 2 1 0 0 12
# 3 0 1 0 15
# 4 0 1 0 14
# 5 0 1 0 19
# 6 0 1 0 23
# 7 0 0 1 25
# 8 0 0 1 29
当然我们也可以手动实现:
df$teamA <- ifelse(df$team=='A',1,0)
df$teamB <- ifelse(df$team=='B',1,0)
df$teamC <- ifelse(df$team=='C',1,0)
df
# team points teamA teamB teamC
# 1 A 25 1 0 0
# 2 A 12 1 0 0
# 3 B 15 0 1 0
# 4 B 14 0 1 0
# 5 B 19 0 1 0
# 6 B 23 0 1 0
# 7 C 25 0 0 1
# 8 C 29 0 0 1
Python实现
import pandas as pd
# 定义数据框
df = pd.DataFrame({'team': ['A', 'A', 'B', 'B', 'B', 'B', 'C', 'C'],
'points': [25, 12, 15, 14, 19, 23, 25, 29]})
# 查看结果
print(df)
sklearn 库提供的OneHotEncoder() 函数用于对pandas数据框实现独热编码:
from sklearn.preprocessing import OneHotEncoder
# 创建实例
encoder = OneHotEncoder(handle_unknown='ignore')
# 对team列执行独热编码
encoder_df = pd.DataFrame(encoder.fit_transform(df[['team']]).toarray())
# 往源数据框中合并独热编码列
final_df = df.join(encoder_df)
# 查看数据
print(final_df)
# team points 0 1 2
# 0 A 25 1.0 0.0 0.0
# 1 A 12 1.0 0.0 0.0
# 2 B 15 0.0 1.0 0.0
# 3 B 14 0.0 1.0 0.0
# 4 B 19 0.0 1.0 0.0
# 5 B 23 0.0 1.0 0.0
# 6 C 25 0.0 0.0 1.0
# 7 C 29 0.0 0.0 1.0
# 删除 'team' 列
final_df.drop('team', axis=1, inplace=True)
# 重命名列
final_df.columns = ['points', 'teamA', 'teamB', 'teamC']
print(final_df)
# points teamA teamB teamC
# 0 25 1.0 0.0 0.0
# 1 12 1.0 0.0 0.0
# 2 15 0.0 1.0 0.0
# 3 14 0.0 1.0 0.0
# 4 19 0.0 1.0 0.0
# 5 23 0.0 1.0 0.0
# 6 25 0.0 0.0 1.0
# 7 29 0.0 0.0 1.0
本文参考链接:https://blog.csdn.net/neweastsun/article/details/125323342