Python Scikit学习-如何从RandomForestRegressor获得非标准化重要性分数

Python Scikit学习-如何从RandomForestRegressor获得非标准化重要性分数,python,scikit-learn,random-forest,Python,Scikit Learn,Random Forest,我想从RandomForestRegressionor得到非标准化的重要性分数 拟合回归器后,我可以访问包含标准化重要性得分的特征重要性 为了得到非标准化的分数,我尝试了这个,但没有成功。我无法获得正确的值: arr = [] for i in range(0,len(clf.feature_importances_)): arr.append(np.array(clf.feature_importances_)[0:i].sum()) non_normalized = clf.featu

我想从RandomForestRegressionor得到非标准化的重要性分数

拟合回归器后,我可以访问包含标准化重要性得分的
特征重要性

为了得到非标准化的分数,我尝试了这个,但没有成功。我无法获得正确的值:

arr = []
for i in range(0,len(clf.feature_importances_)):
  arr.append(np.array(clf.feature_importances_)[0:i].sum())

non_normalized = clf.feature_importances_*arr

是否有禁用规范化的选项?

由于随机林是一种基于决策树的集成方法,因此您可以使用RandomForestRegressionor的属性
clf.estimators\uu
访问底层决策树。通过树列表,您可以访问每个决策树的功能重要性:

feat\u imp=[tree.feature\u importances\u用于clf.estimators中的树]

重要度总是被标准化为总和为1,即使是在您向下查看每个决策树回归器时,例如:

import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor

boston = load_boston()

X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target

X_train, X_test,y_train, y_test = train_test_split(X,y,test_size=0.3)

rf = RandomForestRegressor(n_estimators=100)
rf.fit(X_train, y_train)
您可以看到,在每个树中,重要性值都已标准化:

[x.feature_importances_.sum() for x in rf.estimators_]
 
[1.0,
0.9999999999999999,
 1.0,
 1.0,
 0.9999999999999999,
 1.0,
 0.9999999999999998,...
from sklearn.inspection import permutation_importance
importance_r2 = permutation_importance(rf, X_test, y_test,scoring="r2")
importance_rmse = permutation_importance(rf, X_test,
 y_test,scoring="neg_root_mean_squared_error")
提取树的mse减少值并重新计算并不是那么简单。另一种解决方案是使用
置换重要性,以r平方或rmse作为度量,以估计每个特征的重要性,这些值不是标准化的:

[x.feature_importances_.sum() for x in rf.estimators_]
 
[1.0,
0.9999999999999999,
 1.0,
 1.0,
 0.9999999999999999,
 1.0,
 0.9999999999999998,...
from sklearn.inspection import permutation_importance
importance_r2 = permutation_importance(rf, X_test, y_test,scoring="r2")
importance_rmse = permutation_importance(rf, X_test,
 y_test,scoring="neg_root_mean_squared_error")
并绘制结果:

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
ax1.boxplot(importance_r2.importances.T, vert=False,labels=X_test.columns)
ax1.set_xlabel('Decrease in R2')
ax2.boxplot(importance_rmse.importances.T, vert=False,labels=X_test.columns)
ax2.set_xlabel('Decrease in RMSE')
fig.tight_layout()

谢谢,但我还需要OOB,当引导为真时,似乎每个树的OOB都不可用?