网站导航

特征工程入门与实践

#书名

我的笔记::[[特征工程入门与实践-27337408]]

前言

包括识别、清洗、构建和发掘数据的新特征,为进一步解释数据并进行预测性分析做准备。

1.1 激动人心的例子:AI驱动的聊天

人类很容易觉得AI只是需要更多的时间和更多的数据,但是这些解决方案只是更大问题的小修小补,而且很多时候根本不管用。

这个例子中的潜在问题很有可能是AI的原始输入数据太差,导致AI认识不到语言中的细微差别。

1.2 特征工程的重要性

设计数据流水线和架构,用于处理原始数据,并将数据转换为公司其他部门——特别是数据科学家和机器学习工程师——可以使用的形式

在数据科学家中进行的一项调查显示,他们工作中超过80%的时间都用在捕获、清洗和组织数据上。构造机器学习流水线所花费的时间不到20%,却占据着主导地位

从上图可见,数据科学家的工作占比如下。
❏ 设置训练集:3%
❏ 清洗和组织数据:60%
❏ 收集数据集:19%
❏ 挖掘数据模式:9%
❏ 调整算法:5%
❏ 其他:4%

很多时候我们会觉得,像机器学习竞赛和学术文献中那样干净的数据是理所当然的。然而实际上,超过90%的数据(最有趣、最有用的数据)都以原始形式存在,就像在之前AI聊天系统的例子中一样。

准备数据的概念很模糊,包括捕获数据、存储数据、清洗数据,等等。

清洗数据和组织数据的区别如下图所示。

1.3 特征工程是什么

我们将着眼于清洗和组织数据的过程,为机器学习流水线服务

特征工程(feature engineering)是这样一个过程:将数据转换为能更好地表示潜在问题的特征,从而提高机器学习性能。

特征工程适用于任何阶段的数据

特征是对机器学习过程有意义的数据属性。我们经常需要查看表格,确定哪些列是特征,哪些只是普通的属性。

转换数据的目的是要更好地表达更大的问题

特征工程的最终目的是让我们获取更好的数据,以便学习算法从中挖掘模式,取得更好的效果

大部分公司会同时招聘数据工程师和机器学习工程师。数据工程师主要关注准备和转换数据,而机器学习工程师一般拥有算法知识,知道如何从清洗好的数据中挖掘出模式来。

数据的每行又称为观察值(observation),代表问题的一个实例或例子

机器学习算法是按其从数据中提取并利用模式、以基于历史训练数据完成任务的能力来定义的。

我们把机器学习分为两类:监督学习和无监督学习

一般来说,我们都是在监督学习(也叫预测分析)的特定上下文中提到特征工程

在监督学习中,我们一般将数据集中希望预测的属性(一般只有一个,但也不尽然)叫作响应(response),其余属性叫作特征(feature)。

在机器学习可以利用数据结构之前,我们有时需要调整乃至创造结构。无监督学习在这里大放异彩。

我们的目标是将这个数据集细分成不同的类型或聚类,让执行分析的公司更好地理解客户资料。

聚类会创造一个新的特征,将顾客划分到不同类型或聚类中

这个聚类的例子显示,我们不一定需要输出预测值,可以只是深入了解数据,添加有价值的新特征,甚至删除不相关的特征。

特征工程包括理解并转换监督学习和无监督学习中的特征。

1.4 机器学习算法和特征工程的评估

特征和属性通常有明显的区分。属性一般是表格数据的列,特征则一般只指代对机器学习算法有益的属性。

本书中,我们一般将所有的列都称为特征,直到证明某些列是无用或有害的。之后,我们会用代码将这些属性抛弃。

对于任何机器学习流水线而言,如果不能使用一套标准指标评估其性能,那么它就是没用的。

(1) 在应用任何特征工程之前,得到机器学习模型的基准性能;(2) 应用一种或多种特征工程;(3) 对于每种特征工程,获取一个性能指标,并与基准性能进行对比;(4) 如果性能的增量(变化)大于某个阈值(一般由我们定义),则认为这种特征工程是有益的,并在机器学习流水线上应用;(5) 性能的改变一般以百分比计算(如果基准性能从40%的准确率提升到76%的准确率,那么改变是90%)。

