机器学习匆忙

2021-07-23 00:12:15

今年夏天,我一直在参加 SLICED 机器学习竞赛,参赛者有两个小时的时间来打开新数据集、构建预测模型并作为 Kaggle 提交进行评分。参赛者主要根据模型表现进行评分,但也会通过可视化和讲故事以及观众投票获得分数。在 SLICED 之前,我几乎没有任何竞争性机器学习的经验,所以我学到了很多!到今天为止,我在积分榜上排名第 5,离季后赛的截止日期还差,所以如果你想看到我继续,你可以在这里投票给我作为“观众选择”! (虽然我最喜欢的比赛之一是观众可以与 Kaggle 提交的作品一起竞争,所以我希望我无论如何都会加入!)对于 SLICED 的四集(包括我参加比赛的两周)我分享了我的过程的截屏视频。第 4 集和第 7 集是我现场比赛的那些(你也可以在这里找到代码):如果你只看一集,我推荐 AirBnb,这太棒了! (这很容易成为我最喜欢的比赛数据集,混合了文本、地理和分类数据——尽管第 1 集和第 8 集也很令人愉快)。在这篇文章中,我将分享我在使用 R 和 tidymodels 包集合进行竞争性 Kaggle 建模时学到的一些知识。多年来,Python 在机器学习工具方面具有稳固的优势(scikit-learn 只是炸药),但 R 一直在快速追赶。 RStudio 的 tidyverse 团队一直在开发 tidymodels 软件包套件,以便与 tidyverse 工具配合使用。这是我第一次真正获得与他们的深入体验,我将分享我喜欢(和不喜欢)的内容。与“成功之巅”或“厄运之坑”相反,“成功之坑”是这样一种哲学,即用户不应该为了做正确的事而努力奋斗。他们应该能够几乎偶然地养成良好的习惯,因为这比错误地使用它们更容易。

在进行机器学习时,您可能会陷入很多陷阱,而 tidymodels 包旨在避免那些“不假思索”的陷阱。我认为最令人印象深刻的是在数据清理过程中避免数据泄漏。在拟合模型之前,想想我们可能对数据集应用的许多特征工程步骤中的一些: 分桶稀有类别(例如,用“其他”替换分类变量的稀有级别) recipes 包提供了执行这些操作的函数(例如 step_impute_mean 、step_pca 和 step_other),但这只是其价值的一部分。配方包的绝妙见解是,每个特征工程步骤本身都是一个需要训练的模型!如果在用平均值估算值时包含测试集,或者在应用 PCA 时,您会不小心输入来自测试集的信息(这使您更有可能过度拟合而没有意识到这一点)。 recipes 包明确说明了这一点:在将配方应用于数据集(使用 bake())之前,必须对其进行数据训练(使用 prep())。通过将此配方与模型规范结合到工作流对象中,您可以封装特征工程和建模的整个从头到尾的过程。其他 tidymodels 工具然后利用这个封装的工作流程。我发现其他每个包也在 tidymodels 的“成功坑”中发挥作用。例如:交叉验证(rsamples):交叉验证是避免过度拟合的关键方法之一,尤其是在选择模型和选择超参数时。 vfold_cv 和 fit_resamples 使它变得容易。

调整超参数 (tune): tune_grid 使得指定超参数组合变得微不足道,看看性能如何变化。 autoplot() 尤其具有真正的“开箱即用”的感觉。尝试不同的模型(欧洲防风草):我真的很喜欢不必处理每个建模包的输入和输出特性;更少的时间阅读文档意味着更多的时间专注于我的模型和数据。文本分类(textrecipes):这在我心中有一个特殊的位置。我帮助开发了 tidytext 包,但我从来没有对它如何融入机器学习工作流程感到非常兴奋。通过提供标记化和过滤工具,textrecipes 包将文本变成了另一种类型的预测器。这些便利不仅仅是节省精力或时间;它们共同构成了一个更加稳健和有效的流程。在使用 tidymodels 之前,我可能只是跳过了调整参数,或者停止了我尝试的第一个模型类型,因为迭代太困难了(这种现象称为 shlep 盲)。我在 tidymodels 中看到的一些阻力来自“这太容易了——你没有仔细考虑代码在做什么!”但我认为这让它倒退了。通过消除编写程序逻辑的负担,我可以专注于有关我的数据和模型的科学和统计问题。愚蠢的抱怨:“这个工具让你无法思考。”当他们使用好工具时,没有人会停止思考。他们会考虑更重要的事情 — David Robinson (@drob) 2016 年 8 月 26 日

