tutorial de machine learning

21
Biblitecas de Machine Learning H2O.ai e XGBoost David Pinto 16 Junho, 2016

Upload: david-pinto

Post on 09-Feb-2017

26 views

Category:

Data & Analytics


0 download

TRANSCRIPT

Biblitecas de Machine LearningH2O.ai e XGBoost

David Pinto

16 Junho, 2016

H20.ai Tutorial

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

XGBoost Tutorial

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

Dúvidas?