一般而言,可以将监督学习分为两种更具体的类型:分类(预测定性响应)和回归(预测定量响应)。

通常会利用轮廓系数(silhouette coefficient,这是一个表示聚类分离性的变量,在-1和1之间)加上一些人工分析来确定特征工程是提升了性能还是在浪费时间。

要按步骤评估特征工程的结果,并将特征工程后的结果与基准性能进行对比。

我们也会探索R2和p值等指标,以帮助判断特征工程是否有益。

❏ 统计检验:用相关系数、t检验、卡方检验,以及其他方法评估并量化原始数据和转换后数据的效果

1.5 特征理解:我的数据集里有什么

❏ 结构化数据与非结构化数据;❏ 数据的4个等级;❏ 识别数据的缺失值;❏ 探索性数据分析;❏ 描述性统计;❏ 数据可视化。

数据可视化、描述性统计和探索性数据分析都是特征工程的一部分

1.6 特征增强:清洗数据

■ 标准化(也称为z分数标准化);■ 极差法(也称为min-max标准化);■ L1和L2正则化(将数据投影到不同的空间,很有趣)。

在其他特征上进行机器学习,填充缺失值

归一化是用(一般比较简单的)数学工具改变数据的缩放比例

1.7 特征选择:对坏属性说不

这些过程包括:
❏ 相关系数;
❏ 识别并移除多重共线性;
❏ 卡方检验;
❏ 方差分析;
❏ 理解p值;
❏ 迭代特征选择;
❏ 用机器学习测量熵和信息增益。

1.8 特征构建:能生成新特征吗

通常,我们用现有的特征构建新特征。可以对现有特征进行转换,将结果向量和原向量放置在一起。我们还会研究从其他的系统中引入特征

实体匹配(entity matching)

如何通过高度非结构化的数据手动创建特征。文本和图像是其中的两个例子

1.9 特征转换:数学显神通

能不能创建一个k维(k<n)的子集,完全或几乎完全表示原数据,从而提升机器学习速度或性能?

主成分分析(PCA,principal component analysis)

1.10 特征学习:以AI促AI

用目前最精巧的算法自动构建特征,以改善机器学习和AI流水线。

而是尝试对数据进行理解和建模的一种架构,从而发掘数据的模式并创建新数据。

❏ 受限玻尔兹曼机(RBM,restricted Boltzmann machine);
❏ Word2vec/GloVe等词嵌入(word embedding)算法。

1.11 小结

❏ 特征理解:学习如何识别定量数据和定性数据。❏ 特征增强:清洗和填充缺失值,最大化数据集的价值。❏ 特征选择:通过统计方法选择一部分特征,以减少数据噪声。❏ 特征构建:构建新的特征,探索特征间的联系。❏ 特征转换:提取数据中的隐藏结构,用数学方法转换数据集、增强效果。❏ 特征学习:利用深度学习的力量,以全新的视角看待数据,从而揭示新的问题,并予以解决。

第2章 特征理解:我的数据集里有什么

❏ 结构化数据与非结构化数据;
❏ 定量数据与定性数据;
❏ 数据的4个等级;
❏ 探索性数据分析和数据可视化;
❏ 描述性统计。

锡南的另一本书《数据科学原理》(Principles of Data Science)

2.1 数据结构的有无

结构化(有组织)数据:可以分成观察值和特征的数据,一般以表格的形式组织(行是观察值,列是特征)

以原始文本格式存储的数据,例如服务器日志和推文,是非结构化数据

重要的是要认识到,大部分非结构化数据都可以通过一些方法转换为结构化数据,这个问题我们下章再聊。

2.2 定量数据和定性数据

定量数据本质上是数值,应该是衡量某样东西的数量。
定性数据本质上是类别,应该是描述某样东西的性质。

有时,数据可以同时是定量和定性的

我们用.info()方法了解一下数据有多少行:

salary_ranges.isnull().sum()

describe方法默认描述定量列,但是如果没有定量列,也会描述定性列

当处理定量数据时,一般使用整数或浮点数作为类型(最好使用浮点数);定性数据则一般使用字符串或Unicode对象。

我们可以用Pandas的map功能,将函数映射到整个数据集:

2.3 数据的4个等级

数据的4个等级是:❏ 定类等级(nominal level)❏ 定序等级(ordinal level)❏ 定距等级(interval level)❏ 定比等级(ratio level)

