小夥伴們大家好~o( ̄▽ ̄)ブ,我是菜菜,我的開發環境是Jupyter lab,所用的庫和版本大家參考:

Python 3.7.1(你的版本至少要3.4以上

Scikit-learn 0.20.0 (你的版本至少要0.19

Numpy 1.15.3, Pandas 0.23.4, Matplotlib 3.0.1, SciPy 1.1.0

1 概述

1.1 集成演算法概述

集成學習(ensemble learning)是時下非常流行的機器學習演算法,它本身不是一個單獨的機器學習演算法,而是通過在數據上構建多個模型,集成所有模型的建模結果。基本上所有的機器學習領域都可以看到集成學習的身影,在現實中集成學習也有相當大的作用,它可以用來做市場營銷模擬的建模,統計客戶來源,保留和流失,也可用來預測疾病的風險和病患者的易感性。在現在的各種演算法競賽中,隨機森林,梯度提升樹(GBDT),Xgboost等集成演算法的身影也隨處可見,可見其效果之好,應用之廣。

集成演算法的目標集成演算法會考慮多個評估器的建模結果,匯總之後得到一個綜合的結果,以此來獲取比單個模型更好的回歸或分類表現

多個模型集成成為的模型叫做集成評估器(ensemble estimator),組成集成評估器的每個模型都叫做基評估器(base estimator)。通常來說,有三類集成演算法:裝袋法(Bagging),提升法(Boosting)和stacking。

裝袋法的核心思想是構建多個相互獨立的評估器,然後對其預測進行平均或多數表決原則來決定集成評估器的結果。裝袋法的代表模型就是隨機森林。

提升法中,基評估器是相關的,是按順序一一構建的。其核心思想是結合弱評估器的力量一次次對難以評估的樣本進行預測,從而構成一個強評估器。提升法的代表模型有Adaboost和梯度提升樹。

1.2 sklearn中的集成演算法

  • sklearn中的集成演算法模塊ensemble

集成演算法中,有一半以上都是樹的集成模型,可以想見決策樹在集成中必定是有很好的效果。在這堂課中,我們會以隨機森林為例,慢慢為大家揭開集成演算法的神祕面紗。

  • 複習:sklearn中的決策樹

在開始隨機森林之前,我們先複習一下決策樹。決策樹是一種原理簡單,應用廣泛的模型,它可以同時被用於分類和回歸問題。決策樹的主要功能是從一張有特徵和標籤的表格中,通過對特定特徵進行提問,為我們總結出一系列決策規則,並用樹狀圖來呈現這些決策規則。

決策樹的核心問題有兩個,一個是如何找出正確的特徵來進行提問,即如何分枝,二是樹生長到什麼時候應該停下。

對於第一個問題,我們定義了用來衡量分枝質量的指標不純度,分類樹的不純度用基尼係數或信息熵來衡量,回歸樹的不純度用MSE均方誤差來衡量。每次分枝時,決策樹對所有的特徵進行不純度計算,選取不純度最低的特徵進行分枝,分枝後,又再對被分枝的不同取值下,計算每個特徵的不純度,繼續選取不純度最低的特徵進行分枝。

每分枝一層,樹整體的不純度會越來越小,決策樹追求的是最小不純度。因此,決策樹會一致分枝,直到沒有更多的特徵可用,或整體的不純度指標已經最優,決策樹就會停止生長。

決策樹非常容易過擬合,這是說,它很容易在訓練集上表現優秀,卻在測試集上表現很糟糕。為了防止決策樹的過擬合,我們要對決策樹進行剪枝,sklearn中提供了大量的剪枝參數,我們一會兒會帶大家複習一下。

  • sklearn的基本建模流程

我們先來瞭解一下sklearn建模的基本流程。

在這個流程下,隨機森林對應的代碼和決策樹基本一致:

from sklearn.tree import RandomForestClassifier #導入需要的模塊
?
rfc = RandomForestClassifier() #實例化
rfc = rfc.fit(X_train,y_train) #用訓練集數據訓練模型
result = rfc.score(X_test,y_test) #導入測試集,從介面中調用需要的信息

2 RandomForestClassifier

class sklearn.ensemble.RandomForestClassifier(n_estimators=』10』, criterion=』gini』, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=』auto』, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)

隨機森林是非常具有代表性的Bagging集成演算法,它的所有基評估器都是決策樹,分類樹組成的森林就叫做隨機森林分類器,回歸樹所集成的森林就叫做隨機森林回歸器。這一節主要講解RandomForestClassifier,隨機森林分類器。

2.1 重要參數

2.1.1 控制基評估器的參數

參數含義criterion不純度的衡量指標,有基尼係數和信息熵兩種選擇max_depth樹的最大深度,超過最大深度的樹枝都會被剪掉min_samples_leaf一個節點在分枝後的每個子節點都必須包含至少min_samples_leaf個訓練樣本,否則分枝就不會發生min_samples_split一個節點必須要包含至少min_samples_split個訓練樣本,這個節點才允許被分枝,否則分枝就不會發生max_featuresmax_features限制分枝時考慮的特徵個數,超過限制個數的特徵都會被捨棄,默認值為總特徵個數開平方取整min_impurity_decrease限制信息增益的大小,信息增益小於設定數值的分枝不會發生

這些參數在隨機森林中的含義,和我們在上決策樹時說明的內容一模一樣,單個決策樹的準確率越高,隨機森林的準確率也會越高,因為裝袋法是依賴於平均值或者少數服從多數原則來決定集成的結果的。

2.1.2 n_estimators

這是森林中樹木的數量,即基基評估器的數量。這個參數對隨機森林模型的精確性影響是單調的,n_estimators越大,模型的效果往往越好。但是相應的,任何模型都有決策邊界,n_estimators達到一定的程度之後,隨機森林的精確性往往不在上升或開始波動,並且,n_estimators越大,需要的計算量和內存也越大,訓練的時間也會越來越長。對於這個參數,我們是渴望在訓練難度和模型效果之間取得平衡。

n_estimators的默認值在現有版本的sklearn中是10,但是在即將更新的0.22版本中,這個默認值會被修正為100。這個修正顯示出了使用者的調參傾向:要更大的n_estimators。

?
  • 來建立一片森林吧

樹模型的優點是簡單易懂,可視化之後的樹人人都能夠看懂,可惜隨機森林是無法被可視化的。所以為了更加直觀地讓大家體會隨機森林的效果,我們來進行一個隨機森林和單個決策樹效益的對比。我們依然使用紅酒數據集。

  1. 導入我們需要的包

%matplotlib inline
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine

  1. 導入需要的數據集

wine = load_wine()
?
wine.data
wine.target

  1. 複習:sklearn建模的基本流程

from sklearn.model_selection import train_test_split
?
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
?
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)
clf = clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain,Ytrain)
score_c = clf.score(Xtest,Ytest)
score_r = rfc.score(Xtest,Ytest)
?
print("Single Tree:{}".format(score_c)
,"Random Forest:{}".format(score_r)
)

  1. 畫出隨機森林和決策樹在十組交叉驗證下的效果對比

