Как сделать statsmodels GLM.fit_constrained результатом picklable / store-and-reloadable - PullRequest
2 голосов
/ 15 января 2020

регрессия GLS (или, следовательно, также OLS) с ограничениями на параметры может быть легко запущена с использованием метода statsmodels GLM.fit_constrained () , как с кодом ниже (или здесь ) .

Как создать объект GLMresults, полученный в результате такой регрессии statsmodels GLM.fit_constrained () , чтобы результат оценки можно было сохранить для повторного использования для прогнозирования в новом сеанс в любое время позже?

У объекта GLMresults, полученного из fit_constrained () и содержащего соответствующий результат оценки, есть метод .save () , который обычно легко переносит объект в файл.

Этот .save () работает для результата стандартной (неограниченной) регрессии GLM, sm.glm.fit (). Однако, это не работает с результатом для sm.glm.fit_unconstrained (). Вместо этого он выдает ошибку засоления, по-видимому, потому что patsy DesignMatrixBuilder не является Picklable, поэтому он ссылается на проблему , которая никогда не решается здесь . Это по крайней мере для моего Python 3.6.3 (работает на Windows).

Пример:

import statsmodels
import statsmodels.api as sm
import pandas as pd

# Define exapmle data & Constraints:
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(100, 5)), columns=list('ABCDF'))
y = df['A']
X = df[['B','C','D','F']]
constraints = ['B + C + D', 'C - F'] # Add two linear constraints on parameters: B+C+D = 0 & C-F = 0
statsmodels.genmod.families.links.identity()
OLS_from_GLM = sm.GLM(y, X)

# Unconstrained regression:
result_u = OLS_from_GLM.fit()
result_u.save('myfile_u.pickle') # This works

# Constrained regression - save() fails
result_c = OLS_from_GLM.fit_constrained(constraints)
result_c.save('myfile_c.pickle') # This fails with pickling error (tested in Python 3.6.3 on Windows): "NotImplementedError: Sorry, pickling not yet supported. See https://github.com/pydata/patsy/issues/26 if you want to help."

Есть ли способ легко получить результат из fit_unconstrained () кражи, т.е. / или хранимые?

Я ниже предлагаю первый обходной ответ; это тривиально и хорошо работает для меня до сих пор. Однако я не знаю, действительно ли это целесообразно или существуют большие риски, и / или существует какое-либо предпочтительное альтернативное решение.

1 Ответ

0 голосов
/ 15 января 2020

Я получил это для работы, просто удалив (закомментировав) строку res._results.constraints = lc в определении функции fit_constrained() в активном generalized_linear_model.py сценарии statsmodels (в моем случае в папке virtualenv \ env \ Lib \ site-packages \ statsmodels \ genmod \ generalized_linear_model.py ).

Похоже, простоя этой строки не создала проблем для моей работы; Теперь я могу легко сохранить и перезагрузить маринованный файл и использовать его, чтобы делать правильные прогнозы на основе сохраненной оценки; наложенные ограничения параметров остаются соблюденными, и прогнозы, сделанные с помощью .predict (), остаются без изменений после перезагрузки.

Интересно, есть ли какой-либо серьезный риск, связанный с этой процедурой. Я не знаком с внутренней работой библиотеки statsmodels или с ее методом glm.fit_constrained () в частности. Я считаю, что нецелесообразно что-либо менять в уже существующем модуле, который никто не понимает. Тем не менее, это единственный способ, которым я могу удобно наложить различные ограничения на мои параметры GLM и сохранить результаты регрессии, чтобы легко повторно использовать их для прогнозирования в более поздней сессии.

...