기계학습(Machine Learning)이 많은 장점과 실제 적용되서 실생활을 많이 바꾸고 있습니다. 하지만, 기계학습 전문가를 양성하는데 시간이 많이 걸릴 뿐더러 양성된 인력의 품질(?)문제도 해결해야 될 난제로 남아 있다. 데이터는 폭발적으로 증가하고 있지만, 이를 분석할 수 있는 인력은 턱없이 모자라고 기계학습 알고리즘을 제작하는 인력부족도 심각하기는 마찬가지다.
이런 움직임에 자동기계학습(AutoML) 움직임이 활발히 뜨면서… 기존 데이터과학자와 인공지능 알고리즘 전문가의 일자리를 대체하고 있는 것도 사실이다. 이에 \(H_2O\) AutoML을 바탕으로 자동기계학습에 대해서 살펴보자.
재고가 없어 처리 못한 주문을 구매에서 백오더(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
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()
모형을 뽑아서 메타모형을 발굴하여 메타모형에 가장 큰 기여를 한 모형을 식별한다.
## 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)