首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于sklearn独热编码二.字符串型类别变量

关于sklearn独热编码二.字符串型类别变量

作者头像
小飞侠xp
发布2018-08-29 15:17:06
1.4K0
发布2018-08-29 15:17:06
举报

一.数值型类别变量

#简单来说 LabelEncoder 是对不连续的数字或者文本进行编号

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

le.fit([1,5,67,100])

le.transform([1,1,100,67,5])

输出: array([0,0,3,2,1])

#OneHotEncoder 用于将表示分类的数据扩维:

note:OneHotEncoder的输入必须是 2-D array

from sklearn.preprocessing import OneHotEncoder

ohe = OneHotEncoder()

ohe.fit([[1],[2],[3],[4]])      #注意是两个方括号[ [ ] ].

ohe.transform([2],[3],[1],[4]).toarray()

输出:[ [0,1,0,0] , [0,0,1,0] , [1,0,0,0] ,[0,0,0,1] ]

二.字符串型类别变量

OneHotEncoder无法直接对字符串型的类别变量编码,也就是说OneHotEncoder().fit_transform(testdata[['pet']])这句话会报错(不信你试试)。已经有很多人在 stackoverflow 和 sklearn 的 github issue 上讨论过这个问题,但目前为止的 sklearn 版本仍没有增加OneHotEncoder对字符串型类别变量的支持,所以一般都采用曲线救国的方式:

                方法一 先用 LabelEncoder() 转换成连续的数值型变量,再用 OneHotEncoder() 二值化

                方法二 直接用 LabelBinarizer() 进行二值化

eg.

testdata = pd.DataFrame({'pet': ['cat','dog','dog','fish']

然而要注意的是,无论 LabelEncoder() 还是 LabelBinarizer(),他们在 sklearn 中的设计初衷,都是为了解决标签 y 的离散化,而非输入 X, 所以他们的输入被限定为 1-D array,这恰恰跟 OneHotEncoder() 要求输入 2-D array 相左。

# 方法一: LabelEncoder() + OneHotEncoder()

a = LabelEncoder().fit_transform(testdata['pet'])

OneHotEncoder( sparse=False).fit_transform(a.reshape(-1,1))# 注意: 这里把 a 用 reshape 转换成 2-D array

# 方法二: 直接用 LabelBinarizer()

LabelBinarizer().fit_transform(testdata['pet'])

array([[1.,0.,0.],

[0.,1.,0.],

[0.,1.,0.],

[0.,0.,1.]])

正因为LabelEncoder和LabelBinarizer设计为只支持 1-D array,也使得它无法像上面 OneHotEncoder 那样批量接受多列输入,也就是说LabelEncoder().fit_transform(testdata[['pet', 'age']])会报错。


另一种解决方案

其实如果我们跳出 scikit-learn, 在 pandas 中可以很好地解决这个问题,用 pandas 自带的get_dummies函数即可

get_dummies的优势在于:

本身就是 pandas 的模块,所以对 DataFrame 类型兼容很好

不管你列是数值型还是字符串型,都可以进行二值化编码

能够根据指令,自动生成二值化编码后的变量名

这么看来,我们找到最完美的解决方案了? No!get_dummies千般好,万般好,但毕竟不是 sklearn 里的transformer类型,所以得到的结果得手动输入到 sklearn 里的相应模块,也无法像 sklearn 的transformer一样可以输入到pipeline中 进行流程化地机器学习过程。更重要的一点

get_dummies不像 sklearn 的transformer一样,有transform方法,所以一旦测试集中出现了训练集未曾出现过的特征取值,简单地对测试集、训练集都用get_dummies方法将导致数据错误

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.数值型类别变量
  • 二.字符串型类别变量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档