今天对表格类型的数据集做数据处理的时候,用pandas中的get_dummies()方法对离散的字符型特征做独热编码处理,碰到一个问题:编码出来的结果不是0、1,全是布尔型的True和False,查了网上很多资料,解决问题后特此记录。
one-hot编码是对离散的特征数据进行特征数字化的常用方法,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
比如对性别特征:[“男”,“女”]进行One-Hot编码,按照N位状态寄存器来对N个状态进行编码的原理,处理后应该是这样的(有两种特征,所以N=2):[10,01],就是把原来的特征转化成了n个二元数值型的特征,原来的特征有多少种就有多少位,是哪种特征该位置上就是1,其他位置就是0,这样就可以解决分类器不好处理属性数据(字符型)的问题。
get_dummies是pandas库实现one-hot编码的方式。官方文档:pandas.get_dummies
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
举例:
import pandas as pd
df = pd.DataFrame([
['zhang' , 'A'],
['wang' , 'B']])
df.columns = ['name', 'gender']
pd.get_dummies(df)
这样就可以对df进行one-hot编码,也可以只对表格中的某几种特征进行one-hot编码:
pd.get_dummies(df,columns=['name','gender'])
只要指定columns列表就行了,这里要注意一个问题,就是编码完之后得到的表里只有你编码的那几种特征,你要在原来的数据表里把这几种特征删了,在把get_dummies的结果加进去。
如果你的版本比较新,你可能会得到这么一个结果:
查了资料,原因:
get_dummies函数在pandas1.6.0版本之前返回numpy.uint8,无符号八位整数,在1.6.0版本开始更改为返回numpy.bool_,numpy布尔值。
该修改由#45848提出,认为返回值是无符号整型变量将导致难以跟踪的错误,于#48022中完成修复。
但是这样子给模型训练有可能就会报错,如果你需要int型的,你需要自己指定:
pd.get_dummies(df,columns=['name','gender'],dtype=int)
结果:
问题解决。
更新:有些特征值的取值太多会导致ont-hot编码后的特征矩阵太大无法计算,书接下文:解决one-hot编码时特征值太多导致矩阵维度太大的问题