热门标签 | 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及其相关库完成一个完整的数据挖掘项目流程,包括但不限于数据获取、清理、特征构建、模型训练及调优等方面的工作。
推荐阅读
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • ML学习笔记20210824分类算法模型选择与调优
    3.模型选择和调优3.1交叉验证定义目的为了让模型得精度更加可信3.2超参数搜索GridSearch对K值进行选择。k[1,2,3,4,5,6]循环遍历搜索。API参数1& ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 优化后的摘要:本文详细分析了当前面临的挑战和机遇,结合具体实例探讨了如何通过创新和改革来推动长期可持续发展。文中还介绍了多种可行的解决方案,并强调了在不同阶段实施这些方案的重要性。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • Python库在GIS与三维可视化中的应用
    Python库极大地扩展了GIS的能力,使其能够执行复杂的数据科学任务。本文探讨了几个关键的Python库,这些库不仅增强了GIS的核心功能,还推动了地理信息系统向更高层次的应用发展。 ... [详细]
  • 本文深入探讨了数据挖掘领域内的十个经典算法,包括但不限于C4.5决策树、K-Means聚类、支持向量机等。这些算法不仅在理论上有深厚的数学基础,也在实践中展现出强大的应用价值。 ... [详细]
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社区 版权所有