为了账号安全,请及时绑定邮箱和手机立即绑定

独家|手把手教随机森林

标签:
CSS3

独家|手把手教随机森林

本文是数据派研究部“集成学习月”的第三篇文章,本月将陆续发布关于集中学习的话题内容,月末将有答题互动活动来赢奖,欢迎随时留言讨论相关话题。

随机森林-概述

当变量的数量非常庞大时,你将采取什么方法来处理数据?

通常情况下,当问题非常庞杂时,我们需要一群专家而不是一个专家来解决问题。例如Linux,它是一个非常复杂的系统,因此需要成百上千的专家来搭建。

以此类推,我们能否将许多专家的决策力,并结合其在专业领域的专业知识,应用于数据科学呢?现在有一种称为“随机森林”的技术,它就是使用集体决策来改善单一决策产生的随机结果。在这种方法中,每个软件“专家”使用树型算法来完成它们的任务,然后使用这样的树的集合来计算或推导出一个算法模型,最终发现,最终推导出的模型比任何一个专家的输出结果将更优。

决策森林属于集成学习算法,集成学习(ensemble learning)颇受业内关注。集成学习是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法。集成学习的代表性算法为Boosting系列算法和Bagging系列算法。

数据决策树

首先让我们了解基于单个决策树的决策机制。

许多大学生同时申请“超级专业技术学院”。入学者的SAT历史平均分数是2,200,GPA的平均分是 4.9。我们获得1,000位申请人的申请信息。我们需要创建一个模型来预测最有可能被录取的学生。我们该怎么做呢?

一种方法是首先将SAT平均分超过2200的申请人划为一组,标注成“更可能”。然后进一步以GPA的分数划分, GPA小于或等于4.9的,划分为“很有可能”,GPA超过4.9的,划分为“非常可能”。

然后,我们以同样的方法处理SAT分数低于2,200的组。GAP分数高的,划分为“可能”,GAP分数低的划分为“不可能”。这看似非常合理,但是存在很多的问题:

如果我们先以GPA成绩来划分,然后以SAT成绩划分,那分组结果会一致么?什么才是最好的划分方式呢?

如果我们采用更多的标准,例如论文得分、选修课、获奖情况和体育特长等,我们应该用多少特征以及哪些才是最重要的特征呢?

在给定平均值的情况下,离散值和异常值如何?对于特征的分布如何影响误差率呢?

决策树利用数据的内部结构进行划分:

独家|手把手教随机森林

维基百科的这个图形[1]表示“泰坦尼克号”幸存者数据集的内在结构。

以上就是一个决策树做决策的框架。 每个节点旁边的数字是生存概率,百分数代表该分类的观测值。每个左分支对应的是“是”,右分支对应的是“否”。 每个绿色节点代表“幸存”,每个红色的节点代表“没有幸存”。配偶或兄弟姐妹的数量记录为“sibsp”。

通过以上可以得知,如果你是男性,并且在较便宜的舱位中,你的生存机会要小得多。 如果你是婴儿或女性,并且在最昂贵的舱位,就会有更大的幸存机会。

测量决策树“好”的程度

决策树技术利用信息增益和熵来量化决策树的好坏程度。本质上,我们希望拥有适当的分割点的数量,以便在我们拥有“最佳”的分割方式后,我们不会继续分割群组。那么我们怎么知道一种分割方式比另一种更好呢?

很明显,如果一个分割点非常明确地数据组分割成“接受”和“拒绝”,那么这就是“好”的。

但是,比方说,我们按照论文分数进行了明确的分割,可是每组的GPA分数非常无序,而且STA的分数平均分配。那么,我们实际上没有做出很好的预测,因为两组同样混乱,看不出好坏。

