Austin Cheng作者和中华、林亦霖校对于腾凯 编辑王紫岳翻译

经验&教训分享:我的第一个机器学习项目

本文简要介绍了作者在初次进行机器学习的操作时所遇到到情况与得到的教训。

机器学习之旅的开端

在这片博客中,我将介绍队友(Aron,Ashish,Gabriel)和我如何完成我们的第一个机器学习项目。写这篇博客的目的是为了记录——记录下我作为一名有抱负的数据科学家的旅程。同时,这篇博客也是为了写下逐步完善预测模型背后的思维和推理过程。由于我的目的是建立一个可以快速使用的通用工作流程,所以我将尽可能的简化推理过程。我的最终目标是当某一天再次回顾这个数据集时,可以应用更好的预测模型,看到自己原本可以做出哪些改进,并且能看到自己作为一个数据科学家的成长。

数据集

该数据集取自kaggle.com。它包含了79个描述房屋特征的维度,而且描述了爱荷华州埃姆斯几乎所有的房屋。该数据集旨在为有志向的机器学习从业者提供一个玩具示例。在处理这个数据集时我们得到的主要教训是:简单的线性模型也可以十分强大,并且在适当的场景中,它们的表现可以轻松地胜过高度复杂的模型。在接下来的文章中,我将描述我们处理这个数据集所遵循的工作流程,并证实线性模型应该始终在你的工具箱中占有一席之地。

数据预处理的工作流程

数据预处理和转换

我们遵循了得到的第一个建议将目标变量(售价)转化为一个服从正态分布并去除了异常值的变量。前者很重要,因为它确保目标变量的残差将服从正态分布(线性推理模型的基本假设),而后者可以确保我们的模型结果不会因为异常的观测值,特别是那些有很大影响和杠杆效应的值,而产生偏斜(或成为错误的偏差)。下面将举例说明对数转换(log transformation,我们的手动box-cox转换):

在上方的图片中,显示了高度倾斜且未经处理的数据。在下方的图片中,我们展示了经过对数转换后的数据。将两者进行比较,我们可以看到数据在分布上的巨大改进。

在这里我们没有对各个特征进行转换,来使其变成正态分布。虽然,机器学习模型可能会因使用了正态分布的特征而受益,但这将损害结果模型的可解释性。出于这个原因,我们选择不去应用它,而是继续使用去除异常值的方法。下面,我们展示了删除某个变量的异常值后的效果:

左边是未处理的数据,右边是处理过的数据。去除异常值的效果是明显的,因为我们可以看到拟合线发生了明显的偏移。

缺失值与插补

在第二步中,我们花了大量的时间去查找缺失值。而插补却是十分棘手的,因为它需要我们对每一个特征都有深刻的理解。不论是使用均值、中位数、众数、零、空,还是简单地删除观测值或特征本身,都取决于我们认为可以接受的某种预定准则。这种预定准则很多时候靠直觉。下面,我们对缺失值进行定性总结。

顶部显示的是每个特征的缺失值的数量,底部显示的是缺失之间的相关性。

这里我没有深入的探讨处理每个变量缺失值的具体过程(读者可以参考我们在Github上发布的代码来获得具体的解决办法),而是简单地回顾了一下总体思路。首先,在原则上,任何缺失值超过95%以上的变量都可以被安全地丢弃,但在做之前还是要谨慎一些,因为这些缺失不一定是真实的缺失。从变量缺失值的相关性中提取信息,我们也许可以推断出这些缺失值的含义。例如,与车库紧密相关的缺失值表明了一个房屋没有车库的可能性。另一个基本完全缺失的变量是泳池面积。因此,我们认为缺少泳池面积信息的房屋数据意味着这些房子没有泳池。
 
在这里,我们给出如何在严重缺失的情况下处理变量(一般来说,我们选择保守的方式,即尽可能保留我们可以保留的任何信息)。对于缺失率相对较低的变量(比如缺失值少于5%的观测数据),如果变量是连续的(或有序的),我们选择使用均值进行插补;如果变量是类别型的,我们则会使用众数。平均估算法背后的原理是,插补的数据不会改变拟合的斜率,因此不会对模型结果产生偏差。至于众数和中位数(分别在类别变量或数值变量中使用),除了认为这些观测值归属为最具代表性的组之外,没有更好的解释。虽然这种方式可能会有缺陷,但有时便捷性会比精确性更为重要,特别是当缺失值数量很少的时候(这些特征的缺失值数量在数十个的时候)。为了使缺失值插补的过程更加精确,我会选择基于k近邻或者其他机器学习模型进行插补。另一种被广泛接受的插补方法是用一个非常边缘的数,例如-999(如果所有的观测值都是正实数)。然而,这种插补方法不适用于拟合解析方程的推理模型。因此本例中没有使用-999。

第一轮特征选择

我们经常会听到维度诅咒。高维度可能意味着会产生共线变量,而它则会导致拟合系数不准确以及高方差。高维度可能意味着稀疏的数据,也可能意味着特征数量过多从而导致过拟合。这两种情况都不好,因为它们会产生性能较差的模型。

相关性研究:消除多重共线性

