Lebron個人數據對球隊勝場數的影響(part 3)

yuwei
Jacky’s blog
Published in
Sep 16, 2018
source

前提:

我們已經透過資料爬蟲, 清理, EDA, 特徵工程, 特徵選擇來將資料進行到最後建造模型的步驟了

現在, 我即將帶大家走過各種’classification’的演算法, 初步來讓你們了解, 我在套模型時主要是使用哪一些演算法,也會給各位大略介紹演算法的模型基礎, 而精確的推導, 大家可以去看看我之前有貼過的李弘毅老師的youtube頻道, 本人因為只懂得一些基礎的數學模型, 基本上就是個調包俠, 所以數學方面就不獻醜了

機器學習模型選擇

在這邊我將會就我使用的演算法一一做介紹,

  1. Logistic Regression : 目前很主流的一種演算法, 主要是透過sigmoid function搭配, 就是先透過gradient descent的方式, 找到最佳weight和誤差項, 然後在放入sigmoid function, 如果>0.5 就選1, <0.5 就選0, 如果要看實證的話,可以看我之前證明過的GitHub
  2. SupportVectorClassifier : SVM的其中一種演算法, 利用原本w*x(w為係數). ,如果找到最佳的w, 將點帶入,如果w*x<0(代表在左邊)屬於一種,w*x>0(代表在右邊)屬於另一種, 還必須求出最佳的margin值(距離w*x = 0 的最佳距離k),而supportvector就是指在margin線上的點
  3. BaggingClassifier : 這個演算法可以再放入任何機器學習的演算法, Bagging的全稱為 Bootstrap aggregating, 它會對training data做隨機的取出樣本,再樣本建立後,放入machine learning演算法裡, 做出預測, 最後整體的預測結果就是全部預測的平均, 可以參考這篇不錯的文章
  4. DecisionTreeClassifier : 這邊就是著名的決策樹, 決策樹簡單的意思就是透過每個level有其不同的分類方法,根據切割方法, True就跑到左邊的支(屬於分類1), False就跑到右邊的支(屬於分類0), True裡面可能有多少分類1或多少分類0,在根據下一次的分割再往下走,會越來越精細, 詳細的數學可參考James大神的文章
  5. RandomForestClassifier : 其實就是ensemble後的classifier, 就是我們剛剛提過的BaggingClassifier裡面放DecisionTreeClassifier,Stochastic Gradient Descent , 裡面很多的Decision Tree
  6. KNeighborsClassifier : 是一個懶惰的演算法, KNC無參數, 不需要藉由Gradient Descent來找出最佳的weight, 它是藉由實例不斷的學習才達成更好的效果, 首先要選定K的值和一個distance metric, 在學習某個點上,找出最鄰近的K個點上, 那K個點有其各自的標籤, 並用’多數決’的方式來決定該點是屬於哪個label
  7. GradientBoostingClassifier : 修改誤差值,逐漸增加效能的演算法, 基本上是目前最強的演算法, 很多kaggle比賽最後預測最佳的classifier都是它

現在, 我將把這些演算法一一帶入, 並找出表現最佳的演算法, 針對該演算法進行超參數的遍尋, 就可以找出最佳的預測模型, 這樣你只要給我Lebron的資料, 我就有超過8成的機率將球隊的結果預測出來,那就讓我們開始吧!

首先是要將資料分成‘訓練用資料集’和’測試用資料集,

#將資料分成train test 兩個資料集 資料的25%屬於test
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test=train_test_split(train_removed,labels,test_size=0.25,stratify=labels,random_state=42)

注意, 這裡有一個stratify 是指因為如之前的文章, 可以看到Lebron所屬的球隊勝率是勝>敗的, 所以會有比例不均的現象, 強調stratify=labels, 會使sklearn辨識出label裡面的0(贏)和1(輸), 分別取出25%組成test,剩下的各別75%為train資料

那要用什麼指標來評估演算法是否是最好的, 我們才能在進行下一步的hyperameter tuning, 我們在這使用Part1 使用的f1_score

from sklearn.metrics import f1_score, make_scorer
score=make_scorer(f1_score,average='macro')

現在設定好了, 開始進行導入machine learning algorithms