熵代表一个系统的混乱程度,熵越大,系统越混乱。当一组内所有的变量值都一样的时候,熵值为零。因此,当我们分割一个集合时,其中一组与另一组的差别越大,同时每一组内的个体之间的差别越小,也就是说,对一个数据集中数据的分组,就是使得该数据集熵减小的过程。如果我们使用一种方法对数据集进行分组,如果熵值并没有下降,那么在很大程度上证明,这不是一个好的特征,或是一个好的分割值。

如果我们将一棵已经创建的决策树进行倒置,那么当我们组合两个相同位置的节点时,熵变化会随之增加,熵的增加称为信息增益。 所以在颠倒后,信息增益越高,分割也越好。

这样看似逻辑性不强,但却具有非常强的数学基础做支撑,这种数学基础被用于创建建模软件,来构造决策树。

当给定一组具有许多特征的样本时,决策树将识别最佳分割的特征以及用于分割的特征值。 然后,它将输出一系列参数,包括被用于分割的特征数量,具体特征值和信息增益等。

那么建模软件如何创建最好的决策树呢? 它一个一个地试,并比较每个的信息增益,然后对比选择出最好的。

介绍一下随机森林

决策树提供了一个简单、清晰的概念模型来理解迭代分类过程。然而,在实践中,单个决策树对于解决涉及大量变量和中等大小规模数据的现实问题时,并不十分有效。因此,我们需要重型武器——由一群“专家”组成的决策森林。

这里的“专家”指的是什么呢?

我们认为的“专家”们,每人脑子里有一棵决策树模型,然后将这样的100个专家集合在一起,不那么严格地讲,我们就创建了一个随机森林。当我们期望决策结果好于单个决策树的时候,我们会想要一群“专家”来帮忙做决策。因此,我们需要一些方法来决定如何整理和排序“专家”们的“意见”。

回想一下奥林匹克体育比赛或潜水比赛,那里有一组评委对每一名参赛者打分,你可能会记得,分数中的最高分和最低分将被去掉,其余的求平均。 随机森林算法使用这种技术来去除一些“意见”,但可能会随机去掉一定比例的“意见”,然后重新运行“比赛”,重复进行此操作,比方说 100次,然后对结果求平均。

为什么要有这么复杂的技术呢?

一方面,数学上证明,他们是更为精确的。而且因为当我们拥有10倍或者100倍的特征数时,随机森林能够筛选出最重要的特征,并且将这些特征应用于建模中,而且不需要我们做任何额外的努力。那么这是如何做到的呢?这涉及计算成本的问题,所以我们的模型可能会运行几分钟,而不是几秒钟来处理成千上万个样本,目前大规模的计算已成为现实。然而,这一个成本还带来了其他的好处,随机森林能更好地处理缺失值、噪声和异常值,并且可以处理数量变量和分类变量的混合型数据类型。

我们将探索从手机加速度计量仪和陀螺仪获取的丰富数据集,并基于对数据特征的特定组合,来了解用户的各种活动,如坐着,站立,步行等。我们的数据集有500多这样的特征,数据复杂、多样,所以这是一个将专业知识与随机森林力量相结合、进行探索和分析的较佳选择。

练习

学习下列术语,并研究他们如何将决策树与随机森林相关联的。

自助抽样

自助聚类

Bagging算法

Boosting算法

袋外错误

参考:

[1] 决策树:

en.wikipedia/wiki/Decision_tree_learning

随机森林-数据预处理

简介

现在,我们应用随机森林对一个从熟悉的源对象获取的庞杂数据集进行分析。为什么要使用随机森林?马上你就会清楚。

我们将使用从手机加速度器和陀螺仪获取的数据集来创建预测模型。数据集的格式为R语言[1],存在于Amazon S3,元数据存储在UCI数据库中[2]。数据集读取了手机方位和手机携带者运动的编码数据。

观察对象从事以下六种活动中的一种 - 坐着,站立,躺下,漫步,往前走,往后走。

方法

