sklearn之OneHotEncoder

一、简介

OneHotEncoder(n_values = 'auto',categorical_features='all',dtype=<class 'numpy.float64'),sparse=True,handle_unknown = 'error')
  • 1、One-Hot编码也称为“独热”式编码,既然独热是只能有一位是“发光”的。在众多特征中仅仅有一个特征起作用。
  • 2、比如红绿灯有三个特征红色、绿色、黄色,对这三种特征进行数字化处理,我们可以简单的通过定义红色=1、绿色=2、黄色=3来进行分类,这种分类实现的是标签编码,即给不同的类别打上标签。简单分类的弊端是机器可能会根据数值进行排序,从而导致了红色<绿色<黄色,我们事实只想让机器去区分他们,某方面说他们的地位相等。
  • 3、为了地位相等我们使用了One-Hot编码,红色(1,0,0)、绿色(0,1,0)、黄色(0,0,1)。这种情况下,每两个向量之间的距离都是根号2,在向量空间中的距离是相等的,基本不会影响基于向量空间度量算法的效果。也可以看出来每次只有一位是1。

二、代码操作及参数详解

  • 1、简答的代码操作
from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder()
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 1, 3]]).toarray()
 # 如果不加 toarray() 的话,输出的是稀疏的存储格式,即索引加值的形式;也可以通过参数指定 sparse = False 来达到同样的效果
print(ans) 
# 输出 [[ 1.  0.  0.  1.  0.  0.  0.  0.  1.]]

注解:
(1)代码中4*3的矩阵表示的是4个文本,每个文本具有3个特征,即每一列是一个特征维度。
(2)在矩阵第一列中[0,1,0,1]中,我们可以看到这列特征中有两个特征,即0和1两种;所以我们用两位比特数据即可表示,(1,0)来表示0,用(0,1)来表示1
(3)在矩阵第一列中[0,1,2,0]中,我们可以看到这列特征中有三个特征,即0和1,2三种;所以我们用三位比特数据即可表示,(1,0,0)来表示0,用(0,1,0)来表示1,(0,0,1)来表示2
(4)在矩阵第一列中[3,0,1,2]中,我们可以看到这列特征中有四个特征,即0和1,2,3四种;所以我们用四位比特数据即可表示,(1,0,0,0)来表示0,用(0,1,0,0)来表示1,(0,0,1,0)来表示2,(0,0,0,1)来表示3。
(5)每一列的特征表示完了之后,我们该如何表示第一行的文本[0,0,3]呢?
在第一个特征中0的表示为[1,0],在第二个特征中0的表示为[1,0,0],在第三个特征中3的表示为[0,0,0,1]。综上我们第一行文本的表示为[[1,0,1,0,0,0,0,0,1]]

  • 2、n_values=’auto’,表示每个特征使用几维的数值由数据集自动推断,即每一列中有几种不同的类别就使用几位来表示。当然也可以自己指定,手动赋值特征值的个数有助于防止类别的丢失,看下面这个例子:
from sklearn.preprocessing import  OneHotEncoder
enc = OneHotEncoder(n_values = [2, 3, 4])
enc.fit([[0, 0, 3],
         [1, 1, 0]])
ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) 
# 输出 [[ 1.  0.  0.  0.  1.  0.  0.  0.  1.]]
  • 3、categorical_features = ‘all’,这个参数指定了对哪些特征进行编码,默认对所有类别都进行编码。也可以自己指定选择哪些特征,通过索引或者 bool 值来指定,看下例:
from sklearn.preprocessing import  OneHotEncoder
enc = OneHotEncoder(categorical_features = [0,2]) 
# 等价于 [True, False, True],表示第一列和第三列的特征有编码
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])
ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) 
# 输出 [[ 1.  0.  0.  0.  0.  1.  2.]]
#将有编码的特征列先进行输出,没有编码的特征列后输出
  • 4、
    (1)dtype=<class ‘numpy.float64’> 表示编码数值格式,默认是浮点型。
    (2)sparse=True 表示编码的格式,默认为 True,即为稀疏的格式,指定 False 则就不用 toarray() 了
    (3)handle_unknown=’error’,其值可以指定为 “error” 或者 “ignore”,即如果碰到未知的类别,是返回一个错误还是忽略它。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章