Machine-Learning-Mastery-R-机器学习教程-一-

119 阅读40分钟

Machine Learning Mastery R 机器学习教程(一)

原文:Machine Learning Mastery

协议:CC BY-NC-SA 4.0

从乘客存活预测案例研究中获得的应用机器学习经验

原文:machinelearningmastery.com/applied-mac…

最后更新于 2019 年 8 月 22 日

在学习和实践机器学习时,一个有价值的练习是研究其他人如何应用方法和解决问题。它很有价值,因为你可以了解新的流程、软件、图表和算法。

但是,用机器学习来思考解决问题的过程的新方法是这项练习最有价值的部分。

在这篇文章中,你将回顾一下预测泰坦尼克号乘客存活率的方法科特·韦赫利,这是一个用作初学者卡格尔竞赛基础的数据集。

Curt 使用 R 进行分析,并提供了一种调查问题的逻辑方法,你可以从中吸取很多教训。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

研究问题

科特首先描述了这个问题。他链接到资源,如 RMS 泰坦尼克号维基百科条目,并记录了一些关于泰坦尼克号和沉没事件的事实。

这表明 Curt 考虑的是更广泛的问题,而不是深入数据集。它不是对一个空变量的预测,而是发生在现实世界中的一个事件,我们可以从中做出一些假设。

Curt 做到了这一点,并列出了一些假设,这些假设可以根据乘客等级、船舱到救生艇的距离以及妇女和儿童优先协议等数据进行测试。

研究数据

Curt 评论说,他看到了问题的数据准备阶段的大部分努力(和回报)。他认为这是一个机会,可以让他的手变脏,并获得对数据的颗粒感觉。他说他对这个问题最深刻的见解来自这个阶段。

缺失数据

Curt 研究缺失的数据,创建一个图(来自 Amelia 包的 missmap 函数),该图总结了缺失数据的属性。他对不同属性的缺失数据量进行了评论,并推测了各种方法及其应用。

属性分布

Curt 孤立地研究属性的分布,查看名义属性的直方图。他提取一般趋势并解释数据,评论它们在领域背景下的意义,如年龄和阶级。

Attribute Distributions

属性分布 由科特·韦赫利创建的图形

属性与存活的关系

接下来,Curt 在预测变量存活的背景下研究属性的分布。他使用马赛克图(来自 vcd 包的马赛克图)来评估预测变量的分类属性,并使用相关图(来自相关图包的相关图函数)来支持他的解释。

通过每一个关键属性,Curt 挑选出关键关系和解释,比如阶级影响存活概率和性别与存活的关系。

有一个有用的模式需要注意,那就是可视化、解释和确认。这种确认是通过另一种主观的方法进行的,但是假设也可以很容易地在过程的后期进行建模。

Passenger Fate by Traveling Class

科特·韦赫利创建的按旅行等级划分的乘客命运图

特征工程

Curt 从年龄开始,考虑用不同的方法来估计大约 20%的缺失值。他着眼于平均年龄,首先是总体年龄,然后是班级年龄,然后是性别,甚至是头衔。

这是使用简单统计方法提高数据质量的一个重要例子。鉴于这是一场比赛,我想看看不同年龄模型对最终得分的贡献。

Curt 大量使用名字字段中的标题前缀,提取它,并使用有意义的解释(先生和先生,贵族等)将其合并。).这是一个很好的特性,有很大的空间来探索它对模型的贡献。

最后,Curt 从数据中导出了许多其他特征,例如对女性孩子的偏好、带有船舱属性的记录的甲板和船舷。

研究模型

Curt 没有抛出一堆最先进的模型来解决这个问题,至少一开始没有。

适合理解良好的模型

Curt 从一个很好理解的方法开始:逻辑回归。

他用它对数据进行简单的 80/20 分割,用于训练和测试,并研究不同的属性如何有助于预测乘客的存活率。他使用卡方统计来评估模型,并通过运行方差分析来查看不同属性的方差减少情况。

这是聪明的第一步,因为它允许 Curt 验证关于问题的假设,并寻找容易的胜利,比如放弃不相关的特性。

然后,他切换到 Caret 包,用 3 次重复的 10 倍交叉验证运行逻辑回归。他小心翼翼地在每次跑步中使用相同的随机种子,以便结果可以直接比较。有了这个更强大的测试工具,他尝试了不同的特性组合,删除特性,甚至一些进一步的特性工程。

适合其他型号

在对功能的选择建立了一些信心后,Curt 挑选出了另外三个强大的模型:Adaboost、Random Forest 和 SVM。

Curt 没有盲目地运行模型,而是使用 Caret 包的特性来调整每个模型的参数。他为每个算法选择表现更好的参数集,用于模型评估。

评估模型

Curt 评估问题上的每个模型,并准备一个混淆矩阵来总结结果。他对这些结果提供了一些细微的解释,为更深入的分析留下了很大的空间。

ROC Curves of Model Performance

柯特·韦赫利绘制的模型表现的 ROC 曲线 图

结果通过灵敏度-特异性图上结果的 ROC 曲线进行图形比较。这是一种基于预测准确性的权衡来比较模型的常见方法。

Curt 还使用点图、方框图和触须图来比较每个模型的 ROC 分数。他评论说,所有四个模型在预测死亡人数方面都比存活人数更好,如果他必须选择一个模型来应用,他会选择逻辑回归。

Dot Plots of Model Performance

科特·韦赫利绘制的模型表现点图 图

经验教训

Curt 小心翼翼地指出,这只是解决这个问题的一个例子,远远不是解决这个问题的最佳方法。我认为它是如何处理问题和应用机器学习算法的一个很好的例子。

您可以从本案例研究中学到以下几点:

  • 研究你的问题:在更广阔的背景下回顾问题,列出所有你认为可能相关的假设,以及你可以用实际数据挑战的假设。
  • 查看你的数据:研究现有的数据。寻找缺失的值,并思考如何估计它们。仔细查看每个属性和每个属性在预测变量上下文中的分布,并确保写下您注意到的解释和趋势,这些也可以在模型构建期间进行测试和利用。
  • 衍生特征:超越所提供的数据,设计新的属性,在数据中展示一个你认为有助于模型做出预测的结构。
  • 研究一个模型:挑选一个你很了解和理解的模型,用它来学习更多关于问题的知识,测试假设,挑选出可能有助于预测也可能没有帮助的属性。
  • 稳健的模型评估:使用稳健的方法,如重复交叉验证,在看不见的数据上评估模型表现,并使用对结果(真阳性/假阴性)敏感的度量来比较模型

R 机器学习书籍

原文:machinelearningmastery.com/books-for-m…

最后更新于 2020 年 8 月 16 日

r 是一个强大的数据分析和机器学习平台。

它是我在竞赛和咨询工作等方面的主要工作。原因是大量强大的算法可用,都在一个平台上。

在这篇文章中,我想指出一些你可以用来开始机器学习的资源。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

R 简介

在开始解决机器学习的问题之前,您可能需要熟悉平台和语言。

我认为熟悉自己的最好方法是开始解决问题。真正工作的考验会迫使你去学习你必须学习的东西来解决你的问题。一个好的参考可以帮助你回答你的“我怎么……”问题。

R 简单来说

R in a Nutshell

简而言之

刚开始读 R 的时候,我从头到尾读的书是 R 简写为。它会带你从安装、基本操作、数据分析,甚至一些机器学习算法,一路走过平台。我强烈推荐它。

我选择它是因为它是一个广泛的参考。我想稍微了解一下平台上的一切,这样当我有具体的问题时,我就知道去哪里找了。

机器学习

在 R 语言中实现了大量的机器学习算法,其中许多算法是由学者和他们的团队首先开发的。仅这一点就是在 r .中开始的一个令人信服的理由。此外,数据处理/操作和绘图工具非常强大(尽管 Python 的 SciPy 堆栈正在迎头赶上)。

机器学习和统计学习

不是一本书,但你可以从 Torsten Hothorn 维护的 CRAN 上的机器学习和统计学习视图开始。它列出了大多数可以用于机器学习的 R 包,按算法和算法类型分组。

这是一个很好的起点,但我认为它可以做得更好的一件事是指出规范包,并详细说明一些可用的包装包,如 caret。

应用预测建模

Applied Predictive Modeling

应用预测建模

这本书的作者马克斯·库恩是著名的caret 包的创造者。应用预测建模非常实用,在第一部分首先描述了预测分析流程和案例研究。第二部分和第三部分研究回归和分类算法,最后一部分涵盖更高级的主题,如特征选择。

这是一本厚厚的书,也是一本很好的参考书,我是这本书的粉丝。也可以查看的配套网站获取相关资源。

统计学习导论:在 R 中的应用

An Introduction to Statistical Learning- with Applications in R

统计学习导论——及其在 R

这是经典的“《统计学习的要素:数据挖掘、推理和预测》”的更容易理解的版本,包括两位相同的作者。

统计学习入门首先介绍了统计学习以及模型准确率和偏差-方差权衡等问题。第三章和第四章着眼于线性回归和一些更简单的分类算法。接下来的几章将讨论交叉验证、非线性回归前的模型选择、决策树、SVM 和非监督方法。

这本书也可以从作者网页免费在线获得。

带 R 的实用数据科学

Practical Data Science with R

实用数据科学

带 R 的实用数据科学比机器学习更有数据科学的旋转。第一部分是将数据加载到 r 中的介绍性内容。第二部分从模型评估开始,通过 k-NN、朴素贝叶斯、线性回归、聚类、关联规则和 SVM,逐步增加模型的复杂性。第三部分解决了一些高级问题,如自我记录脚本和呈现结果。

提供了一个很好的介绍和切实可行的建议。

带 R 的机器学习

Machine Learning with R

带 R 的机器学习

带 R 的机器学习提供了 R 中机器学习的概述,不涉及细节或理论。它还大量使用案例研究来演示每种算法。它首先简要介绍了机器学习和 R 以及 R 中的数据管理。它在后续章节中涵盖了 k-NN、朴素贝叶斯、决策树、回归、神经网络、Apriori 和聚类。

它以关于模型评估、算法调整和其他高级主题的章节结束。本文的一个很好的特点是每章提供的一步一步的顺序,围绕案例研究提供了一个可操作的框架。

R 数据挖掘:案例学习

Data Mining with R- Learning with Case Studies

基于案例研究的 R 学习数据挖掘

在第一章快速介绍了 R 之后,用 R 进行数据挖掘给出了一个又一个案例研究。这些包括:预测藻类大量繁殖,股票市场回报,欺诈交易和分类微阵列样本。每项研究都探索了各种不同的数据准备、模型构建和模型评估方法。

如果你想找到解决实际问题的方法,这是一本非常有价值的书。

带 R 的数据挖掘和业务分析

Data Mining and Business Analytics with R

数据挖掘和业务分析

使用 R 的数据挖掘和商业分析提供了使用 R 的工作示例,但是这些示例更侧重于商业而不是科学,就像在其他一些书中一样。这些章节通过使用 R 的关键机器学习方法和较小的案例研究贯穿始终。这本书以一些关于文本情感分析和网络数据建模的大型案例研究结束。

带拨浪鼓和 R 的数据挖掘:挖掘数据进行知识发现的艺术(用 R!)

Data Mining with Rattle and R- The Art of Excavating Data for Knowledge Discovery

带拨浪鼓和 R 的数据挖掘——为知识发现挖掘数据的艺术

带拨浪鼓和 R 的数据挖掘提供了机器学习算法的介绍,尽管难点在于使用了拨浪鼓图形环境。在第一部分关于加载和处理数据的介绍材料之后,第二部分将介绍标准的机器学习算法。

关于算法的介绍,我喜欢的是标准化的描述,包括教程、参数调整和命令摘要。我非常喜欢算法的一致结构化表示。

摘要

我们已经收集了 7 本关于使用 R 平台的热门机器学习书籍。

我能给的最好的建议就是挑一个读一读。从头到尾读一遍,做笔记,做练习。和编程一样,使用 R 是一项只有通过练习才能建立起来的实用技能。练习机器学习 r。

我错过了一本关于机器学习的书吗?留言告诉我。

用于应用预测建模的 Caret 包

原文:machinelearningmastery.com/caret-r-pac…

最后更新于 2019 年 8 月 22 日

统计计算的 R 平台可能是应用机器学习最流行和最强大的平台。

R 中的脱字号套餐被称为“ R 的竞争优势”。它使得在 R 中训练、调整和评估机器学习模型的过程一致、简单甚至有趣。

在这篇文章中,你会发现 R 中的 caret 包,它的关键特性和去哪里了解更多。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

Caret package in R

R 中的 Caret 包

什么是 Caret 包

caret 建立在机器学习的一个关键哲学之上,即“没有免费的午餐”定理。该定理指出,在没有预测问题的先验知识的情况下,没有任何一种方法可以说比其他方法更好。

面对这个定理,caret 包对如何进行应用机器学习持固执己见的立场。对于给定的问题,你无法知道哪种算法或哪种算法参数是最优的,只能通过经验实验来知道。这是 caret 包旨在促进的过程。

它通过几个关键方式做到这一点:

  • 流线型模型创建:提供一致的界面,训练大量 r 中最流行的第三方算法。
  • 评估参数对表现的影响:它提供了一些工具,可以根据一个客观的衡量标准对算法参数的组合进行网格搜索,以了解给定问题的参数对模型的影响。
  • 选择最佳模型:它提供了评估和比较给定问题的模型的工具,以使用客观标准定位最合适的模型。
  • 评估模型表现:它提供了根据给定问题的未知数据来评估模型准确性的工具。