定类等级是数据的第一个等级,其结构最弱。这个等级的数据只按名称分类。

在这个等级上,不能执行任何定量数学操作,

用Pandas的value_counts方法进行计数

因为能在定类等级上进行计数,所以可以绘制图表(如条形图):

定序等级的数据可以自然排序

在定序等级,我们可以像定类等级那样进行计数,也可以引入比较和排序。

在定距等级,数值数据不仅可以像定序等级的数据一样排序,而且值之间的差异也有意义。

算术平均数(就是均值)和标准差

从这个级别开始,最常用的图是直方图。直方图是条形图的“近亲”,用不同的桶包含不同的数据,对数据的频率进行可视化。

定距及更高等级的一大好处是,我们可以使用散点图:在两个轴上绘制两列数据,将数据点可视化为图像中真正的点。

滑动均值(rolling mean)平滑一下

和定距等级一样,我们在定比等级上处理的也是定量数据。这里不仅继承了定距等级的加减运算,而且有了一个绝对零点的概念,可以做乘除运算。

因为存在0这个概念,所以这种比较是有意义的。

2.4 数据等级总结

当你拿到一个新的数据集时,下面是基本的工作流程。(1) 数据有没有组织?数据是以表格形式存在、有不同的行列,还是以非结构化的文本格式存在?(2) 每列的数据是定量的还是定性的?单元格中的数代表的是数值还是字符串?(3) 每列处于哪个等级?是定类、定序、定距,还是定比?(4) 我可以用什么图表?条形图、饼图、茎叶图、箱线图、直方图,还是其他?

第3章 特征增强:清洗数据

清洗和增强数据:前者是指调整已有的列和行,后者则是指在数据集中删除和添加新的列

❏ 识别数据中的缺失值;
❏ 删除有害数据;
❏ 输入(填充)缺失值;
❏ 对数据进行归一化/标准化;
❏ 构建新特征;
❏ 手动或自动选择(移除)特征;
❏ 使用数学矩阵计算将数据集转换到不同的维度。

3.1 识别数据中的缺失值

特征增强的第一种方法是识别数据的缺失值

探索性数据分析(EDA,exploratory data analysis)

先算一下空准确率:

但是,请注意:BMI的最小值是0。这是有悖医学常识的,肯定事出有因。也许数据中缺失或不存在的点都用0填充了。

作为数据科学家,你必须时刻保持警惕,尽可能地了解数据集,以便找到使用其他符号填充的缺失数据

3.2 处理数据集中的缺失值

大部分(不是全部的)学习算法不能处理缺失值

❏ 删除缺少值的行;
❏ 填充缺失值。

先用Python中的None填充所有的数字0,这样Pandas的fillna和dropna

注意describe方法不包括有缺失值的列。

可以看到,删除行(观察值)会严重影响数据的形状,所以应该保留尽可能多的数据。

这个模块会自动找到最适合我们模型的、交叉验证准确率最好的KNN参数组合(暴力搜索)

填充指的是利用现有知识/数据来确定缺失的数量值并填充的行为。

Imputer的输出值不是Pandas的DataFrame,而是NumPy数组:

在机器学习这一语境中讨论流水线的时候,一般指的是在被解读为最终输出之前,原始数据不仅仅进入一种学习算法,而且会经过各种预处理步骤,乃至多种学习算法。

如果在划分数据集和应用算法之前直接对整个数据集填充值,我们就是在作弊,模型其实学不到任何模式

重点是,训练集和测试集都是用整个X矩阵的均值填充的。这违反了机器学习流程的核心原则。当预测测试集的响应值时,不能假设我们已经知道了整个数据集的均值。简而言之,我们的KNN模型利用了测试集的信息以拟合训练集,所以亮红灯了。

我们先计算出训练集的均值,然后用它填充测试集的缺失值

准确率的确低得多,但是至少更诚实地代表了模型的泛化能力,即从训练集的特征中学习并将所学应用到未知隐藏数据上的能力。

3.3 标准化和归一化

一些机器学习模型受数据尺度(scale)的影响很大

我们将重点关注3种数据归一化方法:
❏ z分数标准化;
❏ min-max标准化;
❏ 行归一化。

