OneHot编码知识点

OneHot编码


两个多月没有更新博客了,一直忙于天池某个比赛和开题方面的事宜,现在重新抓起,更新博客,希望能整理+思考得出些有营养的东西,也算是自己的笔记方便以后查阅。
如果有错误,请回复指出,谢谢!

定性特征转换为定量特征

定性特征,表示某个数据点属于某一个类别,或具有某一种类的特性。
定性特征英文用Categorical Variable表示。
常见如:颜色、性别、地址、血型、国籍、省、市、邮政编码,都是定性特征。
维基百科关于Categorical Variable解释
这篇文章对定性特征的定义和数据挖掘中常用处理方法做了很好的讲解


Dummy Encoding VS One-Hot Encoding

二者都可以对Categorical Variable做处理,转换为定量特征,转换为定量特征其实就是将原来每个特征的类别拿出来作为一个新的特征(Dummy Variable)了,如性别——男,女,定量特征即将男作为一个特征,女作为一个特征,如果数据中的Categorical Variable很多,且每个Variable种类比较多,那么转换后的数据可能会非常稀疏。
二者本身存在差别。
Difference:一个定性特征或者成为Categorical Variable,其有n个值,Dummy Encoding 会将这个Categorical Variable转换为n-1个特征变量,而OneHot Encoding会转换为n个特征变量。
其中,
这种转换在经济学或者回归模型中会存在一个Dummy Variable Trap的问题,使用Dummy Encoder可以避免这个问题,由于我这里面对的是分类问题,没有过多的调研。


目前想要对Dataframe某一列数据进行OneHot Encoder,有两种方法,参照Stack Overflow一个回答

  • 使用pandas.get_dummies(df,columns=['df_column_name'])
    默认的pandas.get_dummies使用的是OneHot编码,设置参数drop_first=True可以设置为使用Dummy Coder,即剔除了第一个变量。参考链接
    如:这里写图片描述

  • 使用from sklearn.preprocessing import OneHotEncodersklearn中的OneHotEncoder提供fit(X),transform(X),fit_transform(X),其中X是一个二维数组,且数组类型为int,不能直接处理字符串类型的Categorical Varibale
    OneHotEncoder后的编码长度是原来每个特征各自的类别数之和,如sklearn自带的一个example:
    这里写图片描述
    此时[[0,1,1]]转换后的值长度为9=2+3+4。


我目前面临的是将字符串类型的Categorical Variable定量化,但是OneHotEncoder却不能直接处理字符串类型,所以可以通过
1、 sklearn.preprocessing.LabelEncoder来把字符串类型定性特征转变为连续的数值型变量,再用OneHotEncoder二值化。
如:直接使用OneHotEncoder报错了:
这里写图片描述
这里写图片描述
使用LabelEncoder+OneHotEncoder:
这里写图片描述
2、 LabelBinarizer().fit_transform(testdata['pet'])直接获得结果。
但是这两种方法使用的LabelEncoder和LabelBinarizer的输入数据X都是一维数组,无法批量对多列数据进行定量化。
参考博客
博客中指出,pandas.get_dummies可以很方便的对定性特征定量化,且可以批量处理。
但是,get_dummies 不像 sklearn 的 transformer一样,有 transform方法,所以一旦测试集中出现了训练集未曾出现过的特征取值,简单地对测试集、训练集都用 get_dummies 方法将导致数据错误。
意思为:sklearn中有fit和transform方法,即使测试集中每个定性特征的类别值和训练集同个定性特征的类别值不同,通过使用enc=OneHotEncoder.fit(train),就得到了转换关系,分别transform train和test,此时不会出错;
但是如果是使用get_dummies(),即使测试集定性特征某个类别值在训练集中出现过,二者定量表示也可能不同。
看例子:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
可以看到对于traindata和testdata中的age特征,相同类别的Onehot编码后结果是一致的,否则的话结果不一致。

  • 15
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值