Caret 特征

caret 包有许多围绕核心理念构建的特性。一些例子包括:

  • 数据拆分:在训练和测试数据集中拆分数据。
  • 数据预处理:准备数据进行标准化、规范化等建模。
  • 特征选择:只选择有效预测所需属性的方法。
  • 特征重要性:评估数据集中每个属性对预测属性的相关性。
  • 模型调整:评估计法参数对表现的影响,找到最佳配置
  • 并行处理:使用并行计算(如工作站上的多个内核)来调整和估计模型表现,以提高表现。
  • 可视化:通过量身定制的可视化,更好地理解训练数据、模型比较以及参数对模型的影响。

Caret 从何而来

caret 是由辉瑞公司的马克斯·库恩创建和维护的 R 包。开发始于 2005 年,后来被开源并上传到 CRAN。

caret 实际上是一个首字母缩略词,代表分类和回归训练。

它最初是出于对给定问题运行多种不同算法的需要而开发的。r 包是由第三方创建的,在训练和生成预测时,它们的参数和语法可能会有所不同。caret 包的最初版本旨在统一模型训练和预测。

它后来扩展到进一步标准化相关的常见任务,如参数调整和确定变量重要性。

马克斯·库恩访谈

马克斯·库恩接受数据科学采访。洛杉矶在用户大会上。在采访中,Max 谈到了 caret 的发展和他对 r 的使用,他谈到了在给定问题上测试多个模型的重要性和同时使用多个不同包的痛苦,以及创建包的动力。

<iframe title="Max Kuhn Interviewed by DataScience.LA at useR" width="500" height="281" src="https://www.youtube.com/embed/YmHyAHkjX_A?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""/></div> <p/> <h2>马克斯·库恩对 caret 的演示</h2> <p>马克斯·库恩演示了 caret,并在本次演示中介绍了 caret 的发展和特点。他再次谈到了“没有免费午餐”定理和测试多个模型的必要性。演示的核心是一些流失数据的模型示例。他涉及到评估模型表现、算法调整等等。</p> <p><span class="1KTublOcYeJaAsW"/></p> <div class="responsive-video"><iframe loading="lazy" title="caret package webinar" width="500" height="375" src="about:blank" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" data-rocket-lazyload="fitvidscompatible" data-lazy-src="https://www.youtube.com/embed/7Jbb2ItbTC4?feature=oembed"/><iframe title="caret package webinar" width="500" height="375" src="https://www.youtube.com/embed/7Jbb2ItbTC4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""/></div> <p/> <h2>Caret 资源</h2> <p>如果您对 caret 包中的更多信息感兴趣,请查看下面的一些链接。</p> <ul> <li><a href="https://topepo.github.io/caret/index.html">Caret 包主页</a></li> <li><a href="https://cran.r-project.org/web/packages/caret/">CRAN 上的 caret 包</a></li> <li><a href="https://cran.r-project.org/web/packages/caret/caret.pdf">脱字号包装手册</a> (PDF,所有功能)</li> <li><a href="https://cran.r-project.org/web/packages/caret/vignettes/caret.pdf">Caret 包简介</a></li> <li><a href="http://www.jstatsoft.org/v28/i05">使用 Caret 包</a>在 R 中构建预测模型(PDF 论文)</li> <li><a href="https://github.com/topepo/caret">GitHub 上的开源项目</a>(源代码)</li> </ul> <!-- Shortcode does not match the conditions --> <p/> </body></html>

使用 Caret R 包比较模型并选择最佳方案

原文:machinelearningmastery.com/compare-mod…

最后更新于 2019 年 12 月 13 日

Caret R 包允许您轻松构建许多不同的模型类型并调整它们的参数。

在创建和调整许多模型类型之后,您可能想要知道并选择最佳模型,以便您可以使用它进行预测,也许是在操作环境中。

在这篇文章中,你会发现如何使用 Caret 包来比较多个模型的结果。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

比较机器学习模型

在解决问题时,你会选择一个或几个表现良好的模型。在调整每个模型的参数后,您将希望比较模型,并发现哪些模型表现最好,哪些表现最差。

了解模型的传播是很有用的,也许一个模型可以改进,或者你可以停止研究一个明显比其他模型表现差的模型。

在下面的例子中,我们比较了皮马印第安人糖尿病数据集中的三种复杂的机器学习模型。该数据集是一组医学报告的汇总,表明患者在五年内出现糖尿病。

您可以在此了解有关数据集的更多信息:

构建和调整的三个模型分别是学习矢量量化 (LVQ)、随机梯度提升(也称为梯度提升机或 GBM)和支持向量机 (SVM)。每个模型都是自动调整的,并使用 3 次重复的 10 倍交叉验证进行评估。

随机数种子在每个算法被训练之前被设置,以确保每个算法获得相同的数据分区并重复。这使我们能够在最终结果中比较苹果和苹果。或者,我们可以忽略这个问题,将重复次数增加到 30 或 100 次,利用随机性来控制数据分区的变化。

一旦模型被训练并且为每个模型找到最佳参数配置,从每个最佳模型收集准确率结果。每个“获胜”模型有 30 个结果(10 倍交叉验证的 3 次重复)。比较结果的目的是比较模型之间的准确率分布(30 个值)。

这是通过三种方式完成的。分布以百分位数概括。分布被总结为箱线图,最后分布被总结为点线图。

# load the library
library(mlbench)
library(caret)
# load the dataset
data(PimaIndiansDiabetes)
# prepare training scheme
control <- trainControl(method="repeatedcv", number=10, repeats=3)
# train the LVQ model
set.seed(7)
modelLvq <- train(diabetes~., data=PimaIndiansDiabetes, method="lvq", trControl=control)
# train the GBM model
set.seed(7)
modelGbm <- train(diabetes~., data=PimaIndiansDiabetes, method="gbm", trControl=control, verbose=FALSE)
# train the SVM model
set.seed(7)
modelSvm <- train(diabetes~., data=PimaIndiansDiabetes, method="svmRadial", trControl=control)
# collect resamples
results <- resamples(list(LVQ=modelLvq, GBM=modelGbm, SVM=modelSvm))
# summarize the distributions
summary(results)
# boxplots of results
bwplot(results)
# dot plots of results
dotplot(results)

下面是总结每个模型分布的结果表。

Models: LVQ, GBM, SVM 
Number of resamples: 30 

Accuracy 
      Min. 1st Qu. Median   Mean 3rd Qu.   Max. NA's
LVQ 0.5921  0.6623 0.6928 0.6935  0.7273 0.7922    0
GBM 0.7013  0.7403 0.7662 0.7665  0.7890 0.8442    0
SVM 0.6711  0.7403 0.7582 0.7651  0.7890 0.8961    0

Kappa 
       Min. 1st Qu. Median   Mean 3rd Qu.   Max. NA's
LVQ 0.03125  0.1607 0.2819 0.2650  0.3845 0.5103    0
GBM 0.32690  0.3981 0.4638 0.4663  0.5213 0.6426    0
SVM 0.21870  0.3889 0.4167 0.4520  0.5003 0.7638    0

Box Plot Comparing Model Results

使用 Caret 包比较模型结果的箱线图

Dotplot Comparing Model Results using the Caret R Package

使用 Caret 包比较模型结果的点图

如果你需要对哪种算法更好提出有力的主张,你也可以使用统计假设检验来统计显示结果的差异是显著的。

类似于学生 t 检验,如果结果是正态分布,或者秩和检验,如果分布未知。

摘要

在这篇文章中,你发现了如何使用 Caret 包来比较来自多个不同模型的结果,即使它们的参数已经被优化。你看到了三种比较结果的方法,表格,方框图和点图。

本文中的示例是独立的,您可以轻松地将它们复制并粘贴到您自己的项目中,并根据您的问题进行调整。

在 R 中比较机器学习算法

中的表现

原文:machinelearningmastery.com/compare-the…

最后更新于 2019 年 8 月 22 日

如何有效比较不同机器学习算法的估计准确率?

在这篇文章中,你将发现 8 种技术,可以用来比较 r。

你可以使用这些技术来选择最准确的模型,并能够评论它击败其他算法的统计意义和绝对数量。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

Compare The Performance of Machine Learning Algorithms in R

比较机器学习算法在 R 中的表现。

选择最佳机器学习模型

你如何为你的问题选择最好的模型?

当你在一个机器学习项目中工作时,你经常会有多个好的模型可供选择。每个型号将有不同的表现特征。

使用像交叉验证这样的重采样方法,您可以估计每个模型在未看到的数据上的准确性。您需要能够使用估计值从您创建的模型套件中选择一个或两个最佳模型。

仔细比较机器学习模型

当您有一个新的数据集时,最好使用多种不同的绘图技术来可视化数据,以便从不同的角度查看数据。

同样的想法也适用于模型选择。您应该使用多种不同的方法来查看机器学习算法的估计准确率,以便选择一个或两个来最终确定。

您可以使用不同的可视化方法来显示模型准确率分布的平均准确率、方差和其他属性。

在下一节中,您将会发现如何在 r

比较和选择机器学习模型

在本节中,您将发现如何客观地比较 r

通过本节的案例研究,您将为皮马印第安人糖尿病数据集创建许多机器学习模型。然后,您将使用一套不同的可视化技术来比较模型的估计准确率。

本案例研究分为三个部分:

  1. 准备数据集。加载库和数据集,准备训练模型。
  2. 列车模型。在准备评估的数据集上训练标准机器学习模型。
  3. 比较型号。使用 8 种不同的技术比较训练好的模型。

1.准备数据集

本案例研究中使用的数据集是皮马印第安人糖尿病数据集,可在 UCI 机器学习存储库中获得。它也可以在 r。

关于患者是否会在未来 5 年内出现糖尿病,这是一个二分类问题。输入的属性是数字,描述女性患者的医疗细节。

让我们为这个案例研究加载库和数据集。

# load libraries
library(mlbench)
library(caret)
# load the dataset
data(PimaIndiansDiabetes)

2.火车模型

在本节中,我们将训练 5 个机器学习模型,我们将在下一节中进行比较。

我们将使用 10 次折叠和 3 次重复的重复交叉验证,这是比较模型的常见标准配置。评估指标是准确性和 kappa,因为它们很容易解释。

这些算法是半随机选择的,因为它们的表现形式和学习风格不同。它们包括:

  • 分类和回归树
  • 线性判别分析
  • 径向基函数支持向量机
  • k-最近邻
  • 随机森林

在模型被训练之后,它们被添加到列表中,并且在模型列表中调用重采样()。该功能检查模型是否具有可比性,以及它们是否使用了相同的训练方案(训练控制配置)。该对象包含要评估的每个算法的每个折叠和每个重复的评估指标。

我们在下一节中使用的函数都期望有一个包含这些数据的对象。

# prepare training scheme
control <- trainControl(method="repeatedcv", number=10, repeats=3)
# CART
set.seed(7)
fit.cart <- train(diabetes~., data=PimaIndiansDiabetes, method="rpart", trControl=control)
# LDA
set.seed(7)
fit.lda <- train(diabetes~., data=PimaIndiansDiabetes, method="lda", trControl=control)
# SVM
set.seed(7)
fit.svm <- train(diabetes~., data=PimaIndiansDiabetes, method="svmRadial", trControl=control)
# kNN
set.seed(7)
fit.knn <- train(diabetes~., data=PimaIndiansDiabetes, method="knn", trControl=control)
# Random Forest
set.seed(7)
fit.rf <- train(diabetes~., data=PimaIndiansDiabetes, method="rf", trControl=control)
# collect resamples
results <- resamples(list(CART=fit.cart, LDA=fit.lda, SVM=fit.svm, KNN=fit.knn, RF=fit.rf))

3.比较模型

在本节中,我们将研究 8 种不同的技术来比较构建模型的估计准确率。

表摘要

这是您能做的最简单的比较,只需调用 summary 函数()并将重新采样结果传递给它。它将创建一个表,每行一个算法,每列一个评估指标。在这种情况下,我们已经排序。

# summarize differences between modes
summary(results)

我发现查看平均值和最大值列很有用。

Accuracy 
       Min. 1st Qu. Median   Mean 3rd Qu.   Max. NA's
CART 0.6234  0.7115 0.7403 0.7382  0.7760 0.8442    0
LDA  0.6711  0.7532 0.7662 0.7759  0.8052 0.8701    0
SVM  0.6711  0.7403 0.7582 0.7651  0.7890 0.8961    0
KNN  0.6184  0.6984 0.7321 0.7299  0.7532 0.8182    0
RF   0.6711  0.7273 0.7516 0.7617  0.7890 0.8571    0

Kappa 
       Min. 1st Qu. Median   Mean 3rd Qu.   Max. NA's
CART 0.1585  0.3296 0.3765 0.3934  0.4685 0.6393    0
LDA  0.2484  0.4196 0.4516 0.4801  0.5512 0.7048    0
SVM  0.2187  0.3889 0.4167 0.4520  0.5003 0.7638    0
KNN  0.1113  0.3228 0.3867 0.3819  0.4382 0.5867    0
RF   0.2624  0.3787 0.4516 0.4588  0.5193 0.6781    0

方框图和触须图

这是查看不同方法的估计准确率的分布及其相互关系的有用方法。

