Как сохранить логит-модель в R и импортировать ее в Python?

Мне нужно обучить модель glm в R 3.6 и импортировать ее в Python 3.7, чтобы делать прогнозы.

В качестве доказательства концепции я позаимствовал этот код из https://stats.stackexchange.com/questions/46523/how-to-simulate-artificial-data-for-logistic-regression/46525

set.seed(666)
x1 = rnorm(1000)           # some continuous variables 
x2 = rnorm(1000)
z = 1 + 2*x1 + 3*x2        # linear combination with a bias
pr = 1/(1+exp(-z))         # pass through an inv-logit function
y = rbinom(1000,1,pr)      # bernoulli response variable
#now feed it to glm:
df = data.frame(y=as.factor(y), x1=x1, x2=x2)
my_model = glm(y~x1+x2, data=df, family=binomial(link = 'logit'))

Я могу сохранить модель R в формате PMML, но нет библиотеки Python для ее импорта:

library(r2pmml)
r2pmml(my_model, "my_model.pmml")

так что это не решение.

Я читал, что могу экспортировать модель R в формате pickle, но когда я пытаюсь сделать это с помощью библиотеки reticulate:

package.install(reticulate)
library(reticulate)
use_python("/opt/anaconda3/bin/python")
py_save_object(my_model, "my_model")

Я получаю эту ошибку:

Error in py_call_impl(callable, dots$args, dots$keywords) :
      Evaluation error: Evaluation error: Unable to convert R object to Python type..

Любая идея, как я могу обойти эту проблему?


person Javide    schedule 18.05.2020    source источник


Ответы (1)


Библиотека Python pypmml может импортировать файл PMML. Пример ниже основан на предоставленном вами коде R.

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from pypmml import Model                                           
>>> model = Model.fromFile('./Downloads/my_model.pmml')
>>> model.predict({'x1':-0.08629063, 'x2': 2.832245})
{'probability(1)': 0.9999454865350921, 'probability(0)': 5.451346490792375e-05}

Вы также можете найти это полезным, если вы работаете конкретно со sklearn. Портировать весь объект модели R glm сложно, потому что он содержит длинный список вещей, и среди них есть переменные окружения (попробуйте str(my_model) и проверьте сами). Вместо переноса всего объекта модели вы можете рассмотреть возможность переноса только коэффициентов модели из R — с помощью JSON — и затем создать новый объект модели в Python так же, как показано в ссылке.

person Jackson    schedule 18.05.2020