机器学习之随机森林

机器执行的每一个步都依赖于我们的指令。它们需要指导去哪里做什么,就像一个不了解周围环境而无法自己做决定的孩子。因此,开发人员会需要为机器编写指令。然而当我们谈论机器学习时,我们谈论的是让机器在没有任何外部指令的情况下学会自己做出决定。这个机器有一个成熟的头脑,可以依据实际情况选择最佳的行动方针。

为了更深入地了解机器学习的基础知识,我建议你阅读这篇介绍文章

在之前的博客中,我们了解了决策树算法 及其实现。在这个博客中,我们将继续讨论下一个机器学习算法:随机森林算法。决策树算法是随机森林算法的基础,如果不了解请先学习之前的博客。

什么是随机森林算法?

我们可以说这是“机器学习的其中一种算法”,但是正如我们所知道的,在知识分享的·过程中,解释名词都是必要的。所以让我们深入这个算法。

随机森林算法,顾名思义,是一个森林。而这个森林由树组成,这里提到的树是决策树。所以,我们的完整定义是:随机森林算法由一组随机的决策树组成。因此,这个算法基本上只是决策树算法的一个扩展。

算法思想

在随机森林算法中,我们创建了多个未剪枝决策树,这是因为随机森林算法不需要对决策树进行剪枝。这里的关键在于我们没有提供给每个决策树所有的训练数据,而是为每个决策树提供了一个随机的训练数据的子集。这个过程被称为bagging,或自助聚合。

Bagging是一个常用的过程,被用于降低方差过高的算法的方差。在这个过程中,为数据集创建子样本,并使用一个子样本来训练我们的决策模型。然后,我们综合每个模型的结果,通过投票(针对分类问题)或通过平均(针对回归问题)产生最后的结果。对于随机森林,我们通常会用三分之二的数据替换(对于其他决策树可以重复数据,所以不需要每棵树都使用唯一的数据)。

在随机森林算法中,每个决策树预测一个训练数据子集的结果,并根据投票决定最终的结果。在分类问题中,大多数决策树所得的结果即是最终的结果。在回归问题中,所有结果的平均值是最终结果。

优点

  • 最适合分类问题
  • 可以处理具有大量特征的大型数据集,因为它们将在每棵树中分割。
  • 它可以筛选重要属性 ; 因此,它也用于降维。
  • 保持准确性,即使训练数据有一些缺失。
  • 与未标记数据(无监督学习)一起工作,用于聚类,数据视图和异常值检测。
  • 自助采样过程中使用输入数据的样本。在这里,三分之一的数据不是用于训练,而是用于测试。这些样本被称为“包外样本”,关于这些样本的错误被称为“包外错误”(out-of-bag error)。这种类型的错误显示与训练显示的单独数据集相同的错误率,因此不需要单独的测试数据集。

缺点

  • 随机森林算法对于回归问题效果不太好
  • 算法作为一个黑匣子工作。除了更改输入值之外,您无法控制内部过程。

算法实现

现在是时候看一看在Scala中如何实现随机森林算法了。我们将像使用决策树时一样使用Smile库。

要使用Smile,请在SBT项目中包含以下依赖项:

libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.4.0"

对于这个实现我们将使用与决策树相同的数据。我们会得到一个关于二维数组的数组作为训练实例和INT型数组作为返回值。

val weather: AttributeDataset = read.arff("src/main/resources/weather.nominal.arff", 4)
val (trainingInstances,responseVariables) = data.pimpDataset(weather).unzipInt

训练

获取数据后,我们使用smile.operators 包中的randomForest() 方法,这个将返回一个RandomForest 类的实例。

val nTrees = 200
val maxNodes = 4
val rf = randomForest(trainingInstances, responseVariables, weather.attributes(), nTrees, maxNodes)

