R语言泰坦尼克号随机森林模型案例数据分析

简介: R语言泰坦尼克号随机森林模型案例数据分析

采取大量单独不完美的模型,他们的一次性错误可能不会由其他人做出。如果我们对所有这些模型的结果进行平均,我们有时可以从它们的组合中找到比任何单个部分更好的模型。这就是整体模型的工作方式,他们培养了许多不同的模型,并让他们的结果在整个团队中得到平均或投票。

我们现在很清楚决策树的过度拟合问题。但是如果我们发展了很多并让他们对结果进行投票,我们就可以通过这个限制。让我们构建一个由三个简单决策树组成的非常小的集合来说明:

这些树中的每一个都根据不同的变量做出分类决策。因此,让我们想象一下来自南安普敦的一名女乘客乘坐头等舱。第一和第二树投票表明她活了下来,但树三票她死了。如果我们进行投票,则以2比1赞成她的生存,因此我们将这名乘客归类为幸存者。

随机森林模型比上面的决策树桩更深地生长树木,实际上默认行为是尽可能地将每棵树生长出来,就像我们在第三课中制作的过度拟合树一样。但由于构建单个决策树的公式每次都是相同的,因此需要一些随机源来使这些树彼此不同。随机森林以两种方式做到这一点。

第一个技巧是使用套袋,用于引导聚合。Bagging会对您的训练集中的行进行随机抽样,并进行替换。使用样本函数很容易在R中进行模拟。假设我们想在10行的训练集上进行装袋。

1. > sample(1:10, replace = TRUE)
[1] 3 1 9 1 7 10 10 2 2 9

在此模拟中,我们仍然有10行可以使用,但行1,2,9和10每次重复两次,而行4,5,6和8被排除。如果再次运行此命令,则每次都会获得不同的行样本。平均而言,大约37%的行将被排除在自举样本之外。通过这些重复和省略的行,每个使用装袋生长的决策树将略有不同。如果你在我们的例子中有非常强大的功能,例如性别,那么这个变量可能仍然会支配你大多数树木的第一个决定。

第二个随机来源虽然超越了这个限制。随机森林不是查看整个可用变量池,而是仅采用它们的一部分,通常是可用数量的平方根。在我们的例子中,我们有10个变量,因此使用三个变量的子集是合理的。为决策树中的每个节点更改可用变量的选择。这样,许多树在第一次拆分时甚至都没有可用的性别变量,甚至可能在几个节点深处都看不到它。

通过这两个随机性来源,整体包含一系列完全独特的树木,这些树木的分类都不同。与我们的简单示例一样,每个树都被调用以对给定乘客进行分类,对投票进行统计(可能有数百或数千棵树)并且选择多数决策。由于每棵树都是完全长出来的,它们每个都过度配合,但方式不同。因此,所犯的错误将在所有错误中得到平均。

R的随机森林算法对我们的决策树没有一些限制。到目前为止,最大的一个是房间里的大象,我们必须清理数据集中的缺失值。rpart它有一个很大的优点,它可以在遇到一个NA值时使用代理变量。在我们的数据集中,缺少很多年龄值。如果我们的任何决策树按年龄分割,那么树将搜索另一个以与年龄相似的方式分割的变量,并使用它们代替。随机森林无法做到这一点,因此我们需要找到一种手动替换这些值的方法。

当我们定义成人/儿童年龄桶时,我们在第2部分中隐含使用的方法是假设所有缺失值都是剩余数据的均值或中值。从那以后,我们学到了很多新技能,所以让我们使用决策树来填充这些值。让我们从上一课的中断处开始,看一下合并后的数据框的年龄变量,看看我们遇到了什么:

1. > summary(combi$Age)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.17 21.00 28.00 29.88 39.00 80.00 263

在整个时间里,1309个中有263个值丢失了,这个数字高达20%!一些新的语法要使用。我们可以使用R函数而不是布尔逻辑的子集is.na(),而它是倒数!is.na()(爆炸符号表示“不是”)。此子集是否缺少值。我们现在也想使用method="anova"决策树的版本,因为我们不是要再预测某个类别,而是连续变量。因此,让我们使用可用的年龄值在数据子集上生成一个树,然后替换缺少的那些:

1. > combi$Age[is.na(combi$Age)] <- predict(Agefit, combi[is.na(combi$Age),])

我在这里留下了家庭人数和家庭身份证,因为我认为他们对预测年龄没有多大影响。您可以继续检查摘要,所有这些NA值都消失了。

现在让我们看看整个数据集的摘要,看看是否还有其他我们以前没有注意到的问题变量:

> summary(combi)

两个跳出来是一个问题,虽然没有像Age,Embarked和Fare那样差的两个方面都缺乏价值。

1. > summary(combi$Embarked)
C Q S
2 270 123 914

