Переопределение expect () в GLM statsmodels для использования в контексте sklearn

чтобы использовать модель statsmodels Пуассона GLM в контексте sklearn, я пытаюсь создать собственную модель, которая наследуется от GLM, BaseEstimator и RegressorMixin. Моя цель - делать такие вещи, как перекрестная проверка. Это мой код:

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)

Метод подгонки работает нормально, но у меня проблема с переопределением pred (). Чтобы предсказать, мне нужен прогнозируемый метод экземпляра результатов (GLMResultsWrapper). Поэтому я хочу переопределить метод GLM.predict (у которого есть еще одна функция). Как я пытался в коде, я получаю ожидаемую ошибку:

pred_results = self.model.predict (self.params, exog, * args, ** kwargs) TypeError: pred () принимает 2 позиционных аргумента, но было дано 3

Есть ли возможность «полностью» переопределить метод прогноза?


person ConTcoN    schedule 21.11.2017    source источник
comment
Вам нужно будет отбросить лишний аргумент, который вы передаете: predict_results = self.model.predict(self.params, exog, *args, **kwargs) - ›predict_results = self.model.predict(self.params, exog, **kwargs). Функция прогнозирования, как вы определили, требует X и kwargs, но вы пытались передать больше информации на сайте вызова   -  person Ivan    schedule 21.11.2017


Ответы (1)


Вместо наследования от всех трех, что может вызвать такие проблемы, как перезапись одним родительским классом других членов, вы можете захотеть, чтобы GLM_sklearn владел экземплярами sm.GLM и RegressorMixin и наследовал только от BaseEstimator. Затем вы можете реализовать подгонку и прогнозирование по своему усмотрению, не беспокоясь о членах родительских классов.

person ziggy jones    schedule 21.11.2017
comment
Спасибо за Ваш ответ. Вот как я это сделаю. Я подумал, что лучше будет полностью использовать наследование. - person ConTcoN; 22.11.2017