# box and whisker plots to compare models
scales <- list(x=list(relation="free"), y=list(relation="free"))
bwplot(results, scales=scales)

请注意,箱子是从最高到最低平均准确率排序的。我发现查看平均值(点)和方框的重叠(结果的中间 50%)很有用。

Compare Machine Learning Algorithms in R Box and Whisker Plots

R 盒图和须图中机器学习算法的比较

密度图

您可以将模型准确率的分布显示为密度图。这是评估计法的估计行为中的重叠的有用方法。

# density plots of accuracy
scales <- list(x=list(relation="free"), y=list(relation="free"))
densityplot(results, scales=scales, pch = "|")

我喜欢看峰值的差异以及分布的范围或基数。

Compare Machine Learning Algorithms in R Density Plots

R 密度图中机器学习算法的比较

点图

这些是有用的图,因为它们既显示了平均估计准确率,也显示了 95%的置信区间(例如,95%的观察得分下降的范围)。

# dot plots of accuracy
scales <- list(x=list(relation="free"), y=list(relation="free"))
dotplot(results, scales=scales)

我发现比较算法之间的平均值和重叠值是很有用的。

Compare Machine Learning Algorithms in R Dot Plots

R 点图中机器学习算法的比较

平行图

这是另一种看待数据的方式。它显示了每个交叉验证折叠的每个试验对于每个测试算法的表现。它可以帮助你看到那些对一种算法来说困难的坚持子集如何对其他算法公平。

# parallel plots to compare models
parallelplot(results)

这可能是一个需要解释的技巧。我喜欢认为这有助于思考如何在以后的集合预测(例如叠加)中结合不同的方法,尤其是如果你看到相反方向的相关运动。

Compare Machine Learning Algorithms in R Parallel Plots

R 平行图中机器学习算法的比较

散点图矩阵

与所有其他算法的相同折叠试验结果相比,这创建了算法的所有折叠试验结果的散点图矩阵。所有配对都进行了比较。

# pair-wise scatterplots of predictions to compare models
splom(results)

当考虑来自两种不同算法的预测是否相关时,这是非常宝贵的。如果弱相关,它们是在集合预测中组合的良好候选对象。

例如,用眼睛扫视这些图,它看起来像是 LDA 和 SVM,SVM 和 RF 也是如此。SVM 和卡特看起来每周都有关联。

Compare Machine Learning Algorithms in R Scatterplot Matrix

R 散点图矩阵中机器学习算法的比较

成对 xyPlots

您可以使用 xyplot 对两种机器学习算法的试折叠准确率进行成对比较。

# xyplot plots to compare models
xyplot(results, models=c("LDA", "SVM"))

在这种情况下,我们可以看到 LDA 和 SVM 模型看似相关的准确性。

Compare Machine Learning Algorithms in R Pair-wise Scatterplot

R 对散点图中机器学习算法的比较

统计显著性检验

您可以计算不同机器学习算法的度量分布之间差异的显著性。我们可以通过调用 summary()函数直接汇总结果。

# difference in model predictions
diffs <- diff(results)
# summarize p-values for pair-wise comparisons
summary(diffs)

我们可以看到成对统计显著性得分的表格。表格的下对角线显示了零假设的 p 值(分布相同),越小越好。我们看不到 CART 和 kNN 之间的差异,我们也看不到 LDA 和 SVM 的分布之间的差异。

表格的上对角线显示了分布之间的估计差异。如果我们从前面的图表中认为 LDA 是最准确的模型,我们可以得到一个估计,在绝对准确性方面比其他特定模型好多少。

这些分数可以帮助您在特定算法之间做出任何准确性声明。

p-value adjustment: bonferroni 
Upper diagonal: estimates of the difference
Lower diagonal: p-value for H0: difference = 0

Accuracy 
     CART      LDA       SVM       KNN       RF       
CART           -0.037759 -0.026908  0.008248 -0.023473
LDA  0.0050068            0.010851  0.046007  0.014286
SVM  0.0919580 0.3390336            0.035156  0.003435
KNN  1.0000000 1.218e-05 0.0007092           -0.031721
RF   0.1722106 0.1349151 1.0000000 0.0034441

一个很好的建议是增加试验的次数,以增加群体的规模,也许还能获得更精确的 p 值。你也可以画出差异,但我发现这些图比上面的汇总表用处要小得多。

摘要

在这篇文章中,你发现了 8 种不同的技术,可以用来比较机器学习模型在 r

你发现的 8 种技术是:

  • 表摘要
  • 方框图和触须图
  • 密度图
  • 点图
  • 平行图
  • 散点图矩阵
  • 成对 xyPlots
  • 统计显著性检验

我是不是错过了你最喜欢的一个比较 R 中机器学习算法估计准确率的方法?留言评论,我很想听听!

下一步

你试过这些秘籍吗?

  1. 开始你的互动环境。
  2. 键入或复制粘贴上面的秘籍并试用。
  3. 使用 R 中的内置帮助来了解有关所用函数的更多信息。

你有问题吗?在评论里问,我会尽力回答。

R 中的凸优化

原文:machinelearningmastery.com/convex-opti…

最后更新于 2019 年 8 月 22 日

优化是机器学习的一大部分。它是最流行的方法的核心,从最小二乘回归到人工神经网络。

在这篇文章中,你将发现 5 种优化算法的配方

这些方法可能对你自己实现机器学习算法的核心有用。您可能希望实现自己的算法调整方案,以优化某个成本函数的模型参数。

一个很好的例子是,您希望优化来自多个子模型集合的混合预测的超参数。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

黄金分割搜索

黄金分割搜索是一种一维全局优化的线性搜索方法。这是一种直接搜索(模式搜索)方法,因为它对函数进行采样以逼近导数,而不是直接计算导数。

黄金分割搜索与离散有序列表的模式搜索相关,例如二分搜索法和斐波那契搜索。它与其他线性搜索算法(如布伦特法)相关,更一般地说,与其他直接搜索优化方法(如 NelderMead 法)相关。

该方法的信息处理目标是定位函数的极值。它通过使用三点模式直接对函数进行采样来实现这一点。这些点构成了搜索的括号:第一个点和最后一个点是搜索的当前边界,第三个点划分了中间的空间。选择划分点,使较大分区与整个区间的比值等于较大分区与较小分区的比值,称为黄金比值(φ)。基于分区的功能评估来比较分区,并且选择表现更好的分区作为搜索的新边界。该过程反复进行,直到获得所需的准确率水平(包围最佳值)或搜索停止。

下面的例子提供了一个代码清单黄金分割搜索方法在解决一维非线性无约束优化函数。

# define a 1D basin function, optima at f(0)=0
basin <- function(x) {
x[1]²
}

# locate the minimum of the function using a Golden Section Line Search
result <- optimize( 
basin, # the function to be minimized
c(-5, 5), # the bounds on the function parameter
maximum=FALSE, # we are concerned with the function minima
tol=1e-8) # the size of the final bracketing

# display the results
print(result$minimum)
print(result$objective)

# plot the function 
x <- seq(-5, 5, length.out=100)
y <- basin(expand.grid(x))
plot(x, y, xlab="x",ylab="f(x)", type="l")
# plot the solution as a point
points(result$minimum, result$objective, col="red", pch=19)
# draw a square around the optima to highlight it
rect(result$minimum-0.3, result$objective-0.7, result$minimum+0.3, result$objective+0.7, lwd=2)

Golden Section Search Results

黄金分割搜索结果

使用启发法

  • 假设该函数是凸的并且是单峰的,该函数有一个最佳值,并且它位于包围点之间。
  • 意在寻找一维连续函数的极值。
  • 它被证明比同等大小的分割线性搜索更有效。
  • 终止标准是关于最佳支架之间最小距离的规范。
  • 它可以快速定位最优值的括号区域,但在定位特定最优值时效率较低。
  • 一旦找到所需准确率的解,就可以将其作为具有更快收敛速度的第二搜索算法的基础。

内德尔米德

NelderMead 方法是一种多维非线性无约束函数的优化算法。 这是一种直接搜索方法,因为它在过程中不使用函数梯度。它是一种模式搜索,因为它使用几何模式来探索问题空间。

它与其他直接搜索优化方法相关,如胡克和吉夫斯的模式搜索,也使用几何模式来优化目标函数。

NelderMead 方法的信息处理目标是定位函数的极值。这是通过在域中覆盖单形(几何图案)并迭代地增加和/或减小其尺寸直到找到最佳值来实现的。单纯形总是用 n +1 个顶点来定义,其中 n 是搜索空间的维数(即 2D 问题的三角形)。

该过程包括识别复合体中表现最差的点,并将其替换为通过其余点的质心(中心点)反射的点。通过远离最差点扩展、沿着远离最差点的一维收缩或在所有维度上朝着最佳点收缩,单纯形可以变形(使其自身适应搜索空间的拓扑结构)。

以下示例提供了求解二维非线性优化函数的 NelderMead 方法的代码列表。

# definition of the 2D Rosenbrock function, optima is at (1,1)
rosenbrock <- function(v) { 
(1 - v[1])² + 100 * (v[2] - v[1]*v[1])²
}

# locate the minimum of the function using the Nelder-Mead method
result <- optim(
c(runif(1,-3,3), runif(1,-3,3)), # start at a random position
rosenbrock, # the function to minimize
NULL, # no function gradient 
method="Nelder-Mead", # use the Nelder-Mead method
control=c( # configure Nelder-Mead
maxit=100, # maximum iterations of 100
reltol=1e-8, # response tolerance over-one step
alpha=1.0, # reflection factor
beta=0.5, # contraction factor
gamma=2.0)) # expansion factor

# summarize results
# the coordinate of the minimum
print(result$par) 
# the function response of the minimum
print(result$value) 
# the number of function calls performed
print(result$counts)

# display the function as a contour plot
x <- seq(-3, 3, length.out=100)
y <- seq(-3, 3, length.out=100)
z <- rosenbrock(expand.grid(x, y))
contour(x, y, matrix(log10(z), length(x)), xlab="x",ylab="y")
# draw the optima as a point
points(result$par[1], result$par[2], col="red", pch=19)
# draw a square around the optima to highlight it
rect(result$par[1]-0.2, result$par[2]-0.2, result$par[1]+0.2, result$par[2]+0.2, lwd=2)

Nelder Mead Results

内尔德·米德结果

使用启发法

  • 它可以用于多维函数(一个或多个参数)和非线性响应面。
  • 它不使用函数导数,这意味着它可以用于不可微函数、不连续函数、非光滑函数和噪声函数。
  • 作为一种直接搜索方法,相对于现代基于导数的方法,它被认为是低效和缓慢的。
  • 它依赖于起始位置,并且可以被多模态函数中的局部最优捕获。
  • 停止标准可以是最佳位置的最小变化。
  • 单纯形结构的性质可能意味着它会陷入搜索空间的非最优区域,如果初始单纯形的大小太大,这种情况更有可能发生。
  • 当该方法工作时(适用于被优化的函数),它被证明是快速和健壮的。

梯度下降

梯度下降法是一种无约束非线性函数优化的一阶导数优化方法。它被称为梯度下降,因为它被设想为函数最小化。当应用于函数最大化时,它可以被称为梯度上升。

最陡下降搜索是在梯度线上执行直线性搜索以定位最佳邻近点(最佳步长或最陡步长)的扩展。批量梯度下降是一种扩展,其中成本函数及其导数被计算为训练示例集合上的总误差。随机梯度下降(或在线梯度下降)类似于批量梯度下降,除了为每个训练示例计算成本函数和导数。

该方法的信息处理目标是定位函数的极值。这是通过首先在搜索空间中选择起点来实现的。对于搜索空间中的给定点,计算成本函数的导数,并且在距离当前点α(步长参数)的距离处沿着函数导数的梯度选择新点。

该示例提供了求解二维非线性优化函数的梯度下降算法的代码列表。

# define a 2D basin function, optima is at (0,0)
basin <- function(x) {
x[1]² + x[2]²
}

# define the derivative for a 2D basin function
derivative <- function(x) {
c(2*x[1], 2*x[2])
}

# definition of the gradient descent method in 2D
gradient_descent <- function(func, derv, start, step=0.05, tol=1e-8) {
pt1 <- start
grdnt <- derv(pt1)
pt2 <- c(pt1[1] - step*grdnt[1], pt1[2] - step*grdnt[2])
while (abs(func(pt1)-func(pt2)) > tol) {
pt1 <- pt2
grdnt <- derv(pt1)
pt2 <- c(pt1[1] - step*grdnt[1], pt1[2] - step*grdnt[2])
print(func(pt2)) # print progress
}
pt2 # return the last point
}

# locate the minimum of the function using the Gradient Descent method
result <- gradient_descent(
basin, # the function to optimize
derivative, # the gradient of the function
c(runif(1,-3,3), runif(1,-3,3)), # start point of the search 
0.05, # step size (alpha)
1e-8) # relative tolerance for one step

# display a summary of the results
print(result) # coordinate of fucntion minimum
print(basin(result)) # response of fucntion minimum

# display the function as a contour plot
x <- seq(-3, 3, length.out=100)
y <- seq(-3, 3, length.out=100)
z <- basin(expand.grid(x, y))
contour(x, y, matrix(z, length(x)), xlab="x",ylab="y")
# draw the optima as a point
points(result[1], result[2], col="red", pch=19)
# draw a square around the optima to highlight it
rect(result[1]-0.2, result[2]-0.2, result[1]+0.2, result[2]+0.2, lwd=2)

