My pool table set for 9-ballMy pool table set for 9-ballMy pool table set for 9-ballMy pool table set for 9-ball我的台球桌适合 9 球在以前的帖子,我讨论了机器学习的定义以及是否联合管理计划做到了(是的,确实如此),在这里我将把机器学习应用到我收集的一些真实数据上。
我最喜欢的两种机器学习算法是 K 最近邻算法和朴素贝叶斯算法,因为它们很容易理解。 算法不必很复杂即可获得良好的结果,并且对于某些问题,这两种算法可以快速准确地执行。
K 最近邻几乎就是它听起来的样子。 该算法计算数据集中的哪些观测值是最接近您要预测的点的“K”。 那么预测要么是这些最近点的响应平均值(如果您的响应变量是连续的),要么是最常见的类别(如果您的响应变量是分类的)。 通常,您会拟合一系列 K,并使用交叉验证来选择哪个 K 可提供最佳的预测性能。
经常有人问我为什么朴素贝叶斯被称为“朴素”。该名称源自这样一个事实:使用该算法时做出的关键假设是所有预测变量都是相互独立的。 在许多情况下,这是一个天真的假设。 因此,当该假设更接近真实时,该方法往往比预测变量彼此高度相关时表现更好。 为了进行预测,在给定观察到的预测变量的情况下,根据观察训练数据中的这些值(其中该类别是响应)的概率来计算响应类别(例如,获胜或失败)的概率。 计算概率较高的类别就是预测类别。
让我们看一下这两种方法的实际效果。
谁更好?
我和我丈夫都是台球爱好者,几乎每天下班回家后都会玩台球。 经过一年左右的比赛,我们认为我们的比赛相当势均力敌,也许我稍微好一些。 我说:“这个问题我们可以回答!”
因此,从 2018 年 1 月 1 日开始,我们开始跟踪我们的结果。 我保留了一个电子表格(只是因为家里游戏室的计算机上没有安装 JMP!),用于跟踪月份、星期几、日期、我赢了多少场比赛、我们玩了多少场比赛、是否我赢得了那场比赛,以及进行了哪场台球比赛(8 球或 9 球)。 因为这首先是在电子表格中,所以还有计算整体游戏获胜百分比以及会话获胜百分比的列。
值得庆幸的是,我只需将 Excel 文件拖到 JMP 主窗口中,Excel 导入向导就会发挥其魔力来创建 JMP 数据表。 进行一些调整以使会话获胜?指示一个名义变量和获胜的比赛数量以及序数变量,我就准备好预测我下一个晚上的台球统治力了!
Imported dataImported dataImported dataImported data导入数据只是我还没准备好。 还记得我在 K 最近邻中提到过交叉验证用于确定最佳拟合 K 吗? 我目前没有用于培训和验证的专栏。 虽然 K 最近邻法和朴素贝叶斯法都可以选择在其平台启动时使用一定比例的数据作为验证,但如果我想比较这两种方法,我应该对两者使用相同的训练集。 幸运的是,JMP 也为我提供了“创建验证列”实用程序。
该实用程序中有多个选项可用于如何创建验证列。 如果我的响应变量高度不平衡(这种情况发生在失败不常见或寻找欺诈交易的情况下),我会想使用分层随机选项来确保我在训练和验证集中都有包含响应的数据。 在这种情况下,我知道我的所有列都平衡得相当好,因此我的训练或验证集中不太可能完全缺少某个类别。 因此,我将使用“固定随机”选项创建验证列。 我可以为随机生成设置一个种子,这样我将来就可以再次重现这个特定的列,但我认为在这种情况下没有必要。
分析时间!
现在,有了验证列,我可以在“分析”>“预测建模”菜单中启动 K 最近邻平台。 会话获胜?是我的响应变量以及我想要预测的内容,即我的生日,即 10 月 13 日星期六。 [注:我在生日前开始写这篇文章;读到最后,看看本文中的预测是否正确!] 月、日、游戏和玩过的游戏(玩过的游戏数量)是我的因素。 我认为日期不会有帮助,主要是因为每个月-日组合都会出现一次(除了我们玩多个会话的几个周末)。 我还将让平台计算最多 25 个最近邻居,而不是默认的 10 个。
KNN Launch DialogKNN Launch DialogKNN Launch DialogKNN Launch DialogKNN 启动对话框
报告的模型选择部分跟踪在具有 1 到 25 个邻居的模型的每个训练集和验证集上计算的错误分类率。 选择线设置为 K = 20——验证集上的错误分类率最小。 下表显示验证集中超过 44% 的观测值被错误分类。 混淆矩阵显示,与实际获胜或失败大致相同数量的观察结果被错误分类。 马赛克图给出了混淆矩阵的直观表示。
KNN ReportKNN ReportKNN ReportKNN ReportKNN报告错误分类率并不高,但我不确定我的预测因子是否真的具有预测性。 如果我在 1 月 1 日就想写这篇文章,我可能会记录一些事情,比如这一天的压力有多大、我们是否在玩游戏时享受成人饮料,以及我睡了多少觉。前一天晚上有过! 所以我不会因为算法没有给我一个非常合适的模型而责怪它。
我将把预测公式保存到数据表中,这样我就可以在使用朴素贝叶斯拟合这些相同的数据后对我的生日进行预测。
NB Launch DialogNB Launch DialogNB Launch DialogNB Launch DialogNB 启动对话框
我们注意到的第一件事是验证集上的错误分类率稍小一些,仅超过 40%。 混淆矩阵向我们表明,与 K 最近邻模型相比,我们使用朴素贝叶斯模型在验证集中正确分类了 7 个观测值。 最后,我们得到每组的 ROC 曲线。 在验证集上,我们的曲线下面积(模型拟合质量的另一个度量)是 0.5676。 虽然这不是很好,但它仍然比随机猜测要好,随机猜测的 AUC ≈ 0.5。
NB ReportNB ReportNB ReportNB Report注意报告
我将再次将预测公式保存到数据表中,以对我的生日池表现进行预测。
因为我们打9球时是“9胜制”系列赛,所以我提前不知道我们会打多少场比赛。 我能在5-0大胜的情况下快速获胜吗? 还是需要全部9场比赛才能决出胜负? 我将为每个可能玩的游戏数量(5 到 9)添加一行,看看我们的模型预测什么。
Added rows for predictionAdded rows for predictionAdded rows for predictionAdded rows for prediction添加了用于预测的行
在这一天,两个模型都认为我应该是获胜者,除非系列赛进行到 9 场比赛。 在这种情况下,K 最近邻预测我会输。 这将是一个生日快乐!
几天后,我的生日到了,带着我会赢的信念,我走进了游戏室。 大约一个小时后,我沮丧地退出了比赛,因为我以三比五输掉了比赛。 至少我有蛋糕!
发生了什么?
根据模型,事情看起来对我来说非常好! 我怎么会输呢? 朴素贝叶斯模型让我有机会了解除了最终预测之外的估计获胜概率。 看来我也应该看看这些,而不是抱有如此高的希望。 我将概率公式保存到数据表中,很明显,虽然我被预测获胜,但最高概率略低于 75%,最低概率略高于 60%。 这意味着我丈夫实际上有很大的获胜机会。 通过仅查看最终预测,我错误地判断了生日获胜的实际机会。 我将以此作为警告,在下次下注之前查看我所掌握的所有信息!
Win probabilities. [Note: some data table columns hidden for space.]Win probabilities. [Note: some data table columns hidden for space.]Win probabilities. [Note: some data table columns hidden for space.]Win probabilities. [Note: some data table columns hidden for space.]获胜概率。 [注意:一些数据表列因空间原因而隐藏。]
离别镜头
关于这些模型的最后几句话:当模型中的变量不能很好地预测响应时,即使是最先进的算法也不能很好地执行。 我们通过这些数据以及它们的高错误分类率看到了这一点。 正如我之前所说,这不是算法的错误,而是我收集的数据的错误。 大多数具有合理预测变量的模型都比这里的模型成功得多。 也许在 2019 年,我会在数据收集中添加更多信息,并重新审视这些模型。
此外,台球是一项体育赛事,与机器学习的许多(甚至可能是大多数)常见应用相比,人为因素在结果中发挥着更大的作用。 在秋季的大学和职业橄榄球比赛中,你几乎可以在每个周末看到这样的情况,弱者会爆冷。 这有时被称为“任何给定的星期日”。 然而,从长远来看,考虑到这些概率,经过多次试验,我会赢我的赌注;就像大多数时候最受青睐的足球队获胜一样,体育博彩玩家也能赚钱。 事实上,如果我看看生日后的接下来几天,我确实有 60% 的机会获胜。