重要性始终归一化为总和为 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 平方或 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()