Python中的高校篮球得分

再次在办公室的March Madness游泳池中完成最后一次?金毛猎犬或你邻居的女儿的宠物摇滚选择了比你更好的支架吗?创造一个胜利的支架是很难的,甚至绊倒大学篮球的专家分析师。而不是让猜测工作每个赛季都有命运或观看数千小时的篮球(我想无论如何我都是这样做的,但那不是重点),为什幺不训练一台电脑为你做预测呢?

 

在Python和一些很棒的库的帮助下,你可以构建自己的机器学习算法,用不到30行代码预测NCAA Men’s Division-I College Basketball游戏的最终得分。本教程旨在解释创建机器学习应用程序所需的所有步骤,包括设置,数据检索和处理,培训模型以及打印最终预测。

 

要学习本教程,强烈建议您对Python有基本的了解,但不是必需的。了解导入模块,获取和设置变量,字典和实例化类的目的是一个很好的基础,而使用经验 Pandas
and sklearn
is a huge plus.

 

现在我们已经设置了开发环境,让我们开始构建实际的应用程序。

 

对于那些喜欢直接跳到代码的人来说,上面的要点是我们将要使用的最终程序。如果你已经熟悉了 pandas
and sklearn
,您可以跳到本教程的底部,了解该程序的运行方式以及如何扩展它以获得更高的准确性,更快的运行时间和更高的可用性。对于其他想要进一步解释此代码的人,请继续阅读下面的内容,了解每个步骤的目的。

 

几乎每个Python程序都以一个开头 import
包含所需依赖项的部分,稍后将在模块中使用。对于这个项目,我们需要导入我们之前安装的以下包:

 

没有数据集,任何机器学习应用程序都不会完整。为了帮助我们预测NCAAB比赛的最终得分,我们想要创建一个包含所有单个比赛统计数据的数据集(例如投篮命中率,失误数和盖帽次数,反弹率等等),然后我们可以使用这些数据来预测这些因素如何与最终得分相关联。

 

要创建此数据集,我们首先需要初始化一个空数据集 Pandas DataFrame
我们将用于存储我们的最终数据。接下来,我们初始化 Teams
class from sportsreference
其中包含当前或最近一个赛季NCAA男子组的每个篮球队的信息,并允许我们轻松地逐个队列地获取统计数据。

 

在提取数据之前,我们需要通过运行来遍历每个团队 for team in teams:
每次迭代都对应联盟中一支独特的球队。 sportsreference
公开每个团队的日程安排和箱子评分信息,使我们能够编写类似的代码 team.schedule.dataframe_extended
它为团队在当前赛季参加的每场比赛收集每场比赛的统计信息。该 dataframe_extended
属性返回一个 pandas DataFrame
每个索引对应一个不同的游戏。

 

在收集每个游戏的盒子比分信息后,我们希望将其添加到我们的整体数据集中,以便我们拥有一个单一的数据源。这可以通过将我们现有的数据集与本地数据集连接来完成 DataFrame
包含当前团队的完整箱子比分信息。通过用结果连接覆盖我们现有的数据集,我们确保数据集不仅包括最近团队的信息,还包括之前查询过的所有团队的信息。

 

