one-hot encoding

转载地址:http://www.cnblogs.com/lianyingteng/p/7755545.html
https://blog.csdn.net/sheepwang1991/article/details/73497757/
采用one hot encoding的原因,参考博文:https://blog.csdn.net/pipisorry/article/details/61193868
1. one-hot
1.1 one-hot编码
  什么是one-hot编码?one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。举个例子,假设我们有四个样本(行),每个样本有三个特征(列),如图:
这里写图片描述
上图中我们已经对每个特征进行了普通的数字编码:我们的feature_1有两种可能的取值,比如是男/女,这里男用1表示,女用2表示。那么one-hot编码是怎么搞的呢?我们再拿feature_2来说明:

这里feature_2 有4种取值(状态),我们就用4个状态位来表示这个特征,one-hot编码就是保证每个样本中的单个特征只有1位处于状态1,其他的都是0。
这里写图片描述
对于2种状态、三种状态、甚至更多状态都是这样表示,所以我们可以得到这些样本特征的新表示:
这里写图片描述
one-hot编码将每个状态位都看成一个特征。对于前两个样本我们可以得到它的特征向量分别为
这里写图片描述
1.2 one-hot在提取文本特征上的应用
  one hot在特征提取上属于词袋模型(bag of words)。关于如何使用one-hot抽取文本特征向量我们通过以下例子来说明。假设我们的语料库中有三段话:

    我爱中国

    爸爸妈妈爱我

    爸爸妈妈爱中国

我们首先对预料库分离并获取其中所有的词,然后对每个此进行编号:

    1 我; 2 爱; 3 爸爸; 4 妈妈;5 中国

然后使用one hot对每段话提取特征向量:
这里写图片描述

因此我们得到了最终的特征向量为

    我爱中国  ->   1,1,0,0,1

    爸爸妈妈爱我  ->  1,1,1,1,0

    爸爸妈妈爱中国  ->  0,1,1,1,1

优缺点分析
优点:一是解决了分类器不好处理离散数据的问题,二是在一定程度上也起到了扩充特征的作用(上面样本特征数从3扩展到了9)

缺点:在文本特征表示上有些缺点就非常突出了。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的);最后,它得到的特征是离散稀疏的。

2. sk-learn模拟one-hot encoding

>>> import numpy
>>> import scipy
>>> import sklearn
>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
#一个43列的数组,即有4个样本,3个特征;
>>> enc.n_values_#每个特征的取值个数(第一列共有2个取值,第二列有3个,第三列有4个)
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9])#独热编码后每个特征开始和结束的下标;[0,2,5,9]中的四个数的间距是[2,3,4];相当于给出9位数,前2位截取给第一个特征,这2位数的开始下标是0结束下标是2;中间3位数截取给第二个特征,这3位数的开始下标接着上面即从2开始到5结束....
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])
#对新拿到的[0,1,1]做独热编码,即有第一列是[1,0],第二列是[0,1,0],第三列是[0,1,0,0],所以最终拼在一起得到它的独热编码就是[1,0,0,1,0,0,1,0,0]
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值