Как получить коэффициенты и значения функций из MultiOutputRegressor?
Я пытаюсь выполнить регрессию множественных выходов, используя ElasticNet и случайные леса следующим образом:
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 ответа
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. ])
regr_multi_Enet.estimators_[0].coef_
Получить коэффициенты первой оценки и т. Д.
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")