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.