特征选择的第一次尝试是为了减少系统内部的多重共线性。方法是执行相关性研究,同时对特征进行合并或删除。下面是多重共线性处理前后的相关图:

左侧是原始数据的相关图。右侧是处理后数据的相关图,其中的特征要么被删除,要么被合并。

通过对比可以看到,这种相关性(用深蓝色表示)大大降低了。这是通过去除或组合特征实现的。帮助我们做出正确决定的指标是基于对特征的R平方持续评估:

在左边的图中,与居住面积相关的变量(最后五分之一到最后三分之一)的R平方都大于0.8(大致等于VIF的5)。在右边的图中,适当组合特征后,与居住面积相关的R平方值降低了。

聚类子类别

类别型变量的子类别可以聚类在一起。下面我们来看一个例子:

在这个图中,我们可以看到,所有的不规则子类别(IR1到IR3)的均值都非常接近,但离规则的(Reg)很远。这是一个提示,在简化降低维度后,我们应该把所有的IR聚在一起。

在这个特殊的例子中,我们可以看到,如果我们将所有的不规则类别(IR1到IR3)分组到一个大的子类别中则可能对我们的模型产生有益的影响。之所以说是有益的,是因为在对变量进行哑变量处理之后,与未聚类子类别时相比,特征空间会相对较小。聚类的过程不是人工完成的,而是使用K-means聚类完成的(尽管它是一种非监督的方法),根据与目标变量相关的变量对子类别进行聚类(在这个数据集中,我们使用变量Gr living area)。

特征工程注意事项:应当使用哪种算术运算?

特征工程可以通过交互来完成,而这种交互可以反映为任意两个或多个特征的某种算术运算。例如,乘法和加法可能在最终的模型结果中产生巨大的差异。我们总结出了一个很好的结论:每一个值必须始终服从变量的自然物理单位。例如,如果要合并车库数量和车库面积,应该通过乘法而不是加法来合并。在这种情况下,加法是没有物理意义的。事实上,对这两种操作的测试结果表明:对两个变量的乘法会导致VIF的显著下降,而加法则不会。

另一个值得描述的变量是每个社区的表现。

不同的社区拥有不同的销售价格。每一个都值得拥有属于它自己的模型。

通过观察社区图,我们可以看到每个社区的表现都是有区别的,并且每一个都遵循一个明确定义的行为。这些社区都有自己的模式。为了实现这一目标,我们创建了一个类似开关的交互参数,方法是将哑变量处理过的社区类别乘以Gr living area。这样,每个社区都可以有自己的一组系数——自己的方程,而不是简单的截距偏移 (类别型变量对广义线性模型的作用)。使用这个特征处理使我们的Kaggle排名下降了。

数据流水线

我们的流水线总结如下:

数据集被分割成一个训练集和一个测试集,之后训练集被发送到五个模型中:三个线性模型(Lasso, 岭回归 弹性网络)和两个非线性模型(随机森林梯度提升)。并对每个模型进行了广泛的网格搜索从而选出最佳超参数。在超参数最优的情况下,利用模型对测试集进行预测,并对测试结果进行比较。下面是初始特征工程的总结:

除了上面所显示的特征工程,我们还尝试了许多类型的特征工程和筛选(从数据集A开始直到数据集C,这些特征工程被依次实现)。虽然我们自己得到的MSE测试分数并不总是与Kaggle排名一致,但所有这些都产生了一个更糟糕的Kaggle排名。下面我们展示了使用数据集A到D的结果:

在图中我们可以看到,弹性网络模型相比于其他的模型有微小的优势。所有的线性模型都优于非线性的树模型。这很好的验证了我们一开始提到的内容:线性模型总有它的一席之地。在这个特定的数据集中,目标变量与其他特征主要体现了线性关系,这使得我们有充分的理由使用线性模型而不是非线性模型。综上所述,即使我们使用线性模型(较为简单的模型),我们的Kaggle和MSE分数肯定还将得到提高。我们之所以这么说的原因来自下面的图:

左边是测试和训练数据集MSE,右边是随机森林的数据集MSE。两者都显示出过拟合的迹象。

上图显示,测试和训练数据集MSE分数之间存在巨大的差异。对于树模型来说,这可能是有意义的,因为树模型往往会过拟合(当然,使用随机森林的目的正是为了避免这个问题);然而,惩罚线性模型 应该可以缓解这个问题……但事实并非如此。这意味着我们的确可以改进我们的特征筛选与处理。然而,我们尝试了大量的特征筛选操作,同时也考虑了如下图所示的基于特征重要性的排名,但是它们都给了我们负面的反馈。

这个图是Lasso(左)和随机森林(右)的特征重要性。要注意的是,这两个模型的特征重要性是不同的。随机森林模型比Lasso模型更强调连续变量的重要性,因为高基数会导致更大的误差或熵降。我们通过测试,比较了标签编码和one-hot编码,发现他们产生类似的结果(标签编码有轻微的优势),这就是标签编码比one-hot编码重要的原因。

鉴于特征特征的无用性,我们选择通过递归去除特征来蛮力改进我们的模型。这个想法如下图所示:

