隨機貼片與隨機子空間
BaggingClassifier也支持采樣特征。它被兩個超參數max_features和bootstrap_features控制。他們的工作方式和max_samples和bootstrap一樣,但這是對于特征采樣而不是實例采樣。因此,每一個分類器都會被在隨機的輸入特征內進行訓練。
當你在處理高維度輸入下(例如圖片)此方法尤其有效。對訓練實例和特征的采樣被叫做隨機貼片。保留了所有的訓練實例(例如bootstrap=False和max_samples=1.0),但是對特征采樣(bootstrap_features=True并且/或者max_features小于 1.0)叫做隨機子空間。
采樣特征導致更多的預測多樣性,用高偏差換低方差。
隨機森林
正如我們所討論的,隨機森林是決策樹的一種集成,通常是通過 bagging 方法(有時是 pasting 方法)進行訓練,通常用max_samples設置為訓練集的大小。與建立一個BaggingClassifier然后把它放入DecisionTreeClassifier相反,你可以使用更方便的也是對決策樹優化夠的RandomForestClassifier(對于回歸是RandomForestRegressor)。接下來的代碼訓練了帶有 500 個樹(每個被限制為 16 葉子結點)的決策森林,使用所有空閑的 CPU 核:
>>>from sklearn.ensemble import RandomForestClassifier>>>rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1) >>>rnd_clf.fit(X_train, y_train)>>>y_pred_rf = rnd_clf.predict(X_test)
除了一些例外,RandomForestClassifier使用DecisionTreeClassifier的所有超參數(決定數怎么生長),把BaggingClassifier的超參數加起來來控制集成本身。
隨機森林算法在樹生長時引入了額外的隨機;與在節點分裂時需要找到最好分裂特征相反(詳見第六章),它在一個隨機的特征集中找最好的特征。它導致了樹的差異性,并且再一次用高偏差換低方差,總的來說是一個更好的模型。以下是BaggingClassifier大致相當于之前的randomforestclassifier:
>>>bag_clf = BaggingClassifier(DecisionTreeClassifier(splitter="random", max_leaf_nodes=16),n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1)
極端隨機樹
當你在隨機森林上生長樹時,在每個結點分裂時只考慮隨機特征集上的特征(正如之前討論過的一樣)。相比于找到更好的特征我們可以通過使用對特征使用隨機閾值使樹更加隨機(像規則決策樹一樣)。
這種極端隨機的樹被簡稱為Extremely Randomized Trees(極端隨機樹),或者更簡單的稱為Extra-Tree。再一次用高偏差換低方差。它還使得Extra-Tree比規則的隨機森林更快地訓練,因為在每個節點上找到每個特征的最佳閾值是生長樹最耗時的任務之一。
你可以使用 sklearn 的ExtraTreesClassifier來創建一個Extra-Tree分類器。他的 API 跟RandomForestClassifier是相同的,相似的,ExtraTreesRegressor跟RandomForestRegressor也是相同的 API。
我們很難去分辨ExtraTreesClassifier和RandomForestClassifier到底哪個更好。通常情況下是通過交叉驗證來比較它們(使用網格搜索調整超參數)。
特征重要度
最后,如果你觀察一個單一決策樹,重要的特征會出現在更靠近根部的位置,而不重要的特征會經常出現在靠近葉子的位置。因此我們可以通過計算一個特征在森林的全部樹中出現的平均深度來預測特征的重要性。sklearn 在訓練后會自動計算每個特征的重要度。你可以通過feature_importances_變量來查看結果。例如如下代碼在 iris 數據集(第四章介紹)上訓練了一個RandomForestClassifier模型,然后輸出了每個特征的重要性。看來,最重要的特征是花瓣長度(44%)和寬度(42%),而萼片長度和寬度相對比較是不重要的(分別為 11% 和 2%):
>>> from sklearn.datasets import load_iris >>> iris = load_iris() >>> rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1) >>> rnd_clf.fit(iris["data"], iris["target"]) >>> for name, score in zip(iris["feature_names"], rnd_clf.feature_importances_): >>> print(name, score) sepal length (cm) 0.112492250999sepal width (cm) 0.0231192882825 petal length (cm) 0.441030464364 petal width (cm) 0.423357996355
相似的,如果你在 MNIST 數據及上訓練隨機森林分類器(在第三章上介紹),然后畫出每個像素的重要性,你可以得到圖 7-6 的圖片。
隨機森林可以非常方便快速得了解哪些特征實際上是重要的,特別是你需要進行特征選擇的時候。
提升
提升(Boosting,最初稱為假設增強)指的是可以將幾個弱學習者組合成強學習者的集成方法。對于大多數的提升方法的思想就是按順序去訓練分類器,每一個都要嘗試修正前面的分類。現如今已經有很多的提升方法了,但最著名的就是Adaboost(適應性提升,是Adaptive Boosting的簡稱) 和Gradient Boosting(梯度提升)。讓我們先從Adaboost說起。
Adaboost
使一個新的分類器去修正之前分類結果的方法就是對之前分類結果不對的訓練實例多加關注。這導致新的預測因子越來越多地聚焦于這種情況。這是Adaboost使用的技術。
舉個例子,去構建一個 Adaboost 分類器,第一個基分類器(例如一個決策樹)被訓練然后在訓練集上做預測,在誤分類訓練實例上的權重就增加了。第二個分類機使用更新過的權重然后再一次訓練,權重更新,以此類推(詳見圖 7-7)
圖 7-8 顯示連續五次預測的 moons 數據集的決策邊界(在本例中,每一個分類器都是高度正則化帶有 RBF 核的 SVM)。第一個分類器誤分類了很多實例,所以它們的權重被提升了。第二個分類器因此對這些誤分類的實例分類效果更好,以此類推。右邊的圖代表了除了學習率減半外(誤分類實例權重每次迭代上升一半)相同的預測序列。你可以看出,序列學習技術與梯度下降很相似,除了調整單個預測因子的參數以最小化代價函數之外,AdaBoost 增加了集合的預測器,逐漸使其更好。
一旦所有的分類器都被訓練后,除了分類器根據整個訓練集上的準確率被賦予的權重外,集成預測就非常像Bagging和Pasting了。
序列學習技術的一個重要的缺點就是:它不能被并行化(只能按步驟),因為每個分類器只能在之前的分類器已經被訓練和評價后再進行訓練。因此,它不像Bagging和Pasting一樣。
讓我們詳細看一下 Adaboost 算法。每一個實例的權重wi初始都被設為1/m第一個分類器被訓練,然后他的權重誤差率r1在訓練集上算出,詳見公式 7-1。
公式7-1:第j個分類器的權重誤差率
其中是第j個分類器對于第i實例的預測。
分類器的權重j 隨后用公式 7-2 計算出來。其中η是超參數學習率(默認為 1)。
分類器準確率越高,它的權重就越高。如果它只是瞎猜,那么它的權重會趨近于 0。然而,如果它總是出錯(比瞎猜的幾率都低),它的權重會使負數。
公式 7-2:分類器權重
接下來實例的權重會按照公式 7-3 更新:誤分類的實例權重會被提升。
公式7-3 權重更新規則
對于i=1, 2, ..., m
隨后所有實例的權重都被歸一化(例如被整除)
最后,一個新的分類器通過更新過的權重訓練,整個過程被重復(新的分類器權重被計算,實例的權重被更新,隨后另一個分類器被訓練,以此類推)。當規定的分類器數量達到或者最好的分類器被找到后算法就會停止。
為了進行預測,Adaboost 通過分類器權重j 簡單的計算了所有的分類器和權重。預測類別會是權重投票中主要的類別。(詳見公式 7-4)
公式7-4: Adaboost 分類器
其中N是分類器的數量。
sklearn 通常使用 Adaboost 的多分類版本SAMME(這就代表了分段加建模使用多類指數損失函數)。如果只有兩類別,那么SAMME是與 Adaboost 相同的。如果分類器可以預測類別概率(例如如果它們有predict_proba()),如果 sklearn 可以使用SAMME叫做SAMME.R的變量(R 代表“REAL”),這種依賴于類別概率的通常比依賴于分類器的更好。
接下來的代碼訓練了使用 sklearn 的AdaBoostClassifier基于 200 個決策樹樁 Adaboost 分類器(正如你說期待的,對于回歸也有AdaBoostRegressor)。一個決策樹樁是max_depth=1的決策樹-換句話說,是一個單一的決策節點加上兩個葉子結點。這就是AdaBoostClassifier的默認基分類器:
>>>from sklearn.ensemble import AdaBoostClassifier>>>ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200,algorithm="SAMME.R", learning_rate=0.5) >>>ada_clf.fit(X_train, y_train)
如果你的 Adaboost 集成過擬合了訓練集,你可以嘗試減少基分類器的數量或者對基分類器使用更強的正則化。
-
分類器
+關注
關注
0文章
152瀏覽量
13179 -
數據集
+關注
關注
4文章
1208瀏覽量
24689 -
決策樹
+關注
關注
3文章
96瀏覽量
13548
原文標題:【翻譯】Sklearn 與 TensorFlow 機器學習實用指南 —— 第7章 集成學習和隨機森林 (中)
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論