Machine-Learning

在 Scikit-learn 中對一組特徵求和特徵重要性

  • November 2, 2017

我已經使用一組特徵(~100)構建了一個隨機森林,我想比較兩個特徵子集的特徵重要性。在 scikit-learn 中,與提供無界 MeanDecreaseGini 的 R 相比,所有特徵的特徵重要性總和為 1,請參閱相關線程R 中隨機森林分類中一組預測變量的相對重要性。我的問題是,是否可以簡單地總結一組特徵的特徵重要性,還是應該類似於 R 解決方案並使用一些加權平均值?

我已經使用基尼雜質作為分割標準,而 RF 如何使用該度量來估計特徵重要性對我來說還不清楚。

TL,DR:是的,這對於對一組特徵的重要性求和是完全正確的。

在 scikit-learn 中,節點的重要性 $ j $ 在單個決策樹中計算(源代碼)為: $$ ni_j = w_j C_j - w_{left(j)}C_{left(j)}- w_{right(j)}C_{right(j)} $$ 在哪裡 $ w_j $ 是節點中的加權樣本數 $ j $ 作為總加權樣本數的一部分, $ C_j $ 是節點中的雜質 $ j $ , 和 $ left(j) $ 和 $ right(j) $ 是其各自的子節點。

那麼特徵的特徵重要性 $ i $ 計算為: $$ fi_i = \frac{\sum_{j : \text{node j splits on feature i}} ni_j}{\sum_{j \in \text{all nodes}} ni_j} $$ 在 RandomForest 或 GradientBoosting 中,然後在所有樹上平均特徵重要性(源代碼)。

簡而言之,一個特徵的(未歸一化的)特徵重要性是相應節點的重要性之和。因此,如果您採用一組特徵,則將這組特徵的重要性表示為所有相應節點的重要性之和是完全一致的。後者正好等於單個特徵重要性的總和。並且歸一化分母對於所有特徵都是相同的,因此不會改變相對重要性。

一個簡單的例子:

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
iris = load_iris()
rf = RandomForestClassifier(random_state=42).fit(iris.data, iris.target)
print(rf.feature_importances_)
sepal_features = [0, 1]
petal_features = [2, 3]
print(sum(rf.feature_importances_[sepal_features]))
print(sum(rf.feature_importances_[petal_features]))

它將給出以下輸出:

[ 0.1292683   0.01582194  0.4447404   0.41016935]
0.145090242144
0.854909757856

由此,您可以判斷花瓣特徵對隨機森林的預測貧困率有 85% 的貢獻,而萼片特徵僅佔 15%。如果您的特徵沒有太大的相關性,那麼這些數字是有意義的。

引用自:https://stats.stackexchange.com/questions/311488

comments powered by Disqus