機器學習, 自適應升壓演算法的直觀解釋及其與基於其他決策樹的機器學習演算法的差異
索爾·多比拉斯
8分鐘閱讀
> Image by author.
介紹機器學習演算法的數量隨著時間的推移而不斷增加。如果您想成為一名成功的資料科學家,則必須瞭解它們之間的區別。
這個故事是系列文章的一部分,在本文中,我將深入研究不同的演算法,它們如何工作以及如何在Python中構建它們。
故事涵蓋了以下主題:單個決策樹,隨機森林和AdaBoost之間的模型預測的視覺比較。AdaBoost與其他演算法有何不同的說明Python程式碼示例決策樹與隨機森林與AdaBoost讓我們開始比較這三個模型中的每一個模型的預測機率面。他們都使用相同的澳大利亞天氣資料:
目標(也稱為因變數):“明天雨”。可能的值:1(是,下雨)和0(否,不下雨);特徵(又稱自變數):今天是“下午3點的溼度”,今天是“風速”。注意,我們僅使用兩個特徵使我們能夠輕鬆地視覺化結果。以下是模型預測平面。請注意,如果您想複製這些圖形,則可以在本故事的最後一節中使用Python程式碼。
1.Decision Tree (1 tree, max_depth=3);
2.Random Forest (500 trees, max_depth=3);
3.AdaBoost (50 trees, max_depth=1).
Images by author.
解釋讓我們來解釋一下視覺化,看看它們如何告訴我們這些演算法的差異。上圖中的z軸表示明天下雨的可能性。同時,白色細線是決策邊界,即下雨的機率= 0.5。
在進入AdaBoost之前,我們現在將快速回顧CART和Random Forest。
1.單一決策樹(CART)CART是標準決策樹演算法的首字母縮寫,代表分類樹和迴歸樹。在此示例中,我們構建了一個決策樹,決策樹深入3層,有8個葉子。這是供參考的確切樹:
> CART decision tree. Image by author.
這棵樹上的每一片葉子都給我們明天下雨的可能性,這是下雨的案例數與該葉子內觀察總數之間的比率。例如,左下角的葉子使我們明天下雨的可能性為6%(2,806 / 46,684)。
每片葉子對應於3D預測圖中的平坦表面,而樹中的拆分是階躍變化。請參見下圖。
> CART decision tree and its corresponding predictions. Image by author.
正如您所看到的,這是一棵非常簡單的樹,給我們提供了8個不同的機率。其中5個葉子導致明天沒有下雨的預測(機率<0.5),而剩餘的3葉表明明天將下雨(機率> 0.5)。
2.隨機森林首先要注意的是,在我們的案例中,Random Forest對其基本估算器使用相同的CART演算法。但是,有一些主要差異:
它構建許多隨機樹,並結合每個單獨樹的預測以生成最終預測。它使用載入程式(帶替換的取樣)從原始資料建立許多采樣。這些樣本保持相同大小,但觀測值分佈不同。最後,它使用特徵隨機性來最小化樹之間的相關性。這是透過在每個節點拆分時僅使演算法的可用隨機子集完成的。最後,Random Forest建立了許多樹(在我們的示例中為500棵),並根據每棵樹的預測來計算總體機率。這就是為什麼與單棵樹相比,預測平面表面更平滑的原因(即,它具有許多小步長而不是一些大步長)。
> Random Forest prediction plane. Image by author.
3. AdaBoost最後,我們得出了這個故事的主題。
像隨機森林一樣,我們使用CART作為自適應升壓演算法內的基礎估計。但是,如果需要,Adaboost也可以使用其他估算器。
AdaBoost的核心原理是使一系列弱學習者(例如決策樹樁)適合重複修改的資料版本。決策樹樁是僅深一層的決策樹,即它僅包含一個根節點和兩個(或更多)葉子。這是AdaBoost模型中3個獨立決策樹的示例:
> Three decision stumps. Image by author.
與隨機森林(Random Forest)相似,所有弱學習者(在這種情況下為樹樁)的預測都透過加權多數投票進行組合,以得出最終預測。但是,主要區別在於這些弱學習者的產生方式。
增強迭代包括將權重應用於每個訓練樣本(觀察值)。最初,這些權重在所有觀測值中都是相等的,因此第一步是訓練原始資料的弱學習者。
將此連結到我們的示例中,這意味著第一個決策stump(第一個拆分)與使用單個決策樹方法的方法相同:
> Single Decision Tree vs. the first decision stump in AdaBoost. Image by author.
對於每個連續的迭代,將分別修改樣本權重,並將學習演算法重新應用於重新加權的資料。在上一步中錯誤預測的那些訓練示例的權重增加了。同時,正確預測的物件的權重降低了。因此,每個隨後的弱學習者因此不得不專注於先前的學習者遺漏的例子。
最後,將所有弱學習者組合成最終預測會生成預測的“更扁平”分佈。這是因為該演算法故意降低了最可信示例的權重,並將重點轉移到了難以分類的示例上。結果,我們在下圖中顯示了模型預測。
> AdaBoost prediction plane. Image by author.
請注意,您新增的學習者(樹樁)越弱,預測分佈就變得越“扁平”。
預測分佈視覺化預測分佈的另一種方法是使用簡單的頻率折線圖。不出所料
單個決策樹幾乎沒有間隔預測。隨機森林顯示的預測分佈更加均勻。AdaBoost的所有預測都位於決策邊界附近(為0.5)。表現雖然這三種方法產生了非常不同的機率分佈,但最終的分類結果卻非常相似。可以用許多方法來評估效能,但是為了簡單起見,我僅在此處(在測試樣本上)顯示準確性:
單一決策樹:82.843%隨機森林:83.202%Adaboost:83.033%儘管可以透過一些附加的超引數最佳化來稍微提高效能,但上述結果的相似性告訴我們,我們已經非常接近提取所用特徵中包含的最大資訊。
AdaBoost侷限性AdaBoost產生的“平坦”機率分佈是其主要限制。根據您的用例,可能對您來說不是問題。假設您只關心分配正確的類別,那麼預測機率就不太重要了。
但是,如果您更關心機率本身,則可能要使用隨機森林,它為您提供了9%或78%之類的機率預測,如上面的降雨預測模型所示。這與AdaBoost相反,後者的所有預測都接近50%。
Python部分現在我們知道了AdaBoost的工作原理,並且瞭解了它與其他基於樹的建模方法的區別,讓我們建立一個模型。
設定我們將使用以下資料和庫:
來自卡格勒的澳大利亞天氣資料Scikit-learn庫,用於將資料分為訓練樣本,建立AdaBoost模型和模型評估進行資料視覺化Pandas和Numpy用於資料處理讓我們匯入所有庫:
然後,我們從Kaggle獲得了澳大利亞的天氣資料,您可以透過以下連結下載該資料:https://www.kaggle.com/jsphyg/weather-dataset-rattle-package。
我們提取資料並匯出一些新變數以供模型使用。
> A snippet of Kaggle’s Australian weather data with some modifications. Image by author.
接下來,讓我們按照以下步驟構建模型:
步驟1 —選擇模型特徵(自變數)和模型目標(因變數)第2步-將資料分為訓練樣本和測試樣本步驟3 —設定模型引數並訓練(擬合)模型步驟4 –使用我們的模型預測火車上的班級標籤並測試資料步驟5 —生成模型摘要統計資訊上面的程式碼生成以下輸出,總結了模型的效能。
> AdaBoost model performance. Image by author.
與訓練資料相比,該模型在測試資料上具有相似的效能,泛化效果很好。估計量為50,這意味著最終模型由50個不同的決策樹組成。
最後,正如所承諾的那樣,這裡是生成3D預測平面圖的程式碼:
乾杯!sauldobilas.