我们的目标是,通过一个给定的数据点,能够预测出他们正在从事的活动。我们设定了一个目标,即利用可以理解的变量来创建一个全日制证书模型,而不是一个“黑匣子”模型。我们完全可以选择创建一个只有变量和系数的黑盒子模型。当给定数据点时,我们输入模型,其将弹出一个答案。这通常是可行的,但只是有太多“魔术”的成分,对于我们建立直觉判断或应用专业知识没有太多的帮助。

所以我们打算打开这个盒子,一旦我们形成一些直觉,我们就可以将专业知识和随机森林的大量功能结合起来。我们发现,从长远来看,这是一个更令人满意的方法,而且看起来非常强大。

我们将单独使用专业知识将自变量的数量减少到36个,然后使用随机森林来预测“活动”变量。从准确性的角度来看,这可能不是最好的模型,但是我们想要了解发生了什么,从这方面来讲,事实证明是更佳的。

我们使用准确度指标——正负估计值,敏感度和特异性来评估我们的模型。

清理数据

给定的数据集包含21名受访者的活动数据。数据集有7,352行,561个数字列,外加2列整数表示的“主题”列和字符串表示的“活动”列。由于共有563列,我们将省略创建正式数据字典的步骤,直接引用feature_info.txt中的内容。

通过初步分分析发现,列名称文本含糊且存在许多问题:

列名重复-多次出现

列名包含()

许多列名存在多余的“)”

列名包含“-”

列名包含“,”

许多列名包含“BodyBody”,我们假设这是一个打字错误

独家|手把手教随机森林

将“活动”转换成一个分类变量,将“受访者”设置为整数类型。

创建一个可解释的模型,而不是将随机森林作为一个黑盒子来使用。 所以我们需要了解我们的变量,并提升我们对它们的直觉。

为了规划数据挖掘,UCI网站[2]数据集的文档非常有用,我们对其进行了详细的研究。 特别是文档feature_info.txt,它对我们理解这些变量非常重要。 实际上,我们拒绝使用数据字典,而是使用了feature_info.txt中对术语的解释。 因此,先回顾一下其中的细节非常关键。

练习

对每个数据集进行上述清理活动。即:

识别和删除重复的多次出现的列名称

识别和修正列名中列出的()。 你会如何解决这个问题?

识别和修改列名称中多余的)。 你会如何解决这个问题?

识别并修改列名中的“ - ”。 你会如何解决这个问题?

在列名中识别并修改多余的“,”。 你会如何解决这个问题?

识别并修改包含“BodyBody”的列名

对学习者的提示

该数据集的主要价值如下,它让我们领会到:

你可以仅使用强大的“黑盒”技术,然后获得有用的结果。

你也可以利用专业知识来简化流程。此数据集能够突显你在专业知识上获得的优势。

它让我们走出舒适区,从语义相近的数据源中寻求相关信息,以进一步增强分析能力。

这说明了一个事实,就是你很难将数据和所有相关的信息整合在一起。

我们早就知道要对数据进行清理,但是我们更想扩大我们的知识面,做一点研究来增强我们的专业能力。

所以这个特定的数据集可能看起来有点技术性,但它很容易就与生物学,或者金融、力学相结合。一位数据科学家应该愿意把自己搞的有点手忙脚乱。最成功的科学应该是愿意跨学科的人。

这就是我们所领悟到的。

除了理解每个变量的含义,我们还想得到关于每个变量含义的技术背景。

所以我们使用Android开发人员指南[3]来自学每一个重要的物理参数。以这种方式,我们扩展专业知识,以便我们了解数据语言-我们想让它活着,对我们说话,并从中获知它的奥秘。我们对数据来源的背景了解的越多,那么我们对数据的探究就越好,越快,越深入。

在这种情况下,带有 X,Y,Z前缀/后缀的变量以及Android开发人员指南[3]给出了衡量变量的具体参考框架,包括加速度、加速度的矢量分量、重力角,或者更准确地说是由重力引起的向量加速度。我们在使用这些信息的同时,结合了我们对运动,速度,加速度的直觉。