#帶大家複習一下交叉驗證
#交叉驗證:是數據集劃分為n分,依次取每一份做測試集,每n-1份做訓練集,多次訓練模型以觀測模型穩定性的方法
?
rfc_l = []
clf_l = []
?
for i in range(10):
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
rfc_l.append(rfc_s)
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf,wine.data,wine.target,cv=10).mean()
clf_l.append(clf_s)

plt.plot(range(1,11),rfc_l,label = "Random Forest")
plt.plot(range(1,11),clf_l,label = "Decision Tree")
plt.legend()
plt.show()
?
#是否有注意到,單個決策樹的波動軌跡和隨機森林一致?
#再次驗證了我們之前提到的,單個決策樹的準確率越高,隨機森林的準確率也會越高

  1. n_estimators的學習曲線

#####【TIME WARNING: 2mins 30 seconds】#####
?
superpa = []
for i in range(200):
rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1)
rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
superpa.append(rfc_s)
print(max(superpa),superpa.index(max(superpa)))
plt.figure(figsize=[20,5])
plt.plot(range(1,201),superpa)
plt.show()

思考隨機森林用了什麼方法,來保證集成的效果一定好於單個分類器?

2.2 重要屬性和介面

隨機森林中有三個非常重要的屬性:.estimators_,.oob_score_以及.feature_importances_

.estimators_是用來查看隨機森林中所有樹的列表的。

oob_score_指的是袋外得分。隨機森林為了確保林中的每棵樹都不盡相同,所以採用了對訓練集進行有放回抽樣的方式來不斷組成信的訓練集,在這個過程中,會有一些數據從來沒有被隨機挑選到,他們就被叫做「袋外數據」。這些袋外數據,沒有被模型用來進行訓練,sklearn可以幫助我們用他們來測試模型,測試的結果就由這個屬性oob_score_來導出,本質還是模型的精確度。

而.feature_importances_和決策樹中的.feature_importances_用法和含義都一致,是返回特徵的重要性。

隨機森林的介面與決策樹完全一致,因此依然有四個常用介面:apply, fit, predictscore。除此之外,還需要注意隨機森林的predict_proba介面,這個介面返回每個測試樣本對應的被分到每一類標籤的概率,標籤有幾個分類就返回幾個概率。如果是二分類問題,則predict_proba返回的數值大於0.5的,被分為1,小於0.5的,被分為0。傳統的隨機森林是利用袋裝法中的規則,平均或少數服從多數來決定集成的結果,而sklearn中的隨機森林是平均每個樣本對應的predict_proba返回的概率,得到一個平均概率,從而決定測試樣本的分類。

#大家可以分別取嘗試一下這些屬性和介面
?
rfc = RandomForestClassifier(n_estimators=25)
rfc = rfc.fit(Xtrain, Ytrain)
rfc.score(Xtest,Ytest)
?
rfc.feature_importances_
rfc.apply(Xtest)
rfc.predict(Xtest)
rfc.predict_proba(Xtest)

掌握了上面的知識,基本上要實現隨機森林分類已經是沒問題了。從紅酒數據集的表現上來看,隨機森林的效用比單純的決策樹要強上不少,大家可以自己更換其他數據來試試看(比如上週完整課案例中的泰坦尼克號數據)。

相關閱讀

隨機森林在乳腺癌數據上的調參

機器學習中調參的基本思想

SKlearn中分類決策樹的重要參數詳解

決策樹在sklearn中的實現

機器學習之決策樹在sklearn中的實現

機器學習入門之sklearn介紹

推薦閱讀:

相關文章