OneHot编码知识点

https://blog.csdn.net/tengyuan93/article/details/78930285

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

如果有错误,请回复指出,谢谢!


定性特征转换为定量特征

定性特征,表示某个数据点属于某一个类别,或具有某一种类的特性。 
定性特征英文用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编码后结果是一致的,否则的话结果不一致。

发布了161 篇原创文章 · 获赞 78 · 访问量 24万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览