One_Hot数据预处理

在很多机器学习任务中,特征并不总是连续值,而有可能是分类值

数据预处理之One-Hot

    0.说在前面

    1.什么是One_Hot?

    2.One_Hot编码处理离散特征

    3.One_Hot编码实现

    4.作者的话

0.说在前面

前面一节我们讲了机器学习过程中的特征工程处理,那么这一节是不是该到数据预处理了呢,对头!

接下来,我们进入数据预处理环节,而在数据预处理过程中,非常重要的一节就是One-Hot编码问题,之前在研究TensorFlow时候,听说过One-Hot编码(独热编码),但不清楚是什么,那么我们现在一起来深入学习一下什么是One-Hot编码,它对我们的机器学习过程的模型又有什么影响呢?

对于这些问题我们从问题由来,问题分析,及实战操作,深入探究!

1.什么是One_Hot?

对于这个问题,之前谷歌了一下,还涉及寄存器了(one-hot编码是N位状态寄存器为N个状态进行编码的方式)。。真的无语。这里不说那些很底层的,我们只需要了解one-hot编码是将类别变量转换为机器学习算法中容易处理的一种形式

概念太抽象了,对太抽了,那么从实际例子来说明。

如下我们有两个特征:

 

我们看到有两个特证名为:animal与food,解释一下两列值意思,第一列代表的是动物的名字,第二列是食物的个数,比如第一行cat 2 描述为猫吃了两个食物,这里是测试数据,主要是想通过,这些数据给予直观的认识及实际操作。

而对上述数据做one-hot编码后得结果为:

 

animal列数据类型是字符串,而第二列是数值型,如果我们能将这些特征值用0/1表示,是不是在机器学习中,对这些非连续值非常有帮助。

综上,我们推论出,如果你在处理的数据中,通过特征工程这一步操作,能够将特征的类型判别出来,哪些是连续的,哪些是非连续的,那么我们就可以对它进行特殊处理,比如此处的one-hot编码!

对于定义我们有了基础的了解之后,下面我们来深入了解一下为什么one-hot编码可以用来处理非连续(离散)特征?

2.One_Hot处理离散特征

在使用one-hot编码中,我们可以将离散特征的取值扩展到欧式空间,在机器学习中,我们的研究范围就是在欧式空间中,首先这一步,保证了能够适用于机器学习中;而另外对于one-hot处理的离散的特征的某个取值也就对应了欧式空间的某个点!

那么对于上面这句话,你会有很多疑问,比如:为何one-hot编码能将离散特征映射到欧式空间?

原因是,在统计机器学习算法中的回归,分类这些问题中,特征之间距离的计算或相似度计算非常重要,比如大家常用的k-means,而我们常用的这些计算都在欧式空间中进行相似度计算。换句话说,就是我上面说的研究范围在欧式空间,保证了one-hot编码的成立!

3.One_Hot编码实现

还是以上述animal为例:

数据展示

import pandas as pd
data = {
    'animal':['cat','dog','cat','lion'],
    'food':[2,3,5,3]

}

data_learn = pd.DataFrame(data)
print(data_learn)



输出:
  animal  food
0    cat     2
1    dog     3
2    cat     5
3   lion     3

Process finished with exit code 0
 

完整特征编码

dummies = pd.get_dummies(data_learn,columns=data_learn.columns)
print(dummies)


 

输出:
   animal_cat  animal_dog  animal_lion  food_2  food_3  food_5
0           1           0            0       1       0       0
1           0           1            0       0       1       0
2           1           0            0       0       0       1
3           0           0            1       0       1       0

Process finished with exit code 0

 

特定特征编码

 
dummies = pd.get_dummies(data_learn['animal'])
dummies = dummies.add_prefix("{}_".format('animal'))
data_learn.drop('animal',axis=1,inplace=True)
data_learn = data_learn.join(dummies)
print(data_learn)

 

对于这里的特定特征编码,我这里只选取了一个特定特征,你也可以选择多个,通过列表存储,遍历操作,即可实现!

  food  animal_cat  animal_dog  animal_lion
0     2           1           0            0
1     3           0           1            0
2     5           1           0            0
3     3           0           0            1

机器学习中,经常会用到one-hot编码。pandas中已经提供了这一函数。 
但是这里有一个神坑,得到的one-hot编码数据类型是uint8,进行数值计算时会溢出!!!

import pandas as pd
import numpy as np
a = [1, 2, 3, 1]
one_hot = pd.get_dummies(a)
print(one_hot.dtypes)
print(one_hot)
print(-one_hot)


1    uint8
2    uint8
3    uint8
dtype: object
   1  2  3
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0
     1    2    3
0  255    0    0
1    0  255    0
2    0    0  255
3  255    0    0
--------------------- 

正确做法,将其转换成浮点数:

one_hot = one_hot.astype('float')
print(-one_hot)


     1    2    3
0 -1.0 -0.0 -0.0
1 -0.0 -1.0 -0.0
2 -0.0 -0.0 -1.0
3 -1.0 -0.0 -0.0

猜你喜欢

转载自blog.csdn.net/qq_41853536/article/details/83053849
今日推荐