本章介绍另一种分类算法——决策树,用它预测NBA篮球赛的获胜球队。比起其他算法,决策树有很多优点,其中最主要的一个优点是决策过程是机器和人都能看懂的,我们使用机器学习到的模型就能完成预测任务。正如我们将在本章讲到的,决策树的另一个优点则是它能处理多种不同类型的特征。
一、数据处理
我们使用2013-2014赛季的比赛数据。数据集链接:http://www.basketball-reference.com/leagues/NBA_2014_games.html 。使用pandas加载数据集。
从链接下载的数据集的列包括{Date、Start(ET)、Vistor/Neutral、PTS、Home/Neutral、PTS.1、Unnamed:6、Unnamed:7、Attend.、Unnamed:9、Notes}
import numpy as np
import pandas as pd
data_filename = './basketball2013-2014.csv'
dataset = pd.read_csv(data_filename)
pd.set_option('display.max_columns', 20) # 设置显示的最大列数为20列


数据清洗
上面截图可知数据集有以下两个问题:
(1)字符串格式的日期转换为日期对象(数据格式) parse_dates=[0] --代表第0列的数据日期格式进行转换。
(2)修改列名,防止看不清客队和主队的分数。
# (1)加载数据集时对日期列格式进行修改
dataset = pd.read_csv(data_filename, parse_dates=[0])
# 删除不需要的列
dataset.drop('Unnamed: 9', axis=1, inplace=True)
# (2)对已有的列名进行修改
dataset.columns = ['Date', 'Start', 'Visitor Team', 'VisitorPts',
'Home Team', 'HomePts', 'Score Type', 'OT?', 'Attend.', 'Notes']
特征抽取
给dataset增加三列数据,分别是:
HomeWin:判断home是否战胜了visitor;
HomeLastWin:判断home是否赢得上一场比赛;
VisitorLastWin:判断home是否赢得上一场比赛。
# 增加列1-HomeWin:判断home是否战胜了visitor
dataset['HomeWin'] = dataset['HomePts'] > dataset['VisitorPts']
# 遍历每一行数据,记录获胜球队。当到达一行新数据时,分别查看该行数据中的两支球队在各自的上一场比赛中有没有获胜的
from collections import defaultdict
# 字典的键为球队,值为是否赢得上一场比赛
won_last = defaultdict(int)
for index, row in dataset.sort_values('Date').iterrows(): # 遍历所有行,index是行号,row是具体内容。
home_team = row['Home Team'] # 提取主队名
visitor_team = row['Visitor Team'] # 提取客队名
row['HomeLastWin'] = won_last[home_team] # 第n行的主队上一轮否赢球进行赋值,默认为0(False)
row['VisitorLastWin'] = won_last[visitor_team] # 第n行的客队上一轮否赢球进行赋值,默认为0(False)
dataset['HomeLastWin'] = row['HomeLastWin'] # 给dataset增加列homelastwin、visitorlastwin,不然后面dataset.loc[index] = row修改不了
dataset['VisitorLastWin'] = row['VisitorLastWin']
dataset.loc[index] = row
won_last[home_team] = row['HomeWin'] # 更新defaultdict
won_last[visitor_team] = not row['HomeWin'] # 更新defaultdict
# print(dataset.loc[0:25])
二、决策树
1.决策树简介
决策树是一种有监督的机器学习算法。作为一种积极学习的算法,决策树也分为两大步骤:训练阶段和预测阶段。
创建决策树:大多通过迭代生成一棵树。它们从根节点开始,选取最佳特征,用于第一个决策,到达下一个节点,选择下一个最佳特征,以此类推。当发现无法从增加树的层级中获得更多信息时,算法启动退出机制。
决策树中的参数: (1)min_samples_split:指定创建一个新节点至少需要的个体数量 。控制着决策节点的创建。
(2)min_samples_leaf:指定为了保留节点,每个节点至少应该包含的个体数量。决定着决策节点能否被保留。
(3)决策树的另一个参数是创建决策的标准,常用的有以下两个:
基尼不纯度(Gini impurity):用于衡量决策节点错误预测新个体类别的比例。
信息增益(Information gain):用信息论中的熵来表示决策节点提供多少新信息。
2.决策树代码实现
使用sklearn.tree.DecisionTreeClassifier 创建决策树。
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(random_state=14)
用我们抽取的特征计算分类正确率(分别用fit和predict方法,cross_val_score方法预测)。
x_previouswins = dataset[["HomeLastWin", "VisitorLastWin"]].values
y_true = dataset['HomeWin'].values
# 决策树估计器的fit和predict
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x_previouswin