Gradient Descent Results

梯度下降结果

使用启发法

  • 该方法仅限于寻找局部最优解,如果函数是凸的,它也是全局最优解。
  • 相对于现代方法,它被认为是低效和缓慢的(线性)收敛。如果最佳梯度变平(梯度缓慢地变为零),收敛可能会很慢。如果黑森条件不好(梯度在某些方向变化很快,而在另一些方向变化较慢),收敛也会很慢。
  • 步长(α)可以是恒定的,可以随着搜索而调整,并且可以整体地或针对每个维度来保持。
  • 该方法对初始条件敏感,因此,使用随机选择的初始位置多次重复搜索过程是很常见的。
  • 如果步长参数(α)太小,搜索一般需要大量迭代才能收敛,如果参数太大会超调函数的最优值。
  • 与非迭代函数优化方法相比,梯度下降在与特征(维数)的数量成比例时具有一些相对效率。

共轭梯度

共轭梯度法是多维非线性无约束函数的一阶导数优化方法。它与其他一阶导数优化算法如梯度下降和最速下降有关。

该技术的信息处理目标是定位函数的极值。从起始位置开始,该方法首先计算梯度以定位最陡下降的方向,然后执行直线性搜索以定位最佳步长(α)。然后,该方法重复计算最陡方向、计算搜索方向以及执行线性搜索以定位最佳步长的过程。参数β定义了基于梯度的方向更新规则,可以使用多种方法之一进行计算。

共轭梯度和最速下降的区别在于,它使用共轭方向而不是局部梯度向函数最小值下坡,这可能非常有效。

该示例提供了求解二维非线性优化函数的共轭梯度法的代码列表。

# definition of the 2D Rosenbrock function, optima is at (1,1)
rosenbrock <- function(v) { 
(1 - v[1])² + 100 * (v[2] - v[1]*v[1])²
}

# definition of the gradient of the 2D Rosenbrock function
derivative <- function(v) {
c(-400 * v[1] * (v[2] - v[1]*v[1]) - 2 * (1 - v[1]), 
200 * (v[2] - v[1]*v[1]))
}

# locate the minimum of the function using the Conjugate Gradient method
result <- optim(
c(runif(1,-3,3), runif(1,-3,3)), # start at a random position
rosenbrock, # the function to minimize
derivative, # no function gradient 
method="CG", # use the Conjugate Gradient method
control=c( # configure Conjugate Gradient
maxit=100, # maximum iterations of 100
reltol=1e-8, # response tolerance over-one step
type=2)) # use the Polak-Ribiere update method

# summarize results
print(result$par) # the coordinate of the minimum
print(result$value) # the function response of the minimum
print(result$counts) # the number of function calls performed

# display the function as a contour plot
x <- seq(-3, 3, length.out=100)
y <- seq(-3, 3, length.out=100)
z <- rosenbrock(expand.grid(x, y))
contour(x, y, matrix(log10(z), length(x)), xlab="x", ylab="y")
# draw the optima as a point
points(result$par[1], result$par[2], col="red", pch=19)
# draw a square around the optima to highlight it
rect(result$par[1]-0.2, result$par[2]-0.2, result$par[1]+0.2, result$par[2]+0.2, lwd=2)

Conjugate Gradient Results

共轭梯度结果

使用启发法

  • 它比最速下降更有效,例如,它可能采取一条直线路径沿着狭窄的山谷下降,而最速下降将不得不之字形(弹球)沿着山谷下降。
  • 如果每次迭代都重置共轭方向,则下降为最速下降。
  • 它几乎和二阶梯度法一样快,只需要 n 次迭代就能找到合适函数的最优值(其中 n 是参数个数)。
  • 它不保持黑森矩阵(像 BFGS),因此可能适用于具有许多变量的较大问题。
  • 该方法对于二次函数或类似二次函数,或者函数接近二次最优时,效率最高(效果最好)。
  • 该方法对其在非凸问题上的起始位置很敏感。
  • 学习率(步长α)不必指定,因为线性搜索用于根据需要定位最佳值。
  • 计算方向更新规则( beta )的常用方法有赫斯廷斯-斯蒂费尔法、弗莱彻-里夫斯法、波拉克-里比埃法和比尔-索伦森法。对于非二次函数,Polak-Ribiere 方法通常在实践中效果更好。
  • 它取决于线性搜索的准确率,由此引入的误差和响应面的小于二次的特性将导致方向更新更频繁,搜索效率更低。
  • 为避免搜索退化,考虑在 n 次迭代后重新开始搜索过程,其中 n 为函数参数个数。

BFGS

BFGS 是一种多维非线性无约束函数的优化方法。

BFGS 属于准牛顿(可变度量)优化方法的家族,该方法利用被优化函数的基于一阶导数(梯度)和二阶导数(海森矩阵)的信息。更具体地说,它是一种准牛顿法,这意味着它近似二阶导数,而不是直接计算它。它与其他拟牛顿法有关,如密度泛函方法、布赖登方法和 SR1 方法。

BFGS 的两个流行扩展是 L-BFGS(有限内存 BFGS)和 L-BFGS-B(有限内存盒装 BFGS),前者具有较低的内存资源要求,后者扩展了 L-BFGS 并对方法施加了盒约束。

BFGS 方法的信息处理目标是定位函数的极值。

这是通过迭代建立逆黑森矩阵的良好近似来实现的。给定一个初始起始位置,它准备一个黑森矩阵的近似值(二阶偏导数的平方矩阵)。然后,它重复使用近似的 Hessian 计算搜索方向的过程,然后使用线性搜索计算最佳步长,更新位置,并更新 Hessian 的近似。每次迭代更新黑森矩阵的方法称为 BFGS 规则,它保证更新后的矩阵是正定的。

该示例提供了求解二维非线性优化函数的 BFGS 方法的代码列表。

# definition of the 2D Rosenbrock function, optima is at (1,1)
rosenbrock <- function(v) { 
(1 - v[1])² + 100 * (v[2] - v[1]*v[1])²
}

# definition of the gradient of the 2D Rosenbrock function
derivative <- function(v) {
c(-400 * v[1] * (v[2] - v[1]*v[1]) - 2 * (1 - v[1]), 200 * (v[2] - v[1]*v[1]))
}

# locate the minimum of the function using the BFGS method
result <- optim(
c(runif(1,-3,3), runif(1,-3,3)), # start at a random position
rosenbrock, # the function to minimize
derivative, # no function gradient 
method="BFGS", # use the BFGS method
control=c( # configure BFGS
maxit=100, # maximum iterations of 100
reltol=1e-8)) # response tolerance over-one step

# summarize results
print(result$par) # the coordinate of the minimum
print(result$value) # the function response of the minimum
print(result$counts) # the number of function calls performed

# display the function as a contour plot
x <- seq(-3, 3, length.out=100)
y <- seq(-3, 3, length.out=100)
z <- rosenbrock(expand.grid(x, y))
contour(x, y, matrix(log10(z), length(x)), xlab="x", ylab="y")
# draw the optima as a point
points(result$par[1], result$par[2], col="red", pch=19)
# draw a square around the optima to highlight it
rect(result$par[1]-0.2, result$par[2]-0.2, result$par[1]+0.2, result$par[2]+0.2, lwd=2)

BFGS Results

BFGS 结果

使用启发法

  • 它需要一个函数,函数梯度(一阶偏导数)可以在任意点计算。
  • 它不需要二阶导数,因为它近似黑森矩阵,与牛顿方法相比,计算成本更低。
  • 它需要相对较大的内存占用,因为它维护一个 nn* Hessian 矩阵,其中 n 是变量的数量。这是对方法可伸缩性的限制。
  • 收敛速度是超线性的,每次迭代的计算成本是 O(n²).
  • BFGS 的 L-BFGS 扩展是为具有大量参数(> 1000)的函数设计的。
  • 停止条件通常是响应的最小变化或最小梯度。
  • 就搜索方向而言,BFGS 有些稳健和自校正,因此在确定步长时不需要使用精确的线性搜索。

摘要

优化是应用机器学习中需要仔细理解和应用的一个重要概念。

在这篇文章中,你发现了 5 个凸优化算法,它们的配方在 R 中,可以复制粘贴到你自己的问题中。

您还学习了每种方法的一些背景知识以及操作每种算法的一般启发式方法。

我错过了你最喜欢的凸优化算法吗?留言告诉我。

使用可视化更好地理解你在 R 中的数据(今天你可以使用的 10 个秘籍)

原文:machinelearningmastery.com/data-visual…

最后更新于 2019 年 8 月 22 日

您必须了解您的数据,才能从机器学习算法中获得最佳结果。

数据可视化可能是总结和了解更多数据的最快和最有用的方法。

在这篇文章中,你将发现如何使用数据可视化来更好地理解机器学习的数据。

如果你是一名开发人员,并且刚刚开始使用 R 进行机器学习,或者希望开始使用,这篇文章是完美的。

在你当前或下一个项目中遵循或使用这篇文章中的秘籍。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

Better Understand Data in R Using Visualization

使用可视化更好地理解 R 中的数据 图片由科里·m·格雷尼尔提供,保留部分权利。

了解您的数据以获得最佳结果

更好地理解您的数据将从机器学习算法中产生更好的结果。

您将能够清理、转换和最好地展示您所拥有的数据。数据越好地将问题的结构暴露给机器学习算法,你的模型就越精确。

此外,对数据更深入的理解甚至可能会建议使用特定的机器学习算法来尝试你的数据。

可视化您的数据以便更快地理解

提高对数据集理解的最快方法是将其可视化。

可视化意味着从原始数据创建图表和图表。

属性的分布或扩散图可以帮助您发现异常值、奇怪或无效的数据,并让您了解可以应用的可能数据转换。

属性之间的关系图可以让您了解哪些属性可能是多余的,可能需要哪些重采样方法,以及预测问题最终会有多难。

现在,让我们看看如何使用 r 创建数据图

在 R 中可视化您的数据

在本节中,您将发现如何在 r

本节分为三个部分:

  1. 可视化包:关于可视化的 R 包的选项的快速说明。
  2. 单变量可视化:可用于单独理解每个属性的图。
  3. 多元可视化:可以帮助你更好地理解属性之间相互作用的图。

我们开始吧。

1.可视化包

有许多方法可以可视化 R 中的数据,但是一些包可能是最有用的。

  • 图形:非常适合快速和基本的数据绘图。
  • 格子:比较好看的剧情,在实践中往往比较有用。
  • ggplot2 :想要呈现结果时想要生成的漂亮的图。

我经常坚持使用图形包中的简单图来实现快速而肮脏的可视化,并使用点阵周围的包装器(通过 Caret 包)来实现更有用的多元图。

我认为 ggplot2 的情节很好,看起来很可爱,但是对于快速和肮脏的数据可视化来说有些矫枉过正。

2.单变量可视化

单变量图是没有交互作用的单个属性的图。目标是了解每个属性的分布、中心趋势和传播。

直方图

直方图提供了一个数值属性的柱状图,该数值属性被拆分为多个箱,高度显示了每个箱中的实例数量。

它们对于获得属性分布的指示很有用。

# load the data
data(iris)
# create histograms for each attribute
par(mfrow=c(1,4))
for(i in 1:4) {
	hist(iris[,i], main=names(iris)[i])
}

您可以看到大多数属性显示高斯或双高斯分布。您可以在花瓣宽度和长度栏中看到非常小的花朵的尺寸。

Histogram Descriptive Statistics in R

R 中的直方图

密度图

我们可以使用密度图将直方图平滑成线条。这些对于更抽象地描述每个变量的分布是有用的。

# load libraries
library(lattice)
# load dataset
data(iris)
# create a panel of simpler density plots by attribute
par(mfrow=c(1,4))
for(i in 1:4) {
	plot(density(iris[,i]), main=names(iris)[i])
}

使用与上例相同的数据集和直方图,我们可以看到花瓣测量的双高斯分布。我们还可以看到萼片宽度可能呈指数分布。

Density Plot in R

R 中的密度图

方框图和触须图

我们可以使用方框图和触须图以不同的方式观察数据的分布。方框捕捉了中间 50%的数据,线条显示了中间值,图中的胡须显示了数据的合理范围。胡须外的任何点都是异常值的良好候选点。

# load dataset
data(iris)
# Create separate boxplots for each attribute
par(mfrow=c(1,4))
for(i in 1:4) {
	boxplot(iris[,i], main=names(iris)[i])
}

我们可以看到数据都有一个相似的范围(和相同的厘米单位)。我们还可以看到,对于这个样本,Sepal 宽度可能有一些异常值。

Box and Whisker Plot in R

R 中的方框图和触须图

Barplots

在具有分类属性而不是数字属性的数据集中,我们可以创建条形图,给出属于每个类别的实例的比例。

# load the library
library(mlbench)
# load the dataset
data(BreastCancer)
# create a bar plot of each categorical attribute
par(mfrow=c(2,4))
for(i in 2:9) {
	counts <- table(BreastCancer[,i])
	name <- names(BreastCancer)[i]
	barplot(counts, main=name)
}

我们可以看到,一些地块具有良好的混合分布,而另一些地块则以压倒性的数量展示了一些标签。

Bar Plot in R

R 中的条形图

缺失的情节

缺失的数据对建模有很大影响。有些技术忽略了丢失的数据,有些则打破了。

您可以使用缺失图快速了解数据集中缺失的数据量。x 轴显示属性,y 轴显示实例。水平线表示实例缺少数据,垂直块表示属性缺少数据。

