当前位置:首页 > 篮球新闻

2019赛季NBA预测获胜球队数据获取方式

编辑:火焱燚直播 时间:2024年02月07日 21:16

由于疫情原因,2020赛季尚未结束,因此我们使用2019赛季的数据进行预测。 获取数据有两种方式:

通过网站获取

我们可以通过网站获取任意一年的所有比赛数据。 获取方法如下:

转到浏览器,单击“共享和更多”,单击“以 CSV 形式获取表格(适用于 Excel)”,然后将带有标题的所有数据复制到 Excel 文本文件。 依次选择每个月,将不带表头的数据复制到上一个文件中。

同时,我们还需要获取上赛季的积分榜数据。 获取方法如下:

访问并点击浏览器即可查看整个赛季的战斗信息。 只需单击链接即可复制数据并保存。

通过得到

本文数据和代码已上传至 ,链接如下:

数据准备

在设计预测算法之前,我们需要先回顾并整合数据。 由于原始数据中很多特征名称没有设置好,因此我们在加载数据时重置了列名称。 代码如下:

import pandas as pd
path = 'basketball.csv'
dataset = pd.read_csv(path, parse_dates=['Date'])
dataset.columns = [
    'Date', 'Start(ET)', 'Visitor Team', 'VisitorPts', 'Home Team', 'HomePts',
    'OT?', 'Score Type', 'Notes'
]
dataset.head()

运行结果如下:

当我们建立预测模型时,我们通常有一个标准。 当我们的预测效果超过这个标准时nba常规赛球队奖杯有否,我们就可以认为预测模型已经起作用了。 接下来,我们将建立一个预测球队胜利的标准。

NBA比赛通常分为主场和客场。 球队在主场作战时,往往会占据一定的优势。 所以如果我们每次预测主队都会赢的话,我们应该能够得到一个不错的准确度nba常规赛球队奖杯有否,那么我们就可以用这个值作为我们的标准。 代码如下:

# 提取新特征
# 统计客队得分小于主队的场次
dataset['HomeWin'] = dataset['VisitorPts'] < dataset['HomePts']
# 保留成label
y_true = dataset['HomeWin'].values
# y_true
dataset['HomeWin'].mean()

运行结果如下:

0.5907012195121951

现在我们的标准是0.59。 后面我们要保证我们建立的模型的准确率不低于这个。

构建功能

一点一点构建功能,稍后我们会陆续添加新功能。

在构建模型之前,另一个重要的过程是构建我们想要使用的特征。 我们首先要考虑的是两队最后一场比赛是否获胜。 通常我们会认为他们赢了最后一场比赛。 团队更强大。 我们创建了两个新特征:主队/客队是否赢得了上一场比赛。 代码如下所示:

from collections import defaultdict
won_last = defaultdict(int)
dataset['HomeLastWin'] = 0
dataset['VisitorLastWin'] = 0
# 时间是无序的时候dataset.sort('Date').iterrows()
for index, row in dataset.iterrows():
    home_team = row['Home Team']
    visitor_team = row['Visitor Team']
    dataset.at[index, 'HomeLastWin'] = won_last[home_team]
    dataset.at[index, 'VisitorLastWin'] = won_last[visitor_team]
    won_last[home_team] = int(row['HomeWin'])
    won_last[visitor_team] = 1 - int(row['HomeWin'])
X_previouswins = dataset[['HomeLastWin', 'VisitorLastWin']].values
X_previouswins

运行结果如下:

array([[0, 0],
       [0, 0],
       [0, 0],
       ...,
       [0, 1],
       [1, 0],
       [1, 0]])

使用决策树

我们尝试使用简单的决策树算法进行简单的训练,并通过交叉验证获得分数。

决策树的原理:

决策树(第 1 部分)

决策树(第 2 部分)

代码如下所示:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import numpy as np
clf = DecisionTreeClassifier(random_state=42)
score = cross_val_score(clf, X_previouswins, y_true, scoring = 'accuracy')
print('score is:{0:.1f}%'.format(np.mean(score)*100))

运行结果如下:

score is:59.1%

根据结果​​可以发现,目前的特征并没有提高我们的预测效果。 接下来我们将继续完善数据和模型。

添加功能

考虑到球队的胜利可能与上赛季的战绩有一定的关系,我们尝试加入上赛季的数据来进行预测。

# 加入上赛季数据
standings = pd.read_excel('standings.xls')
# 建立新的特征(排名情况)
dataset['HomeTeamRanksHigher'] = 0
for index, row in dataset.iterrows():
    home_team = row['Home Team']
    visitor_team = row['Visitor Team']
    home_rank = standings[standings['Team'] == home_team]['Rk'].values[0]
    visitor_rank = standings[standings['Team'] == visitor_team]['Rk'].values[0]
    row['HomeTeamRanksHigher'] = int(home_rank > visitor_rank)
    dataset.at[index, 'HomeTeamRanksHigher'] = int(home_rank < visitor_rank)

