3.2 特征

特征构建的主要目的是生成新的特征,而针对不同类型的特征,有多种方式可以生成新特征。例如,针对分类特征可以利用一些重新编码的方式生成新特征,针对数值特征也有多种方式生成新特征,针对文本数据通常会使用生成的词频等内容作为新的特征。本节将针对不同类型的数据分别介绍相关的特征构建方法。

3.2.1 分类特征重新编码

针对类别数据的特征编码有多种方式,下面对sklearn库中的相关方式进行介绍。针对类别标签数据,常用的方法是将其编码为常数,可以使用preprocessing模块中的OrdinalEncoder(),程序如下:

从上面程序的输出结果可知,类别Iris-setosa被编码为0,类别Iris-versicolor被编码为1,类别Iris-setosa被编码为2。

离散特征可以通过preprocessing模块中的LabelEncoder(),将其编码为0~n-1的整数,或者使用OneHotEncoder()对特征进行One-Hot编码,使用这些方法的程序如下:

上面的程序对变量[1,2,3,10,10]进行了LabelEncoder()操作,从输出结果可以发现,数据在重新编码后成了向量[0 1 2 3 3]。对label变量进行One-Hot编码的输出中,输出为一个n×3的矩阵,其中[1.0.0.]、[0.0.1.]与[0.1.0.]分别表示3种类别标签。

preprocessing模块还提供了LabelBinarizer(),可以对类别标签进行二值化变化,使用方式如下。针对该示例,从输出结果可以发现,其功能和One-Hot编码类似。

针对分类问题中的多标签预测,可以使用preprocessing模块中的MultiLabelBinarizer()。其输出结果可以理解为,先将每一个单独的标签进行One-Hot编码,如果一个样本由多个标签表示,那么就把它们对应的One-Hot编码相加。程序如下:

3.2.2 数值特征重新编码

多项式特征经常用来生成数值特征,针对一个变量x的多项式特征,通常对其进行幂运算,获取[x,x2,x3,…]。多项式特征可以使用sklearn库中preprocessing模块的PolynomialFeatures函数来完成,下面给出一个最多获取3次幂多项式特征的计算方式,程序如下:

多个变量的多项式特征,可以使用现有的数据特征相互组合生成新的数据特征,如特征之间的相乘组成新特征,特征的平方组成新特征等,同样可以使用PolynomialFeatures函数来完成。下面的程序针对两个变量[a,b]生成多项式特征,并且指定幂为2,所以生成的polyFXm将会包括[a,b,a2,a*b,b2等变量。

针对数值特征,在使用以树为基础的模型时(例如决策树等),常常需要将数值特征进行分箱操作,将其切分为一个个小的模块,每个模块使用一个离散值来表示。在对连续的数值编码进行分箱操作时,最常用的方式就是每隔一定的距离对数据进行切分。分箱操作可以使用preprocessing模块中的KBinsDiscretizer()函数,其可以通过控制参数strategy的取值,使用不同的分箱方式,例如参数strategy="quantile"表示利用分位数进行分箱;参数strategy="kmeans"表示每个变量执行k-均值聚类过程的分箱策略。下面以鸢尾花的数值变量为例,利用每种分箱策略进行数据分箱,并可视化出分箱结果。

首先使用strategy="quantile"分箱策略,程序如下。在数据分箱时,使用Kbins.bin_edges_获取分箱所需的分界线,在可视化时,第一行图像分别使用直方图可视化出4个特征的分布情况,并在直方图添加垂直线作为分界线;第二行图像则使用条形图可视化出每个箱所包含的样本数量,程序运行后的结果如图3-11所示。

图3-11 strategy="quantile"分箱策略

使用下面的程序可以获得分箱策略为strategy="kmeans"的结果。同样为了方便对比分析,将结果可视化展示,程序运行后的结果如图3-12所示。

图3-12 strategy="kmeans"分箱策略

从上面的介绍可以发现,不同的分箱策略可获得不同的分箱结果,所以在进行连续特征离散化时,应该选择合适的方法对数据进行分箱。

3.2.3 文本数据的特征构建

文本数据作为一种非结构化数据也会经常出现在机器学习应用中,例如,对新闻的类型进行分类、判断邮件是否为垃圾邮件,这些都是对文本进行学习的方法。但是算法并不能理解文字的意思,因此需要使用相应的数据特征对文本数据进行表示。文本数据常用的特征是词频特征、TF-ID矩阵等。

下面使用一个很小的文本数据,介绍如何使用Python获取文本特征的方法。

首先读取文本数据,查看所包含的文本内容,程序如下:

获取文本特征之前需要对文本数据进行预处理,保留有用的文本,剔除不必要的内容等,下面对数据进行大写字母转化为小写、剔除多余的空格和标点符号两个预处理操作,程序如下:

计算文本数据中的词频特征,即计算每个词语出现的次数,可以使用下面的程序进行计算,在程序中同时还可视化出了词频条形图,程序运行后的结果如图3-13所示。

图3-13 文本词频条形图

针对一条文本数据,使用词袋模型生成一个向量,该向量可以表示文本的特征,因此多个文本内容可以使用一个矩阵来表示。词袋模型是文本表示的常用方法,该模型只关注文档中是否出现给定的单词和单词出现的频率,舍弃了文本的结构、单词出现的顺序和位置等信息。

下面利用词袋模型获取文本数据的文档—词项的词频矩阵,程序如下:

针对获得的矩阵,可以根据不同的分析目的,使用不同的分析方法,例如,想要知道每个样本之间的相似性,可以利用上面的矩阵,计算文本之间的余弦相似性。相关程序如下,在程序中同时将余弦相似性使用热力图进行可视化,程序运行后的结果如图3-14所示。

图3-14 文本词频特征余弦相似性热力图

从图3-14中可以发现,文本0和文本6的相似性最大。

针对该数据还可以计算文本数据的文档—词项TF-IDF矩阵,TF-IDF是一种用于信息检索与数据挖掘的加权技术,经常用于评估一个词项对于一个文件集或一个语料库中的一份文件的重要程度。词的重要性随着它在文件中出现的次数成正比增加,但会随着它在语料库中出现的频率成反比下降。计算文本数据TF-IDF矩阵的程序如下,同时还利用该特征计算了每个文本之间的余弦相似性,并使用热力图进行表示,程序运行后的结果如图3-15所示。

图3-15 文本TF-IDF特征余弦相似性热力图

从图3-15中可以发现,文本0和文本6的相似性依然最大。

文本特征的表示还有很多种方式,例如,对一个句子学习到一个句向量等。这些内容将在后面的章节中应用时进行介绍。