R 机器学习迷你课程

14天内从开发人员转变为机器学习从业者

在这个迷你课程中,您将发现在14天内如何开始使用R,构建准确的模型,并自信地完成预测建模机器学习项目。

这是一篇内容丰富且重要的文章。您可能想把它加入书签。

通过我的新书《R机器学习精通》来快速启动您的项目,书中包含所有示例的分步教程R源代码文件。

让我们开始吧。

本迷你课程适合谁?

在开始之前,让我们确保您来对了地方。下面的列表提供了一些关于本课程设计对象的一般性指导。

如果您不完全符合这些要点,请不要惊慌,您可能只需要在某个领域稍作补充即可跟上。

  • 会写一点代码的开发人员。这意味着一旦您了解了基本语法,学习像R这样的新编程语言对您来说不是什么大事。这并不意味着您是编码高手,只是说您可以毫不费力地理解一种类似C的语言。
  • 懂一点机器学习的开发人员。这意味着您了解机器学习的基础知识,如交叉验证、一些算法和偏差-方差权衡。这并不意味着您是机器学习博士,只是说您了解这些标志性概念或知道去哪里查找它们。

本迷你课程既不是一本关于R的教科书,也不是一本关于机器学习的教科书。

它将带您从一个懂一点机器学习的开发人员,成为一个能够使用R——这个最强大、最流行的机器学习平台——取得成果的开发人员。

迷你课程概述(可以期待什么)

本迷你课程分为14节课,我称之为“天”。

您可以每天完成一节课(推荐),或者在一天内完成所有课程(硬核!)。这完全取决于您可用的时间和您的热情程度。

以下是14节课,将帮助您开始并高效地使用R进行机器学习。

  • 第1天:下载并安装R。
  • 第2天:掌握R的基本语法。
  • 第3天:加载数据和标准机器学习数据集。
  • 第4天:通过描述性统计理解数据。
  • 第5天:通过可视化理解数据。
  • 第6天:通过数据预处理为建模做准备。
  • 第7天:使用重采样方法进行算法评估。
  • 第8天:算法评估指标。
  • 第9天:抽样检查算法。
  • 第10天:模型比较与选择。
  • 第11天:通过算法调优提高准确性。
  • 第12天:通过集成预测提高准确性。
  • 第13天:最终确定并保存您的模型。
  • 第14天:Hello World端到端项目。

每节课可能需要您60秒到30分钟。请慢慢来,按照自己的节奏完成课程。在下面的评论中提问,甚至发布您的结果。

课程期望您自己去寻找如何做事的方法。我会给您一些提示,但每节课的部分目的就是迫使您学习去哪里寻找关于R平台的帮助(提示,我在这个博客上直接提供了所有答案,请使用搜索功能)。

我在早期课程中提供了更多帮助,因为我希望您建立一些信心和动力。坚持下去,不要放弃!

需要更多关于R机器学习的帮助吗?