z分数标准化的输出会被重新缩放,使均值为0、标准差为1。通过缩放特征、统一化均值和方差(标准差的平方),可以让KNN这种模型达到最优化,而不会倾向于较大比例的特征。

m=(x-xmin)/(xmax-xmin)

这种缩放的副作用是标准差都非常小。这有可能不利于某些模型,因为异常值的权重降低了

行归一化不是计算每列的统计值(均值、最小值、最大值等),而是会保证每行有单位范数(unit norm),意味着每行的向量长度相同。

很多算法会受尺度的影响,下面就是其中一些流行的学习算法:❏ KNN——因为依赖欧几里得距离;❏ K均值聚类——和KNN的原因一样;❏ 逻辑回归、支持向量机、神经网络——如果使用梯度下降来学习权重;❏ 主成分分析——特征向量将偏向较大的列。

3.4 小结

特征增强的意义是,识别有问题的区域,并确定哪种修复方法最有效。

第4章 特征构建:我能生成新特征吗

我们会探讨如下主题:❏ 检查数据集;❏ 填充分类特征;❏ 编码分类变量;❏ 扩展数值特征;❏ 针对文本的特征构建。

4.2 填充分类特征

Imputer的确有一个most_frequent方法可以用在定性数据上,但是只能处理整数型的分类数据。

而对于分类数据,我们也有类似的处理方法:计算出最常见的类别用于填充。

流水线的目的是将几个可以交叉验证的步骤组装在一起,并设置不同的参数

用scikit-learn的TransformerMixin基类创建我们的自定义分类填充器。

4.3 编码分类变量

需要将分类数据转换为数值数据

任何机器学习算法,无论是线性回归还是利用欧几里得距离的KNN算法,需要的输入特征都必须是数值。

主要方法是将分类数据转换为虚拟变量(dummy variable)

虚拟变量的取值是1或0,代表某个类别的有无

当使用虚拟变量时,需要小心虚拟变量陷阱。虚拟变量陷阱的意思是,自变量有多重共线性或高度相关。简单地说,这些变量能依据彼此来预测。

Pandas有个很方便的get_dummies方法,可以找到所有的分类变量,并将其转换为虚拟变量:

在定序等级,由于数据的顺序有含义,使用虚拟变量是没有意义的。为了保持顺序,我们使用标签编码器。

Pandas有一个有用的函数叫作cut,可以将数据分箱(binning),亦称为分桶(bucketing)。意思就是,它会创建数据的范围。

把每列的自定义转换器放在一起。我们流水线的顺序是:(1) 用imputer填充缺失值;(2) 用虚拟变量填充分类列;(3) 对ordinal_column进行编码;(4) 将quantitative_column分箱。

4.4 扩展数值特征

在处理数值数据、创建更多特征时,一个关键方法是使用scikit-learn的Polynomial-Features类。这个构造函数会创建新的列,它们是原有列的乘积,用于捕获特征交互。

interaction_only是布尔值:如果为真,表示只生成互相影响/交互的特征,也就是不同阶数特征的乘积。interaction_only默认为false。

多项式特征的目的是更好地理解原始数据的特征交互情况,所以最好的可视化办法是关联热图

热图的颜色是基于值的:颜色越深,特征的相关性越大。

4.5 针对文本的特征构建

因为长文本包括一系列类别,或称为词项(token)

这种工作叫作自然语言处理(NLP,natural language processing)

scikit-learn有一个feature_extraction模块

词袋的3个步骤是:❏ 分词(tokenizing);❏ 计数(counting);❏ 归一化(normalizing)。

停用词的意义在于消除特征的噪声,去掉在模型中意义不大的常用词。

词干提取(stemming)是一种常见的自然语言处理方法,可以将词汇中的词干提取出来,也就是把单词转换为其词根,从而缩小词汇量。

TF-IDF向量化器由两部分组成:表示词频的TF部分,以及表示逆文档频率的IDF部分

TfidfVectorizer和CountVectorizer相同,都从词项构造了特征,但是TfidfVectorizer进一步将词项计数按照在语料库中出现的频率进行了归一化。

本例要处理大量的列(数十万),所以我们使用在这种情况下更高效的分类器——朴素贝叶斯(naive Bayes)模型:

scikit-learn有一个FeatureUnion模块,可以水平(并排)排列特征

