TransformedTargetRegressor does not inherit feature_importances_ attribute

Viewed 1106

I am using TransformedTargetRegressor to transform my target into log space. It is done like

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.compose import TransformedTargetRegressor
clf = TransformedTargetRegressor(regressor=GradientBoostingRegressor(**params),
       func=np.log1p, inverse_func=np.expm1)

However when I later call

feature_importance = clf.feature_importances_

I get

AttributeError: 'TransformedTargetRegressor' object has no attribute 'feature_importances_'

I would have thought that all the attributes of the original class would be inherited. How can this be solved?

For further context here is an official example. Replacing the initialization line with mine would result in the crash.

1 Answers

As TransformedTargetRegressor Doc says, one can access its component regressor through .regressor_. So this is what you want:

clf.regressor_.feature_importances_

Workable code:

import numpy as np
import matplotlib.pyplot as plt

from sklearn import ensemble
from sklearn import datasets
from sklearn.utils import shuffle
from sklearn.metrics import mean_squared_error
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.compose import TransformedTargetRegressor #only in sklearn==0.20.2

# #############################################################################
# Load data
boston = datasets.load_boston()
X, y = shuffle(boston.data, boston.target, random_state=13)
X = X.astype(np.float32)
offset = int(X.shape[0] * 0.9)
X_train, y_train = X[:offset], y[:offset]
X_test, y_test = X[offset:], y[offset:]

# #############################################################################
# Fit regression model
params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 2,
          'learning_rate': 0.01, 'loss': 'ls'}
#clf = ensemble.GradientBoostingRegressor(**params)
clf = TransformedTargetRegressor(regressor=GradientBoostingRegressor(**params),
       func=np.log1p, inverse_func=np.expm1)

clf.fit(X_train, y_train)
mse = mean_squared_error(y_test, clf.predict(X_test))
print("MSE: %.4f" % mse)

print(clf.regressor_.feature_importances_)

Its output:

MSE: 7.7145
[6.45223704e-02 1.32970011e-04 2.92221184e-03 4.48101769e-04
 3.57392613e-02 2.02435922e-01 1.22755948e-02 7.03996426e-02
 1.54903176e-03 1.90771421e-02 1.98577625e-02 1.63376111e-02
 5.54302378e-01]
Related