利用决策树预测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及其相关库完成一个完整的数据挖掘项目流程,包括但不限于数据获取、清理、特征构建、模型训练及调优等方面的工作。
推荐阅读
本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ...
[详细]
蜡笔小新 2024-12-27 18:29:55
2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ...
[详细]
蜡笔小新 2024-12-27 18:51:49
本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ...
[详细]
蜡笔小新 2024-12-27 16:07:12
前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ...
[详细]
蜡笔小新 2024-12-27 15:19:01
本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ...
[详细]
蜡笔小新 2024-12-27 15:04:09
随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ...
[详细]
蜡笔小新 2024-12-22 21:21:03
本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ...
[详细]
蜡笔小新 2024-12-20 18:58:01
本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ...
[详细]
蜡笔小新 2024-12-20 18:26:03
优化后的摘要:本文详细分析了当前面临的挑战和机遇,结合具体实例探讨了如何通过创新和改革来推动长期可持续发展。文中还介绍了多种可行的解决方案,并强调了在不同阶段实施这些方案的重要性。 ...
[详细]
蜡笔小新 2024-12-20 17:49:13
前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ...
[详细]
蜡笔小新 2024-12-18 15:33:00
Python库极大地扩展了GIS的能力,使其能够执行复杂的数据科学任务。本文探讨了几个关键的Python库,这些库不仅增强了GIS的核心功能,还推动了地理信息系统向更高层次的应用发展。 ...
[详细]
蜡笔小新 2024-12-13 17:24:24
本文深入探讨了数据挖掘领域内的十个经典算法,包括但不限于C4.5决策树、K-Means聚类、支持向量机等。这些算法不仅在理论上有深厚的数学基础,也在实践中展现出强大的应用价值。 ...
[详细]
蜡笔小新 2024-12-07 18:26:46
serafina捡到一枚人鱼
这个家伙很懒,什么也没留下!