Как загрузить модель, сохраненную в виде файла RDS из Python и сделать прогнозы? - PullRequest
0 голосов
/ 25 января 2020

У меня есть модель машинного обучения, сохраненная в формате * .rds. Я хочу открыть эту модель в Python, чтобы делать прогнозы. Для этого я установил rpy2. Это мой код Jupyter Notebook:

!pip install rpy2

import json
import pandas as pd
import numpy as np
import rpy2.robjects as robjects
from rpy2.robjects import numpy2ri
from rpy2.robjects.packages import importr

r = robjects.r
numpy2ri.activate()

model_rds_path = "model.rds"
model = r.readRDS(model_rds_path)

raw_data = '{"data":[[79],[63]]}'
data = json.loads(raw_data)["data"]

if type(data) is not np.ndarray:
    data = np.array(data)

result = r.predict(model, data, probability=False)
result

В строке r.predict(…) я получаю следующую ошибку:

RRuntimeError: Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
  'data' must be a data.frame, not a matrix or an array
Calls: <Anonymous> -> predict.lm -> model.frame -> model.frame.default

Учебный скрипт в R выглядит следующим образом:

library(caret)

# Reading `data` from CSV file
x <- data$height
y <- data$weight

model <- lm(y~x)

# Test predictions
df_test_heights <- data.frame(x = as.numeric(c(115,20)))
result <- predict(model,df_test_heights)
print(result)

Я так растерялся ... Потратил целый день, пытаясь решить эту проблему !! Кто-нибудь знает, как это исправить ??? Буду также признателен, если кто-нибудь знает альтернативный способ (альтернативный rpy2) для открытия файлов RDS из Python.

Спасибо !!!

Ответы [ 2 ]

1 голос
/ 25 января 2020

Вот вариант с pyper

import numpy as np
import pandas as pd
from pyper import *
import json
r=R(use_pandas=True)
model_rds_path = "model.rds"
r.assign("rmodel", model_rds_path)


raw_data = '{"data":[[79],[63]]}'
data = json.loads(raw_data)["data"]

if type(data) is not np.ndarray:
    data = dat = pd.DataFrame( np.array(data), columns = ['x'])


r.assign("rdata", data)
# rdata
expr  = 'model <- readRDS(rmodel); result <- predict(model, rdata, probability=False)'
r(expr)
res= r.get('result')
1 голос
/ 25 января 2020

Функция R predict() ожидает кадр данных R для data. Однако в качестве этой точки у вас есть массив numpy.

data = json.loads(raw_data)["data"]

if type(data) is not np.ndarray:
    data = np.array(data)

В Python, pandas объекты DataFrame являются более близким концептуальным эквивалентом R фреймов данных. Этот раздел документации rpy2 может вам помочь:

https://rpy2.github.io/doc/v3.2.x/html/pandas.html

...