左边的示意图显示了我们递归地删除特征的过程。右侧显示了特征被逐渐删除时的MSE变化。突然的跳转很可能是由于一个重要的特征被删除了。

特征的最佳数量由测试误差突然跳跃的位置来表示。通过这种递归的方法,我们可以进一步提高我们的MSE分数:

我们可以看到,使用机器来递归地删除特征是着实有效的。在递归地去除特征后,误差得分显著下降。

最后,我们选择通过集成所有不同的模型,来把所有的东西放在一起。我们是这样做的:

这张图展示了我们使用的集成技术,它很显然被称为堆叠

集成技术只是不同模型预测值的线性组合。不同模型的权值是从最小化测试集错误分数的权值集中选取的。在将最终结果提交给Kaggle之后,我们的最终分数是0.1214。

尝试新事物和我的结论

作为我们的第一个机器学习项目,我们学到了很多。第一点,也是很重要的一点,我们亲眼看到了线性模型的力量。这是我们预料到的事实。第二点也是更深刻的教训是,我们看到了人类直觉的局限性。长时间的无用的特征工程对我们来说也是一个值得纪念的教训。在这些机器学习的问题中,我们应该始终在人类直觉和依赖机器之间取得平衡。我们花费了太多的时间热衷于研究数据集,尝试找出哪些数据在统计上是重要的或是不重要的,并且在删除特征时又过于犹豫。如果我们果断的处理这些操作,那么他们是很有益的。但问题是,这些EDA和统计测试的结论从来不是非黑即白的——他们很少产生有可操作性的反馈。我们应该做的是,在跟随机哑变量比较重要性时,更快速地研究线性和非线性模型给出的特征重要性。与此同时,我们应该花更多的时间来研究如何执行相关特征子集的PCA。尽管我们在人工特征处理方面做了很多努力,但最终我们仍然遭受了多重共线性的困扰。我们需要更明智地使用机器学习技术。因此,我们从中得到的教训是显而易见的。当然,我们下次会做的更好。

原文标题:

My First Machine Learning Project

原文链接:

https://nycdatascience.com/blog/student-works/my-first-machine-learning-project-a-somewhat-generalized-workflow-with-after-thoughts/

THU数据派
THU数据派

THU数据派"基于清华,放眼世界",以扎实的理工功底闯荡“数据江湖”。发布全球大数据资讯,定期组织线下活动,分享前沿产业动态。了解清华大数据,敬请关注姐妹号“数据派THU”。

入门机器学习
3
相关数据
网格搜索技术

网格搜索是一项模型超参数优化技术,常用于优化三个或者更少数量的超参数,本质是一种穷举法。对于每个超参数,使用者选择一个较小的有限集去探索。然后,这些超参数笛卡尔乘积得到若干组超参数。网格搜索使用每组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

数据科学技术

数据科学,又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域中的理论和技术,包括应用数学、统计、模式识别、机器学习、数据可视化、数据仓库以及高性能计算。数据科学通过运用各种相关的数据来帮助非专业人士理解问题。

梯度提升技术

梯度提升是用于回归和分类问题的机器学习技术,其以弱预测模型(通常为决策树)的集合的形式产生预测模型。 它像其他增强方法一样以阶段式方式构建模型,并且通过允许优化任意可微损失函数来推广它们。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

随机森林技术

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。而"Random Forests"是他们的商标。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans的"Bootstrap aggregating"想法和Ho的"random subspace method" 以建造决策树的集合。

特征工程技术

特征工程是利用数据所在领域的相关知识来构建特征,使得机器学习算法发挥其最佳的过程。它是机器学习中的一个基本应用,实现难度大且代价高。采用自动特征工程方法可以省去采用人工特征工程的需求。Andrew Ng 说“挖掘特征是困难、费时且需要专业知识的事,应用机器学习其实基本上是在做特征工程。”

弹性网络技术

在统计学中,特别是在拟合线性或逻辑回归模型时,弹性网络是一个正则回归方法,线性组合了套索和脊线方法的L1和L2惩罚。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

广义线性模型技术

在统计学上, 广义线性模型 (Generalized linear model) 是一种应用灵活的线性回归模型,简称GLM。该模型允许因变量的偏差分布有除了正态分布之外的其它分布。此模型假设实验者所量测的随机变量的分布函数与实验中系统性效应(即非随机的效应)可经由一链接函数(link function)建立起可资解释其相关性的函数。

特征选择技术

在机器学习和统计学中,特征选择(英语:feature selection)也被称为变量选择、属性选择或变量子集选择。 它是指:为了构建模型而选择相关特征(即属性、指标)子集的过程。

堆叠技术

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

聚类技术

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。“物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析起源于分类学,但是聚类不等于分类。聚类与分类的不同在于,聚类所要求划分的类是未知的。聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预报法等。

算术技术

算术(英语:arithmetic)是数学最古老且最简单的一个分支,几乎被每个人使用着,从日常生活上简单的算数到高深的科学及工商业计算都会用到。一般而言,算术这一词指的是记录数字某些运算基本性质的数学分支。

推荐文章
暂无评论
暂无评论~