# load libraries
library(Amelia)
library(mlbench)
# load dataset
data(Soybean)
# create a missing map
missmap(Soybean, col=c("black", "grey"), legend=FALSE)

我们可以看到,一些实例在一些或大部分属性中缺少大量数据。

Missing Map in R

R 中缺少地图

3.多元可视化

多元图是属性之间的关系或相互作用的图。目标是了解一些关于分布、中心趋势和分布在数据组(通常是属性对)上的信息。

相关图

我们可以计算每对数字属性之间的相关性。这些成对的相关性可以绘制在相关性矩阵图中,以给出哪些属性一起改变的想法。

# load library
library(corrplot)
# load the data
data(iris)
# calculate correlations
correlations <- cor(iris[,1:4])
# create correlation plot
corrplot(correlations, method="circle")

使用点表示,其中蓝色表示正相关,红色表示负相关。点越大,相关性越大。我们可以看到矩阵是对称的,对角线是完全正相关的,因为它显示了每个属性与其自身的相关性。我们可以看到一些属性是高度相关的。

Correlation Matrix Plot in R

相关矩阵图

散点图矩阵

散点图将两个变量绘制在一起,x 轴和 y 轴各有一个,各点表示相互作用。点的分布表示属性之间的关系。您可以为数据集中的所有属性对创建散点图,称为散点图矩阵。

# load the data
data(iris)
# pair-wise scatterplots of all 4 attributes
pairs(iris)

请注意,矩阵是对称的,显示了轴反转的相同图。这有助于从多个角度查看您的数据。注意花瓣长度和宽度之间的线性(对角线)关系。

Scatterplot Matrix in R

R 中的散点图矩阵

按类别划分的散点图矩阵

在分类问题中,散点图矩阵中的点可以通过类标签来着色。这有助于发现清晰(或不清晰)的类分离,并可能给出问题有多难的想法。

# load the data
data(iris)
# pair-wise scatterplots colored by class
pairs(Species~., data=iris, col=iris$Species)

请注意,在大多数成对图中,点是按类别标签明确分开的。

Scatterplot Matrix by Class in R

R 中按类别划分的散点图矩阵

按类别划分的密度

我们可以查看按类值细分的每个属性的密度分布。像散点图矩阵一样,按类的密度图可以帮助看到类的分离。这也有助于理解属性类值的重叠。

# load the library
library(caret)
# load the data
data(iris)
# density plots for each attribute by class value
x <- iris[,1:4]
y <- iris[,5]
scales <- list(x=list(relation="free"), y=list(relation="free"))
featurePlot(x=x, y=y, plot="density", scales=scales)

我们可以看到,有些类根本不重叠(例如花瓣长度),而其他属性很难分开(萼片宽度)。

Density Plot By Class in R

R 中按类别划分的密度图

按类别划分的方框图和触须图

我们还可以按类值查看每个属性的箱线图分布。这也有助于理解每个属性与类值的关系,但是从不同的角度来看密度图。

# load the caret library
library(caret)
# load the iris dataset
data(iris)
# box and whisker plots for each attribute by class value
x <- iris[,1:4]
y <- iris[,5]
featurePlot(x=x, y=y, plot="box")

这些图有助于理解属性类组的重叠和分离。我们可以看到花瓣长度属性的 Setosa 类的一些很好的分离。

Box and Whisker Plots by Class in R

按类别划分的方框图和触须图

其他可视化

您可能会发现有用的另一种可视化类型是数据集的投影。

有时使用主成分分析或自组织映射的预测可以提供对数据的洞察。

你有没有最喜欢的数据可视化方法,这篇文章没有涉及到?留下评论,我很想听听。

数据可视化技巧

  • 查看地块。实际上,花点时间看看你已经生成的情节,并思考它们。尝试将您看到的内容与一般问题领域以及数据中的特定记录联系起来。目标是了解你的数据,而不是生成一个图表。
  • 剧情难看,不好看。你的目标是了解你的数据,而不是创建漂亮的可视化。不要担心图表是否难看。你不会给任何人看的。
  • 写下想法。当你查看数据的可视化时,你会得到很多想法。像数据分割这样的想法需要考虑,转换需要应用,技术需要测试。把它们都写下来。当你努力想出更多的事情来获得更好的结果时,它们将是无价的。

您可以在 R 中可视化数据

不需要做 R 程序员。提供的秘籍是完整的,并提供了获得结果所需的一切。您可以立即运行它们,或者在自己的项目中将其用作模板。慢慢来,研究用来了解更多关于 R 编程的函数。

不需要数据可视化专家。数据可视化是一个很大的领域,已经写了很多书。专注于了解你的数据,而不是创建大量花哨的图表。这些图表真的会在你学会之后被扔掉。

不需要自己准备数据集。R 中有许多数据集可供您使用。你不需要等到你收集自己的。你也可以从 UCI 机器学习储存库中下载数据集,有数百个来自一系列有趣的研究领域可供选择。

你不需要很多时间。可视化要快。从可视化中了解您的数据应该需要几分钟或几小时,而不是几天或几周。如果你花了几个小时以上的时间,你可能是想让剧情变得好看。把他们变丑,专注于学习。

摘要

在这篇文章中,你发现了数据可视化的重要性,以便更好地理解你的数据。

您发现了许多方法,可以使用这些方法来可视化和提高您对使用单变量图的独立属性以及使用多变量图的相互作用的理解:

  • 单变量图
    • 直方图
    • 密度图
    • 方框图和触须图
    • Barplots
    • 缺失的情节
  • 多元图
    • 相关图
    • 散点图矩阵
    • 按类别划分的散点图矩阵
    • 按类别划分的密度
    • 按类别划分的方框图和触须图

行动步骤

你研究过秘籍了吗?

  1. 开始你的互动环境。
  2. 将每个配方键入或复制粘贴到您的环境中。
  3. 花一点时间了解每个秘籍是如何工作的,并使用帮助来了解更多关于使用的功能。

在你当前或下一个机器学习项目中使用这篇文章中的可视化秘籍。如果你知道,我很想听听。

你对这篇文章有什么问题吗?留言问一问。

将 Caret R 包用于数据可视化

原文:machinelearningmastery.com/data-visual…

最后更新于 2019 年 8 月 22 日

R 中的 caret 包旨在简化应用机器学习的过程。

解决数据问题的一个关键部分是理解你现有的数据。通过用数据可视化总结属性,您可以非常快速地做到这一点。

R 中有很多用于汇总数据的包和函数,可以感觉到势不可挡。出于应用机器学习的目的,caret 包提供了一些关键工具,可以让您快速总结数据。

在这篇文章中,你会发现数据可视化工具可用的 caret R 包。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

Caret 包

caret 包主要用于简化模型训练、估计模型表现和调优。它还有许多方便的数据可视化工具,可以快速让您了解正在处理的数据。

在这篇文章中,我们将看到以下 4 个数据可视化:

  • 散点图矩阵:用于比较成对图中实值属性的分布。
  • 密度图:用于比较属性的概率密度函数。
  • 方块和触须图:用于总结和避免属性扩散

每个示例都是独立的,因此您可以将其复制并粘贴到您自己的项目中,并根据您的需要进行调整。所有的例子都将利用鸢尾花的数据集,这个类别数据集提供了三种鸢尾花的 150 个观察值,以及它们花瓣和萼片的厘米测量值。

散点图矩阵

散点图矩阵显示散点图的网格,其中每个属性相对于所有其他属性绘制。它可以按列或行阅读,每个图出现两次,允许您从两个角度考虑空间关系。

仅仅绘制散点图的一个改进是进一步包括类别信息。这通常是通过按类值给每个散点图中的点着色来实现的。

下面的示例显示了虹膜数据集的散点图矩阵,所有四个属性都有成对散点图,散点图中的点由类属性着色。

# load the library
library(caret)
# load the data
data(iris)
# pair-wise plots of all 4 attributes, dots colored by class
featurePlot(x=iris[,1:4], y=iris[,5], plot="pairs", auto.key=list(columns=3))

Scatterplot Matrix of the Iris dataset using the Caret R package

使用 Caret 包的虹膜数据集散点图矩阵

密度图

密度估计图(简称密度图)总结了数据的分布情况。像直方图一样,属性值和观察次数之间的关系被总结,但是这种关系被总结为连续的概率密度函数(PDF),而不是频率。这是给定观测值具有给定值的概率。

密度图可以通过将每个属性按照观察的类值分开来进一步改进。这有助于理解单属性与类值的关系,并突出有用的结构,如属性值到类的线性可分性。

下面的示例显示了 iris 数据集的密度图,显示了每个属性如何与每个类值相关的 pdf。

# load the library
library(caret)
# load the data
data(iris)
# density plots for each attribute by class value
featurePlot(x=iris[,1:4], y=iris[,5], plot="density", scales=list(x=list(relation="free"), y=list(relation="free")), auto.key=list(columns=3))

Density Plot of the iris dataset using the Caret R package

使用 Caret 包绘制虹膜数据集的密度图

方框图和触须图

方框图和触须图(或简称方框图)通过显示第 25 和 75 百分位的方框、第 50 百分位(中间值)方框中的一条线和平均值的一个点来总结给定属性的分布。络腮胡显示 1.5 *框的高度(称为四分位数范围),表示数据的预期范围,超出这些络腮胡的任何数据都被认为是异常值,并用点标记。

同样,每个属性都可以根据它们观察到的类值进行总结,让您了解属性值和类值之间的关系,就像密度图一样。

下面的示例显示了 iris 数据集的方框图和触须图,为给定属性的每个类值显示了一个单独的方框。

# load the library
library(caret)
# load the data
data(iris)
# box and whisker plots for each attribute by class value
featurePlot(x=iris[,1:4], y=iris[,5], plot="box", scales=list(x=list(relation="free"), y=list(relation="free")), auto.key=list(columns=3))

Box plots of the iris dataset using the Caret R package

使用 Caret 包绘制虹膜数据集的方框图

摘要

在这篇文章中,您发现了三种使用 caret R 包的快速数据可视化,可以帮助您理解您的类别数据集。

每个示例都是独立的,可以复制粘贴到您自己的项目中并适应您的问题。

使用描述性统计更好地理解你的 R 数据

原文:machinelearningmastery.com/descriptive…

最后更新于 2019 年 8 月 22 日

你必须熟悉你的数据。

你建立的任何机器学习模型都只有你提供的数据好。了解数据的第一步是实际查看一些原始值并计算一些基本统计数据。

在这篇文章中,您将发现如何通过 r 中的描述性统计示例和方法快速处理数据集。

如果你是一个刚刚开始使用 R 进行机器学习的开发人员,这些秘籍非常适合你。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

  • 2016 年 11 月更新:作为一个有用的更新,本教程假设您已经安装了 mlbenche1071 R 软件包。可以通过键入以下命令来安装它们:install . packages(“e 1071”、“mlbench”)

Descriptive Statistics Examples

使用描述性统计 了解你在 R 中的数据。

您必须了解您的数据

理解你所拥有的数据是至关重要的。

您可以对您的数据运行技术和算法,但是直到您花时间真正理解您的数据集,您才能完全理解您所获得的结果的上下文。

更好的理解等于更好的结果

对数据的深入了解会给你带来更好的结果。

花时间研究你所拥有的数据会在一些不太明显的方面帮助你。您为数据以及单个记录或观察所代表的实体建立了直觉。这些可能会让你偏向于特定的技术(不管是好是坏),但你也可以受到启发。

例如,详细检查您的数据可能会引发对特定技术进行调查的想法:

  • 数据清理。您可能会发现丢失或损坏的数据,并考虑执行各种数据清理操作,例如标记或删除坏数据以及输入丢失的数据。
  • 数据转换。您可能会发现一些属性具有熟悉的分布,例如高斯或指数分布,这为您提供了缩放或对数或其他可以应用的变换的概念。
  • 数据建模。您可能会注意到数据的属性,例如建议使用(或不使用)特定机器学习算法的分布或数据类型。

使用描述性统计

你需要看看你的数据。你需要从不同的角度来看待你的数据。

检查你的数据将帮助你建立你的直觉,并促使你开始询问关于你所拥有的数据的问题。

多角度将挑战你从不同的角度思考数据,帮助你提出更多更好的问题。

查看数据的两种方法是:

  1. 描述统计学
  2. 数据可视化

首先也是最好的开始是计算数据的基本汇总描述性统计数据。

你需要学习你所拥有的数据的形状、大小、类型和总体布局。

让我们看看一些使用 r 总结数据的方法。

用描述性统计汇总 R 中的数据

在本节中,您将发现总结数据集的 8 种快速简单的方法。

每种方法都有简要描述,并在 R 中包含一个秘籍,您可以自己运行或复制并适应自己的需求。

1.查看您的数据

首先要做的就是查看数据集的一些原始数据。

如果数据集很小,您可能可以在屏幕上显示所有内容。通常不是,所以你可以拿一个小样本来回顾一下。

# load the library
library(mlbench)
# load the dataset
data(PimaIndiansDiabetes)
# display first 20 rows of data
head(PimaIndiansDiabetes, n=20)

head 函数将显示前 20 行数据,供您查看和思考。

   pregnant glucose pressure triceps insulin mass pedigree age diabetes
