简体   繁体   中英

How to use sklearn's TransformedTargetRegressor with a custom data transformer?

I want to use sklearn.compose.TransformedTargetRegressor like illustrated in this answer . However, the transformer is a custom one and I'm running into an error.

In this minimal example, target values should be multiplied by ten, and then divided by ten again when predicting. (In my real application, target values must be transformed from a non-numeric to a numeric format.)

import numpy as np
import sklearn
from sklearn.compose import TransformedTargetRegressor
from sklearn.linear_model import LinearRegression

class MyTransform(sklearn.base.TransformerMixin):
    def fit(self, *_, **__):
        return self

    def transform(self, X):
        return np.array(X)*10

    def inverse_transform(self, X):
        return np.array(X)/10


def MyLinearRegression():
    return TransformedTargetRegressor(
        regressor=LinearRegression(),
        transformer=MyTransform()
    )


if __name__ == '__main__':
    model = MyLinearRegression()
    model.fit(X=[[1], [2], [3]], y=[1, 2, 3]) # raises TypeError

This raises:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.3\plugins\python-ce\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.3\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/me/.PyCharmCE2019.3/config/scratches/scratch.py", line 26, in <module>
    model.fit(X=[[1], [2], [3]], y=[1, 2, 3]) # raises TypeError
  File "C:\Users\me\.virtualenvs\project--3333Ox_\lib\site-packages\sklearn\compose\_target.py", line 185, in fit
    self._fit_transformer(y_2d)
  File "C:\Users\me\.virtualenvs\project--3333Ox_\lib\site-packages\sklearn\compose\_target.py", line 127, in _fit_transformer
    self.transformer_ = clone(self.transformer)
  File "C:\Users\me\.virtualenvs\project--3333Ox_\lib\site-packages\sklearn\base.py", line 64, in clone
    raise TypeError("Cannot clone object '%s' (type %s): "
TypeError: Cannot clone object '<__main__.MyTransform object at 0x000001653B2FA9A0>' (type <class '__main__.MyTransform'>): it does not seem to be a scikit-learn estimator as it does not implement a 'get_params' methods.

You just need to inherit from sklearn.base.BaseEstimator as well as the transformermixin: ). The type error says:

it does not seem to be a scikit-learn estimator

So you just need to make it one:D. The code below should work.

import numpy as np
import sklearn
from sklearn.compose import TransformedTargetRegressor
from sklearn.linear_model import LinearRegression

class MyTransform(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin):
    def fit(self, *_, **__):
        return self

    def transform(self, X):
        return np.array(X)*10

    def inverse_transform(self, X):
        return np.array(X)/10


def MyLinearRegression():
    return TransformedTargetRegressor(
        regressor=LinearRegression(),
        transformer=MyTransform()
    )



model = MyLinearRegression()
model.fit(X=[[1], [2], [3]], y=[1, 2, 3])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM