【Python】数据处理之One-Hot编码

       在我们数据分析、建模的时候,首先要处理的就是各种数据,数据的类型也不仅仅局限于连续型数值。比如,性别、城市名等等此类的指标也是很多的。这种类型, 它是不具备序列性、也不能比较大小的,如果这个时候简单的用数字来替换,那么就给这种赋予了大小的属性,这就会影响权重矩阵的计算。这个时候,就可以用One-Hot编码(也有人称独热编码)这种特殊的编码方式了。

        举例解释下为什么直接转变为数值型数据会有问题:对于分类型数据,如果种类较多,转变为分类1,2,3,4等来表示,带入到模型中,就被认为连续变量,并且如果同样的数据,一个分类被1代表,另一个分类被1000代表,1000和1对模型的影响明显不同,会影响统一特征在样本中的权重。

        One-Hot编码是用N位状态寄存器来对N个状态进行编码。一个变量,共有3个分类值(ABC),那么N为3,对应的One-Hot编码可以表示为100,010,001。

        对于连续型数据,有时候我们也需要做特征转换,比如说人的年龄,这个分布可能会从0一直到100,但其实他们的分布可能集中在10-40之间,那么我们可以将这种连续型的数据处理为分类变量。比如:0-18:1;19-30:2;30-40:3,40-60:4,60+:5,这样做的好处是提高模型运算的效率。比如用LR算法做模型,在数据处理过程中,可以先对连续变量进行离散化处理,然后对离散化后数据进行One-Hot编码,最后放入LR模型中。这样可以增强模型的非线性能力。

优缺点
(1)通过One-Hot编码,可以对特征进行了扩充。
(2)连续变量经过编码后,从一个权重变为多个权重,提升了模型的非线性能力。
(3)不需要多参数进行归一化处理。
(4)随着将大权重拆分成几个小权重管理特征,降低了异常值对模型的影响,增加了模型稳定性。
(5)生成了较大的稀疏矩阵。

     接下来就是在Python中实现此方法:

from sklearn.preprocessing import OneHotEncoder#导入One-Hot编码
import pandas as pd

#创建一个数据集,放入dataframe中
data = [['语文',125],
        ['数学',140],
        ['英语',130],
       ['地理',80],
       ['历史',90],
       ['物理',80],
       ['化学',90]]
data = pd.DataFrame(data,columns=['titile','分数'])
#把带title这一列转换为数值型,因为one-hot编码也需要先转换成数值型
list = data.ix[:,'titile'].unique()#取出唯一的列的值
#用简单的数字直接代表即可
for j in range(len(list )):
    data.ix[:,'titile'] = data.ix[:,'titile'].apply(lambda x:j if x==list [j] else x)
print(data)

这里先看一下转化的结果:

 titile   分数
0       0  125
1       1  140
2       2  130
3       3   80
4       4   90
5       5   80
6       6   90

然后用One-Hot编码来处理:

#进行one-hot编码
#先取出title这一列的值
tempdata = data[['titile']]

#使用One-Hot编码
enc = OneHotEncoder()
enc.fit(tempdata)

#one-hot编码的结果是比较奇怪的,最好是先转换成二维数组
tempdata = enc.transform(tempdata).toarray()
print(tempdata)
print('取值范围整数个数:',enc.n_values_)

先看下直接One-Hot的结果:

[[1. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 1.]]
取值范围整数个数: [7]

将这个结果转成dataframe中的列:

#再将二维数组转换为DataFrame,这里多列用一样的列名
tempdata = pd.DataFrame(tempdata,columns=['titile']*len(tempdata[0]))
print(tempdata)
titile  titile  titile  titile  titile  titile  titile
0     1.0     0.0     0.0     0.0     0.0     0.0     0.0
1     0.0     1.0     0.0     0.0     0.0     0.0     0.0
2     0.0     0.0     1.0     0.0     0.0     0.0     0.0
3     0.0     0.0     0.0     1.0     0.0     0.0     0.0
4     0.0     0.0     0.0     0.0     1.0     0.0     0.0
5     0.0     0.0     0.0     0.0     0.0     1.0     0.0
6     0.0     0.0     0.0     0.0     0.0     0.0     1.0

以上就是一个简单的独热编码的过程了~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值