1         6     148       72      35       0 33.6    0.627  50      pos
2         1      85       66      29       0 26.6    0.351  31      neg
3         8     183       64       0       0 23.3    0.672  32      pos
4         1      89       66      23      94 28.1    0.167  21      neg
5         0     137       40      35     168 43.1    2.288  33      pos
6         5     116       74       0       0 25.6    0.201  30      neg
7         3      78       50      32      88 31.0    0.248  26      pos
8        10     115        0       0       0 35.3    0.134  29      neg
9         2     197       70      45     543 30.5    0.158  53      pos
10        8     125       96       0       0  0.0    0.232  54      pos
11        4     110       92       0       0 37.6    0.191  30      neg
12       10     168       74       0       0 38.0    0.537  34      pos
13       10     139       80       0       0 27.1    1.441  57      neg
14        1     189       60      23     846 30.1    0.398  59      pos
15        5     166       72      19     175 25.8    0.587  51      pos
16        7     100        0       0       0 30.0    0.484  32      pos
17        0     118       84      47     230 45.8    0.551  31      pos
18        7     107       74       0       0 29.6    0.254  31      pos
19        1     103       30      38      83 43.3    0.183  33      neg
20        1     115       70      30      96 34.6    0.529  32      pos

2.数据的维度

你有多少数据?你可能有一个大概的想法,但是有一个精确的数字要好得多。

如果您有很多实例,您可能需要使用较小的数据样本,以便模型训练和评估在计算上易于处理。如果你有大量的属性,你可能需要选择那些最相关的。如果属性比实例多,您可能需要选择特定的建模技术。

# load the libraries
library(mlbench)
# load the dataset
data(PimaIndiansDiabetes)
# display the dimensions of the dataset
dim(PimaIndiansDiabetes)

这将显示加载数据集的行和列。

[1] 768   9

3.数据类型

您需要知道数据中属性的类型。

这是无价的。这些类型将表明进一步分析的类型、可视化的类型,甚至是你可以使用的机器学习算法的类型。

此外,也许一些属性被加载为一种类型(例如整数),并且实际上可以被表示为另一种类型(分类因子)。检查类型有助于尽早暴露这些问题并激发想法。

# load library
library(mlbench)
# load dataset
data(BostonHousing)
# list types for each attribute
sapply(BostonHousing, class)

这将列出数据集中每个属性的数据类型。

     crim        zn     indus      chas       nox        rm       age       dis       rad       tax   ptratio         b 
"numeric" "numeric" "numeric"  "factor" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" 
    lstat      medv 
"numeric" "numeric"

4.类别分布

在分类问题中,您必须知道属于每个类值的实例的比例。

这一点很重要,因为它可能会突出数据中的不平衡,如果严重,可能需要通过重新平衡技术来解决。在多类分类问题的情况下,它可能会暴露具有少量或零个实例的类,这些实例可能是要从数据集中移除的候选实例。

# load the libraries
library(mlbench)
# load the dataset
data(PimaIndiansDiabetes)
# distribution of class variable
y <- PimaIndiansDiabetes$diabetes
cbind(freq=table(y), percentage=prop.table(table(y))*100)

这个方法创建了一个有用的表格,显示了属于每个类的实例数量以及它在整个数据集中所占的百分比。

    freq percentage
neg  500   65.10417
pos  268   34.89583

5.数据汇总

有一个最有价值的函数叫做 summary(),它依次汇总数据集中的每个属性。这是最有价值的功能。

该函数为每个属性创建一个表,并列出值的细分。因子被描述为每个类别标签旁边的计数。数字属性描述如下:

  • 福建话
  • 第 25 百分位
  • 中位数
  • 均值
  • 第 75 百分位
  • 最大

细分还包括属性缺失值数量的指示(标记为不适用)。

# load the iris dataset
data(iris)
# summarize the dataset
summary(iris)

你可以看到这个秘籍产生了很多信息供你回顾。慢慢来,依次研究每个属性。

  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500

6.标准偏差

上面的 summary()函数缺少的一点是标准差。

标准差和平均值有助于了解数据是否具有高斯(或近似高斯)分布。例如,它对于快速和肮脏的异常值去除工具非常有用,其中任何超过平均值标准偏差三倍的值都在数据的 99.7%之外。

# load the libraries
library(mlbench)
# load the dataset
data(PimaIndiansDiabetes)
# calculate standard deviation for all attributes
sapply(PimaIndiansDiabetes[,1:8], sd)

这会计算数据集中每个数值属性的标准偏差。

   pregnant     glucose    pressure     triceps     insulin        mass    pedigree         age 
  3.3695781  31.9726182  19.3558072  15.9522176 115.2440024   7.8841603   0.3313286  11.7602315

7.歪斜

如果一个分布看起来有点像高斯分布,但是被向左或向右推得很远,那么知道偏斜是有用的。

通过数据图,如直方图或密度图,可以更容易地感觉到倾斜。从平均值、标准差和四分位数来看,很难分辨。

然而,预先计算偏斜给了您一个参考,如果您决定纠正属性的偏斜,您可以在以后使用它。

# load libraries
library(mlbench)
library(e1071)
# load the dataset
data(PimaIndiansDiabetes)
# calculate skewness for each variable
skew <- apply(PimaIndiansDiabetes[,1:8], 2, skewness)
# display skewness, larger/smaller deviations from 0 show more skew
print(skew)

偏斜值的分布离零越远,向左(负偏斜值)或向右(正偏斜值)的偏斜就越大。

  pregnant    glucose   pressure    triceps    insulin       mass   pedigree        age 
 0.8981549  0.1730754 -1.8364126  0.1089456  2.2633826 -0.4273073  1.9124179  1.1251880

8.相关

观察和思考属性之间的相互关系非常重要。

对于数字属性,考虑属性间交互的一个好方法是计算每对属性的相关性。

# load the libraries
library(mlbench)
# load the dataset
data(PimaIndiansDiabetes)
# calculate a correlation matrix for numeric variables
correlations <- cor(PimaIndiansDiabetes[,1:8])
# display the correlation matrix
print(correlations)

这为数值数据创建了所有属性相关性对的对称表。偏离零表示更多的正相关或负相关。高于 0.75 或低于-0.75 的值可能更有趣,因为它们显示出很高的相关性。值 1 和-1 表示完全正相关或负相关。

            pregnant    glucose   pressure     triceps     insulin       mass    pedigree         age
pregnant  1.00000000 0.12945867 0.14128198 -0.08167177 -0.07353461 0.01768309 -0.03352267  0.54434123
glucose   0.12945867 1.00000000 0.15258959  0.05732789  0.33135711 0.22107107  0.13733730  0.26351432
pressure  0.14128198 0.15258959 1.00000000  0.20737054  0.08893338 0.28180529  0.04126495  0.23952795
triceps  -0.08167177 0.05732789 0.20737054  1.00000000  0.43678257 0.39257320  0.18392757 -0.11397026
insulin  -0.07353461 0.33135711 0.08893338  0.43678257  1.00000000 0.19785906  0.18507093 -0.04216295
mass      0.01768309 0.22107107 0.28180529  0.39257320  0.19785906 1.00000000  0.14064695  0.03624187
pedigree -0.03352267 0.13733730 0.04126495  0.18392757  0.18507093 0.14064695  1.00000000  0.03356131
age       0.54434123 0.26351432 0.23952795 -0.11397026 -0.04216295 0.03624187  0.03356131  1.00000000

更多秘籍

这个数据汇总方法的列表并不完整,但是它们足以让您快速对数据集有一个初步的了解。

除了上面的秘籍列表之外,您可以研究的一些数据汇总是查看数据子集的统计数据。考虑查看 r 中的*聚合()*函数

您是否使用了未列出的数据汇总方法?在下面留言,我很想听听。

要记住的提示

本节为您提供了使用汇总统计数据查看数据时需要记住的一些提示。

  • 查看数字。生成汇总统计信息是不够的。花点时间停下来,阅读并认真思考你看到的数字。
  • 问为什么。回顾你的数字,问很多问题。你是如何以及为什么看到具体数字的?想想这些数字是如何与一般的问题领域和观察相关的具体实体联系起来的。
  • 写下想法。写下你的观察和想法。保存一个小的文本文件或记事本,记下变量之间的关系,数字的含义,以及以后尝试的技巧。当你试图想出新的尝试时,你现在在数据新鲜时写下的东西会很有价值。

你可以用 R 总结你的数据

不需要做 R 程序员。R 中的数据汇总非常简单,上面的秘籍可以证明。如果你刚刚开始,你可以复制并粘贴上面的秘籍,并使用 R 中的内置帮助开始学习它们是如何工作的(例如:?功能名称)。

不需要擅长统计。这篇文章中使用的统计数据非常简单,但是您可能已经忘记了一些基本信息。你可以快速浏览维基百科的均值、标准差和四分位数等主题来刷新你的知识。

下面是一个简短的列表:

相关帖子见:【机器学习统计】中速成班

不需要自己的数据集。上面的每个示例都使用内置数据集或 R 包提供的数据集。数据集 R 包中有很多有趣的数据集,你可以研究和玩。有关更多信息,请参见数据集 R 包的文档。

摘要

在这篇文章中,您发现了在开始机器学习项目之前描述数据集的重要性。

您发现了使用 R 总结数据集的 8 种不同方法:

  1. 查看您的数据
  2. 数据的维度
  3. 数据类型
  4. 类别分布
  5. 数据汇总
  6. 标准偏差
  7. 歪斜
  8. 相关

您现在也有了可以复制并粘贴到项目中的秘籍。

行动步骤

你是想用 R 提高技能还是在 R 练习机器学习?

完成上面的每个例子。

  1. 打开 R 交互环境。
  2. 键入或复制粘贴每个配方,并了解其工作原理。
  3. 潜入更深的地方使用?FunctionName 了解有关使用的特定函数的更多信息。

回电并留言,我很想听听你的进展。

你有问题吗?留言问一问。

如何用 R 评估机器学习算法

原文:machinelearningmastery.com/evaluate-ma…

最后更新于 2019 年 12 月 13 日

您应该在数据集上使用什么算法?

这是应用机器学习中最常见的问题。这是一个只能通过反复试验才能回答的问题,或者我所说的:抽查算法。

在这篇文章中,你将发现如何使用 r 在数据集上抽查算法。包括测试选项、评估指标和算法的选择。

你可以使用这篇文章中的代码作为模板,根据你自己的问题抽查机器学习算法。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

Evaluate Machine Learning Algorithms with R

布莱恩·汤斯利用 R 评估机器学习算法,保留部分权利。

一个问题的最佳算法

您需要数据集的最精确模型。这就是预测建模的目标。

没有人能告诉你在数据集上使用什么算法来得到最好的结果。如果你或任何人知道什么算法对特定数据集给出了最好的结果,那么你可能不需要首先使用机器学习,因为你对这个问题有很深的了解。

我们无法事先知道最佳算法表示或该表示使用的学习算法。我们甚至不知道我们可以尝试的算法的最佳参数。

我们需要一个策略来为我们的数据集找到最佳算法。

使用过去的经验选择算法

你可以选择一个问题的算法的一个方法是根据经验来回答。

这可能是你过去处理类似问题的经验。这也可能是该领域的集体经验,你可以参考论文、书籍和其他类似问题的资源,了解哪些算法在过去运行良好。

这是一个好的开始,但这不应该是你停止的地方。

使用试错法选择算法

为数据集发现好的甚至最好的算法的最可靠的方法是反复试验。在数据集上评估一组不同的算法,看看哪些可行,哪些不可行。

我称这个过程为抽查算法。

一旦你有了一个你知道擅长挑选问题结构的算法的简短列表,你就可以把精力集中在那些算法上。

您可以通过调整算法参数或使用集成方法组合多个模型的预测来改进候选算法的结果。

接下来,让我们看看如何在 r 中评估数据集上的多种机器算法。

R 中的抽查算法

在本节中,您将通过一个案例研究来评估 r

本例中使用的测试问题是一个称为 Pima Indians 数据集的二进制类别数据集。这些数据描述了女性患者的医疗细节和布尔输出变量,即她们在接受医疗评估的五年内是否出现糖尿病。

你可以在这里了解更多关于这个数据集的信息:皮马印第安人糖尿病数据集。

您可以在此了解有关此数据集的更多信息:

本案例研究分为 3 个部分:

  1. 定义测试线束。
  2. 从数据中构建多个预测模型。
  3. 比较模型并选择一个简短的列表。

我们将在 R 中使用 Caret 包,因为它提供了一个进入数百种不同机器学习算法的优秀界面,以及评估和比较模型的有用工具。

有关 Caret 的更多信息,请参阅文章:

让我们定义测试工具

1.试验用接线

测试线束由三个关键要素组成:

  1. 我们将用来训练模型的数据集。
  2. 用于评估模型的测试选项(例如重采样方法)。
  3. 我们感兴趣的度量和比较。
测试数据集

我们用来抽查算法的数据集应该代表我们的问题,但它不一定是我们所有的数据。

抽查算法必须快速。如果我们有一个大数据集,它可能会导致一些我们想要检查的计算量更大的算法需要很长时间来训练。

当抽查时,我使用的一个好的经验法则是每个算法应该在 1 到 2 分钟内训练。(最好在 30 秒内)。我发现少于 10,000 个实例(行)通常是一个很好的大小,但这将因数据集而异。

如果你有一个大数据集,取一些不同的随机样本和一个简单模型(glm),看看训练需要多长时间。选择一个合适的样本量。

我们可以稍后研究样本大小对我们的表现良好的算法的简短列表的影响。