第5章 特征选择:对坏属性说不

❏ 特征理解:理解数据的等级。❏ 特征增强:填充缺失值。❏ 特征标准化和正则化。

特征选择是从原始数据中选择对于预测流水线而言最好的特征的过程

基于统计的特征选择,以及基于模型的特征选择

❏ 在特征工程中实现更好的性能;
❏ 创建基准机器学习流水线;
❏ 特征选择的类型;
❏ 选用正确的特征选择方法。

5.1 在特征工程中实现更好的性能

分类任务可以使用如下指标:❏ 真阳性率和假阳性率;❏ 灵敏度(真阳性率)和特异性;❏ 假阴性率和假阳性率。

5.2 创建基准机器学习流水线

KNN是按照欧几里得距离进行预测的,在非标准数据上可能会失效,但是其他3个算法不会受此影响

KNN是基于距离的模型,使用空间的紧密度衡量,假定所有的特征尺度相同

我们使用的办法是在选择特征之前选择模型。虽然不必要,但是在时间有限的情况下这样做一般很省时。你可以尝试多种模型,不必拘泥于一个模型。

不再需要StandardScaler了,因为决策树不受其影响。

5.3 特征选择的类型

基于模型的特征选择则依赖于一个预处理步骤,需要训练一个辅助的机器学习模型,并利用其预测能力来选择特征。

❏ 皮尔逊相关系数(Pearson correlations);❏ 假设检验。

皮尔逊相关系数(是Pandas默认的)会测量列之间的线性关系。

值得注意的是,皮尔逊相关系数要求每列是正态分布的(我们没有这样假设)。在很大程度上,我们也可以忽略这个要求,因为数据集很大(超过500的阈值)

我们假设,和响应变量越相关,特征就越有用。不太相关的特征应该没有什么用。

也可以用相关系数确定特征交互和冗余变量。发现并删除这些冗余变量是减少机器学习过拟合问题的一个关键方法。

在特征选择中,假设测试的原则是:“特征与响应变量没有关系”(零假设)为真还是假。

p值是介于0和1的小数,代表在假设检验下,给定数据偶然出现的概率。简而言之,p值越低,拒绝零假设的概率越大。

p值的一个常见阈值是0.05,意思是可以认为p值小于0.05的特征是显著的。

找到最佳的特征子集,优化机器学习流水线

特征选择指标——针对基于树的模型

SelectFromModel和SelectKBest相比最大的不同之处在于不使用k(需要保留的特征数):SelectFromModel使用阈值,代表重要性的最低限度

在线性模型中,正则化是一种对模型施加额外约束的方法,目的是防止过拟合,并改进数据泛化能力。正则化通过对需要优化的损失函数添加额外的条件来完成,意味着在拟合时,正则化的线性模型有可能严重减少甚至损坏特征。

数据中有多个线性相关的特征。L1惩罚可以强制其他线性相关特征的系数为0,保证选择器不会选择这些线性相关的特征,有助于解决过拟合问题。

逻辑回归分类器和支持向量分类器(SVC)的最大区别在于,后者会最大优化二分类项目的准确性,而前者对属性的建模更好

基于SVC,利用正则化为决策树分类器找到最佳特征

5.4 选用正确的特征选择方法

❏ 如果特征是分类的,那么从SelectKBest开始,用卡方或基于树的选择器。❏ 如果特征基本是定量的(例如本例),用线性模型和基于相关性的选择器一般效果更好。❏ 如果是二元分类问题,考虑使用SelectFromModel和SVC,因为SVC会查找优化二元分类任务的系数。❏ 在手动选择前,探索性数据分析会很有益处。不能低估领域知识的重要性。

第6章 特征转换:数学显神通

最主要的两个特征是准确率和预测/拟合时间

特征转换,这是一套改变数据内部结构的算法,以产生数学上更优的超级列(super-column)

数据集的原始特征是数据点的描述符/特点,也应该能创造一组新的特征,用更少的列来解释数据点,并且效果不变,甚至更好。

在特征转换中,最棘手的部分是一开始就不认为原始特征空间是最好的。我们需要接受一个事实:可能有其他的数学坐标轴和系统能用更少的特征描述数据,甚至可以描述得更好。

6.1 维度缩减:特征转换、特征选择与特征构建

