如何从MultiOutputRegressor中获取系数和特征重要性?

8

我正在尝试使用ElasticNet和Random Forests进行多输出回归,具体代码如下:

from sklearn.ensemble import RandomForestRegressor
from sklearn.multioutput import MultiOutputRegressor
from sklearn.linear_model import ElasticNet

X_train, X_test, y_train, y_test = train_test_split(X_features, y, test_size=0.30,random_state=0)

弹性网络
l1_range=np.arange(0.1,1.05,0.1).tolist()

regr_Enet=ElasticNetCV(cv=5,copy_X=True,n_alphas=100,l1_ratio=l1_range,selection='cyclic',normalize=False,verbose =2,n_jobs=1)

regr_multi_Enet= MultiOutputRegressor(regr_Enet)##ElasticNetCV

regr_multi_Enet.fit(X_train, y_train)

随机森林

max_depth = 20
number_of_trees=100

regr_multi_RF=MultiOutputRegressor(RandomForestRegressor(n_estimators=number_of_trees,max_depth=max_depth,random_state=0,n_jobs=1,verbose=1))

regr_multi_RF.fit(X_train, y_train)

y_multirf = regr_multi_RF.predict(X_test)

一切进展顺利,但我还没有找到获取模型系数(coef_)或最重要特征(feature_importances_)的方法。当我写下以下代码时:

regr_multi_Enet.coef_
regr_multi_RF.feature_importances_

它显示以下错误:
AttributeError: 'MultiOutputRegressor' object has no attribute 'feature_importances_'
AttributeError: 'MultiOutputRegressor' object has no attribute 'coef_'

我已经阅读了MultiOutputRegressor的文档,但是我找不到提取系数的方法。如何检索它们?

3个回答

8

MultiOutputRegressor本身没有这些属性 - 您需要先使用estimators_属性访问底层估计器(尽管文档没有提到,但确实存在 - 请参阅MultiOutputClassifier的文档)。以下是一个可复现的示例:

from sklearn.multioutput import MultiOutputRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import ElasticNet

# dummy data
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
W = np.array([[1, 1], [1, 1], [2, 2], [2, 2]])

regr_multi_RF=MultiOutputRegressor(RandomForestRegressor())
regr_multi_RF.fit(X,W)

# how many estimators?
len(regr_multi_RF.estimators_)
# 2

regr_multi_RF.estimators_[0].feature_importances_
# array([ 0.4,  0.6])

regr_multi_RF.estimators_[1].feature_importances_
# array([ 0.4,  0.4])

regr_Enet = ElasticNet()
regr_multi_Enet= MultiOutputRegressor(regr_Enet)
regr_multi_Enet.fit(X, W)

regr_multi_Enet.estimators_[0].coef_
# array([ 0.08333333,  0.        ])

regr_multi_Enet.estimators_[1].coef_
# array([ 0.08333333,  0.        ])

2
regr_multi_Enet.estimators_[0].coef_

获取第一个估计器的系数等。


感谢您的快速回答!为了完整起见,在随机森林的情况下 - regr_multi_RF.estimators_[0].feature_importances_。 - Julioolvera
不适用于 knn = KNeighborsRegressor(n_neighbors=3, leaf_size=20) regr = MultiOutputRegressor(knn) - Soyol

0
    from sklearn.multioutput import MultiOutputRegressor
        
    from sklearn.ensemble import GradientBoostingRegressor
        
    params = {'n_estimators': 500, 'max_depth':3, 'learning_rate': 0.1} 
        
    reg = MultiOutputRegressor(GradientBoostingRegressor(**params, random_state = 123))
    reg.fit(X_train,Y_train)
    
    ###  feature importance 
    reg.estimators_[0]           # for estimator 0
    reg.estimators_[0].feature_importances_
    print (feature_importance) 

    sorted_idx = np.argsort(feature_importance)
    pos = np.arange(sorted_idx.shape[0]) + 0.5
    fig = plt.figure(figsize=(12, 6))
    plt.subplot(1, 2, 1)
    plt.barh(pos, feature_importance[sorted_idx], align="center")
    plt.yticks(pos, np.array(X.columns)[sorted_idx])
    plt.title("Feature Importance")

1
虽然这段代码片段可能是解决方案,但包括详细的解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 - Shawn Hemelstrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接