首页 > 解决方案 > Scikit-Learn - 如何从 RandomForestRegressor 获得非归一化的重要性分数

问题描述

我想从 RandomForestRegressor 获得非标准化的重要性分数。

拟合回归器后,我可以访问feature_importances_包含归一化重要性分数的回归器。

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

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

是否有禁用标准化的选项?

标签: pythonscikit-learnrandom-forest

解决方案


重要性始终归一化为总和为 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,...

提取树的 mse 减少并重新计算并不是那么简单。一种替代解决方案是使用permutation_importancer squared 或 rmse 作为度量,以估计每个特征的重要性,这些值未标准化:

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()

在此处输入图像描述


推荐阅读