特征选择的降维原理是隔离信号列和忽略噪声列。

特征转换的原理是生成可以捕获数据本质的新特征,这一点和特征构造的本质类似:都是创建新特征,捕捉数据的潜在结构。

特征构造用几个列之间的简单操作(加法和乘法等)构造新的列

特征转换方法可以用每个列中的一点点特征创建超级列,所以不需要创建很多新特征就可以捕获所有潜在的特征交互

6.2 主成分分析

主成分分析(PCA,principal components analysis)是将有多个相关特征的数据集投影到相关特征较少的坐标系上。这些新的、不相关的特征(之前称为超级列)叫主成分。

PCA的目标是识别数据集中的模式和潜在结构,以创建新的特征,而非使用原始特征。

主成分会产生新的特征,最大化数据的方差。

PCA本身是无监督任务,意思是PCA不使用响应列进行投影/转换

PCA利用了协方差矩阵的特征值分解。

这个过程分为4步:
(1) 创建数据集的协方差矩阵;
(2) 计算协方差矩阵的特征值;
(3) 保留前k个特征值(按特征值降序排列);
(4) 用保留的特征向量转换新的数据点。

碎石图是一种简单的折线图,显示每个主成分解释数据总方差的百分比。

PCA的主要优点之一:消除相关特征。

本质上,在特征值分解时,得到的所有主成分都互相垂直,意思是彼此线性无关。

原始矩阵和中心化后矩阵的协方差矩阵相同。如果两个矩阵的协方差矩阵相同,那么它们的特征值分解也相同

这是因为对数据进行缩放后,列与列的协方差会更加一致,而且每个主成分解释的方差会变得分散,而不是集中在一个主成分中。在实践和生产环境下,我们会建议进行缩放,但应该在缩放和未缩放的数据上都进行性能测试。

PCA是一种特征转换工具,能以原始特征的线性组合构建出全新的超级特征。

6.3 线性判别分析

和PCA的主要区别在于,LDA不会专注于数据的方差,而是优化低维空间,以获得最佳的类别可分性。

基于类别可分性的分类有助于避免机器学习流水线的过拟合,也叫防止维度诅咒。LDA也会降低计算成本。

LDA分为5个步骤:(1) 计算每个类别的均值向量;(2) 计算类内和类间的散布矩阵;(3) 计算[插图]的特征值和特征向量;(4) 降序排列特征值,保留前k个特征向量;(5) 使用前几个特征向量将数据投影到新空间。

用LDA拟合n个类别的数据集,最多只需要n-1次切割。

PCA是无监督方法,捕获整个数据的方差;而LDA是有监督方法,通过响应变量来捕获类别可分性。

LDA等有监督特征转换的局限性在于,不能像PCA那样处理聚类任务。这是因为聚类是无监督的任务,没有LDA需要的响应变量。

6.4 LDA与PCA:使用鸢尾花数据集

在生产环境下,最好的机器学习流水线实际上是多种特征工程工具的组合。

7.1 数据的参数假设

这些算法都基于预定的算式,每次肯定输出同样的特征。这也是我们将PCA和LDA都视为线性变换的原因

很多数据科学家和机器学习流水线会使用深度学习算法,从原始数据中学习新特征。

特征学习和特征转换都属于特征提取,因为这两类算法都尝试从原始数据的潜在结构创建新的特征集。

非参数模型不代表模型在训练中对数据完全没有假设。

受限玻尔兹曼机(RBM):一种简单的深度学习架构,根据数据的概率模型学习一定数量的新特征。

7.2 受限玻尔兹曼机

在RBM提取特征之后使用线性模型(线性回归、逻辑回归、感知机等)往往效果最佳。

在概念上说,RBM是一个浅层(两层)的神经网络,属于深度信念网络(DBN,deep belief network)算法的一种。

RBM的限制是,不允许任何层内通信。这样,节点可以独立地创造权重和偏差,最终成为(希望是)独立的特征。

RBM的学习来自于可见层和隐藏层间的多重前后向传导。

这个过程是一种生成性学习,试图学习一种可以生成原始数据的概率分布,并且利用知识来提取原始数据的新特征集。

7.3 伯努利受限玻尔兹曼机

该模型假定输入是二进制的值,或者是0~1的数