随机森林预测NBA篮球赛(二)——数据分析

  决策树是一种有监督的机器学习算法,它看起来就像是由一系列节点组成的流程图,其中位

于上层节点的值决定下一步走向哪个节点。
  首先是训练阶段,用训练数据构造一棵树。之后再是测试阶段。决策树跟大多数机器学习方法类似,是一种积极学习的算法,在训练阶段完
成模型的创建。
  
  除了设定退出准则外,也可以先创建一棵完整的树,再对其进行修剪,去掉对整个过程没有
 提供太多信息的节点。这个过程叫作剪枝(pruning)。
  scikit-learn库实现的决策树算法给出了退出方法,使用下面这两个选项就可以达到目的。
     min_samples_split:指定创建一个新节点至少需要的个体数量。
     min_samples_leaf:指定为了保留节点,每个节点至少应该包含的个体数量。
    第一个参数控制着决策节点的创建,第二个参数决定着决策节点能否被保留。
  决策树的另一个参数是创建决策的标准,常用的有以下两个。
     基尼不纯度(Gini impurity):用于衡量决策节点错误预测新个体类别的比例。
     信息增益(Information gain):用信息论中的熵来表示决策节点提供多少新信息。
 上面内容摘自  Robert Layton 的python
 
 
  首先,对于数据,要先提取特征:对于特征的提取大致有几种方法。
1  最简单的就是根据主客场球队 单纯上次的比赛情况
dataset["HomeLastWin"] = False
dataset["VisitorLastWin"] = False
# This creates two new columns, all set to False

from collections import defaultdict
won_last = defaultdict(int)
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
    won_last[home_team] = row["HomeWin"]
    won_last[visitor_team] = not row["HomeWin"]

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
clf = DecisionTreeClassifier(random_state=14)

X_previouswins  = dataset[["HomeLastWin", "VisitorLastWin"]].values
scores = cross_val_score(clf, X_previouswins, y_true, scoring="accuracy")
print("Accuracy: {0:.1f}%".format(np.mean(scores) * 100))

2 根据上个赛季的比赛情况,这是需要用到上个赛季的数据,数据的爬取方式,再上一篇中着重介绍。

  根据主客场对战的上次排名进行比较,将此作为一个特征:

last_match_winner = defaultdict(int)
dataset['HomeTeamWonLast'] = 0
for index, row in dataset.iterrows():
    home_team = row['Home Team']
    visitor_team = row['Visitor Team']
    # 通过字母排序,这样不论谁是主客场队伍,保证不会出现重复
    teams = tuple(sorted([home_team, visitor_team]))
    row['HomeTeamWonLast'] = 1 if last_match_winner[teams] == row["Home Team"] else 0
    dataset.ix[index] = row
    winner = row["Home Team"] if row["HomeWin"] else row['Visitor Team']
    last_match_winner[teams] = winner

X_lastwinner = dataset[["HomeTeamRanksHigher", "HomeTeamWonLast"]].values
clf = DecisionTreeClassifier(random_state=14)
scores = cross_val_score(clf, X_lastwinner, y_true, scoring='accuracy')
print("Accuracy: {0:.1f}%".format(np.mean(scores) * 100))

  为了防止决策树过拟合的现象,还可以采用随机森林的方式,方差会减小。

  这里的方差的大小与数据集(训练集)的分割有关系;而偏误与训练集没有关系,与算法有关系,因为,算法都是先假设数据按照正态分布,导致较高的误差。

from sklearn.ensemble import RandomForestClassifier
cls = RandomForestClassifier(random_state=14)
scores = cross_val_score(clf, X_teams, y_true, scoring='accuracy')
print("Accuracy: {0:.1f}%".format(np.mean(scores) * 100))


X_all = np.hstack([X_homehigher, X_teams])
cls = RandomForestClassifier(random_state=14)
scores = cross_val_score(clf, X_all, y_true, scoring='accuracy')
print("Accuracy: {0:.1f}%".format(np.mean(scores) * 100))

  还可以通过GridSearchCV选取最佳的参数

from sklearn.model_selection import GridSearchCV

parameter_space = {
    "max_features":[2,10,'auto'],
    "n_estimators":[100,],
    "criterion":['gini','entropy'],
    'min_samples_leaf':[2,4,6]
}
clf = RandomForestClassifier(random_state=14)
grid = GridSearchCV(clf, parameter_space)
grid.fit(X_all, y_true)
print("Accuracy: {0:.1f}%".format(grid.best_score_ * 100))


print(grid.best_estimator_)
RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
                       criterion='entropy', max_depth=None, max_features=2,
                       max_leaf_nodes=None, max_samples=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=6, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, n_estimators=100,
                       n_jobs=None, oob_score=False, random_state=14, verbose=0,
                       warm_start=False)


以上参考 Robert Layton 的python数据挖掘与数据分析,有兴趣可以看看书。
posted @ 2020-02-05 21:20  为红颜  阅读(1557)  评论(0编辑  收藏  举报