此外,您可以稍后用更大的数据集重复这个实验,一旦您有了看起来有希望的更小的算法子集。

让我们加载库和我们的糖尿病数据集。它与 mlbench 包一起分发,所以我们可以直接加载它。

# load libraries
library(mlbench)
library(caret)

# load data
data(PimaIndiansDiabetes)
# rename dataset to keep code below generic
dataset <- PimaIndiansDiabetes

只有 768 个实例,因此在本案例研究中,我们将使用所有这些数据来抽查我们的算法。

请注意,在一个完整的端到端项目中,我建议保留一个验证数据集,以便对表现最好的模型进行客观的最终评估。

测试选项

测试选项指的是根据看不见的数据评估模型准确性的技术。它们通常被称为统计学中的重采样方法。

我通常推荐的测试选项有:

  • Train/Test split :如果你有很多数据,并且确定你需要很多数据来构建精确的模型
  • 交叉验证 : 5 倍或 10 倍提供了计算速度和广义误差估计的常用折衷。
  • 重复交叉验证 : 5 倍或 10 倍的交叉验证和 3 倍或 3 倍以上的重复,以给出更稳健的估计,前提是你的数据集很小,并且有时间。

在本案例研究中,我们将使用 3 次重复的 10 倍交叉验证。

control <- trainControl(method="repeatedcv", number=10, repeats=3)
seed <- 7

请注意,我们为变量分配了一个随机数种子,这样我们就可以在训练每个算法之前重新设置随机数生成器。

这对于确保在完全相同的数据分割上评估每个算法非常重要,以便以后进行真正的苹果对苹果的比较。

有关测试选项的更多信息,请参见文章:

有关在 caret 中使用所有三个推荐测试选项的示例,请参见文章:

测试度量

有许多可能的评估指标可供选择。Caret 提供了一个很好的选择,如果需要,您可以使用自己的选择。

用于不同问题类型的一些好的测试指标包括:

分类:

  • 准确率 : x 正确除以 y 总实例。通俗易懂,应用广泛。
  • Kappa :容易理解为考虑了类的基数分布的准确率。

回归:

  • RMSE :均方根误差。再次,易于理解和广泛使用。
  • Rsquared :拟合优度或确定系数。

其他流行的衡量标准包括 ROC 和 LogLoss。

评估指标是通过调用给定模型的 train() 函数来指定的,因此我们现在将定义指标,供以后所有的模型训练使用。

metric <- "Accuracy"

在帖子中了解更多关于测试指标的信息:

2.模型结构

选择要抽查的型号时,有三个注意事项:

  1. 实际选择什么型号。
  2. 如何配置它们的参数。
  3. 算法的数据预处理。
算法

算法表示(线、树、实例等)的良好混合很重要。)以及用于学习这些表示的算法。

我使用的一个很好的经验法则是“各几个”,例如在二分类的情况下:

  • 线性方法:线性判别分析和逻辑回归。
  • 非线性方法:神经网络、SVM、kNN 和朴素贝叶斯
  • 树和规则 : CART、J48 和 PART
  • 树木集合 : C5.0,袋装车,随机森林,随机梯度提升

你想要一些低复杂度的易于解释的方法(比如 LDA 和 kNN),如果它们做得好,你可以采用它们。你还需要一些复杂的方法(比如随机森林)来看看这个问题是否可以学习,并开始建立对准确性的期望。

有多少算法?至少有 10 到 20 种不同的算法。

算法配置

几乎所有的机器学习算法都是参数化的,要求您指定它们的参数。

好的一点是,大多数算法参数都有试探法,您可以使用它来提供算法的第一个过去的配置,以使球滚动。

当我们进行抽查时,我们不想尝试算法参数的许多变化,这些变化会在以后改进结果时出现。我们也想给每个算法一个展示自己的机会。

R 中 caret 包的一个方面是它有助于调整算法参数。它还可以估计良好的默认值(通过自动调谐功能和列车()功能的调谐长度参数)。

我建议在抽查时,如果不是所有算法,也是大多数算法都使用默认值,除非您查找一些合理的默认值,或者对给定的算法有一些经验。

数据预处理

一些算法在一些基本的数据预处理中表现得更好。

你想给每一个算法一个很好的发光的机会,所以重要的是在那些需要的算法的训练中包括任何需要的预处理。

例如,如果所有输入变量具有相同的规模,许多基于实例的算法会工作得更好。

幸运的是,Caret 中的 train() 函数允许您指定在训练之前要执行的数据预处理。您需要的转换以列表的形式提供给 preference 参数,并按顺序对数据执行

最有用的转换是通过以下方式扩展和集中数据。例如:

preProcess=c("center", "scale")
算法抽查

下面是我们将抽查的糖尿病病例研究模型。

# Linear Discriminant Analysis
set.seed(seed)
fit.lda <- train(diabetes~., data=dataset, method="lda", metric=metric, preProc=c("center", "scale"), trControl=control)
# Logistic Regression
set.seed(seed)
fit.glm <- train(diabetes~., data=dataset, method="glm", metric=metric, trControl=control)
# GLMNET
set.seed(seed)
fit.glmnet <- train(diabetes~., data=dataset, method="glmnet", metric=metric, preProc=c("center", "scale"), trControl=control)
# SVM Radial
set.seed(seed)
fit.svmRadial <- train(diabetes~., data=dataset, method="svmRadial", metric=metric, preProc=c("center", "scale"), trControl=control, fit=FALSE)
# kNN
set.seed(seed)
fit.knn <- train(diabetes~., data=dataset, method="knn", metric=metric, preProc=c("center", "scale"), trControl=control)
# Naive Bayes
set.seed(seed)
fit.nb <- train(diabetes~., data=dataset, method="nb", metric=metric, trControl=control)
# CART
set.seed(seed)
fit.cart <- train(diabetes~., data=dataset, method="rpart", metric=metric, trControl=control)
# C5.0
set.seed(seed)
fit.c50 <- train(diabetes~., data=dataset, method="C5.0", metric=metric, trControl=control)
# Bagged CART
set.seed(seed)
fit.treebag <- train(diabetes~., data=dataset, method="treebag", metric=metric, trControl=control)
# Random Forest
set.seed(seed)
fit.rf <- train(diabetes~., data=dataset, method="rf", metric=metric, trControl=control)
# Stochastic Gradient Boosting (Generalized Boosted Modeling)
set.seed(seed)
fit.gbm <- train(diabetes~., data=dataset, method="gbm", metric=metric, trControl=control, verbose=FALSE)

您可以看到算法类型的良好混合。

您可以看到所有算法都使用默认的(自动估计的)算法参数,没有优化网格(Caret 如何优化算法)。

您还可以看到,那些从重新缩放的数据中受益的算法都有 PRofile 参数集。

有关抽查算法的更多信息,请参阅帖子:

3.型号选择

现在,我们已经训练了大量不同的模型,我们需要对它们进行评估和比较。

现阶段我们并不寻求最佳模式。算法还没有调整,可能比你现在看到的结果做得更好。

现在的目标是选择几个,也许是 2 到 5 个多样且表现良好的算法来进一步研究。

results <- resamples(list(lda=fit.lda, logistic=fit.glm, glmnet=fit.glmnet,
	svm=fit.svmRadial, knn=fit.knn, nb=fit.nb, cart=fit.cart, c50=fit.c50,
	bagging=fit.treebag, rf=fit.rf, gbm=fit.gbm))
# Table comparison
summary(results)

您可以看到,我们已经将算法的结果总结为表格。

Models: lda, logistic, glmnet, svm, knn, nb, cart, c50, bagging, rf, gbm 
Number of resamples: 30 

Accuracy 
           Min. 1st Qu. Median   Mean 3rd Qu.   Max. NA's
lda      0.6711  0.7532 0.7662 0.7759  0.8052 0.8701    0
logistic 0.6842  0.7639 0.7713 0.7781  0.8019 0.8701    0
glmnet   0.6842  0.7557 0.7662 0.7773  0.8019 0.8701    0
svm      0.6711  0.7403 0.7582 0.7651  0.7890 0.8961    0
knn      0.6753  0.7115 0.7386 0.7465  0.7785 0.8961    0
nb       0.6316  0.7305 0.7597 0.7569  0.7869 0.8571    0
cart     0.6234  0.7115 0.7403 0.7382  0.7760 0.8442    0
c50      0.6711  0.7273 0.7468 0.7586  0.7785 0.8831    0
bagging  0.6883  0.7246 0.7451 0.7530  0.7792 0.8571    0
rf       0.6711  0.7273 0.7516 0.7617  0.7890 0.8571    0
gbm      0.6974  0.7273 0.7727 0.7708  0.8052 0.8831    0

使用几种不同的可视化技术来查看结果也很有用,这样可以了解精确度的平均值和分布情况。

# boxplot comparison
bwplot(results)
# Dot-plot comparison
dotplot(results)

从这些结果来看,线性方法似乎在这个问题上做得很好。我可能会进一步调查物流ldaglmnetgbm

Compare Machine Learining Algorithms in R Box and Whisker Plots

在 R 盒和须图中比较机器学习算法

Compare Machine Learining Algorithms in R Dot Plots

在 r 点图中比较机器学习算法

如果我有更多的数据,我可能会用一个大样本重复这个实验,看看这个大数据集是否提高了任何树方法的表现(这种情况经常发生)。

优秀算法抽查技巧

下面是一些小技巧,你可以用它们来评估机器学习算法。

  • 速度。快速获得结果。使用数据的小样本和算法参数的简单估计。转身应该是几分钟到一个小时。
  • 多样性。使用不同的算法选择,包括表示法和针对同一类型表示法的不同学习算法。
  • 放大。不要害怕用更大的数据样本安排后续抽查实验。这些算法可以通宵运行,也可以在更大的计算机上运行,并且可以很好地清除那些只在更大样本(例如树)上运行良好的算法。
  • 短名单。你的目标是创建一个算法的候选列表来进一步研究,而不是优化准确性(还没有)。
  • 试探法。最佳实践算法配置和已知适合您这样的问题的算法是一个很好的起点。用它们来播种你的抽查实验。有些算法只是在特定的参数配置下才开始显示出它们的准确性。

你可以在 R 中抽查算法

不需要成为机器学习专家。您可以从运行上述案例研究并查看结果开始。你可以通过阅读案例研究中使用的 R 函数和机器学习算法来深入研究。

不需要做 R 程序员。这篇文章中的案例研究已经完成,并将产生一个结果。您可以复制它,在工作站上运行它,并将其用作当前或下一个项目的模板。

不需要知道如何配置算法。R 中的*列车()*功能可以自动估计合理的默认值作为起点。您还不需要指定算法参数。您可能需要稍后在调优期间,R 中特定机器学习功能的帮助通常还会提供您可以使用的示例参数,以及关于算法本身的研究论文。

不需要自己收集数据。有许多 R 包提供了小的、标准的、内存中的数据集,您可以使用这些数据集来练习分类和回归机器学习问题。在本例中,我们使用了 mlbench 包。

不需要很多数据。数据的小样本有利于抽查算法。您希望快速得到结果,而小数据样本是实现这一目标的最佳方式。

摘要

在这篇文章中,你发现了抽查机器学习算法对你的问题的重要性。

您发现抽查是为给定数据集找到好的甚至最好的机器学习算法的最佳方式。

您使用 caret 包在 R 中完成了一个案例研究,并对一个二进制分类问题评估了 10 多种不同的算法。

您现在有了一个抽查算法的模板,可以在当前或下一个机器学习项目中使用。

下一步

你完成案例研究了吗?

  1. 开始你的互动环境。
  2. 键入或复制粘贴每个代码段。
  3. 花点时间去了解正在发生的事情,并详细阅读所使用的功能。

你有什么问题吗?在评论中提问,我会尽力回答。

使用 caret 包选择特征

原文:machinelearningmastery.com/feature-sel…

最后更新于 2019 年 8 月 22 日

在数据中选择正确的特征意味着训练时间长时表现平平和训练时间短时表现出色之间的区别。

caret R 包提供了自动报告数据中属性的相关性和重要性的工具,甚至可以为您选择最重要的特性。

在这篇文章中,你会发现 caret R 包中的功能选择工具在 R 中有独立的配方。

看完这篇文章你会知道:

  • 如何从数据集中移除冗余要素?
  • 如何根据要素的重要性对数据集中的要素进行排序。
  • 如何使用递归要素消除方法从数据集中选择要素。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

Confidence Intervals for Machine Learning

机器学习的置信区间 保罗·巴尔夫摄,版权所有。

删除冗余特征

数据可以包含彼此高度相关的属性。如果删除高度相关的属性,许多方法的表现会更好。

Caret R 包提供了 findCorrelation,它将分析数据属性的相关性矩阵,报告可以删除的属性。

以下示例加载了皮马印第安人糖尿病数据集,该数据集包含医疗报告中的许多生物属性。从这些属性创建相关矩阵,并识别高度相关的属性,在这种情况下,年龄属性被移除,因为它与怀孕属性高度相关。

通常,您希望删除绝对相关性为 0.75 或更高的属性。

# ensure the results are repeatable
set.seed(7)
# load the library
library(mlbench)
library(caret)
# load the data
data(PimaIndiansDiabetes)
# calculate correlation matrix
correlationMatrix <- cor(PimaIndiansDiabetes[,1:8])
# summarize the correlation matrix
print(correlationMatrix)
# find attributes that are highly corrected (ideally >0.75)
highlyCorrelated <- findCorrelation(correlationMatrix, cutoff=0.5)
# print indexes of highly correlated attributes
print(highlyCorrelated)

