隨機森林預測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數據挖掘與數據分析,有興趣可以看看書。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM