python - 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
是否有禁用标准化的选项?
解决方案
重要性始终归一化为总和为 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_importance
r 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()
推荐阅读
- excel - 如何使用 FOR NEXT
- c# - .NET 标准库中的实体框架
- karate - afterScenario not working calling features not in the same folder
- javascript - 替换对象数组中的对象属性
- flutter - 将触摸事件推迟到堆栈中的小部件
- google-tag-manager - 无法使用 Google 跟踪代码管理器跟踪表单提交
- typescript - Typescript interface with function called "new"
- javascript - 如何在带有来自动作的道具(MemoizedSelectorWithProps)的选择器的效果中使用 withLatestFrom
- angular - Angular 自定义异步验证器未显示错误
- postman - 跨迭代重用数据