1 예측모형 Hello World!

예측모형을 가져와서 다음 후속 업무에 제대로 사용될 수 있는지 파악해보자. .rds 확장자를 갖는 파일에 예측모형을 바이너리로 배포한다. 이것을 plumber를 사용해서 RESTful API로 감싸 배포하는 방법을 살펴보자. Josiah Parry (2019-09-12), “Intro to Tidy modeling”, GitHub도 유사한 사례로 볼 수 있다.

library(tidyverse)
library(tidymodels)
# penguin_predictvie_model <- fit(lasso_spec_final, data = penguin_df)
# write_rds(penguin_predictvie_model, "data/penguin_predictvie_model.rds")
penguin_predictvie_model <- read_rds("data/penguin_predictvie_model.rds")

obs_df <- tibble("species" = "Adelie",
                  "bill_length_mm" =  39.1,
                  "bill_depth_mm" =  18.7,
                  "flipper_length_mm" =  181,
                  "body_mass_g" = 3750)

predict(penguin_predictvie_model, obs_df)
# A tibble: 1 x 1
  .pred_class
  <fct>      
1 male       
predict(penguin_predictvie_model, obs_df, type = "prob")
# A tibble: 1 x 2
  .pred_female .pred_male
         <dbl>      <dbl>
1        0.255      0.745

2 Plumber RESTful API

배관공(plumber)를 사용해서 수월하게 tidymodels 예측모형을 RESTful API로 변환시킬 수 있다. tidy odels 이전 RESTful API 사용에 대한 내용은 R 병렬 프로그래밍 - RESTful API부분을 참고한다.

2.1 펭귄 한마리

먼저 jsonlite 팩키지 toJSON() 함수를 사용해서 펭귄 한마리를 만들어보자.

jsonlite::toJSON(obs_df)
[{"species":"Adelie","bill_length_mm":39.1,"bill_depth_mm":18.7,"flipper_length_mm":181,"body_mass_g":3750}] 

.json 파일 확장자를 갖는 파일로 데이터프레임에서 펭귄 한마리를 추출해서 저장시킨다.

Rscript -e "library(palmerpenguins); data(penguins); jsonlite::toJSON(penguins[1,])" > data/penguin_one.json

2.2 predict API 명세

api.R 파일에 다양한 API를 명세하는데 predict/ API를 준비하여 명세한다.

#* Perform a prediction by submitting in the body of a POST request
#* @post /predict 

get_prediction <- function(req) {
    example <- req$postBody
    parsed_example <- jsonlite::fromJSON(example)

    penguin_predictvie_model <- readr::read_rds("data/penguin_predictvie_model.rds")
    prediction <- predict(penguin_predictvie_model, new_data = parsed_example)
    probability <- predict(penguin_predictvie_model, new_data = parsed_example, type = "prob")

    return(dplyr::bind_cols(prediction, probability) %>% 
             bind_cols(parsed_example))
}

2.3 API 실행 파일

run.R 파일을 실행시켜 RESTful API를 웹서비스로 띄워 펭귄 정보를 넘기면 성별 여부를 판정하고 관련 정보를 반환시키게 작성한다.

r <- plumber::plumb(here::here("penguin/api.R"))
r$run(port = 8000)

2.4 실행 결과

RESTful API predict/를 띄운 상태에서 .json 파일을 던져 결과를 실행시킨다.

curl localhost:8000/predict --header "Content-Type: application/json"   --request POST   --data @data/penguin_one.json
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   372  100   217  100   155   7233   5166 --:--:-- --:--:-- --:--:-- 12400
[{".pred_class":"male",".pred_female":0.2554,".pred_male":0.7446,"species":"Adelie","island":"Torgersen","bill_length_mm":39.1,"bill_depth_mm":18.7,"flipper_length_mm":181,"body_mass_g":3750,"sex":"male","year":2007}]
 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com