在数据预处理中,为了方便模型的输入,常常会把非数值类型量化成数值类型。
其中比较简单的一种处理离散型数值编码方式叫one-hot coding(独热编码)
1、概念
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
2、介绍
其实编码方式并不难理解,N位状态寄存器来对N个状态进行编码就是将所有状态排列,具有哪些状态就将状态进行标记。用来解决类别型数据的离散值问题
比如:
对0,1进行编码
首先只有两个状态就是需要两个状态寄存器
编码为:00,01
再比如,有3个特征值;
face = ['handsome','ugly']
stature = ['tall','middle','short']
country = ['Chinese','American,'Japan','korea']
一共9种状态,用9位数字表示
['handsome','tall','Japan'] 表示为 101000010
['ugly','short','Japan'] 表示为 010010010
3、简单实现
在python的第三方库pandas中实现非常简单,就是使用 get_dummies() 方法
def one_hot_encoder(df, nan_as_category = True):
original_columns = list(df.columns) # 属性
categorical_columns = [col for col in df.columns if df[col].dtype == 'object']
df = pd.get_dummies(df, columns= categorical_columns, dummy_na= nan_as_category) #
new_columns = [c for c in df.columns if c not in original_columns]
return df, new_columns
# 测试
data = [['handsome', 'tall', 'Japan'],
['ugly', 'short', 'Japan'],
['handsome', 'middle', 'Chinese']]
df = pd.DataFrame(data,columns=['face', 'stature ',' country '])
df,df_cat = one_hot_encoder(df)
print(df)
结果如下:
4、特点
优点:独热编码的值只有0和1,不同的类型存储在垂直的空间,解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用,特征的增加也防止了模型的过拟合。
缺点:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用主成分分析(PCA)来减少维度。而且one-hot encoding+PCA这种组合在实际中也非常有用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。