登上了两名乘客的空白。虽然空白不会像我们的模型那样成为一个问题NA,因为我们无论如何都要清理,让我们摆脱它。因为在南安普顿这么少的观察和如此大多数的登船,让我们用“S”代替那两个。首先,我们需要找出他们是谁!我们可以which用于此:

1. > which(combi$Embarked == '')
[1] 62 830

这为我们提供了空白字段的索引。然后我们简单地替换这两个,并将其编码为一个因素:

1. > combi$Embarked <- factor(combi$Embarked)

另一个顽皮的变量是Fare,让我们来看看:

• > summary(combi$Fare)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.000 7.896 14.450 33.300 31.280 512.300 1

它只有一个乘客NA,所以让我们找出它是哪一个并用中位数票价取而代之:

• > which(is.na(combi$Fare))
[1] 1044

好的。我们的数据框现已被清除。现在进入第二个限制:R中的随机森林只能消化多达32个等级的因子。我们的FamilyID变量几乎翻了一倍。我们可以在这里采用两条路径,或者将这些级别更改为它们的基础整数(使用unclass()函数)并让树将它们视为连续变量,或者手动减少级别数以使其保持在阈值之下。

我们采取第二种方法。为此,我们将FamilyID列复制到一个新变量FamilyID2,然后将其从一个因子转换回一个字符串as.character()。然后,我们可以将我们的截止点增加为2至3人的“小型”家庭。然后我们将它转换回一个因素,我们就完成了:

1. > combi$FamilyID2 <- combi$FamilyID
> combi$FamilyID2 <- factor(combi$FamilyID2)

好吧,我们已经降到了22级,所以我们很好地将测试和训练集分开,就像我们上一课并增长一个随机森林一样。安装并加载包

1. randomForest:
> install.packages('randomForest')

因为该过程具有我们之前讨论过的两个随机源,所以在开始之前在R中设置随机种子是个好主意。这使您的结果在下次加载代码时可重现,否则您可以为每次运行获得不同的分类。


> set.seed(415)

内部数字并不重要,您只需确保每次使用相同的种子编号,以便在随机森林函数内生成相同的随机数。

现在我们准备运行我们的模型了。语法类似于决策树,但还有一些额外的选项。


> fit <- randomForest( )

我们强制模型通过暂时将目标变量更改为仅使用两个级别的因子来预测我们的分类,而不是method="class"像使用那样指定。该参数允许我们检查变量的重要性,我们将看到,参数指定了我们想要增长的树数。rpartas.factor()importance=TRUEntree

如果您正在使用更大的数据集,您可能希望减少树的数量,至少在初始探索时,或者使用限制每个树的复杂性nodesize以及减少采样的行数sampsize。您也可以覆盖可供选择的默认变量数mtry,但默认值是可用总数的平方根,应该可以正常工作。由于我们只有一个小的数据集可供使用,我们可以种植大量的树而不用太担心它们的复杂性,它仍然会运行得非常快。

那么让我们来看看哪些变量很重要:


> varImpPlot(fit)

请记住装袋大约37%的行会被遗漏?Well Random Forests不仅浪费了那些“袋外”(OOB)观察,它还使用它们来查看每棵树在看不见的数据上的表现。它几乎就像一个奖励测试集,可以动态确定您的模型的性能。

上面显示了两种类型的重要性度量。一个测试的准确性可以看出模型在没有每个变量的情况下会有多差,因此对于非常预测的变量,预期准确度会大大降低。基尼可以深入研究决策树背后的数学,但实质上是衡量节点在树末端的纯度。如果取出每个变量并且高分表示变量很重要,它再次测试结果。

不出所料,我们的Title变量在这两个指标中都处于领先地位。我们应该非常高兴地看到剩下的工程变量也做得非常好。无论如何,足够的延迟,让我们看看它是如何做到的!

预测函数与决策树的工作方式类似,我们可以完全相同的方式构建提交文件。但需要更长的时间,因为所有2000棵树都需要进行分类,然后讨论谁是对的:

1. > Prediction <- predict(fit, test)
> write.csv(submit, file = "firstforest.csv", row.names = FALSE)

嗯,这实际上与Kaggle的Python随机森林教程完全相同。我不会把它当作任何森林的预期结果,但这可能只是纯粹的巧合。相对较差的性能确实表明在较小的数据集上,有时候一个更高级的模型不会打败一个简单的模型。除此之外,还有私人排行榜,因为我们的公共分数只评估了50%的测试数据。

但是,我们不要放弃。有不止一个合奏模型。让我们尝试一下条件推理树的森林。他们使用统计测试而不是纯度测量以稍微不同的方式做出决定,但每棵树的基本构造非常相似。

所以继续安装并加载party包。

1. > install.packages('party')
> library(party)

