博客地址:https://blog.csdn.net/CoderPai/article/details/97646151點擊閱讀原文,更好的閱讀體驗
CoderPai 是一個專注於人工智慧在量化交易應用的算法實戰平臺,主要關注人工智慧在量化交易上面的應用。如果你對人工智慧感興趣,請快快關注 「CoderPai」 微信號(coderpai)吧。
(一)機器學習中的集成學習入門
(二)bagging 方法
(三)使用Python進行交易的隨機森林算法
(四)Python中隨機森林的實現與解釋
(五)如何用 Python 從頭開始實現 Bagging 算法
(六)如何利用Python從頭開始實現隨機森林算法
(七)AdaBoost 簡介
(八)Python 中的 AdaBoost 分類器實例
(九)AdaBoost 中參數對於決策邊界複雜度分析
(十)stacking 簡介(當前文章)
集成學習通過組合多種模型來改善機器學習的結果,與單一的模型相比,這種方法允許產生更好的預測性能。這就是為什麼在許多著名的機器學習競賽中,集成學習方法總是被優先考慮。集成學習屬於元算法,即結合數個「好而不同」的機器學習技術,形成一個預測模型,以此來降方差(bagging),減偏差(boosting),提升預測準確性(stacking)。今天,我們來學習的就是其中一個技術 stacking 方法。
如果你的模型沒有達到 50% 的正確率,並且你經常發現自己將機器學習模型調整到凌晨,但是你又只能提高一點點的性能。那麼,這篇文章非常適合你。
什麼是模型堆疊?模型堆疊是一種數據科學基礎方法,它依賴於多個模型的結果,即將多個弱學習器的結果進行組織,往往勝過單一的強模型。過去幾年中大多數主要 kaggle 比賽的獲勝者在最終獲獎模型中都使用了模型堆疊。
堆疊模型類比於現實世界的例子,就比如商業團隊,科學實驗,或者體育團隊。如果團隊中的所有成員都非常擅長完成同樣的任務,那麼團隊就會摧毀任何需要這個任務的挑戰。
在現實中我們如何實踐?下面你可以看到一個最近的主要 kaggle 比賽的最佳獲獎模型的例子:
注意:擁有足夠數量的數據以執行強大的模型堆棧非常重要。為了避免過度擬合,你需要在每個堆疊(訓練階段)進行交叉驗證,並將一些數據作為測試階段的數據,在訓練集和測試集上面保證模型的性能之間沒有太大的差異。
初始階段:你運行各種不同的獨立模型,並花一些時間分析其各自的性能指標,並考慮某些模型可能比其他模型做的更好的地方。
階段一集成:你選擇這些模型的小團隊,確保其預測係數之間的相關性較低,以確保你的 stacked model 允許較弱連結之間的大量交叉學習。你可以獲取預測的平均值並構建一個新表,該表將在第 2 階段輸入一個新的較小的模型團隊。
階段二集成:你運行新的模型集合,它將使用階段 1 中的平均預測度量作為要素,以便了解有關原始變量之間關係的新信息。
階段三集成:你重複相同的過程,將階段二中的模型的平均預測提供給最終的「元學習器」模型,該模型應該經過精心挑選,以適應你嘗試解決的問題類型。在上面的示例中,比賽者使用線性回歸作為最終模型,因為這可能是在初始階段作為獨立模型表現最佳的模型之一。
我們都應該試試嗎?絕對!!對於我的第一次模型堆疊實驗,我決定擴展我最新的數據科學項目,這是一個自然語言處理模型,旨在從歌詞中預測歌曲的類型。對於該項目,我們預處理了來自八種不同類型的 16000 首歌詞列表:嘻哈,鄉村,流行,搖滾,金屬,電子,爵士和R&B。我們確保在我們的數據集中包含每種類型的 2000 首歌曲,以避免類不平衡的問題。第一步是運行各種基本模型,其預測方法之間的相關性較低,以便能夠相應的構建我們的模型堆疊塊,請看下面的結果:
接下來,我們決定採用前3個模型並通過廣泛的 GridSearch 進行一些超參數優化,以便了解我們的頂級獨立模型可以實現的最高精度。結果如下:
正如你從下面的圖表中看到的那樣,我們的最佳表現達到了 50%,咋一看似乎不是很高,但考慮到我們的模型視圖預測一首歌屬於哪種類型。而我們這個準確性已經是隨機猜測的四倍了。這意味著大約一半的時間,我們的模型準確的預測了一首歌的類型,僅基於該歌曲的歌詞,並且在超過3000首歌曲的測試集上達到了 50% 的測試準確度,這個結果已經相當好了。
首先,我選擇結合併平均我的三個最弱學習器的預測:隨機森林,adaboost和KNN分類器,並構建一個新的數據框架,我可以提供給我們最強大的學習器。代碼如下:
上表中的每一列是八個類型中的每一個的平均預測係數,並且每一行是具有對應的真實類型的歌詞,存儲在作為類標籤列表的單獨的 y 變量中。
接下裡,我將數據分為訓練集和測試集,並且運行模型堆棧的第二階段,我的強學習器:GradientBoost 和樸素貝葉斯,使用來自弱學習器的組合預測來生成一組新的預測。然後,我將第二階段的預測結果合併到一個最終的數據框架中,我希望將其提供給我的最終元學習器:NN。
我選擇使用神經網絡進行模型堆疊的最後階段,因為 NN 往往在多分類問題上表現很好,並且 NN 非常善於找到隱藏特徵並找出依賴變量和自變量之間的複雜關係,我使用 softmax 作為輸出層激活函數,因為我們師徒預測八個類別,最終結果如下:
最後的想法當我在我最初的 NLP 項目中看到這個模型堆疊實驗的結果時,我是非常驚訝的,80% 的正確率是在測試數據集上面產生的,該測試數據由 NN 模型以前從未見過的 3600 首歌詞組成。交叉驗證的訓練準確率達到 86% 也是非常令人印象深刻的,讓我特別高興的是訓練集和測試集上面沒有顯著差異,這是非常好的。
我多次檢查我的代碼和數學,以確保我的交叉驗證和訓練/測試在每個階段都有效,因為性能提升 30% 似乎有點不太可能。但我找不到任何我的代碼中的錯誤。因此,我對使用模型堆疊的第一次嘗試感到非常高興。
作者:chen_h
微信號&QQ:862251340