sklearn中决策树处理类别特征_机器学习|sklearn如何处理类别型特征?

sklearn中决策树处理类别特征_机器学习|sklearn如何处理类别型特征?_第1张图片

0 前言

在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和朴素贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。

然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是["小学",“初中”,“高中”,"大学"],付费方式可能包含["支付宝",“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。

1 类别型特征分类

并不是所有的类别型特征都能统一的转换为数值型,在转换之前要先对类别进行一个分析,总体来说,类别型特征可以分为定类变量、定序变量、定距变量和定比变量。

  • 定类变量:如性别(男、女、其他),三种取值之间是相互独立的,彼此之间完全没有关系,这种变量称之为名义变量。
  • 定序变量:如学历(小学、初中、高中),三种取值不是完全独立的,我们可以明显看出,在性质上可以有高中>初中>小学这样的联系,学历有高低,但是学历的取值之间却不是可以计算的,我们不能说小学 + 某个取值 = 初中。这是有序变量。
  • 定距变量:如温度(>25摄氏度、>30摄氏度 、>35摄氏度),各个取值之间有联系,且是可以互相计算的,而且两者的差值有意义。比如35摄氏度 - 25摄氏度 = 10摄氏度,分类之间可以通过数学计算互相转换。这是有距变量。
  • 定比变量:如质量(>10kg、>50kg、>100kg),各个取值之间有联系,不仅可以计算差值,还可以计算其商值。

实际应用中对定距变量和定比变量一般不加以区分,它俩的主要区别是是否存在绝对的零点,定距变量取值为“0”时,不代表“没有”,仅代表取值为0,而定比变量为“0”时,则代表“没有”。

然而在对特征进行编码的时候,这四种分类数据都会被我们转换为[0,1,2],这三个数字在算法看来,是连续且可以计算的,这三个数字相互不等,有大小,并且有着可以相加相乘的联系。所以算法会把性别、血型这样的分类特征都误会成是质量这样的分类特征。这是说,我们把分类转换成数字的时候,忽略了数字中自带的数学性质,所 以给算法传达了一些不准确的信息,而这会影响我们的建模。

2 处理方法

这里主要介绍三种方法,分别是序号编码、独热编码二进制编码

  • 序号编码:序号编码通常用于处理类别间具有大小关系的数据

可以通过导入sklearn.preprocessing中的OrdinalEncoder进行处理。

data = [{
      '姓名':'张三','性别':'男','学历':'小学'},
        {
      '姓名':'李四','性别':'女','学历':'高中'},
        {
      '姓名':'王五','性别':'其他','学历':'高中'}]

df = pd.DataFrame(data)
df

from sklearn.preprocessing import OrdinalEncoder

oe = OrdinalEncoder()

oe.fit(df['学历'].values.reshape(-1, 1)).categories_

df['学历'] = oe.fit_transform(df['学历'].values.reshape(-1, 1))

可以看到学历这一特征按照“小学”和“高中”被编码为“0”、“1”。

  • 独热编码:通常用于处理类别间不具有大小关系的特征。

可以通过导入sklearn.preprocessing中的OneHotEncoder,创建哑变量进行处理。

from sklearn.preprocessing import OneHotEncoder
X = df['性别'].values.reshape(-1, 1)
enc = OneHotEncoder(categories='auto').fit(X) 

enc.transform(X).toarray()

可以看到性别这一特征按照“男”、“女”和“其他”分别被编码为[0,0,1] 、 [0,1,0] 和 [1,0,0]。

  • 二进制编码:二进制编码主要分为两步,先用序号编码给每个类别赋予一个类别ID,然后将类别ID对应的二进制编码作为结果。

以性别“男”、“女”和“其他”为例,分别赋予其类别ID为1,2,3,对应二进制编码为001,010,011。

二进制编码本质上是利用二进制对ID进行哈希映射,最终得到0/1特征向量,且维数少于独热编码,节省了存储空间。

sklearn中决策树处理类别特征_机器学习|sklearn如何处理类别型特征?_第2张图片

你可能感兴趣的:(sklearn中决策树处理类别特征_机器学习|sklearn如何处理类别型特征?)