这里是这个方法的参数列表:

  • trainingInstancesArray [Array [Double]](必需参数)
  • responseVariablesArray [Int] (每个实例的返回值)
  • attributesArray [Attribute] (包含所有属性的数组;该参数默认为null)
  • nodeSizeInt (树中无法拆分的节点中的实例数量;缺省值为1,但对于非常大的数据集则应该不止一个)
  • ntreesInt (用于限制树的数量;默认值为500)
  • maxNodesInt (每个决策树中叶子节点的最大数目;缺省值 = 属性数目 / nodeSize
  • mtryInt (每个决策树随机选择的属性的数量,默认情况下它的值是平方根*属性的数量
  • subsampleDouble(如果值为1.0,则用替换样本;如果小于1.0,则不替换样本;默认值为1.0)
  • splitRuleDecisionTree.SplitRule (为决策树计算信息增益的方法;可以是GINI或ENTROPY;默认情况下是GINI)
  • classWeightArray [Int] (每个类包含的实例数量的比例;如果没有提供,算法会自己计算这个值)

测试

现在,我们的随机森林已经创建完成了。我们可以使用它的error() 方法来显示我们的随机森林的外包错误。

println(s"OOB error = ${rf.error}")

输出是:

我们可以看到,我们的随机森林中的错误是0.0,这是基于外包错误的统计。我们不需要再用另一个数据集进行测试。

之后我们可以用 RandomForest类的predict()方法来预测一些实例的结果。

准确性

我们的随机森林已经准备就绪,我们也检查了外包错误。我们知道,每一个预测也会产生一些错误。那么我们如何检查我们刚建立的随机森林的准确性呢?

还好我们有smile.validation 这个包!在这个包中,我们有很多方法可以来测试我们的模型。在这里,我们使用test()这个方法。这是一个匿名函数,需要几个参数:

val testedRF = test(trainingInstances, responseVariables, testInstances, testResponseVariables)((_, _) => rf)

参数列表如下:

  • trainingInstancesArray [Array [Double]]
  • responseValuesArray [Int]
  • testInstancesArray [Array [Double]]
  • testResponseValuesArray [Int]
  • trainer:一个以trainingInstances 作为输入,并通过responseValues参数返回分类结果的一个匿名方法。

这里testInstancestestResponseVaues 是从同一个测试数据集中提取,如下所示:

val weatherTest = read.arff("src/main/resources/weatherRF.nominal.arff", 4)
val (testInstances,testResponseValues) = data.pimpDataset(weatherTest).unzipInt

这是输出:

如上图所示,我们的随机森林的准确性 - 现在是83.33%。

示例代码的链接在这里

本文的版权归 hzr 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习原理

图像处理和数据增强图片处理数据增强颜色空间转换噪音数据的加入样本不均衡

7864
来自专栏机器学习养成记

缺失值处理(r语言,mice包)

对缺失值的处理是数据预处理中的重要环节,造成数据缺失的原因有:数据丢失、存储故障和调查中拒绝透露相关信息。这里我们使用VIM包中的sleep数据集为样本,介绍缺...

7227
来自专栏AI科技大本营的专栏

福利 | Keras入门之——网络层构造

《Keras快速上手:基于Python的深度学习实战》系统地讲解了深度学习的基本知识、建模过程和应用,并以深度学习在推荐系统、图像识别、自然语言处理、文字生成和...

5035
来自专栏灯塔大数据

干货|机器学习:Python实现聚类算法之K-Means

1.简介 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。 K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最...

6196
来自专栏专知

【干货】对抗自编码器PyTorch手把手实战系列——PyTorch实现自编码器

即使是非计算机行业, 大家也知道很多有名的神经网络结构, 比如CNN在处理图像上非常厉害, RNN能够建模序列数据. 然而CNN, RNN之类的神经网络结构本身...

6597
来自专栏数据结构与算法

09:图像旋转翻转变换

09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。...

4705
来自专栏IT派

深度学习入门实战

导语:在本文的开始前,强烈推荐两个深度学习相关的视频集 1.台湾李宏毅教授的ML 2016,清晰明了,很多晦涩的原理能让你看了也能明白:https://www....

3337
来自专栏深度学习与数据挖掘实战

干货|深度学习面试问答集锦

No.19 CNN中,conv layer、ReLu layer、Pooling layer、Fully connected layer的区别?

1254
来自专栏绿巨人专栏

神经网络学习笔记-02-循环神经网络

3657
来自专栏大数据挖掘DT机器学习

机器学习模型的特性

机器学习模型中有许多种不同方法可以用来解决分类和回归问题。对同一个问题来说,这些不同模型都可以被当成解决问题的黑箱来看待。然而,每种模型都源自于不同的...

35311

扫码关注云+社区

领取腾讯云代金券