变量压缩

所以我们对变量进行了挖掘,并做了一些简短的注释。

在进一步探究之前,你需要打开数据集目录中的HAR文件夹。有一个名为feature_info.txt的文件。该文件描述了每个特征的物理含义,以及通过对原始数据进行求平均、抽样等操作后得出的数值。

让我们看一下:

所有变量名

物理量

首先让我们了解一下这些内容。一旦我们投入时间开始做,就可以结合对人体的理解和常识,得到一些有用的指南:

在静态活动(坐,站立,躺下)中,运动信息不会很有用。

在动态活动中(3种类型的行走),运动信息将会很重要。

角度变量在区分“躺与站立”和“向前走与向后走”方面,将非常有用。

加速度和压力变量在区分各种运动时是重要的,同时过滤掉静止状态下的随机震颤。

大小和角度变量包含了与XYZ变量(=强相关)含有相同的信息

我们选择专注于后者,因为它们更便于解释。

这一点非常重要,因为它缩减了几百个变量。

我们忽略频率变量,因为我们无法做出简化和解释,并将其与物理活动相联系。

平均值和标准差非常重要,我们也将偏度和峰值包括在内。

将图1中变量作为预测因子是有效的,它们展示了我们的探究工作并验证了我们的想法。

独家|手把手教随机森林

图1.使用身体加速度的直方图来评估作为静态和动态活动的预测因子的变量。 这是一个我们使用专业知识进行变量选择和数据探究的一个例子。

消除干扰

在缩减-X-Y -Z变量(笛卡尔坐标)时,我们删除了大量的干扰变量,因为它们与极坐标的大小和角度强相关。 可能仍然会有一些干扰,但剩余的影响不会很大。

从常识来看,由于最小值,最大值等与平均值/标准差有相关性,所以我们也删除所有这些干扰。最终变量的数量减少到37,如下:

阅读提示:我们做了一些繁琐的名称映射,以保持语义完整,因为我们想要一个“白盒子”模型。我们可以用几行代码和注释,将剩余的变量映射到v1,v2 … v37。但是我们将失去利用专业知识进行解释的,并从中获取价值的机会。

名称转换:为了方便研究数据,我们对变量进行了重命名和简化,以方便阅读,我们去掉所有的“body”和“Mag”,然后将“mean”替换成“Mean”,将“std”替换成“SD”,如下所示:

例如:

tAccBodyMag - - > tAccMean

fAccBodyMag-std - > fAccSD

等等

结果:

缩减后,已转换名称的选定变量(具有有意义的分组):

tAccMean, tAccSD tJerkMean, tJerkSD

tGyroMean, tGyroSD tGyroJerkMean, tGyroJerkSD

fAccMean, fAccSD, fJerkMean, fJerkSD,

fGyroMean, fGyroSD, fGyroJerkMean, fGyroJerkSD,

fGyroMeanFreq, fGyroJerkMeanFreq fAccMeanFreq, fJerkMeanFreq

fAccSkewness, fAccKurtosis, fJerkSkewness, fJerkKurtosis

fGyroSkewness, fGyroKurtosis fGyroJerkSkewness, fGyroJerkKurtosis

angleAccGravity, angleJerkGravity angleGyroGravity, angleGyroJerkGravity

angleXGravity, angleYGravity, angleZGravity

subject, activity

结论

现在,经过处理后,我们得到了完美的结果。

获得的主要变量为加速度的大小、抖动统计量和角度变量。 这让我们感受到,专注于专业知识,进行一些额外的阅读、研究,并结合一些基本的身体直觉,收获将非常大。

这是一组语义紧凑,可解释和相对容易理解的变量。

我们可以对变量进行新一轮的研究,我们可能认为,37个变量太多了,无法一次性记住 。为了更好地解决这个问题,我们使用重型武器,借助建模软件和随机森林算法来处理。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消