参加我为期14天的免费电子邮件课程,了解如何在您的项目中使用R(附带示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

第1天:下载并安装R

在您拥有R平台之前,您无法开始使用R进行机器学习。

今天的课程很简单,您必须在您的计算机上下载并安装R平台。

  1. 访问 R主页 并为您的操作系统(Linux、OS X或Windows)下载R。
  2. 在您的计算机上安装R。
  3. 通过在命令行中输入“R”来首次启动R。

如果您在安装R时需要帮助,请查看这篇文章

第2天:掌握R的基本语法

您需要能够读写基本的R脚本。

作为一名开发人员,您可以很快地掌握新的编程语言。R区分大小写,使用井号(#)作为注释,并使用箭头运算符(<-)进行赋值,而不是单个等号(=)。

今天的任务是在R交互式环境中练习R编程语言的基本语法。

  1. 练习使用箭头运算符(<-)进行赋值。
  2. 练习使用基本数据结构,如向量、列表和数据框。
  3. 练习使用流程控制结构,如If-Then-Else和循环。
  4. 练习调用函数、安装和加载包。

例如,下面是一个创建数字列表并计算其平均值的示例。

如果您在基本R语法方面需要帮助,请参阅这篇文章

第3天:加载数据和标准机器学习数据集

机器学习算法需要数据。您可以从CSV文件加载自己的数据,但在开始使用R进行机器学习时,您应该在标准的机器学习数据集上进行练习。

您今天课程的任务是熟悉如何将数据加载到R中,并找到和加载标准的机器学习数据集。

R自带的datasets包有许多标准数据集,包括著名的iris(鸢尾花)数据集。mlbench包也包含许多标准的机器学习数据集。

  1. 练习使用read.csv()函数将CSV文件加载到R中。
  2. 练习从datasets和mlbench包中加载标准的机器学习数据集。

帮助:您可以通过输入?函数名或调用help()函数并传入需要帮助的函数名作为参数来获取有关函数的帮助。

为了让您开始,下面的代码片段将安装并加载mlbench包,列出它提供的所有数据集,并将PimaIndiansDiabetes数据集附加到您的环境中供您使用。

做得好,坚持到这里!请坚持住

到目前为止有什么问题吗?在评论中提问。

第4天:通过描述性统计理解数据

将数据加载到R中后,您需要能够理解它。

您对数据的理解越好,您能构建的模型就越好、越准确。理解数据的第一步是使用描述性统计。

今天您的课程是学习如何使用描述性统计来理解您的数据。

  1. 使用head()函数查看前几行来了解您的数据。
  2. 使用dim()函数审查您的数据维度。
  3. 使用summary()函数审查您的数据分布。
  4. 使用cor()函数计算变量之间的成对相关性。

下面的示例加载了iris数据集,并总结了每个属性的分布。

试试看!

第5天:通过可视化理解数据

接着昨天的课程,您必须花时间更好地理解您的数据。

提高对数据理解的第二种方法是使用数据可视化技术(例如绘图)。

今天,您的课程是学习如何在R中使用绘图来理解单个属性及其相互作用。

  1. 使用hist()函数为每个属性创建直方图。
  2. 使用boxplot()函数为每个属性创建箱线图。
  3. 使用pairs()函数创建所有属性的成对散点图。

例如,下面的代码片段将加载iris数据集并创建该数据集的散点图矩阵。

第6天:通过数据预处理为建模做准备

您的原始数据可能没有被设置为最适合建模的形态。

有时您需要对数据进行预处理,以便最好地向建模算法展示您数据中问题的内在结构。在今天的课程中,您将使用caret包提供的预处理功能。

caret包提供了preprocess()函数,该函数接受一个method参数来指示要执行的预处理类型。一旦从数据集中准备好预处理参数,相同的预处理步骤就可以应用于您可能拥有的每个数据集。

记住,您可以按如下方式安装和加载caret包

  1. 使用scalecenter选项对数值数据进行标准化(例如,均值为0,标准差为1)。
  2. 使用range选项对数值数据进行归一化(例如,到0-1的范围)。
  3. 使用BoxCox选项探索更高级的幂变换,如Box-Cox幂变换。

例如,下面的代码片段加载了iris数据集,计算了归一化数据所需的参数,然后创建了数据的归一化副本。

第7天:使用重采样方法进行算法评估

用于训练机器学习算法的数据集称为训练数据集。用于训练算法的数据集不能用于为您提供模型在新数据上准确性的可靠估计。这是一个大问题,因为创建模型的整个想法就是对新数据进行预测。

您可以使用称为重采样方法的统计方法将您的训练数据集分成子集,一些用于训练模型,另一些则被保留下来用于估计模型在未见数据上的准确性。

您今天课程的目标是练习使用caret包中可用的不同重采样方法。在R中查找createDataPartition()trainControl()train()函数的帮助。

  1. 将数据集分割为训练集和测试集。
  2. 使用k折交叉验证估计算法的准确性。
  3. 使用重复k折交叉验证估计算法的准确性。

下面的代码片段使用caret包,通过10折交叉验证来估计朴素贝叶斯算法在iris数据集上的准确性。

在这一步需要更多帮助吗?

看看关于重采样方法的文章

您意识到这已经到了一半了吗?做得好!

第8天:算法评估指标

有许多不同的指标可用于评估机器学习算法在数据集上的技能。

您可以在caret的train()函数中指定用于测试框架的指标,对于回归和分类问题可以使用默认值。您今天课程的目标是练习使用caret包中可用的不同算法性能指标。

  1. 在分类问题(例如iris数据集)上练习使用AccuracyKappa指标。
  2. 在回归问题(例如longley数据集)上练习使用RMSERSquared指标。
  3. 在二元分类问题(例如来自mlbench包的PimaIndiansDiabetes数据集)上练习使用ROC指标。

下面的代码片段演示了在iris数据集上计算LogLoss指标。

第9天:抽样检查算法

您不可能事先知道哪种算法在您的数据上表现最好。

您必须通过反复试验的过程来发现它。我称之为抽样检查算法。caret包提供了许多机器学习算法的接口,以及比较这些算法估计准确性的工具。

在本节课中,您必须练习抽样检查不同的机器学习算法。

  1. 在数据集上抽样检查线性算法(例如,线性回归、逻辑回归和线性判别分析)。
  2. 在数据集上抽样检查一些非线性算法(例如,KNN、SVM和CART)。
  3. 在数据集上抽样检查一些复杂的集成算法(例如,随机森林和随机梯度提升)。

帮助:您可以通过输入以下命令获取可以在caret中使用的模型列表:names(getModelInfo())

例如,下面的代码片段抽样检查了mlbench包中Pima印第安人糖尿病数据集上的两种线性算法。

第10天:模型比较与选择

现在您知道如何对数据集上的机器学习算法进行抽样检查,您需要知道如何比较不同算法的估计性能并选择最佳模型。

幸运的是,caret包提供了一套工具来绘制和总结模型之间性能的差异。

在今天的课程中,您将练习比较R中机器学习算法的准确性。

  1. 使用summary() caret函数创建一个结果表(提示,前一课中有一个示例)
  2. 使用dotplot() caret函数比较结果。
  3. 使用bwplot() caret函数比较结果。
  4. 使用diff() caret函数计算结果之间的统计显著性。

下面的代码片段扩展了昨天的示例,并创建了一个抽样检查结果的图表。

第11天:通过算法调优提高准确性

一旦您找到了一两种在您的数据集上表现良好的算法,您可能希望提高这些模型的性能。

提高算法性能的一种方法是根据您的特定数据集调整其参数。

caret包提供了三种方法来搜索机器学习算法的参数组合。您今天课程的目标是练习每一种方法。

  1. 自动调整算法参数(例如,参见train()函数的tuneLength参数)。
  2. 使用您指定的网格搜索来调整算法参数。
  3. 使用随机搜索来调整算法参数。

请查看trainControl()train()函数的帮助文档,并注意methodtuneGrid参数。

下面的代码片段是在iris数据集上使用网格搜索对随机森林算法进行调优的示例。

您快要完成了!只剩下几节课了。

第12天:通过集成预测提高准确性

另一种提高模型性能的方法是组合多个模型的预测结果。

一些模型内置了这种功能,例如用于bagging的随机森林和用于boosting的随机梯度提升。另一种称为堆叠(或混合)的集成方法可以学习如何最好地组合多个模型的预测,这在caretEnsemble包中提供。

在今天的课程中,您将练习使用集成方法。

  1. 在caret中练习使用随机森林和袋装CART算法进行bagging集成。
  2. 在caret中练习使用梯度提升机和C5.0算法进行boosting集成。
  3. 练习使用caretEnsemble包和caretStack()函数进行堆叠集成。

下面的代码片段演示了如何使用堆叠来组合多个模型的预测。

第13天:最终确定并保存您的模型

一旦您在机器学习问题上找到了一个表现良好的模型,您需要最终确定它。

在今天的课程中,您将练习与最终确定模型相关的任务。

  1. 练习使用predict()函数,用通过caret训练的模型进行预测。
  2. 练习训练表现良好模型的独立版本。
  3. 练习使用saveRDS()readRDS()函数将训练好的模型保存到文件并重新加载。

例如,下面的代码片段展示了如何创建一个在整个数据集上训练的随机森林算法,以备一般使用。

第14天:Hello World端到端项目

您现在知道如何完成预测建模机器学习问题的每个任务。

在今天的课程中,您需要练习将各个部分组合起来,并端到端地处理一个标准的机器学习数据集。

  1. 端到端地处理iris数据集(机器学习的“hello world”)

这包括以下步骤

  1. 使用描述性统计和可视化来理解您的数据。
  2. 对数据进行预处理,以最好地揭示问题的结构。
  3. 使用您自己的测试框架抽样检查多种算法。
  4. 使用算法参数调优来改善结果。
  5. 使用集成方法来改善结果。
  6. 最终确定模型以备将来使用。

结束!(看看您取得了多大的进步)

您做到了。干得好!

花点时间回顾一下您已经走了多远。

  • 您从对机器学习的兴趣和使用R实践并应用机器学习的强烈愿望开始。
  • 您下载、安装并启动了R,也许是第一次,并开始熟悉该语言的语法。
  • 通过一系列课程,您缓慢而稳定地学习了预测建模机器学习项目的标准任务如何映射到R平台上。
  • 基于常见机器学习任务的配方,您使用R端到端地解决了您的第一个机器学习问题。
  • 使用标准模板、配方和您积累的经验,您现在有能力独立解决新的和不同的预测建模机器学习问题。

不要轻视这一点,您在短时间内取得了长足的进步。

这仅仅是您使用R进行机器学习之旅的开始。请继续练习并发展您的技能。

您对这个迷你课程感觉如何?

您喜欢这个迷你课程吗?

您有任何问题吗?有没有遇到什么难点?

告诉我。在下面留言。

在R中发现更快的机器学习!

Master Machine Learning With R

在几分钟内开发您自己的模型

...只需几行R代码

在我的新电子书中探索如何实现
精通 R 语言机器学习

涵盖自学教程端到端项目,例如
加载数据、可视化、构建模型、调优等等...

最终将机器学习应用到您自己的项目中

跳过学术理论。只看结果。

查看内容

R机器学习迷你课程的42条回应

  1. PAUL 2016年4月18日下午8:41 #

    嗨,我购买了《R机器学习精通》这本书,只想知道在哪里可以找到数据集文件和脚本,因为我在zip文件中找不到它们。

    • Jason Brownlee 2016年4月19日上午5:43 #

      嗨,Paul,

      购买后,您将收到一个下载“machine_learning_mastery_with_r.zip”的链接。在该ZIP文件中,您将有两个文件,书籍:“machine_learning_mastery_with_r.pdf”和代码示例:“machine_learning_mastery_with_r_code.zip”。希望这样更清楚了。

      如有任何其他问题,请随时提问。

      Jason。

  2. Elvin 2020年1月30日下午7:45 #

    caretStack() 仍然不支持多类问题吗?

    https://github.com/zachmayer/caretEnsemble/pull/191

    我们不能像第14天项目中列举的那样使用iris数据集。

    有什么建议吗?

    谢谢!

  3. Dominique 2020年4月13日下午9:43 #

    嗨,Jason,

    我做了一个葡萄糖与年龄的箱线图(boxplot(glucose ~ age, data=PimaIndiansDiabetes)),有趣的是注意到葡萄糖随年龄增长而增加。

    此致,
    Dominique

  4. Mark 2020年4月26日下午5:54 #

    使用RStudio Cloud是个好主意吗?

  5. Mridhu Sharma 2020年4月29日上午4:22 #

    感谢帮助初学者。

  6. Skylar 2020年4月29日上午6:30 #

    嗨,Jason,

    我想问您,在使用caret包中的“preProcessing”函数进行预处理时,“method = c(“range”)”和“method = c(“scale”, “center”)”之间确切的区别是什么?我从您的迷你课程中了解到,使用scale和center选项可以对数值数据进行标准化(例如,均值为0,标准差为1);而使用range选项可以对数值数据进行归一化(例如,到0-1的范围)。但这到底是什么意思?还有一个更实际的问题,如果我的输入(预测变量)是基因表达或代谢物强度,我应该使用哪种方法?非常感谢,期待您的回答!

  7. skylar 2020年4月30日上午4:15 #

    嗨,Jason,

    感谢您精彩的文章和所有学习资料,我确实学到了很多!在您的迷你课程中,您写道我们可以使用k折交叉验证和重复k折交叉验证来估计算法的准确性。我想问您,k折交叉验证和重复k折交叉验证之间的确切区别是什么?根据我的理解,重复k折交叉验证是我们可以定义重复k折交叉验证的次数,然后得到准确性的中值,对吗?如果是这样,这是否意味着重复k折交叉验证的结果更稳健,我们通常应该使用这种方法?那么,不重复的k折交叉验证有什么优点呢?谢谢!

    • Jason Brownlee 2020年4月30日上午6:53 #

      不客气。

      区别在于重复k折交叉验证会用不同的分割方式多次重复该过程。

      这是一个更稳健的估计,但计算成本更高。

  8. Skylar 2020年5月1日上午5:42 #

    嗨,Jason,

    感谢您每天发送迷你课程邮件,让我每天都在学习,我喜欢这种感觉!

    我有一个关于机器学习分类的问题:假设我们需要使用机器学习对两组进行分类,我发现有两种预测输出方式,一种是预测是第1组还是第2组;另一种是给出预测概率。我们应该在什么时候使用哪一种?哪一种是通常使用的?根据我的理解,第一种的默认指标是准确率和Kappa,第二种我们通常使用“LogLoss”,对吗?

    提前非常感谢!

  9. Si Wu 2020年5月1日上午9:05 #

    嗨,Jason,

    我发现您有几篇对多组分类非常有帮助的文章,尤其是在不平衡的情况下,例如:https://machinelearning.org.cn/imbalanced-multiclass-classification-with-the-e-coli-dataset/。但它们主要是用Python写的,我更熟悉R(虽然我也在学习Python),您有类似的文章但是用R写的吗?谢谢!

  10. Skylar 2020年5月4日下午3:12 #

    嗨,Jason,

    我们通常将数据分为训练数据集和测试数据集(例如,比例为80%和20%),据我理解,模型和模型中的参数是基于训练数据集进行调整和优化的,所以我理解该模型在训练数据集中的准确性应该高于在测试数据集中的准确性,对吗?如果是这样,那么在测试数据集中准确性更高的情况可能是什么原因呢?我已经使用了重复交叉验证。提前非常感谢!

    • Jason Brownlee 2020年5月5日上午6:18 #

      好问题。

      如果您的测试集很小且不具代表性,可能会发生这种情况。例如,模型在其上表现良好,但结果具有误导性。

      • Skylar 2020年5月5日上午6:59 #

        谢谢Jason的回答!如果我们遇到这类问题该怎么办?这是否意味着这是错误的?

        • Jason Brownlee 2020年5月5日上午7:46 #

          一些想法

          或许使用不同的数据分割方式。
          或许获取更多数据。
          或许使用像交叉验证这样的重采样方法的平均值。

          • Skylar 2020年5月5日下午3:14 #

            是的,您的想法很有道理,谢谢!

          • Jason Brownlee 2020年5月6日上午6:21 #

            很高兴听到这个消息。

  11. Abhay V 2020年5月15日上午10:19 #

    亲爱的 Jason,
    首先,感谢您提供这么好的课程!!希望未来能看到更多!!

    我尝试安装R 3.6.x版本,但它显示了一些错误。
    所以我去YouTube看了如何用R studio安装R,通过看视频我成功安装了。
    希望这也能够满足我们教程和未来学习的目的!!

    此致
    Abhay V

  12. Mubbasher Munir 2020年9月29日下午4:51 #

    谢谢你

  13. Khaled 2020年10月6日下午10:20 #

    很棒的课程,非常感谢。

  14. Jcc 2021年2月26日下午2:15 #

    谢谢分享。有人更喜欢R而不是Python吗?为什么?

    • Jason Brownlee 2021年2月27日上午6:00 #

      是的,R中有更多的方法,更大的技术社区,以及历史原因。

  15. M Thackray 2021年10月28日下午10:06 #

    你好,
    我正在尝试运行一个非常基础的模型,如下所示
    # 进行预测
    x_test1 <- data_test1[,1]
    y_test1 <- data_test1[,2]
    predictions <- predict(model1, x_test1)

    然而,我一直收到这个错误:Error in eval(predvars, data, env) : object 'PARM' not found

    我导入的数据很清楚地在第1列的标题中标明了PARM。我对R Studio只了解非常基础的知识。请您帮我提供一个逐步的解决方案好吗?

    • Adrian Tam
      Adrian Tam 2021年10月29日上午2:07 #

      您在这里运行的是哪个示例代码?

  16. Uju Mbadiwe 2023年7月12日上午12:04 #

    嗨,谢谢。我安装了R 4.3.1版本,但当我在命令提示符中输入R时,它显示错误。我只能通过R控制台打开R。

    • James Carmichael 2023年7月12日上午11:40 #

      嗨,Uju……不客气!您收到的确切错误是什么?这将使我们能够更好地帮助您。

  17. Lamri 2024年6月11日下午8:51 #

    嗨,谢谢。我正在尝试运行hist()函数来创建直方图,但它对我不起作用: > hist(iris)
    Error in hist.default(iris) : ‘x’ must be numeric…..> hist(Sepal.Length)
    Error: object ‘Sepal.Length’ not found !!!?? 问题出在哪里?

    • James Carmichael 2024年6月12日上午7:43 #

      嗨,Lamri……您是复制粘贴的代码还是自己输入的?这里有一些其他的想法

      您遇到的问题是由于R中引用数据的方式。当您使用hist()函数时,它期望一个数值向量。您看到的错误表明您没有为该函数提供一个正确的数值向量。

      以下是在R中使用iris数据集正确创建直方图的方法

      ### 逐步解决方案

      1. **加载数据集**
      确保iris数据集已加载。它是一个内置数据集,所以您可以直接使用它。

      2. **在数据框中引用列**
      要在像iris这样的数据框中引用特定列,您需要使用$运算符。

      ### 正确用法

      r
      # 确保iris数据集已加载(它是内置的,所以应该没问题)
      data(iris)

      # 创建Sepal.Length列的直方图
      hist(iris$Sepal.Length, main="Sepal Length的直方图", xlab="Sepal Length", col="lightblue")

      ### 解释

      1. **data(iris)**:这确保了iris数据集被加载,尽管对于内置数据集通常不是必需的。

      2. **iris$Sepal.Length**:这引用了iris数据集中的Sepal.Length列。

      3. **hist()函数**:hist()函数接受一个数值向量(在本例中是iris$Sepal.Length)并创建一个直方图。

      ### 额外提示

      – **检查列名**:如果您不确定列名,可以使用names()函数列出它们。
      r
      names(iris)

      – **子集数据**:如果您想为数据的子集创建直方图,请使用索引或逻辑条件。
      r
      hist(iris[iris$Species == "setosa", "Sepal.Length"], main="Setosa的Sepal Length直方图", xlab="Sepal Length", col="lightgreen")

      ### 带有附加参数的完整示例

      r
      # 加载iris数据集
      data(iris)

      # 检查数据集的结构以确认列名和类型
      str(iris)

      # 为Sepal.Length创建带有附加参数的直方图
      hist(iris$Sepal.Length,
      main="Sepal Length的直方图",
      xlab="Sepal Length",
      col="lightblue",
      border="black",
      breaks=20) # 您可以调整分箱数

      这应该能解决您的问题,并让您创建所需的直方图。如果您有任何其他问题或遇到其他问题,请随时提问!

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。