机器学习之特征工程——基于Scikit-Learn

《Python数据科学手册》 笔记

前几篇博客的所有示例都假设已经拥有一个干净的[n_samples,n_features]特征矩阵。但在现实工作中,数据很少会这么干净,例如,数据中含有缺失值、含非数值内容等等。这时候,就需要用到特征工程——将其转换为特征矩阵的数值。接下来简要介绍如何处理分类特征文本特征图像特征,如何在已有的特征基础上衍生特征,以及如何填充缺失值

一、分类特征

当数据集中的某些特征列是用分类数据表示时,可用OneHot编码(独热编码)将所有分类做为新的列,让0和1出现在对应的列分别表示每个分类值的有或无。

例如:

最后一列特征‘neighborhood’为非数值,我们可以提取出这列数据的所有分类(元):‘Queen Anne','Fremont','Wallingford'为新的列,用Scikit-Learn的DictVectorizer类实现:

二、文本特征

另一种特征工程是将文本转换成一组数值。数据采集最简单的编码方法之一就是单词统计:在给定文本中统计每个单词出现的次数,然后放到表格中。但是这种统计方法存在一些问题:常用词(‘of’,‘is’,‘的’等等)的出现频次太多,然而对文章分类却意义不大。解决这个问题的方法就是通过TF-IDF(词频逆文档频率)

这里介绍一下IF-IDF:它是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。例如,一篇文件的总词语数是100个,而词语“花生”出现了3次,那么“花生”一词在该文件中的词频就是0.03(词频),而“花生”在1000份文件中出现过,文件总数为10000000份的话,其文件频率就是0.0001(逆文档频率)。则 IF-IDF= 0.03/0.0001 = 300。

下面举例说明如何用Scikit-Learn中的函数计算TF-IDF:

三、图像特征

可以用像素表示图像

四、衍生特征

另一种有用的特征是通过数学变换衍生出来的新特征。例如,将一个线性回归转换成多项式回归时,并不是通过改变模型来实现,而是通过改变输入数据。例如,有一组数据 x=[1,2,3,4,5], y = [4,2,1,3,7], 不能用一条直线拟合。此时,可以对x进行变换,衍射出一个新的特征矩阵,第一列表示x,第二列表示x^2,第三列表示x^3。然后再对其进行线性拟合,即可获得更接近原始数据的结果。用Scikit-Learn演示一下:

注意,model = LinearRegression().fit(X2,y) 这里还是用的线性回归,并没有改变模型,而是变换输入来改善模型效果的。 

五、缺失值填充

特征工程中还有一种常见的需求是处理缺失值。缺失值填充的策略有很多:用均值、中位数、众数等填充。

Scikit-Learn中的语法为:

最后,在介绍一下特征管道。管道,顾名思义,就是将多个步骤串联起来使用。例如我们想进行如下操作:用均值填充缺失值、将衍生特征转换为二次方、拟合线性回归模型。这时,就可以用Scikit-Learn的管道对象进行操作了。如下:

猜你喜欢

转载自blog.csdn.net/elma_tww/article/details/88031327
今日推荐