1 왜 AutoML인가?

기계학습(Machine Learning)이 많은 장점과 실제 적용되서 실생활을 많이 바꾸고 있습니다. 하지만, 기계학습 전문가를 양성하는데 시간이 많이 걸릴 뿐더러 양성된 인력의 품질(?)문제도 해결해야 될 난제로 남아 있다. 데이터는 폭발적으로 증가하고 있지만, 이를 분석할 수 있는 인력은 턱없이 모자라고 기계학습 알고리즘을 제작하는 인력부족도 심각하기는 마찬가지다.

이런 움직임에 자동기계학습(AutoML) 움직임이 활발히 뜨면서… 기존 데이터과학자와 인공지능 알고리즘 전문가의 일자리를 대체하고 있는 것도 사실이다. 이에 \(H_2O\) AutoML을 바탕으로 자동기계학습에 대해서 살펴보자.

2 순수 \(H_2O\) AutoML 1 2

2.1 백오더 데이터

재고가 없어 처리 못한 주문을 구매에서 백오더(back order)라고 한다. 결품이 나게 되면 생산에 차질이 나고 이는 판매를 못해 심하면 매출을 넘어 브랜드에도 악영향을 미치게 된다.

캐글에 공개되었다가 지금은 삭제된 Product Backorder 데이터를 Github에서 다운로드 받아 순수 \(H_2O\)를 바탕으로 기계학습을 자동화해본다.

# 0. 환경설정 -----
library(tidyverse)
library(h2o)

h2o.init()
 Connection successful!

R is connected to the H2O cluster: 
    H2O cluster uptime:         2 hours 54 minutes 
    H2O cluster timezone:       Asia/Seoul 
    H2O data parsing timezone:  UTC 
    H2O cluster version:        3.20.0.2 
    H2O cluster version age:    1 month and 18 days  
    H2O cluster name:           H2O_started_from_R_victorlee_tdi626 
    H2O cluster total nodes:    1 
    H2O cluster total memory:   7.51 GB 
    H2O cluster total cores:    4 
    H2O cluster allowed cores:  4 
    H2O cluster healthy:        TRUE 
    H2O Connection ip:          localhost 
    H2O Connection port:        54321 
    H2O Connection proxy:       NA 
    H2O Internal Security:      FALSE 
    H2O API Extensions:         Algos, AutoML, Core V3, Core V4 
    R Version:                  R version 3.5.0 (2018-04-23) 
h2o.no_progress()

# 1. 데이터 -----
## 1.1. 데이터 가져오기 -----
backorder_df <- h2o.importFile("https://github.com/h2oai/h2o-tutorials/raw/master/h2o-world-2017/automl/data/product_backorders.csv")

## 1.2. 데이터 살펴보기 -----
h2o.describe(backorder_df)
               Label Type Missing Zeros PosInf NegInf     Min     Max
1                sku  int       0     0      0      0 1111620 3284775
2       national_inv  int       0  1858      0      0   -1440  730722
3          lead_time  int    1078   121      0      0       0      52
4     in_transit_qty  int       0 15432      0      0       0  170920
5   forecast_3_month  int       0 12118      0      0       0  479808
6   forecast_6_month  int       0 11136      0      0       0  967776
7   forecast_9_month  int       0 10604      0      0       0 1418208
8      sales_1_month  int       0 10278      0      0       0  186451
9      sales_3_month  int       0  8022      0      0       0  550609
10     sales_6_month  int       0  6864      0      0       0 1136154
11     sales_9_month  int       0  6231      0      0       0 1759152
12          min_bank  int       0  9909      0      0       0   85584
13   potential_issue enum       0 19032      0      0       0       1
14   pieces_past_due  int       0 18601      0      0       0   13824
15  perf_6_month_avg real       0   474      0      0     -99       1
16 perf_12_month_avg real       0   401      0      0     -99       1
17      local_bo_qty  int       0 18585      0      0       0    1440
18         deck_risk enum       0 14842      0      0       0       1
19     oe_constraint enum       0 19048      0      0       0       1
20         ppap_risk enum       0 16728      0      0       0       1
21     stop_auto_buy enum       0   657      0      0       0       1
22          rev_stop enum       0 19044      0      0       0       1
23 went_on_backorder enum       0 16787      0      0       0       1
            Mean        Sigma Cardinality
1   2.059553e+06 6.633376e+05          NA
2   3.763670e+02 7.002072e+03          NA
3   7.706036e+00 6.778665e+00          NA
4   4.827235e+01 1.465999e+03          NA
5   1.829108e+02 4.304866e+03          NA
6   3.447398e+02 8.406062e+03          NA
7   4.977924e+02 1.218057e+04          NA
8   5.611888e+01 1.544218e+03          NA
9   1.685345e+02 4.581340e+03          NA
10  3.335322e+02 9.294566e+03          NA
11  5.042554e+02 1.418415e+04          NA
12  4.884071e+01 9.687739e+02          NA
13  1.102189e-03 3.318180e-02           2
14  2.311500e+00 1.102411e+02          NA
15 -6.519834e+00 2.597514e+01          NA
16 -6.053935e+00 2.518450e+01          NA
17  8.917756e-01 2.303335e+01          NA
18  2.210151e-01 4.149415e-01           2
19  2.624259e-04 1.619786e-02           2
20  1.220280e-01 3.273268e-01           2
21  9.655172e-01 1.824704e-01           2
22  4.723666e-04 2.172943e-02           2
23  1.189314e-01 3.237163e-01           2

2.2 예측모형 적합 및 성능평가

h2o.automl() 함수를 바탕으로 제품 백오더 데이터를 학습한다. max_models = 10은 기본 예측모형을 10개를 자동선택해서 학습한다는 설정이고 모형의 성능은 leaderboard에 담겨진다.

# 2. 예측모형 -----
## 2.1. 모형공식 설정 -----
y <- "went_on_backorder"
x <- setdiff(names(backorder_df), c(y, "sku"))

## 2.2. 모형적합 -----
backorder_aml <- h2o.automl(y = y, x = x,
                  training_frame = backorder_df,
                  max_models = 10,
                  seed = 1)

# 3. 모형 성능 -----
## 3.1. 모형성능 
backorder_aml@leaderboard %>% 
    as.data.frame() %>% 
    DT::datatable()

2.3 예측모형 기여도 평가

모형을 뽑아서 메타모형을 발굴하여 메타모형에 가장 큰 기여를 한 모형을 식별한다.

## 3.2. 메타학습모형 기여도 평가

model_ids <- as.data.frame(backorder_aml@leaderboard$model_id)[,1]
stacked_ensemble_model <- h2o.getModel(grep("StackedEnsemble_AllModels", model_ids, value = TRUE)[1])

metalearner <- h2o.getModel(stacked_ensemble_model@model$metalearner$name)

### 시각화
h2o.varimp(metalearner) %>% DT::datatable()
h2o.varimp_plot(metalearner)