決策樹是一種有監督的機器學習算法,它看起來就像是由一系列節點組成的流程圖,其中位
於上層節點的值決定下一步走向哪個節點。
首先是訓練階段,用訓練數據構造一棵樹。之后再是測試階段。決策樹跟大多數機器學習方法類似,是一種積極學習的算法,在訓練階段完
成模型的創建。
除了設定退出准則外,也可以先創建一棵完整的樹,再對其進行修剪,去掉對整個過程沒有
提供太多信息的節點。這個過程叫作剪枝(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數據挖掘與數據分析,有興趣可以看看書。