Press "Enter" to skip to content

Numpy与Pandas、Sklearn中one-hot快速编码方法

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

1. 前言

 

在机器学习、深度学习分类算法中,需要把分类标识转换为数值,例如客户留存、流失、预计流失、新客户分别对应数字【0、1、2、3】。这样离散型编码数据,数值大小在算法没有实际意义,还容易造成负面影响。对于这种情况,常用解决方案是使用one_hot编码。

 

例如:一组客户生命周期状态数据:

carduser_id状态编码
12345预计流失2
223432流失1
343424新客户3

 

对应one_hot编码解决方案

 

客户留存流失预计流失新客户
0010
0100
0001

 

什幺是 one-hot 编码?

 

独热编码即 One-Hot 编码,又称一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

 

One-Hot 编码是分类变量作为二进制向量的表示。

 

(1) 将分类值映射到整数值。

 

(2) 然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。

 

在构建分类算法的时候,客户标签通常都要求是one_hot编码,实际上标签可能各种离散形式,当然也包括整数值。

 

例如:

 

性别特征:["男","女"]
       省份特征:["黑龙江","湖北","四川"]
       运动特征:["马拉松","足球","篮球","羽毛球","乒乓球"]

 

2. 如何使用Numpy快速编码

 

在numpy中,可以使用eye()函数,便捷生成one_hot编码,先简单介绍eye()函数的功能。

 

函数:np.eye(N, M=None, k=0, dtype=float, order=‘C’)

 

功能说明:用来返回一个2维的对角数组

 

参数:

N:int型,用来控制输出二维数组的行数
M:int型,用来控制输出二维数组的列数,如果M为None,则M等于N
k:int型,可选项,主对角线的index,默认是0,如果k为正数,则对角线往上移动,如果k为负数,则对角线往下移动
dtype:数据的类型,可选项,返回的数据的数据类型
order:{‘C’,‘F’},可选项,也就是输出的数组的形式是按照C语言的行优先’C’,还是按照Fortran形式的列优先‘F’存储在内存中。

例如:生成one-hot形式数组

 

#设置类别的数量
    num_classes = 4
    #需要转换的整数
    arr = [2,3,1]
    #将整数转为一个4位的one hot编码
    print(np.eye(num_classes )[arr])

 

输出如下:

 

[[0. 0. 1. 0.]
 [0. 0. 0. 1.]
 [0. 1. 0. 0.]]

 

3. 在Pandas中快速编码方法

 

3.1. 使用pd.get_dummies

 

 

import pandas as pd
df = pd.DataFrame({
 'carduser_id': [12345,223432,343424],
                   'gender': ['男','男','女']})
dummies = pd.get_dummies(df)
dummies = dummies.rename(columns={
 'gender_女':'female','gender_男':'male'})
dummies

 

从输入(下图左1),执行过程如下图所示。

注:不知列名有没有很好的命名方法。

 

3.2. 自己控制编码

 

import pandas as pd
df = pd.DataFrame({
 'carduser_id': [12345,223432,343424],
                   'gender': ['男','男','女']})
df['male']= df['gender'].apply(lambda x:1 if x=='男' else 0)
df['female']= df['gender'].apply(lambda x:1 if x=='女' else 0)
df = df.drop(['gender'], axis=1)
df

 

 

4. Sklearn中OneHotEncoder方法

 

from sklearn.preprocessing import OneHotEncoder
import pandas as pd
df = pd.DataFrame({
 'carduser_id': [12345,223432,343424],
                   'gender': ['男','男','女']})
gender = df['gender'].values
encoder=OneHotEncoder(sparse=False) # One-Hot编码
ans=encoder.fit_transform(gender.reshape((-1,1)))
ans

 

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

 

5. 总结

 

在机器学习、深度学习过程中,针对类别、分类离散型数据,one hot encoding是常用的方案,在numpy、pandas、SKlearn中分别给出了便捷解决方案,建议优先考虑。

 

参考:

 

[1]. 修炼之路.numpy快速生成one hot编码
. CSDN博客. 2019.01

 

[2]. 梦dancing.机器学习数据预处理1:独热编码(One-Hot)及其代码
. CSDN博客. 2019.04

 

[3]. 肖永威.大数据人工智能常用特征工程与数据预处理Python实践(1)
. CSDN博客. 2020.12

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注