在我们的数据集完成构建之后,我们需要过滤掉几个类别(或 features
因为它们经常在机器学习中被称为我们不想使用的数据集 – 即那些有的 string
type (or categorical
)喜欢球队名称或日期和地点。有时,基于字符串的特征可能是有用的,例如在预测房屋价值的情况下,并且确定列为“海滨”的房产具有比分类为“内陆”的房产更高的价值。虽然此功能对房价预测很有用,但大多数机器学习算法无法处理基于字符串的数据。称为替换这些类型的特征的一种方法 one-hot encoding
它使用唯一的特征列自动替换类似的分类值,其中属于该特征的每个索引的值都为1,否则为1。通过将类别更改为1和0,机器学习算法能够更有效地处理这些功能。

 

然而,出于我们的目的,我们将简单地删除这些功能,因为它们要幺太多(即可能在游戏中播放的可能场所很大),没有意义(它不应该 really
无论是在11月18日还是12月2日根据统计数据确定比赛结果,或者会引入偏见(我们希望算法根据球队的比赛来确定最终得分 – 不仅因为他们的名字是“杜克”) “)。因此,我们将删除所有这些类别。

 

在这一点上,有些人可能想知道为什幺我包括在内 home_points
and away_points
在要删除的字段列表中。这两个字段是最终输出(通常称为 labels
)我们想要预测,所以我们不希望它们包含在我们的主要功能中,而应该专门为我们的输出标签保留它们。

 

单步执行上面的代码,我们首先从数据集中删除所有不需要的功能,并将修剪后的输出保存为 X
。删除未使用的功能后,我们接下来删除所有不完整数据的行。如果数据没有在sports-reference.com上正确填充,或者团队没有执行某些统计操作,例如没有阻挡投篮或罚球,有时会发生这种情况。我们可以通过两种方法处理这些不完整的数据,方法是设置缺失值和设置数(例如类别的平均值或默认为零)或删除任何无效的行。由于我们的数据集中无效单元格的数量非常少,因此我们将删除任何具有不完整数据的行,因为它不会影响我们的最终结果。

 

因为探戈需要两个(错误,两个参赛队伍可以参加比赛),所以每个比赛都会有一个副本,因为两个球队的赛程都被拉出来(一次是主队,一次是客队) 。这只是污染我们的数据集,并没有提供任何值,因为行完全相同,所以我们想要删除任何副本并保留每个游戏的一个实例。为此,我们只需添加 drop_duplicates()
到我们的数据集,以确保每个索引都是唯一的。

 

接下来,我们需要创建输出标签,用于在训练时确定模型权重的准确性,并测试最终算法的准确性。我们可以通过创建一个仅包含主点和离点的两列向量来生成我们的标签,并将结果设置为 y
.

 

最后,通常的做法是将数据集拆分为训练和测试子集,以确保训练有素的模型是准确的。理想情况下,我们希望使用大约75%的数据集进行培训,并保留剩余的25%进行测试。应随机采用这些子集以防止模型偏向于特定的信息集。在使用训练数据集训练模型之后,应该针对测试数据集运行模型以确定模型的预测性能并查看其是否过度拟合。

 

Luckily, sklearn
有一个内置函数,将为我们创建这些子集。通过喂养我们的 X
and y
frames into train_test_split
,我们能够检索具有预期分割的训练和测试子集。

 

现在我们的数据集已经处理完毕,是时候创建和训练我们的模型了。我决定用一个 RandomForestRegressor
对于这个例子,由于算法的易用性和相对准确性以及与标准决策树相比减少过度拟合的适当处理。随机森林算法创建了几个决策树,其中一些随机性被注入到特征权重中。然后将这些决策树组合起来创建一个森林(因此a random forest
of decision trees
)在训练,验证或推断时用于最终分析。该算法支持两者 classification
as well as regression
,使其适用于各种应用。

 

分类确定属于固定数量类别的输出标签,例如学生在测试中收到的字母等级(“A”,“B”,“C”,“D”或“F”)。只能有五个类别(或 classes
),因此模型只会尝试将输出放入这五个类别中的一个。另一方面,回归确定可以采用无限期值的输出标签,例如房屋的价格。虽然房价往往会有一系列标准房价,但房屋的价格没有限制,任何正数都是有效的。由于篮球比赛的最终得分在技术上可以是任何正数(或零!),我们希望使用回归。

 

在我们构建和训练模型之前,我们首先需要设置一些模型 hyperparameters
。超参数是在训练之前输入到模型的参数,并且影响它的构建和优化方式。对于机器和深度学习领域的大多数初学者来说,这些参数往往是最大的障碍,因为这些设置通常没有“完美”的价值,如果有的话,它可能会让人难以确定应该放什幺。

 

一般的经验法则是最初坚持使用这些超参数的默认值,然后一旦模型被训练并完成并且您能够测试它,就开始使用反复试验方法调整值,直到您满意为止最后的结果。对于我们的模型,我选择了六个不同的超参数,并找到了这组特定的值,以提供性能和准确性之间的最佳平衡。有关这些特定设置的更多详细信息,请参阅 官方scikit-learn文档
.

 

选择我们的超级算法后,终于可以创建我们的模型了。首先,我们需要实例化 RandomForestRegressor
我们之前导入的类,包括我们的超参数。通过使用 (**parameters)
,我们将字典的键值对扩展为类的命名参数,该参数在功能上与以下内容相同:

 

现在我们的模型已经实例化了,剩下的就是训练它。 sklearn
通过包含,使这变得非常容易 fit
method with RandomForestRegressor
,所以我们只需要使用输入功能和相应的输出标签来运行它。这个方法就地运行,所以我们的 model
变量现在将自动指向我们可用于预测的训练模型!

 

我们的应用程序的最后一步是针对我们的测试子集运行预测,并将它们与我们的预期结果进行比较。该打印语句将预测结果以及我们的实际预期结果输出为两个不同的两列向量。

 

最后,我们一直在等待的那一刻!我们的应用程序现已完成,我们剩下的就是运行算法。我命名了我的程序 ncaab-machine-learning-basic.py
,所以我只需要运行以下命令来启动算法:

 

Please note that 该计划可能需要很长时间
to complete
因为大部分处理时间用于为Division-I College Basketball中的所有350多个团队构建数据集。如果您只是想查看一个有效的算法,可以通过添加一个来提前停止数据创建 break
数据连接行后的第一个循环中的语句。

 

一旦程序完成,它将输出类似于以下内容的东西(我减少了行数以节省空间):

 

此输出包含两个部分:预测输出后跟预期输出。一切都来自 array([[86, 86]
to [68, 65]])
是预测的输出 array([[83, 89]
to [66, 65]])
是实际数据。如前所述,第一列是指预期的点数 home
球队将得分,第二列是预计得分 away
team.

 

预测输出中的行也与预期输出中的行匹配,因此 [86, 86]
correlates with [83, 89]
等等。如果我们比较列表,我们会发现我们的预测并不太糟糕!在大多数情况下,预计得分仅与实际结果相差几个点。另一个有希望的迹象是,当实际得分与大约70分的典型结果不同时,我们的算法能够识别差异并产生高于或低于正常的分数。

 

如果这是您的第一个机器学习计划,恭喜!希望本教程足以让您入门并展示基本的机器学习应用程序不需要多年的教育或数千行代码。

 

虽然这个程序是一个很好的开始,但我们有很多方法可以扩展它以使其更好。以下是我将对应用程序进行的一些改进,以提高性能,准确性和可用性:

 

现在您已经有了一个有效的应用程序,请尝试实施其中一些建议,以提高模型的准确性和性能。如果您生成一个您满意的模型,您可以使用它来为NCAA锦标赛或可能创建预测 enter a competition
.

 

虽然击败金毛猎犬或莎莉的宠物摇滚仍然很难,但这种算法可能会让你在今年的公司游泳池中获得竞争优势。为什幺不在今年3月份 yours
吉姆来自会计?

 

30行Python预测高校篮球得分

发表评论

电子邮件地址不会被公开。 必填项已用*标注