我正在使用sklearn估计器,它继承自sklearn.base.BaseEstimator,具有相当标准的接口。我想做的一个例子是重写.fit()和.predict()方法,以根据日志转换的目标进行回归,如下所示:
Estimator = sklearn.some_regression_estimator
class LogFit(Estimator):
"""subclass the sklearn regression estimator to fit and predict using
log-transformed target variable
"""
def __init__(self, **kwargs):
super().__init__(kwargs)
def fit(X, y=None, **kwargs):
super().fit(X, np.log(y), **kwargs)
return self
def predict(X):
return np.exp(super().predict(X))
我不一定事先知道将使用哪个估计器,只知道它将根据sklearn估计器惯例进行操作。我也不想为每个可能的估计器重新编写上面的子类,而且多重继承似乎是不正确的,因为LogFit
的每个实例只从一个单亲继承
我发现我可以编写一个包装类(然后使用过度使用的fit()和predict()方法将其子类it),例如:
class EstimatorWrapper():
"""Wrapper class that has an estimator as a property"""
def __init__(self, estimator_instance):
self.estimator = estimator_instance
def fit(self, X, y=None, **kwargs):
self.fit(X, y, **kwargs)
return self
...
但在这一点上,我现在必须承担起确保EstimatorWrapper类的行为与基本estimator类一样的责任,这样我就可以使用fit()和predict()的LogFit版本,而不用让sklearn的其他机器知道它们之间的区别。在这里,如果我不知道在每个可能的estimator_实例中存在哪些特定的方法/属性,那么我似乎必须设法让estimator Wrapper()动态定义其属性,而我真正想做的就是调整fit()和predict()函数的行为
我是否缺少一种简单的方法来编写一个直到实例化才知道其父类的子类,或者根本不允许这样做?我找不到任何关于如何做前者的例子
它绕过了这个问题,但是这里有第三个选项可能是很好的探索:^{} ,它包装了一个回归器,允许您定义正向和反向变换函数以应用于目标变量
下面是一个使用
np.log1p
和反向np.expm1
的示例:结果:
相关问题 更多 >
编程相关推荐