热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用决策树预测NBA比赛胜负的Python数据挖掘实践

本文通过使用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及其相关库完成一个完整的数据挖掘项目流程,包括但不限于数据获取、清理、特征构建、模型训练及调优等方面的工作。
推荐阅读
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • This post discusses an issue encountered while using the @name annotation in documentation generation, specifically regarding nested class processing and unexpected output. ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 本文深入探讨了Memcached的内存管理机制,特别是其采用的Slab Allocator技术。该技术通过预分配不同大小的内存块来有效解决内存碎片问题,并确保高效的数据存储与检索。文中详细描述了Slab Allocator的工作原理、内存分配流程以及相关的优化策略。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
  • 本文详细介绍了 Java 中 org.geotools.data.shapefile.ShapefileDataStore 类的 getCurrentTypeName() 方法,并提供了多个代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文档旨在详细解析电子秤项目的主循环代码,涵盖其核心功能和任务处理逻辑。内容包括初始化、称重、休眠、错误处理及校准等模式的实现。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • InmyapplicationIhaveQGraphicsScenewithpixmapaddedandallisviewedinQGraphicsViewwithsc ... [详细]
author-avatar
serafina捡到一枚人鱼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有