tutorial de machine learning
TRANSCRIPT
Instalação
# Remove any previously installed H2O packages for R if ("package:h2o" %in% search()) detach("package:h2o", unload = TRUE) if ("h2o" %in% rownames(installed.packages())) remove.packages("h2o") # Download packages that H2O depends on pkgs <- c("methods", "statmod", "stats", "graphics", "RCurl", "jsonlite", "tools", "utils") for (pkg in pkgs) { if (!(pkg %in% rownames(installed.packages()))) install.packages(pkg) } # Download and install the H2O package for R install.packages("h2o", type = "source", repos = ( c("http://h2o-release.s3.amazonaws.com/h2o/rel-turchin/9/R") ))
3/21
Inicialização da Biblioteca
library('h2o') ## Allowed RAM: 2GB, allowed cores: all h2o.init(max_mem_size = '2G', nthreads = -1) h2o.removeAll() ## Kill h2o cluster # h2o.shutdown(prompt = FALSE)
4/21
Carregamento dos Dados
label.name <- 'Target' ### Load train data train.hex <- h2o.importFile(path = normalizePath("train.csv.zip"), destination_frame = 'train.hex') train.hex[, label.name] <- as.factor(train.hex[, label.name]) ### Load test data test.hex <- h2o.importFile(path = normalizePath("test.csv.zip"), destination_frame = 'test.hex') ### Get feature names input.names <- setdiff(colnames(train.hex), c('Id', label.name))
5/21
Random Forest
rf.model <- h2o.randomForest(x = input.names, y = label.name, training_frame = train.hex, ntrees = 10)
6/21
Predição dos dados de Teste
## Predict probabilities options(scipen = 999) rf.pred <- as.data.frame(predict(rf.model, test.hex)) rf.pred$predict <- NULL rf.pred <- round(rf.pred, 8) ## Save prediction rf.pred <- cbind.data.frame(Id = as.integer(1:nrow.H2OFrame(test.hex)), rf.pred) write.csv( rf.pred, file = gzfile('rf_pred.csv.gz'), row.names = FALSE )
7/21
Importância das Variáveis
### Variable ranking var.imp <- h2o.varimp(rf.model) ### Best 15 features best.feat <- var.imp$variable[1:15]
8/21
Validação-Cruzada k-Fold
rf.cv <- h2o.randomForest( x = input.names, y = label.name, nfolds = 5, training_frame = train.hex, ntrees = 20, stopping_rounds = 10, stopping_metric = 'logloss', score_tree_interval = 5 ) train.loss <- rf.cv@model$training_metrics@metrics$logloss test.loss <- rf.cv@model$cross_validation_metrics@metrics$logloss
9/21
Parâmetros do Modelo
Os principais parâmetros a serem ajustados em um modelo Random Forest são:
mtries: número de variáveis candidatas selecionadas aleatoriamente emcada split de cada árvore. Valor default: sqrt(p) para classificação e p/3 pararegressão
sample_rate: fração de observações aleatoriamente selecionadas para cadaárvore. Valor default: 0.632 (bootstrap)
max_depth: profundidade máxima das árvores. Valor default: 20
·
·
·
10/21
Otimização de Parâmetros via Random Search
rf.grid <- h2o.grid( 'randomForest', grid_id = 'rf_search', x = input.names, y = label.name, training_frame = train.hex, is_supervised = TRUE, nfolds = 5, ntrees = 300, stopping_rounds = 10, stopping_metric = 'logloss', score_tree_interval = 5, search_criteria = list( strategy = "RandomDiscrete", max_models = 100, max_runtime_secs = 3*60*60 ), hyper_params = list( mtries = seq(from = 5, to = 30, by = 1), max_depth = seq(from = 3, to = 15, by = 1), sample_rate = seq(from = 0.3, to = 0.9, by = 0.05) ) ) summary(rf.grid)
11/21
Outros Algoritmos
Classificação e/ou Regressão: Naive-Bayes (h2o.naiveBayes), Regularized GLM(h2o.glm), Gradient Boosting Machine (h2o.gbm), Deep Learning(h2o.deeplearning)
Extração de Características: Principal Components Analysis (h2o.prcomp),Generalized Low-Rank Models (h2o.glrm) e Deep Features (h2o.deepfeatures)
Clusterização: k-Means (h2o.kmeans)
·
·
·
12/21
Instalação
OBS: Usuários Windows precisam instalar o pacote RTools antes.
devtools::install_github('tqchen/xgboost',subdir='R-package')
14/21
Carregamento dos dados
Usar o script indicado na primeira aula para criar as variáveis x, x.new e y. Emseguida:
library('xgboost') library('Matrix') dtrain <- xgb.DMatrix( Matrix(x, sparse = TRUE), label = as.integer(y) - 1 ) dtest <- xgb.DMatrix( Matrix(x.new, sparse = TRUE) )
15/21
Treinamento do Modelo
xgb.params <- list( "booster" = "gbtree", # or "gblinear" "num_class" = 7, "objective" = "multi:softprob", "eval_metric" = "mlogloss", "silent" = 1, "nthread" = 4 ) xgb.model <- xgb.train( data = dtrain, params = xgb.params, nrounds = 10 )
16/21
Predição dos dados de Teste
### Avoid scientific notation options(scipen = 999) ### Generate matrix of predictions xgb.pred <- matrix(predict(xgb.model, dtest), ncol = 7, byrow = TRUE) ### Reduce number of decimal places xgb.pred <- round(xgb.pred, 8) ### Transform to data.frame xgb.pred <- as.data.frame(xgb.pred) names(xgb.pred) <- levels(y) xgb.pred <- cbind.data.frame(Id = as.integer(dt.te$Id), xgb.pred) ### Save result write.csv( xgb.pred, file = gzfile('xgb_pred.csv.gz'), row.names = FALSE )
17/21
Validação-Cruzada k-Fold
### 5-fold CV cv.out <- xgb.cv(params = xgb.params, data = dtrain, nrounds = 20, nfold = 5, prediction = FALSE, stratified = TRUE, verbose = TRUE, showsd = FALSE, print.every.n = 10, early.stop.round = 5, maximize = FALSE) ### Get best performance best.train <- min(cv.out$train.mlogloss.mean) best.test <- min(cv.out$test.mlogloss.mean) best.iter <- which.min(cv.out$test.mlogloss.mean)
18/21
Ajuste de Parâmetros
Um modelo XGBoost possui muitos parâmetros (12), que podem ser ajustadosusando validação k-Fold. Os mais importantes são:
eta: taxa de aprendizado. Valor default: 0.3
max_depth: profundidade máxima das árvores. Valor default: 6
subsample: fração de observações aleatoriamente selecionadas para cadaárvore. Valor default: 1 (todas)
colsample_bytree: fração de variáveis aleatoriamente selecionadas paracada árvore. Valor default: 1 (todas)
·
·
·
·
19/21
Ranqueamento de Variáveis
### Variable ranking var.imp <- xgb.importance(colnames(x), model = xgb.model) ### Best 15 features best.feat <- var.imp$Feature[1:15] x.sub <- x[, best.feat] x.new.sub <- x.new[, best.feat]
20/21