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