library(h2o)
h2o.init(ip = 'localhost', # default
port = 54321, # default
name = 'GBM_Test', # 임의로 지정함
min_mem_size = '1G', # 2MB 보다는 크고, 1024의 배수로 지정. 뒤에 M/m 또는 G/g를 붙이면 MB/GB
max_mem_size = '2G') # 2MB 보다는 크고, 1024의 배수로 지정. 뒤에 M/m 또는 G/g를 붙이면 MB/GB
## Connection successful!
##
## R is connected to the H2O cluster:
## H2O cluster uptime: 2 hours 31 minutes
## H2O cluster timezone: Asia/Seoul
## H2O data parsing timezone: UTC
## H2O cluster version: 3.30.0.1
## H2O cluster version age: 3 months and 24 days !!!
## H2O cluster name: GBM_Test
## H2O cluster total nodes: 1
## H2O cluster total memory: 1.46 GB
## H2O cluster total cores: 8
## H2O cluster allowed cores: 8
## H2O cluster healthy: TRUE
## H2O Connection ip: localhost
## H2O Connection port: 54321
## H2O Connection proxy: NA
## H2O Internal Security: FALSE
## H2O API Extensions: Amazon S3, Algos, AutoML, Core V3, TargetEncoder, Core V4
## R Version: R version 4.0.2 (2020-06-22)
cars <- h2o.importFile("https://s3.amazonaws.com/h2o-public-test-data/smalldata/junit/cars_20mpg.csv")
##
|
| | 0%
|
|======================================================================| 100%
여기서는 종속변수를 predictors에 담았고, 독립변수를 response에 담았다.
predictors <- c("displacement", "power", "weight", "acceleration", "year")
response <- "cylinders"
여기에서 사용된 h2oframe은 data.frame과 거의 동일한데, 큰 차이점은 메모리에 저장되지 않고 원격에(여기서는 localhost) 저장된다는 점이 다름.
cars_splits <- h2o.splitFrame(data = cars, ratios = 0.8, seed = 1234)
train <- cars_splits[[1]]
valid <- cars_splits[[2]]
cars_gbm <- h2o.gbm(x = predictors,
y = response,
training_frame = train,
validation_frame = valid,
distribution = "poisson",
seed = 1234)
##
|
| | 0%
|
|================================== | 48%
|
|======================================================================| 100%
구현된 cars_gbm의 성능을 성능 지표로 확인해 본다.
* 회귀분석의 성능 지표의 의미는 다음과 같다.
* R2 결정 계수: R squared는 회귀 분석으로 만든 model이 실제 data에 얼마나 잘 적용되었는지 보여주는 척도(0~1). 클수록 좋음. * deviance(이탈도): R2의 반대 개념. 모델의 부적합도(작을 수록 좋음)
* MSE(Mean Squared Error;평균제곱오차): 실제 값과 예측 값의 차이를 제곱해 평균한 것. 실제값과 추정값의 편차를 알아보는데 사용함. 작을수록 좋음.
* RMSE(Root Mean Squared Error;평균제곱근오차): MSE 값은 오류의 제곱을 구하므로 실제 오류 평균보다 더 커지는 특성이 있어 MSE에 루트를 씌운 값.
* MSLE (Mean Squared Log Error): MSE에 로그를 적용해준 지표입니다.
* RMSLE (Root Mean Squared Logarithmic Error) : RMSE에 로그를 적용해준 지표
* MAE (Mean Absolute Error): 실제 값과 예측 값의 차이를 제곱해 평균한 것
perf <- h2o.performance(cars_gbm, valid)
perf
## H2ORegressionMetrics: gbm
##
## MSE: 0.03769792
## RMSE: 0.1941595
## MAE: 0.07947862
## RMSLE: 0.0335913
## Mean Residual Deviance : -9.918301
# R2 결정 계수: R squared는 회귀 분석으로 만든 model이 실제 data에 얼마나 잘 적용되었는지 보여주는 척도(0~1). 클수록 좋음.
h2o.r2(cars_gbm, train = T, valid = T)
## train valid
## 0.9930651 0.9886704
# 잔차 이탈도. R2와는 반대로 모델이 얼마나 데이터를 잘못 설명하는지 보여주는 척도. 작을수록 좋음
h2o.mean_residual_deviance(cars_gbm, train = T, valid = T)
## train valid
## -7.781964 -9.918301
plot(cars_gbm)
plot(cars_gbm, timestep = "duration", metric = "deviance") # timestep은 No of Tree 또는 duration_sec 중의 하나. metric은 rmse, mae, deviance 중의 하나.
# deviance(이탈도): R2의 반대 개념. 모델의 부적합도(작을 수록 좋음)
plot(cars_gbm, timestep = "number_of_trees", metric = "deviance")
# RMSE(Root Mean Squared Error;평균제곱근오차): MSE 값은 오류의 제곱을 구하므로 실제 오류 평균보다 더 커지는 특성이 있어 MSE에 루트를 씌운 값.
plot(cars_gbm, timestep = "duration", metric = "rmse")
plot(cars_gbm, timestep = "number_of_trees", metric = "rmse")
# MAE (Mean Absolute Error): 실제 값과 예측 값의 차이를 제곱해 평균한 것
plot(cars_gbm, timestep = "number_of_trees", metric = "mae")
R2 계수가 0.99이므로 모델의 적합도가 매우 좋다고 할 수 있다.