Python 重写statsmodels GLM中的predict()以在sklearn上下文中使用
为了在sklearn的上下文中使用statsmodels的Poisson GLM模型,我试图建立一个自己的模型,它继承了GLM,BaseEstimator ans RegregatorMixin。我的目标是做交叉验证之类的事情。这是我的代码: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
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,但您尝试在呼叫站点传递更多信息谢谢您的回答。这就是我要做的事。我认为完全使用继承会更好。谢谢你的回答。这就是我要做的事。我认为完全使用继承会更好。