决策树是一种有监督的机器学习算法,它看起来就像是由一系列节点组成的流程图,其中位
于上层节点的值决定下一步走向哪个节点。
首先是训练阶段,用训练数据构造一棵树。之后再是测试阶段。决策树跟大多数机器学习方法类似,是一种积极学习的算法,在训练阶段完
成模型的创建。
除了设定退出准则外,也可以先创建一棵完整的树,再对其进行修剪,去掉对整个过程没有
提供太多信息的节点。这个过程叫作剪枝(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数据挖掘与数据分析,有兴趣可以看看书。
来源:https://www.cnblogs.com/a-runner/p/12266669.html