我对 tidymodels 软件包的所有内容都不满意,尤其是当我第一次开始比赛时。在某些情况下,我觉得 API 在他们可以使用函数参数时会强迫过度管道,使模型规范比他们必须的要冗长得多。正如我稍后将讨论的那样,stacks 包仍然是一个具有粗略实现草案的好主意。但好消息是该团队正在继续改进它!在我的 SLICED 比赛过程中,我打开了两个 GitHub 问题(欧洲防风草和工作流),当我到达第二圈时,它们已经修复了! 1 在今晚的#SLICED 中,将会震撼欧洲防风草和工作流的开发版本 A. 防风草模型现在有一个默认值而不是需要 set_engine() B.工作流() 现在采用预处理器/规范参数 💕 tidymodels 团队最近的工作https://t.co/2O4Xfen2kU pic.twitter.com/9yI4FYTilu — David Robinson (@drob) 2021 年 7 月 14 日现在我已经讨论了这些工具,我将谈谈机器学习本身。我知道我几乎是最后一个欣赏这一点的人,但 xgboost 在快速创建高性能模型方面的强大功能令人惊叹。当我为比赛练习时,我很早就磨练了一个过程。类似于:拟合 xgboost boosted 树模型,learn_rate = .02,mtry 从 2-4 不等,树从 300 到 800 不等

绘制学习曲线(显示随着树数量变化的性能),并在需要时使用它来调整 mtry 和树。在大多数剧集中,这个死记硬背的过程通常是我最终模型的大部分时间!它几乎总是胜过我从线性或随机森林模型中得到的任何东西,即使有大量的特征工程和调整。该过程特别方便,因为您可以从单个模型拟合中获得整个学习曲线(改变树的数量),因此可以非常快速地使用 tune 包。这与我使用 keras(一个深度学习框架)的经验非常不同,我发现在我什至击败随机森林之前,我通常必须花费大量时间摆弄超参数。 keras 肯定有可能被我的一些提升的树击败,但我怀疑我是否会以同样快的速度获得它。在我自己的专业工作中,我通常喜欢构建可解释的模型,进行可视化,并了解每个特征的作用。但是提升树在“黑匣子”的方向上走得更远。但是竞争性机器学习有一种有趣的方式,可以将注意力集中在性能指标上。除此之外,我印象深刻的是我可以从基尼系数这样的重要性度量中学到很多东西。与线性模型中的特征不同,这些可以代表有趣的非线性项,它有助于突出我可以从模型中删除的不重要的项。说起来……我很快发现 xgboost 的一个特点是提供太多功能很容易对其造成伤害。 xgboost 中的低值特征削弱了其余特征的重要性,因为它们出现在较少随机选择的树中。这与正则化线性回归(例如 LASSO)形成对比,其中惩罚项通常很容易将额外系数设置为零。当我们有分类预测变量时,就会出现这种情况。如果一个类别有 20 个级别,那么当变成 one-hot 编码时,就会有 20 个额外的二进制变量。与(比如说)一两个高度预测模型相比,这些最终生成的树要多得多。我倾向于发现,当我预先删除高基数变量时,我的模型表现更好(我的理解是 catboost 可能会更优雅地处理这些!)

一旦您在调整模型时遇到收益递减点,通常最好从另一个产生不同类型错误的模型重新开始,并将它们的预测平均在一起。这就是模型堆叠背后的原理,这是一种集成学习。一个完美的例子是 AirBnb 定价视频。我能够使用 xgboost 建立一个强大的模型,该模型基于纬度/经度等数字变量(对树木非常有效!)和一些分类变量。但数据还包括稀疏的分类变量,如街区和文本字段(公寓名称),其中“联排别墅”或“工作室”等标记具有很强的预测能力 stacks 包将此过程置于 tidymodels 框架内。在我使用过的所有 tidymodels 包中,stacks 包是最明显处于早期状态的包。对于初学者来说,它对组合模型的方式过于固执己见,总是使用带有自举交叉验证的正则化线性模型。部分原因是,即使只组合两个或三个模型,它也很慢。而且我发现当输入设置不正确时,它有时会出现无益的错误,这表明它需要一些更重的“游戏测试”。我在比赛的过程中学到了很多关于 tidymodels 和机器学习的知识。但我最喜欢的部分体验是,因为它是在 Kaggle 上公开举办的,观看比赛直播的人可以与自己竞争(通常比参赛者表现得更好!)该主题仅适用于 @kierisi 和 @kierisi。如果你不是@kierisi,你可以滚动过去。 JESSE 的手工切片模因,a 🧵:pic.twitter.com/mYHR3bobGE — Chelsea Parlett-Pelleriti(@ChelseaParlett)2021 年 6 月 23 日

我的竞争对手 Jesse Mostipak 想出了一个绝妙的技巧,在她的模特训练时在屏幕上展示模因:这至少是她在我们比赛的聊天投票部分压倒我的原因之一(也是我正在尝试的原因之一)在这篇文章中拿出一些表情包。迟到总比不做强!)不管你喜欢不喜欢这些表情包,如果你想看到我去季后赛,你可以在这里投票给我。不管我能不能进入季后赛,我都会提交一些意见书,我很荣幸有机会和大家一起学习。特别感谢我的朋友兼同事 Julia Silge,她全职从事 tidymodels 软件包的工作,并帮助讨论了我对软件包的一些想法和反馈。 ↩ 机器学习匆忙:我从 SLICED ML 竞赛中学到的东西发表在 .