各位可以看到, 因為f1 score 是數值越高越好, 所以主要就是LogisticRegression和GradientBoostingClassifier在爭奪下一個hyperparameter tuning, 在這邊我會選擇GBC當做較好的演算法,因為其標準差較小, 較不會使得模型有較大的歧異, 而因為在GradientBoostingClassifier其運算效能不比lightGBM還來得好, 而其運算結果也大略相同, 但在這裡我還是會先帶大家用GBM做GridSearch找最佳參數,

Grid Search:是指先訂定所要尋找的參數範圍,去針對參數範圍去做遍尋, 找出對model metrics score最高或最低的那個參數

Random Search: 就是字面上的意思, 隨機搜索, 找出每個的score,並回傳,如果下一個比上一個好,就保留,下一個沒有比較好,也不影響目前找到的最佳解

這是GBC的所有參數, 我們會針對‘loss’,’n_estimators’,’max_depth’,’min_samples_leaf’,’min_samples_split’,’max_features’ 等超參數項去做Random Search

其意義為找出要跑25種不同的參數, 並cross_validation 4次

大家可以看一看在random search時候怎麼運行的

Ok! 跑完了這麼多的Cross validation, 我們可以看看每次平均的test_score

random_results=pd.DataFrame(random_cv.cv_results_).sort_values(by='mean_test_score',ascending=False)
random_results.head()

現在要找到在mean_test_score最高的那一個參數,

random_cv.best_estimator_

好了,這就是在我給定的超參數的範圍內最好的hyperparameter, 接下來,我會特別針對’n_estimators’(決策樹的個數)和’learning_rate’去做再一次的gridsearch

跑到我的電腦都開始熱起來了

random_model=pd.DataFrame(grid_search.cv_results_).sort_values(by='mean_test_score',ascending=False)
random_model.head()

接下來,要展示在不同的test train 的score在圖上根據n_estimators的增加所變動的幅度

因為test error的變化幅度過小,所以在圖上看不太出來

查看f1_score(這是我們評估模型的metrics,我把它更尚未作修改前的GradientBoostingClassifier去做比較,有沒有比之前的好

y_pred_default=default_model.predict(X_test)
y_pred_final=final_model.predict(X_test)
print('Default model performance on the test set: f1= %0.4f' %f1_score(y_test,y_pred_default))
print('Final model performance on the test set: f1= %0.4f' %f1_score(y_test,y_pred_final))

…竟然沒有比較好,沒關係, 我們再繼續檢查下去,針對test資料集的預測能力是誰比較好呢?

print(sum(y_test==y_pred_default)/len(y_test))
print(sum(y_test==y_pred_final)/len(y_test))

又輸!我願意給我辛苦調參數的final_model最後一次機會,這次我採用了交叉驗證的方式看準確率(平均和標準差),這是最具象徵意義的檢驗方法之一

default_cross_validation=cross_val_score(default_model,train_removed,labels,scoring='accuracy',cv=20)
print(default_cross_validation)
print(np.mean(np.array(default_cross_validation)))
print(np.std(np.array(default_cross_validation)))
final_cross_validation=cross_val_score(final_model,train_removed,labels,scoring='accuracy',cv=20)
print(final_cross_validation)
print(np.mean(np.array(final_cross_validation)))
print(np.std(np.array(final_cross_validation)))

皇天不負苦心人,在20次拿出資料的不同部分去做交叉驗證後,得到final model是平均預測能力是高於原始的model,也間接證明了我們調參數有成功

結論:

這一章帶領著大家走過機器學習的各種演算法, 而在超參數的tuning當中,其實如同feature engineering 和feature selection 一樣都有automated的方法, 我也會在之後的文章帶領著大家使用那個方法,下一篇,我會就我得到數據和模型,跟你們報告我對模型的解讀和做資料科學最最最重要的部分,就是報告給長官聽(就是你們)!

謝謝,如果有什麼都可以跟我一起討論,我的email是jacky308082@gmail.com

--

--

yuwei
Jacky’s blog

Curious Data scientist. Strong Lebron James’s fan. #StriveForGreatness #JustAKidFromTaiwan https://www.linkedin.com/in/yu-wei-chung/