按重要性排列特征

特征的重要性可以通过建立模型从数据中估计出来。像决策树这样的方法有一个内置的机制来报告可变的重要性。对于其他算法,可以使用针对每个属性进行的 ROC 曲线分析来估计重要性。

以下示例加载了皮马印第安人糖尿病数据集,并构建了一个学习矢量量化 (LVQ)模型。变量随后被用来估计变量的重要性,并被打印和绘制出来。它显示葡萄糖、质量和年龄属性是数据集中最重要的前 3 个属性,胰岛素属性是最不重要的。

# ensure results are repeatable
set.seed(7)
# load the library
library(mlbench)
library(caret)
# load the dataset
data(PimaIndiansDiabetes)
# prepare training scheme
control <- trainControl(method="repeatedcv", number=10, repeats=3)
# train the model
model <- train(diabetes~., data=PimaIndiansDiabetes, method="lvq", preProcess="scale", trControl=control)
# estimate variable importance
importance <- varImp(model, scale=FALSE)
# summarize importance
print(importance)
# plot importance
plot(importance)

Rank of Features by Importance

使用 Caret R 包按重要性排列特征

特征选择

自动特征选择方法可用于构建具有不同数据集子集的许多模型,并识别构建精确模型所需的和不需要的属性。

caret R 包提供的一种流行的自动特征选择方法叫做递归特征消除或 RFE。

以下示例提供了皮马印第安人糖尿病数据集的 RFE 方法示例。每次迭代都使用随机森林算法来评估模型。该算法被配置为探索所有可能的属性子集。本例中选择了所有 8 个属性,尽管在显示不同属性子集大小的准确性的图中,我们可以看到只有 4 个属性给出了几乎相当的结果。

# ensure the results are repeatable
set.seed(7)
# load the library
library(mlbench)
library(caret)
# load the data
data(PimaIndiansDiabetes)
# define the control using a random forest selection function
control <- rfeControl(functions=rfFuncs, method="cv", number=10)
# run the RFE algorithm
results <- rfe(PimaIndiansDiabetes[,1:8], PimaIndiansDiabetes[,9], sizes=c(1:8), rfeControl=control)
# summarize the results
print(results)
# list the chosen features
predictors(results)
# plot the results
plot(results, type=c("g", "o"))

Feature Selection

使用 Caret 包选择功能

摘要

在这篇文章中,您发现了 caret R 包提供的 3 种特性选择方法。具体而言,搜索和移除冗余特征、按重要性对特征进行排序以及自动选择最具预测性的特征的子集。

R 中提供了三个独立的方法,您可以将其复制并粘贴到自己的项目中,并根据您的具体问题进行调整。

在 R 中保存并最终确定您的机器学习模型

原文:machinelearningmastery.com/finalize-ma…

最后更新于 2019 年 8 月 22 日

找到一个准确的机器学习并不是项目的终点。

在这篇文章中,你将发现如何在 R 中最终确定你的机器学习模型,包括:对看不见的数据进行预测,从零开始重建模型,并保存模型以备后用。

用我的新书用 R 启动你的项目,包括一步一步的教程和所有例子的 R 源代码文件。

我们开始吧。

Finalize Your Machine Learning Model in R

将你的机器学习模型最终确定在 R. 图片由克里斯蒂安·施奈特尔克提供,保留部分权利。

最终确定您的机器学习模型

一旦你的测试工具上有了一个准确的模型,你就差不多了。但还没有。

要最终确定您的模型,还有许多任务要做。为数据集创建精确模型的整个想法是对看不见的数据进行预测。

您可能会关注三项任务:

  1. 根据看不见的数据做出新的预测。
  2. 使用所有训练数据创建独立模型。
  3. 将模型保存到文件中,以便以后加载和预测新数据。

一旦你确定了你的模型,你就可以使用它了。你可以直接使用 R 模型。您还可以发现学习算法找到的关键内部表示(像线性模型中的系数),并在另一个平台上的预测算法的新实现中使用它们。

在下一节中,您将了解如何在 r 中完成您的机器学习模型。

最终确定预测模型

caret 是一个很好的工具,你可以用它来找到好的甚至最好的机器学习算法和机器学习算法的参数。

但是当你发现了一个足够精确可以使用的模型后,你会怎么做呢?

一旦你在 R 中找到了一个好的模型,你有三个主要的关注点:

  1. 使用您调整后的 Caret 模型进行新的预测。
  2. 使用整个训练数据集创建独立模型。
  3. 将独立模型保存/加载到文件。

本节将向您介绍如何在 r

1.对新数据进行预测

您可以使用您使用 caret 使用 predict.train() 函数调整的模型进行新的预测。

在下面的配方中,数据集被分为验证数据集和训练数据集。验证数据集也可以是存储在单独文件中并作为数据框加载的新数据集。

使用线性判别分析找到了数据的良好模型。我们可以看到,Caret 提供了对 finalModel 变量中的训练运行的最佳模型的访问。

我们可以使用该模型进行预测,方法是使用自动使用最终模型的训练拟合调用预测。我们必须通过 newdata 参数指定要进行预测的数据。

# load libraries
library(caret)
library(mlbench)
# load dataset
data(PimaIndiansDiabetes)
# create 80%/20% for training and validation datasets
set.seed(9)
validation_index <- createDataPartition(PimaIndiansDiabetes$diabetes, p=0.80, list=FALSE)
validation <- PimaIndiansDiabetes[-validation_index,]
training <- PimaIndiansDiabetes[validation_index,]
# train a model and summarize model
set.seed(9)
control <- trainControl(method="cv", number=10)
fit.lda <- train(diabetes~., data=training, method="lda", metric="Accuracy", trControl=control)
print(fit.lda)
print(fit.lda$finalModel)
# estimate skill on validation dataset
set.seed(9)
predictions <- predict(fit.lda, newdata=validation)
confusionMatrix(predictions, validation$diabetes)

运行该示例,我们可以看到训练数据集上的估计准确率为 76.91%。在拟合中使用 finalModel,我们可以看到搁置验证数据集的准确率为 77.78%,与我们的估计非常相似。

Resampling results

  Accuracy   Kappa    Accuracy SD  Kappa SD 
  0.7691169  0.45993  0.06210884   0.1537133

...

Confusion Matrix and Statistics

          Reference
Prediction neg pos
       neg  85  19
       pos  15  34

               Accuracy : 0.7778          
                 95% CI : (0.7036, 0.8409)
    No Information Rate : 0.6536          
    P-Value [Acc > NIR] : 0.000586        

                  Kappa : 0.5004          
 Mcnemar's Test P-Value : 0.606905        

            Sensitivity : 0.8500          
            Specificity : 0.6415          
         Pos Pred Value : 0.8173          
         Neg Pred Value : 0.6939          
             Prevalence : 0.6536          
         Detection Rate : 0.5556          
   Detection Prevalence : 0.6797          
      Balanced Accuracy : 0.7458          

       'Positive' Class : neg

2.创建独立模型

在这个例子中,我们为设置为 2000 的 mtryntree 调整了一个随机森林,其中有 3 个不同的值。通过打印拟合和最终模型,我们可以看到 mtry 的最准确值是 2。

现在我们知道了一个好的算法(随机森林)和好的配置(mtry=2, ntree=2000 )我们可以直接使用所有的训练数据创建最终的模型。我们可以在Caret 模型列表中查找 Caret 使用的“ rf ”随机森林实现,注意它使用的是 randomForest 包以及 randomForest() 函数。

该示例直接创建一个新模型,并使用它对新数据进行预测,这种情况下模拟为验证数据集。

# load libraries
library(caret)
library(mlbench)
library(randomForest)
# load dataset
data(Sonar)
set.seed(7)
# create 80%/20% for training and validation datasets
validation_index <- createDataPartition(Sonar$Class, p=0.80, list=FALSE)
validation <- Sonar[-validation_index,]
training <- Sonar[validation_index,]
# train a model and summarize model
set.seed(7)
control <- trainControl(method="repeatedcv", number=10, repeats=3)
fit.rf <- train(Class~., data=training, method="rf", metric="Accuracy", trControl=control, ntree=2000)
print(fit.rf)
print(fit.rf$finalModel)
# create standalone model using all training data
set.seed(7)
finalModel <- randomForest(Class~., training, mtry=2, ntree=2000)
# make a predictions on "new data" using the final model
final_predictions <- predict(finalModel, validation[,1:60])
confusionMatrix(final_predictions, validation$Class)

我们可以看到,最优配置的估计准确率为 85.07%。我们可以看到,在所有训练数据集上训练的最终独立模型和对验证数据集的预测的准确率为 82.93%。

Random Forest 

167 samples
 60 predictor
  2 classes: 'M', 'R' 

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 3 times) 
Summary of sample sizes: 151, 150, 150, 150, 151, 150, ... 
Resampling results across tuning parameters:

  mtry  Accuracy   Kappa      Accuracy SD  Kappa SD 
   2    0.8507353  0.6968343  0.07745360   0.1579125
  31    0.8064951  0.6085348  0.09373438   0.1904946
  60    0.7927696  0.5813335  0.08768147   0.1780100

Accuracy was used to select the optimal model using  the largest value.
The final value used for the model was mtry = 2\. 

...

Call:
 randomForest(x = x, y = y, ntree = 2000, mtry = param$mtry) 
               Type of random forest: classification
                     Number of trees: 2000
No. of variables tried at each split: 2

        OOB estimate of  error rate: 14.37%
Confusion matrix:
   M  R class.error
M 83  6  0.06741573
R 18 60  0.23076923

...

Confusion Matrix and Statistics

          Reference
Prediction  M  R
         M 20  5
         R  2 14

               Accuracy : 0.8293          
                 95% CI : (0.6794, 0.9285)
    No Information Rate : 0.5366          
    P-Value [Acc > NIR] : 8.511e-05       

                  Kappa : 0.653           
 Mcnemar's Test P-Value : 0.4497          

            Sensitivity : 0.9091          
            Specificity : 0.7368          
         Pos Pred Value : 0.8000          
         Neg Pred Value : 0.8750          
             Prevalence : 0.5366          
         Detection Rate : 0.4878          
   Detection Prevalence : 0.6098          
      Balanced Accuracy : 0.8230          

       'Positive' Class : M

一些更简单的模型,如线性模型,可以输出它们的系数。这很有用,因为通过这些,您可以用您选择的语言实现简单的预测过程,并使用系数来获得相同的准确率。随着表示的复杂性增加,这变得更加困难。

3.保存并加载您的模型

您可以将最佳模型保存到文件中,以便以后加载它们并进行预测。

在本例中,我们将声纳数据集分为训练数据集和验证数据集。我们将验证数据集作为新数据来测试最终模型。我们使用训练数据集和我们的最佳参数训练最终模型,然后将其保存到本地工作目录中名为 final_model.rds 的文件中。

模型是序列化的。可以在以后通过调用 readRDS()并将加载的对象(在本例中是随机的林拟合)分配给变量名来加载它。然后,加载的随机森林用于对新数据进行预测,在本例中是验证数据集。

# load libraries
library(caret)
library(mlbench)
library(randomForest)
library(doMC)
registerDoMC(cores=8)
# load dataset
data(Sonar)
set.seed(7)
# create 80%/20% for training and validation datasets
validation_index <- createDataPartition(Sonar$Class, p=0.80, list=FALSE)
validation <- Sonar[-validation_index,]
training <- Sonar[validation_index,]
# create final standalone model using all training data
set.seed(7)
final_model <- randomForest(Class~., training, mtry=2, ntree=2000)
# save the model to disk
saveRDS(final_model, "./final_model.rds")

# later...

# load the model
super_model <- readRDS("./final_model.rds")
print(super_model)
# make a predictions on "new data" using the final model
final_predictions <- predict(super_model, validation[,1:60])
confusionMatrix(final_predictions, validation$Class)

我们可以看到验证数据集的准确率为 82.93%。

Confusion Matrix and Statistics

          Reference
Prediction  M  R
         M 20  5
         R  2 14

               Accuracy : 0.8293          
                 95% CI : (0.6794, 0.9285)
    No Information Rate : 0.5366          
    P-Value [Acc > NIR] : 8.511e-05       

                  Kappa : 0.653           
 Mcnemar's Test P-Value : 0.4497          

            Sensitivity : 0.9091          
            Specificity : 0.7368          
         Pos Pred Value : 0.8000          
         Neg Pred Value : 0.8750          
             Prevalence : 0.5366          
         Detection Rate : 0.4878          
   Detection Prevalence : 0.6098          
      Balanced Accuracy : 0.8230          

       'Positive' Class : M

摘要

在这篇文章中,你发现了使用最终预测模型的三种方法:

  1. 如何使用脱字号优化的最佳模型进行预测?
  2. 如何使用 Caret 调优过程中找到的参数创建独立模型。
  3. 如何保存和稍后加载独立模型并使用它进行预测。

你可以通过这些秘籍来更好地理解它们。您也可以将它们用作模板,并将其复制粘贴到当前或下一个机器学习项目中。

下一步

你试过这些秘籍吗?

  1. 开始你的互动环境。
  2. 键入或复制粘贴上面的秘籍并试用。
  3. 使用 R 中的内置帮助来了解有关所用函数的更多信息。

你有问题吗?在评论里问,我会尽力回答。