我们再次设置种子以获得一致的结果,并以与我们的随机森林类似的方式构建模型:

1. > set.seed(415)
> fit <- cforest( )

条件推理树能够处理比Random Forests更多级别的因子,所以让我们回到FamilyID的原始版本。你可能也注意到了一些新的论点。现在我们必须在更复杂的命令中指定树的数量,因为参数的传递方式cforest不同。我们还必须手动设置每个节点的样本数量,因为我们的数据集的默认值为5。好的,让我们做另一个预测:

1. > Prediction <- predict(fit, test, OOB=TRUE, type = "response")

如您所见,预测函数需要对条件推理森林进行一些额外的微调。

 

从这个数据集中可能还有一些更多的见解。

相关文章
|
1月前
|
机器学习/深度学习 数据采集 数据挖掘
实战派教学:掌握Scikit-learn,轻松实现数据分析与机器学习模型优化!
【10月更文挑战第4天】Scikit-learn凭借高效、易用及全面性成为数据科学领域的首选工具,简化了数据预处理、模型训练与评估流程,并提供丰富算法库。本文通过实战教学,详细介绍Scikit-learn的基础入门、数据预处理、模型选择与训练、评估及调优等关键步骤,助你快速掌握并优化数据分析与机器学习模型。从环境搭建到参数调优,每一步都配有示例代码,便于理解和实践。
80 2
|
3月前
|
数据采集 存储 数据挖掘
【优秀python数据分析案例】基于Python书旗网小说网站数据采集与分析的设计与实现
本文介绍了一个基于Python的书旗网小说网站数据采集与分析系统,通过自动化爬虫收集小说数据,利用Pandas进行数据处理,并通过Matplotlib和Seaborn等库进行数据可视化,旨在揭示用户喜好和市场趋势,为图书出版行业提供决策支持。
299 6
【优秀python数据分析案例】基于Python书旗网小说网站数据采集与分析的设计与实现
|
2月前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
3月前
|
数据采集 数据可视化 关系型数据库
【优秀python 数据分析案例】基于python的穷游网酒店数据采集与可视化分析的设计与实现
本文介绍了一个基于Python的穷游网酒店数据采集与可视化分析系统,通过爬虫技术自动抓取酒店信息,并利用数据分析算法和可视化工具,提供了全国主要城市酒店的数量、星级、价格、评分等多维度的深入洞察,旨在为旅行者和酒店经营者提供决策支持。
【优秀python 数据分析案例】基于python的穷游网酒店数据采集与可视化分析的设计与实现
|
3月前
|
JSON 数据挖掘 API
案例 | 用pdpipe搭建pandas数据分析流水线
案例 | 用pdpipe搭建pandas数据分析流水线
|
3月前
|
数据采集 机器学习/深度学习 算法
"揭秘数据质量自动化的秘密武器:机器学习模型如何精准捕捉数据中的‘隐形陷阱’,让你的数据分析无懈可击?"
【8月更文挑战第20天】随着大数据成为核心资源,数据质量直接影响机器学习模型的准确性和效果。传统的人工审查方法效率低且易错。本文介绍如何运用机器学习自动化评估数据质量,解决缺失值、异常值等问题,提升模型训练效率和预测准确性。通过Python和scikit-learn示例展示了异常值检测的过程,最后强调在自动化评估的同时结合人工审查的重要性。
90 2
|
3月前
|
机器学习/深度学习 前端开发 数据挖掘
基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型
本文介绍了一个基于Python Django框架开发的房价数据分析平台,该平台集成了多种机器学习模型,包括线性回归、SVM、GBDT和BP神经网络,用于房价预测和市场分析,同时提供了前端大屏展示和后台数据管理功能。
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
【python】python母婴数据分析模型预测可视化(数据集+论文+PPT+源码)【独一无二】
【python】python母婴数据分析模型预测可视化(数据集+论文+PPT+源码)【独一无二】
|
3月前
|
数据采集 数据可视化 数据挖掘
【优秀python案例】基于python爬虫的深圳房价数据分析与可视化实现
本文通过Python爬虫技术从链家网站爬取深圳二手房房价数据,并进行数据清洗、分析和可视化,提供了房价走势、区域房价比较及房屋特征等信息,旨在帮助购房者更清晰地了解市场并做出明智决策。
121 2
|
3月前
|
数据采集 存储 数据可视化
【优秀python数据分析案例】基于python的中国天气网数据采集与可视化分析的设计与实现
本文介绍了一个基于Python的中国天气网数据采集与可视化分析系统,通过requests和BeautifulSoup库实现数据爬取,利用matplotlib、numpy和pandas进行数据可视化,提供了温湿度变化曲线、空气质量图、风向雷达图等分析结果,有效预测和展示了未来天气信息。
583 2
下一篇
无影云桌面