雷鋒網(公眾號:雷鋒網)按:本文為 AI 研習社編譯的技術博客,原標題 Random forest interpretation with scikit-learn,作者 ando。
翻譯 | 汪鵬 校對 | 餘杭 整理 | 餘杭
在我以前的一篇文章中,我討論了隨機森林如何變成一個「白箱子」,這樣每次預測就能被分解為各項特徵的貢獻和,即預測=偏差+特徵 1 貢獻+ ... +特徵 n 貢獻。
我的一些代碼包正在做相關工作,然而,大多數隨機森林算法包(包括 scikit-learn)並沒有給出預測過程的樹路徑。因此 sklearn 的應用需要一個補丁來展現這些路徑。幸運的是,從 0.17 版本的 scikit-learn 開始,在 api 中有兩個新增功能,這使得這個過程相對而言比較容易理解 : 獲取用於預測的所有葉子節點的 id ,並存儲所有決策樹的所有節點中間值,而不僅僅只存葉子節點的。通過這些,我們可以提取每個單獨預測的樹路徑,並通過檢查路徑來分解這些預測過程。
閒話少說,代碼託管在 github ,你也可以通過pip install treeinterpreter來獲取。
注意:這需要 0.17 版本的 scikit-learn ,你可以通過訪問 http://scikit-learn.org/stable/install.html#install-bleeding-edge 這個網址來進行安裝。
使用 treeinterpreter 分解隨機森林
首先我們將使用一個簡單的數據集,來訓練隨機森林模型。在對測試集的進行預測的同時我們將對預測值進行分解。
從模型中任意選擇兩個產生不同價格預測的數據點。
對於這兩個數據點,隨機森林給出了差異很大的預測值。為什麼呢?我們現在可以將預測值分解成偏差項(就是訓練集的均值)和單個特徵貢獻值,以便於觀察究竟哪些特徵項造成了差異,差異程度有多大。
我們可以簡單地使用 treeinterpreter 中 predict 方法,向其傳入模型和數據作為參數。
將表格列印出來
各個特徵的貢獻度按照絕對值從大到小排序。我們 觀察到第一個樣本的預測結果較高,正貢獻值主要來自 RM 、LSTAT 和 PTRATIO。第二個樣本的預測值則低得多,因為 RM 實際上對預測值有著很大的負影響,而且這個影響並沒有被其他正效應所補償,因此低於數據集的均值。
但是這個分解真的是對的麼?這很容易檢查:偏差和各個特徵的貢獻值加起來需要等於預測值。
請注意,在把貢獻值相加時,我們需要對浮點數進行處理,所以經過四捨五入處理後的值可能略有不同。
比較兩個數據集
在對比兩個數據集時,這個方法將會很有用。例如:
......
想要繼續閱讀,請移步至我們的AI研習社社區:https://club.leiphone.com/page/TextTranslation/627
更多精彩內容盡在 AI 研習社。
不同領域包括計算機視覺,語音語義,區塊鏈,自動駕駛,數據挖掘,智能控制,程式語言等每日更新。
手機端可以掃描二維碼訪問:雷鋒網雷鋒網
雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。