簡體   English   中英

回歸分析,例如量化隨機森林中變量的重要性

[英]Regression like quantification of the importance of variables in random forest

是否有可能量化變量的重要性,以弄清觀察結果落入一類的可能性。 類似於Logistic回歸。

例如:如果我具有以下自變量1)一個人的貓數2)一個人的狗數3)一個人的雞數

我的因變量是:一個人是否是PETA的一部分

是否可以說這樣的話:“如果該人收養的貓多於其現有動物的范圍,則其成為PETA的幾率增加了0.12”。

我目前正在使用以下方法來實現此特定場景:1)使用訓練數據構建隨機森林模型2)預測客戶落入某一特定類別(Peta與非Peta)的概率3)人為地增加貓的數量每個觀察點擁有1的4)預測客戶落入兩個類別之一的新概率5)(4)的概率與(2)的概率之間的平均變化是一個人的概率平均增加已經收養了一只貓。

這有意義嗎? 我沒有想到的方法上有什么缺陷嗎? 有沒有更好的方法可以做到這一點?

如果您使用的是scikitlearn,則可以通過訪問已擬合的RandomForestClassifier的feature_importance_屬性輕松地做到這一點。 根據SciKitLearn:

用作樹中決策節點的特征的相對等級(即深度)可用於評估該特征相對於目標變量的可預測性的相對重要性。 在樹的頂部使用的特征有助於更大比例的輸入樣本的最終預測決策。 他們所貢獻的樣本的預期比例因此可以用作特征相對重要性的估計。 通過在幾棵隨機樹上平均那些預期的活動率,可以減少這種估計的方差並將其用於特征選擇。

屬性feature_importance_存儲樹中每個特征的平均深度。 這是一個例子。 讓我們從導入必要的庫開始。

# using this for some array manipulations
import numpy as np
# of course we're going to plot stuff!
import matplotlib.pyplot as plt

# dummy iris dataset
from sklearn.datasets import load_iris
#random forest classifier
from sklearn.ensemble import RandomForestClassifier

一旦有了這些,我們將加載虛擬數據集,定義分類模型並將數據擬合到模型中。

data = load_iris()
​
# we're gonna use 100 trees
forest = RandomForestClassifier(n_estimators = 100)
​
# fit data to model by passing features and labels
forest.fit(data.data, data.target)

現在,我們可以根據要素能夠將數據分類到不同目標的程度,使用要素重要性屬性來為其評分。

# find importances of each feature
importances = forest.feature_importances_
# find the standard dev of each feature to assess the spread 
std = np.std([tree.feature_importances_ for tree in forest.estimators_],
             axis=0)
​
# find sorting indices of importances (descending)
indices = np.argsort(importances)[::-1]
​
# Print the feature ranking
print("Feature ranking:")
​
for f in range(data.data.shape[1]):
    print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))

功能排名:1.功能2(0.441183)2.功能3(0.416197)3.功能0(0.112287)4.功能1(0.030334)

現在,我們可以將每個功能的重要性繪制為條形圖,並確定是否值得保留所有功能。 我們還繪制了誤差線以評估其重要性。

plt.figure()
plt.title("Feature importances")
plt.bar(range(data.data.shape[1]), importances[indices],
       color="b", yerr=std[indices], align="center")
plt.xticks(range(data.data.shape[1]), indices)
plt.xlim([-1, data.data.shape[1]])
plt.show()

功能重要性的條形圖

我道歉。 在您提到要發表什么樣的陳述時,我沒有注意到。 我假設您的響應變量為1或零。 您可以嘗試這樣的事情:

  1. 在數據上擬合線性回歸模型。 這實際上並不能為您提供最准確的擬合,但是獲取所需的信息將非常可靠。
  2. 用原始輸入找到模型的響應。 (很可能不會是一或零)
  3. 像您在問題中建議的那樣,人為地更改輸入,並找到原始數據和修改后的數據的輸出差異。

也可以通過邏輯回歸進行嘗試。 它實際上取決於您的數據及其分布方式,以找到哪種回歸效果最好。 您絕對必須使用回歸來找到輸入變化帶來的概率變化。

您甚至可以嘗試使用具有回歸/線性輸出層的單層神經網絡來執行相同的操作。 如果數據不太可能是線性的,則添加圖層或非線性激活函數。

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM