利用决策树预测NBA比赛胜负的Python数据挖掘实践
作者:serafina捡到一枚人鱼 | 来源:互联网 | 2024-12-23 09:07
本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。
### 1. 数据准备与预处理
本文的数据来源包括2013-14赛季NBA的比赛记录和2013年的球队排名。我们首先加载并初步检查这些数据。
```python
import pandas as pd
import time
start = time.time()
file_path = 'path_to_your_data/NBA_2014_games.csv'
data = pd.read_csv(file_path)
print(data.head())
print(f'Data shape: {data.shape}')
print('Duplicate rows:', data[data.duplicated()])
```
接下来,对数据进行清洗,确保日期格式正确,并重命名列标题以提高可读性。
```python
data = pd.read_csv(file_path, parse_dates=['Date'])
data.columns = ['Date', 'Score Type', 'Visitor Team', 'VisitorPts', 'Home Team', 'HomePts', 'OT?', 'Notes']
print(data.head())
```
### 2. 特征工程
为了更好地训练模型,我们需要从原始数据中提取有用的信息作为新特征。例如,我们可以根据历史战绩判断主场或客场比赛的结果。
```python
data['HomeWin'] = data['VisitorPts'] y_true = data['HomeWin'].values
from collections import defaultdict
won_last = defaultdict(int)
data['HomeLastWin'], data['VisitorLastWin'] = None, None
for index, row in data.iterrows():
home_team, visitor_team = row['Home Team'], row['Visitor Team']
data.at[index, 'HomeLastWin'] = won_last[home_team]
data.at[index, 'VisitorLastWin'] = won_last[visitor_team]
won_last[home_team] = row['HomeWin']
won_last[visitor_team] = not row['HomeWin']
print(data[['Home Team', 'HomePts', 'HomeWin', 'HomeLastWin', 'VisitorLastWin']].head())
```
### 3. 模型构建与评估
这里选择决策树作为基础分类器,并通过交叉验证评估其性能。
```python
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import numpy as np
clf = DecisionTreeClassifier(random_state=14)
X_previousWins = data[['HomeLastWin', 'VisitorLastWin']].values
scores = cross_val_score(clf, X_previousWins, y_true, scoring='accuracy')
mean_accuracy = np.mean(scores) * 100
print(f'Accuracy using previous wins: {mean_accuracy:.2f}%')
```
此外,还可以引入更多特征(如球队排名差异)来改进模型表现。
```python
standings = pd.read_csv('path_to_your_data/NBA_2013_standings.csv')
data['HomeTeamRanksHigher'] = 0
for index, row in data.iterrows():
home_team, visitor_team = row['Home Team'], row['Visitor Team']
if home_team == 'New Orleans Pelicans':
home_team = 'New Orleans Hornets'
elif visitor_team == 'New Orleans Pelicans':
visitor_team = 'New Orleans Hornets'
home_rank = standings[standings['Team'] == home_team]['Rk'].values[0]
visitor_rank = standings[standings['Team'] == visitor_team]['Rk'].values[0]
data.at[index, 'HomeTeamRanksHigher'] = int(home_rank > visitor_rank)
X_homehigher = data[['HomeLastWin', 'VisitorLastWin', 'HomeTeamRanksHigher']].values
scores = cross_val_score(clf, X_homehigher, y_true, scoring='accuracy')
mean_accuracy_with_rank = np.mean(scores) * 100
print(f'Improved accuracy with ranking: {mean_accuracy_with_rank:.2f}%')
```
最后,尝试使用随机森林进一步优化预测效果,并通过网格搜索确定最佳参数组合。
```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
param_grid = {
'max_features': [2, 3, 'auto'],
'n_estimators': [100, 110, 120],
'criterion': ['gini', 'entropy'],
'min_samples_leaf': [2, 4, 6]
}
rf_clf = RandomForestClassifier(random_state=14, n_jobs=-1)
grid_search = GridSearchCV(rf_clf, param_grid)
grid_search.fit(X_homehigher, y_true)
optimal_accuracy = grid_search.best_score_ * 100
print(f'Optimized accuracy: {optimal_accuracy:.2f}%')
print('Best parameters:', grid_search.best_params_)
end = time.time()
print(f'Total runtime: {end - start:.2f} seconds')
```
以上代码展示了如何利用Python及其相关库完成一个完整的数据挖掘项目流程,包括但不限于数据获取、清理、特征构建、模型训练及调优等方面的工作。
推荐阅读
-
本文介绍如何使用 Python 将一个字符串按照指定的行和元素分隔符进行两次拆分,最终将字符串转换为矩阵形式。通过两种不同的方法实现这一功能:一种是使用循环与 split() 方法,另一种是利用列表推导式。 ...
[详细]
蜡笔小新 2024-12-28 12:15:45
-
1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ...
[详细]
蜡笔小新 2024-12-27 18:36:54
-
-
本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ...
[详细]
蜡笔小新 2024-12-27 13:55:14
-
本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ...
[详细]
蜡笔小新 2024-12-26 22:04:19
-
本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ...
[详细]
蜡笔小新 2024-12-28 08:39:55
-
本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ...
[详细]
蜡笔小新 2024-12-26 19:47:05
-
本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ...
[详细]
蜡笔小新 2024-12-26 18:20:17
-
本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ...
[详细]
蜡笔小新 2024-12-26 17:37:25
-
根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ...
[详细]
蜡笔小新 2024-12-26 10:42:40
-
本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ...
[详细]
蜡笔小新 2024-12-25 21:01:14
-
本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ...
[详细]
蜡笔小新 2024-12-25 17:38:50
-
本文详细介绍了如何在JMeter中使用JSON提取器来获取和处理API响应中的数据。特别是在需要将一个接口返回的数据作为下一个接口的输入时,JSON提取器是一个非常有用的工具。 ...
[详细]
蜡笔小新 2024-12-25 16:34:37
-
#点球小游戏fromrandomimportchoiceimporttimescore[0,0]direction[left,center,right]defkick() ...
[详细]
蜡笔小新 2024-12-23 19:17:34
-
本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ...
[详细]
蜡笔小新 2024-12-22 19:56:15
-
serafina捡到一枚人鱼
这个家伙很懒,什么也没留下!