在数据预处理中,为了方便模型的输入,常常会把非数值类型量化成数值类型。
其中比较简单的一种处理离散型数值编码方式叫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这种组合在实际中也非常有用。


西区彭于晏
3 声望0 粉丝

学习者