clf = DecisionTreeClassifier(random_state=42)
X_homehigher = dataset[[
    'HomeLastWin', 'VisitorLastWin', 'HomeTeamRanksHigher'
]].values
score = cross_val_score(clf, X_homehigher, y_true, scoring='accuracy')
print('score is:{0:.1f}%'.format(np.mean(score) * 100))

运行结果如下:

score is:62.2%

很明显,当我们加上上赛季的记录时,预测的准确性提高了3个百分点。

接下来我们继续添加上一场交手的两支球队哪支球队获胜的数据。 代码如下:

last_match_winner = defaultdict(int)
dataset['HomeTeamWonLast'] = 0
for index, row in dataset.iterrows():
    home_team = row['Home Team']
    visitor_team = row['Visitor Team']
    teams = tuple(sorted([home_team, visitor_team]))
    home_team_won_last = 1 if last_match_winner[teams] == row[
        'Home Team'] else 0
    dataset.at[index, 'HomeTeamWonLast'] = home_team_won_last
    winner = row['Home Team'] if row['HomeWin'] else row['Visitor Team']
    last_match_winner[teams] = winner
    

clf = DecisionTreeClassifier(random_state=42)
X_lastwinner = dataset[[
    'HomeLastWin', 'VisitorLastWin', 'HomeTeamRanksHigher', 'HomeTeamWonLast'
]].values
score = cross_val_score(clf, X_lastwinner, y_true, scoring='accuracy')
print('score is:{0:.1f}%'.format(np.mean(score) * 100))

运行结果如下:

score is:61.7%

结果和上面没有太大区别,所以没关系。 我们将继续尝试使用其他策略来改进。

添加团队数据

我们之前做的工作是基于一些游戏数据。 接下来我们尝试添加团队数据来检查我们的运营结果。 由于我们无法直接计算字符数据,所以我们先将数据转换为数值类型,但是一般数值类型都会受到大小的影响,所以我们可以再次进行操作。 代码如下所示:

from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
encoding = LabelEncoder()
onehot = OneHotEncoder()
encoding.fit(dataset['Home Team'].values)
home_teams = encoding.transform(dataset['Home Team'].values)
visitor_teams = encoding.transform(dataset['Visitor Team'].values)
X_teams = np.vstack([home_teams, visitor_teams]).T
X_teams = onehot.fit_transform(X_teams).todense()
X_all = np.hstack([X_lastwinner, X_teams])

clf = DecisionTreeClassifier(random_state=42)
score = cross_val_score(clf, X_all, y_true, scoring='accuracy')
print('score is:{0:.1f}%'.format(np.mean(score) * 100))

运行结果如下:

score is:60.7%

显然,虽然比我们直接预测主队获胜要好,但也高不了多少。 不要惊慌,让我们继续尝试更好的算法。

使用随机森林

随机森林是一种基于决策树的集成学习算法。 理论上,我们得到的结果比决策树的结果更好。

代码如下所示:

clf = RandomForestClassifier(random_state=42)
score = cross_val_score(clf, X_all, y_true, scoring='accuracy')
print('score is:{0:.1f}%'.format(np.mean(score) * 100))

运行结果如下:

score is:63.6%

尝试使用网格搜索,代码如下:

from sklearn.model_selection import GridSearchCV
parameter_space = {
    'max_features': [2, 10, 'auto'],
    'n_estimators': [100, 200],
    'criterion': ['gini', 'entropy'],
    'min_samples_leaf': [2, 4, 6]
}
clf = RandomForestClassifier(random_state=42)
grid = GridSearchCV(clf, parameter_space)
grid.fit(X_all, y_true)
print('score is:{0:.1f}%'.format(np.mean(score) * 100))

运行结果如下:

score is:63.6%

可以看出nba常规赛球队奖杯有否,基于我们迄今为止构建的几个简单特征,准确率可以得到显着提高。 同时,它还受到球员转会、伤病等因素的影响,对不同赛季的数据使用这些方法会得到不同的结果。 有兴趣的读者可以获取其他季节的数据来尝试一下。

进一步考虑

您可能对当前的结果不太满意。 您可以尝试以下指导以供参考:

本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除,如需转载请保留原文地址:https://www.huoyanyi.cn/lqnews/151.html

友情链接: 工华直播网 音视屏直播 本学直播 智汇保直播 美联直播 火焱燚直播 大湾区直播 咏靖直播 炫酷直播网 领沃直播

Copyright 2024-2028 火焱燚直播 版权所有 | XML地图

声明:火焱燚直播所有内容均只可用于学习参考,信息与图片素材来源于互联网,如内容侵权与违规,请与本站联系,将在三个工作日内处理,联系邮箱:122226789@qq.com