没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
35页
本章介绍另一种分类算法——决策树,用它预测NBA篮球赛的获胜球队。比起其他算法,决策树有很多优点,其中最主要的一个优点是决策过程是机器和人都能看懂的,我们使用机器学习到的模型就能完成预测任务。正如我们将在本章讲到的,决策树的另一个优点则是它能处理多种不同类型的特征。 本章将介绍怎样预测NBA获胜球队。如果你看过NBA,可能知道比赛中两支球队比分咬得很紧,难分胜负,有时最后一分钟才能定输赢,因此预测赢家很难。很多体育赛事都有类似的特点,预期的大赢家也许当天被另一支队伍给打败了。以往很多对体育赛事预测的研究表明,正确率因体育赛事而异,其上限在70%~80%之间。体育赛事预测多采用数据挖掘或统计学方法。
资源推荐
资源详情
资源评论
3.1 加载数据集 31
1
2
3
4
5
12
6
7
8
9
10
11
用决策树预测获胜球队
本章介绍另一种分类算法——决策树,用它预测NBA篮球赛的获胜球队。比起其他算法,决
策树有很多优点,其中最主要的一个优点是决策过程是机器和人都能看懂的,我们使用机器学习
到的模型就能完成预测任务。正如我们将在本章讲到的,决策树的另一个优点则是它能处理多种
不同类型的特征。
本章主要内容有:
用pandas库加载、处理数据
决策树
随机森林
对真实数据集进行数据挖掘
创建新特征,用强有力的框架对其进行测试
3.1 加载数据集
本章将介绍怎样预测NBA获胜球队。如果你看过NBA,可能知道比赛中两支球队比分咬得
很紧,难分胜负,有时最后一分钟才能定输赢,因此预测赢家很难。很多体育赛事都有类似的特
点,预期的大赢家也许当天被另一支队伍给打败了。
以往很多对体育赛事预测的研究表明,正确率因体育赛事而异,其上限在70%~80%之间。
体育赛事预测多采用数据挖掘或统计学方法。
3.1.1 采集数据
我们将使用NBA 2013
—
2014赛季的比赛数据。http://Basketball-Reference.com网站提供了NBA
及其他赛事的大量资料和统计数据。请按以下方法下载数据。
(1) 在浏览器中打开http://www.basketball-reference.com/leagues/NBA_2014_games.html。
(2) 点击标题Regular Season旁边的Export按钮。
32 第3 章 用决策树预测获胜球队
(3) 将文件下载到Data文件夹,记录文件的路径。
数据文件格式为CSV,包含了NBA常规赛季的1230场比赛。
CSV为简单的文本格式文件,每行为一条用逗号分隔的数据(文件格式的名字就是这么来
的)。在记事本里输入内容,保存时使用.csv扩展名,也能生成CSV文件。只要能阅读文本文件的
编辑器,就能打开CSV文件,也可以用Excel把它作为电子表格打开。
我们用pandas(Python Data Analysis的简写,意为Python数据分析)库加载这些数据,pandas
在数据处理方面特别有用。Python内置了读写CSV文件的
csv库。但是,考虑到后面创建新特征
时还要用到pandas更强大的一些函数,所以我们干脆用pandas加载数据文件。
本章需要安装
pandas。最简单的方法就是用pip3来安装,第1章中安装
scikit-learn库时用的就是pip3。pandas的安装方法如下:
$pip3 install pandas
安装过程中若遇到任何困难,请访问http://pandas.pydata.org/getpandas.html,
根据自己的系统,阅读相关安装指南。
3.1.2 用pandas 加载数据集
pandas库是用来加载、管理和处理数据的。它在后台处理数据结构,支持诸计算均值等分析
方法。
如果做过大量数据挖掘实验,就会发现自己翻来覆去地编写文件读取、特征抽取等函数。而
这些函数每重新实现一次,都可能引入新错误。使用pandas等封装了很多功能的库,能有效减少
反复实现上述函数所带来的工作量,并能保证代码的正确性。
本书后面会陆续介绍更多的数据挖掘案例,我们将大量使用pandas。
用
read_csv函数就能加载数据集:
import pandas as pd
dataset = pd.read_csv(data_filename)
上述代码会加载数据集,将其保存到数据框(dataframe)中。数据框提供了一些非常好用的
方法,后面会用到。我们来看看数据集是否有问题。输入以下代码,输出数据集的前5行:
dataset.ix[:5]
输出结果如下。
3.1 加载数据集 33
1
2
3
4
5
12
6
7
8
9
10
11
从输出结果来看,这个数据集可以用,但存在几个小问题。下面我们就来修复这些问题。
3.1.3 数据集清洗
从上面的输出结果中,我们发现了以下几个问题。
日期是字符串格式,而不是日期对象。
第一行没有数据。
从视觉上检查结果,发现表头不完整或者不正确。
这些问题来自数据,我们可以改动数据本身,但是这样做的话,容易忘记之前做过哪些操作,
落下步骤或是弄错哪一步,因而无法重现之前的结果。我们像前一章用流水线跟踪数据预处理流
程那样,用pandas对原始数据进行预处理。
pandas.read_csv函数提供了可用来修复数据的参数,导入文件时指定这几个参数就好。
导入后,我们还可以修改文件的头部,如下所示:
dataset = pd.read_csv(data_filename, parse_dates=["Date"],
skiprows=[0,])
dataset.columns = ["Date", "Score Type", "Visitor Team",
"VisitorPts", "Home Team", "HomePts", "OT?", "Notes"]
经过这些处理之后,结果会有很大改善,我们再来输出前5行看看:
dataset.ix[:5]
结果如下。
34 第3 章 用决策树预测获胜球队
即使原始数据很规整,比如刚使用的这个,我们仍需要对其做些调整。其中一个原因是,文
件可能来自不同的系统,由于存在兼容性问题,文件也许会发生变化。
既然数据已经准备好,在开始编写预测算法之前,我们先定下一个正确率作为基准。该基准
任何算法都应该能达到。
每场比赛有两个队:主场队和客场队。最直接的方法就是拿几率作为基准,猜中的几率为
50%。猜测任意一支球队获胜,都有一半胜算。
3.1.4 提取新特征
我们接下来通过组合和比较现有数据抽取特征。首先,确定类别值。在测试阶段,拿算法得
到的分类结果与它对比,就能知道结果是否正确。类别可以有多种表示方法,我们这里用1表示
主场队获胜,用0表示客场队获胜。对于篮球比赛而言,得分最多的队伍获胜。虽然数据集没有
明确给出各球队的胜负情况,但是稍加计算就能得到。
找出主场获胜的球队:
dataset["HomeWin"] = dataset["VisitorPts"] < dataset["HomePts"]
我们把主场获胜球队的数据保存到NumPy数组里,稍后要用scikit-learn分类器对其进行
处理。当前pandas和
scikit-learn并没有进行整合,但是借助NumPy数组,它们配合地很好。
我们用pandas抽取特征后再用
scikit-learn抽取特征具体的值。
y_true = dataset["HomeWin"].values
上面的y_true数组保存的是类别数据,scikit-learn可直接读取该数组。
我们还可以创建一些特征用于数据挖掘。有时候,只要把原始数据丢给分类器就行了,但通
常需要先抽取数值型或类别型特征。
首先,创建两个能帮助我们进行预测的特征,分别是这两支队伍上场比赛的胜负情况。赢得
上场比赛,大致可以说明该球队水平较高。
遍历每一行数据,记录获胜球队。当到达一行新数据时,分别查看该行数据中的两支球队在
各自的上一场比赛中有没有获胜的。
创建(默认)字典,存储球队上次比赛的结果。
from collections import defaultdict
won_last = defaultdict(int)
字典的键为球队,值为是否赢得上一场比赛。遍历所有行,在此过程中,更新每一行,为其
增加两个特征值:两支球队在上场比赛有没有获胜。
3.2 决策树 35
1
2
3
4
5
12
6
7
8
9
10
11
for index, row in dataset.iterrows():
home_team = row["Home Team"]
visitor_team = row["Visitor Team"]
row["HomeLastWin"] = won_last[home_team]
row["VisitorLastWin"] = won_last[visitor_team]
dataset.ix[index] = row
请注意,上述代码假定数据集是按照时间顺序排列的。我们所使用的数据集是按这种顺序排
列的,如果你的数据集不是这样,你需要把代码中的
dataset.iterrows()替换为dataset.
sort("Date").iterrows()
。
用当前比赛(遍历到的那一行数据所表示的比赛)的结果更新两支球队上场比赛的获胜情况,
以便下次再遍历到这两支球队时使用。代码如下:
won_last[home_team] = row["HomeWin"]
won_last[visitor_team] = not row["HomeWin"]
上述代码运行结束后,我们多了两个新特征:HomeLastWin和VisitorLastWin。我们再来看下
数据集。这次只看前5条意义不大。只有一个球队参加过两场比赛后,我们才知道它在上场比赛
表现如何。以下代码将输出本赛季第20~25场比赛:
dataset.ix[20:25]
输出结果如下:
更换上述代码中的索引值,查看其他部分数据。别忘了,一共有1000多场比赛呢!
现在,每个队(包括上个赛季的冠军!)在数据集中第一次出现时,都假定它们在上场比赛
中失败。其实可以用上一年的数据弥补缺失的信息,从而改进这个特征,但这里就先做简单处
理了。
3.2 决策树
决策树是一种有监督的机器学习算法,它看起来就像是由一系列节点组成的流程图,其中位
于上层节点的值决定下一步走向哪个节点。
剩余34页未读,继续阅读
好知识传播者
- 粉丝: 498
- 资源: 4204
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页