Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 重写statsmodels GLM中的predict()以在sklearn上下文中使用_Python_Scikit Learn_Overriding_Glm_Statsmodels - Fatal编程技术网

Python 重写statsmodels GLM中的predict()以在sklearn上下文中使用

Python 重写statsmodels GLM中的predict()以在sklearn上下文中使用,python,scikit-learn,overriding,glm,statsmodels,Python,Scikit Learn,Overriding,Glm,Statsmodels,为了在sklearn的上下文中使用statsmodels的Poisson GLM模型,我试图建立一个自己的模型,它继承了GLM,BaseEstimator ans RegregatorMixin。我的目标是做交叉验证之类的事情。这是我的代码: import statsmodels.api as sm from sklearn.base import BaseEstimator, RegressorMixin class GLM_sklearn(sm.GLM, BaseEstimator, Re

为了在sklearn的上下文中使用statsmodels的Poisson GLM模型,我试图建立一个自己的模型,它继承了GLM,BaseEstimator ans RegregatorMixin。我的目标是做交叉验证之类的事情。这是我的代码:

import statsmodels.api as sm
from sklearn.base import BaseEstimator, RegressorMixin

class GLM_sklearn(sm.GLM, BaseEstimator, RegressorMixin):
    def __init__(self, X, y, family=sm.families.Poisson()):
        super().__init__(y, X, family=family)

    def fit(self, **kwargs):
        self.results_ = super().fit()

        self.coef_ = self.results_.params.values
        self.bse_ = self.results_.bse.values

        return self

    def predict(self, X, **kwargs):
        return self.results_.predict(X)
fit方法工作正常,但我在重写predict()时遇到了一个问题。要进行预测,我需要结果实例的预测方法(GLMResultsWrapper)。所以我想重写GLM.predict方法(它还有另一个功能)。正如在代码中尝试的那样,我得到了预期的错误:

预测结果=self.model.predict(self.params,exog,*args,**kwargs) TypeError:predict()接受2个位置参数,但给出了3个


是否有可能“完全”覆盖predict方法?

而不是从这三个方法继承,这可能会导致一个父类覆盖另一个成员的问题。您可能希望GLM_sklearn拥有sm.GLM和RegregatorMin的实例,并且只从BaseEstimator继承。然后,您可以按照自己的意愿实现fit和predict,而不必担心父类的成员。

而不是从所有三个类继承,这可能会导致诸如一个父类覆盖另一个父类成员之类的问题,您可能希望GLM_sklearn拥有sm.GLM和RegregatorMin的实例,并且只从BaseEstimator继承。然后,您可以按照自己的意愿实现fit和predict,而不必担心父类的成员。

您需要删除一个过多的参数:
predict\u results=self.model.predict(self.params,exog,*args,**kwargs)
-->
predict\u results=self.model.predict(self.params,exog,**kwargs)
。预测函数您定义它的方式需要X和kwargs,但是您试图在调用站点传递更多内容,您需要删除一个过多的arg:
predict\u results=self.model.predict(self.params,exog,*args,**kwargs)
-->predict\u results=self.model.predict(self.params,exog,**kwargs)。您定义的预测函数需要X和kwargs,但您尝试在呼叫站点传递更多信息谢谢您的回答。这就是我要做的事。我认为完全使用继承会更好。谢谢你的回答。这就是我要做的事。我认为完全使用继承会更好。