Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子类从任意父类继承和重写_Python_Class_Inheritance_Scikit Learn_Subclass - Fatal编程技术网

Python子类从任意父类继承和重写

Python子类从任意父类继承和重写,python,class,inheritance,scikit-learn,subclass,Python,Class,Inheritance,Scikit Learn,Subclass,我正在使用sklearn估计器,它继承自sklearn.base.BaseEstimator,具有相当标准的接口。我想做的一个例子是重写.fit()和.predict()方法,以根据日志转换的目标进行回归,如下所示: Estimator = sklearn.some_regression_estimator class LogFit(Estimator): """subclass the sklearn regression estimator to fi

我正在使用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()方法将其子类化),例如:

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
的示例:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从sklearn.model\u选择导入列车\u测试\u拆分
从sklearn.svm导入SVR
从sklearn.tree导入决策树
从sklearn.neural_网络导入MLPREGESSOR
从sklearn.compose导入转换的目标浏览器
X=np.array([-0.890,-0.798,-0.610,-0.502,-0.450,-0.382,-0.342,-0.282,-0.226,-0.158,-0.0500,0.106,0.202,0.322,0.418,0.482,0.530,0.590,0.666,0.754,0.834,0.914,0.970,-0.694,-0.762,-0.782,-0.854,-0.850,-0.658,-0.666,-0.482,-0.506,-0.398,-0.478,-0.350,-0.410,-0.334,-0.378,-0.314,-0.346,-0.230,-0.250,-0.150,-0.146,-0.0500,-0.0700,0.0180,0.0300,0.110,0.178,0.214,0.290,0.318,0.406,0.422,0.482,0.478,0.486,0.546,0.566,0.674,0.658,0.702,0.726,0.838,0.882,0.950,0.934,0.882,0.786,0.718,0.682,0.570.502,0.426,0.234,-0.470,-0.430,-0.354,-1、-1)
y=np.array([0.663,0.679,0.675,0.627,0.535,0.331,0.171,0.0111,-0.169,-0.273,-0.421,-0.497,-0.505,-0.457,-0.361,-0.237,-0.141,-0.0129,0.0751,0.127,0.143,0.147,0.143,0.691,0.723,0.671,0.707,0.611,0.727,0.595,0.683,0.567,0.571,0.375,0.391,0.255,0.255,0.0831,0.0991,-0.0689,-0.0729,-0.225,-0.217,-0.309,-0.293,-0.453,-0.417,-0.533,-0.433,-0.577,-0.393,-0.489,-0.341,-0.421,-0.313,-0.353,-0.109,-0.117,-0.169,-0.0369,-0.141,0.159,0.0991,0.139,0.155,0.0511,0.231,0.123,0.187,0.00707,0.139,-0.0249,-0.00893,-0.205,-0.121,-0.261,-0.417,0.527,0.491,0.391,0.0591])。拉威尔()
plt.散射(X,y)
X_序列,X_测试,y_序列,y_测试=序列测试分割(X,y)
对于[DecisionTreeRegressor(max_depth=3)、MLPrepressor(max_iter=500)、SVR()中的回归器:
regr=转换目标累加器(
回归者=回归者,
func=np.log1p,
逆函数=np.expm1,
)
重新装配(X_系列、y_系列)
得分=四舍五入(再得分(X_检验,y_检验),3)
#一些想象
data=np.linspace(X.min(),X.max(),num=250)。重塑(-1,1)
reg_line=重新预测(数据)
plt.plot(数据、注册线、标签=f“R2={score},{regr.regressor.\uuuuuuu class.\uuuuuuuuu name}”)
plt.legend()
plt.show()
结果:


啊,这很有趣,谢谢!我还没有看到。它确实以sklearn原生格式解决了示例问题,并以sklearn原生格式启动。希望它能有所帮助!它确实解决了这个问题,但我也不确定解决这个问题的好方法是什么样的——特别是因为大多数回归器的I中都有不同的参数nit方法。