Vai al contenuto principale

Introduzione a H2O AutoML

In questo tutorial scoprirai H2O e darai un'occhiata alla sua funzionalità AutoML.
· 9 min leggi

Scopri con l'IA

Descrivere H2O

C'è grande fermento intorno agli algoritmi di machine learning e una forte richiesta di esperti. Sappiamo tutti che esiste un notevole divario di competenze. L'obiettivo di H2O è offrire una piattaforma che renda facile per i non esperti fare esperimenti con il machine learning.

L'architettura di H2O può essere suddivisa in diversi livelli, in cui il livello superiore comprende le varie API e quello inferiore la JVM di H2O.

architettura h20
Fonte

Il codice centrale di H2O è scritto in Java, il che abilita l'intero framework al multi-threading. Sebbene sia scritto in Java, fornisce interfacce per R, Python e altri, come mostrato nell'architettura, consentendone un uso efficiente.

In sostanza, possiamo dire che H2O è una piattaforma open source, in-memory, distribuita, veloce e scalabile per il machine learning e l'analisi predittiva, che rende la creazione di modelli di machine learning molto più semplice.

Procedura di installazione

R

Se vuoi usare le funzionalità di H2O in R, puoi semplicemente installare il pacchetto H2O con il comando install.packages("h2o").

library(h2o)
##
## ----------------------------------------------------------------------
##
## Your next step is to start H2O:
##     > h2o.init()
##
## For H2O package documentation, ask for help:
##     > ??h2o
##
## After starting H2O, you can use the Web UI at http://localhost:54321
## For more information visit http://docs.h2o.ai
##
## ----------------------------------------------------------------------

##
## Attaching package: 'h2o'

## The following objects are masked from 'package:stats':
##
##     cor, sd, var

## The following objects are masked from 'package:base':
##
##     %*%, %in%, &&, ||, apply, as.factor, as.numeric, colnames,
##     colnames<-, ifelse, is.character, is.factor, is.numeric, log,
##     log10, log1p, log2, round, signif, trunc
h2o.init()
##  Connection successful!
##
## R is connected to the H2O cluster:
##     H2O cluster uptime:         32 minutes 57 seconds
##     H2O cluster timezone:       Asia/Kolkata
##     H2O data parsing timezone:  UTC
##     H2O cluster version:        3.20.0.2
##     H2O cluster version age:    3 months and 22 days !!!
##     H2O cluster name:           H2O_started_from_R_NSingh1_wou076
##     H2O cluster total nodes:    1
##     H2O cluster total memory:   1.55 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.1 (2018-07-02)

L'inizializzazione di H2O potrebbe generare un errore sul tuo sistema se non hai una JDK a 64 bit. Se dovesse capitare, installa l'ultima JDK a 64 bit: dopo funzionerà senza problemi.

Python

Se usi Python vale lo stesso approccio: da riga di comando esegui pip install -U h2o e H2O verrà installato per il tuo ambiente Python. Il processo è identico anche per l'inizializzazione di H2O.

Il comando h2o.init() è piuttosto intelligente e fa molte cose: prima cerca un'istanza H2O attiva prima di avviarne una nuova e ne avvia una nuova quando non sono presenti istanze.

Dispone di argomenti che aiutano ad assegnare risorse all'istanza H2O; quelli usati più spesso sono:

  • nthreads: per impostazione predefinita vale -1, il che significa che l'istanza può usare tutti i core della CPU; possiamo impostare il numero di core da utilizzare passando un valore all'argomento.

  • max_mem_size: passando un valore a questo argomento puoi limitare la memoria massima allocata all'istanza. È di tipo stringa: puoi passare ad esempio ‘2g’ o ‘2G’ per 2 GB di memoria, analogamente per i MB.

Una volta creata l'istanza, puoi accedere a Flow digitando http://localhost:54321 nel browser. Flow è il nome dell'interfaccia web parte di H2O, non richiede installazioni aggiuntive ed è scritta in CoffeeScript (un linguaggio simile a JavaScript). Puoi usarla per:

  • Caricare i dati direttamente
  • Visualizzare i dati caricati dal client
  • Creare modelli direttamente
  • Visualizzare i modelli creati da te o dal tuo client
  • visualizzare le predizioni
  • Eseguire predizioni direttamente
flow senza titolo

L'interfaccia è molto utile e offre facilità d'uso ai non esperti; ti consiglio di provarla e fare qualche esperimento.

AutoML

Passando alla parte AutoML di H2O: AutoML aiuta ad addestrare e ottimizzare automaticamente molti modelli entro un limite di tempo specificato dall'utente.

L'attuale versione della funzione AutoML può addestrare e cross-validare una Random Forest, una Extremely-Randomized Forest, una griglia casuale di Gradient Boosting Machines (GBM), una griglia casuale di reti neurali profonde, e quindi addestra uno Stacked Ensemble usando tutti i modelli.

Quando parliamo di AutoML, dovrebbe coprire gli aspetti di preparazione dei dati, generazione dei modelli ed ensemble e offrire anche il minor numero possibile di parametri, così che gli utenti possano svolgere i compiti con molta meno confusione. H2O AutoML svolge questo compito con facilità e con il minimo di parametri passati dall'utente.

Sia nell'API R sia in quella Python, usa gli stessi argomenti relativi ai dati x, y, training_frame, validation frame, tra i quali y e training_frame sono obbligatori e gli altri opzionali. Puoi anche configurare i valori di max_runtime_sec e max_models: qui max_runtime_sec è obbligatorio, mentre max_model è opzionale; se non passi alcun valore, assume NULL per impostazione predefinita.

Il parametro x è il vettore dei predittori da training_frame; se non vuoi usare tutti i predittori del frame passato, puoi specificarli passandoli in x.

Parliamo ora di alcuni parametri opzionali e vari: prova a smanettare con i parametri anche se non li conosci a fondo, ti aiuterà a imparare argomenti più avanzati:

  • validation_frame: questo parametro è usato per l'early stopping dei singoli modelli in AutoML. È un dataframe che passi per la validazione di un modello o può essere parte dei dati di training se non lo fornisci.

  • leaderboard_frame: se passato, i modelli verranno valutati in base a questi valori invece di usare le metriche di cross-validation. Anche in questo caso, se non lo passi, i valori sono parte dei dati di training.

  • nfolds: cross-validation K-fold, per impostazione predefinita 5; può essere usato per ridurre le prestazioni del modello.

  • fold_columns: specifica l'indice per la cross-validation.

  • weights_column: se vuoi assegnare pesi a specifiche colonne puoi usare questo parametro; assegnare peso 0 significa escludere la colonna.

  • ignored_columns: solo in Python, è l'inverso di x.

  • stopping_metric: specifica una metrica per l'early stopping delle ricerche a griglia e dei modelli; il valore predefinito è logloss per la classificazione e deviance per la regressione.

  • sort_metric: il parametro per ordinare i modelli in classifica alla fine. Il valore predefinito è AUC per la classificazione binaria, mean_per_class_error per la classificazione multinomiale e deviance per la regressione.

I parametri validation_frame e leaderboard_frame dipendono dal parametro di cross-validation nfolds.

Si possono presentare i seguenti scenari in due casi:

quando usiamo la cross-validation in AutoML: * Viene passato solo il training frame - I dati verranno divisi 80-20 tra training e validation frame. * Vengono passati training e leaderboard frame - Nessuna modifica alla divisione 80-20 tra training e validation frame. * Quando vengono passati training e validation frame - Nessuna divisione. * Quando vengono passati tutti e tre i frame - Nessuna divisione.

Quando non usiamo la cross-validation, il che influisce molto sul leaderboard frame (nfolds = 0): * Viene passato solo il training frame - I dati sono divisi in 80/10/10 tra training, validation e leaderboard. * Vengono passati training e leaderboard frame - I dati sono divisi 80-20 tra training e validation frame. * Quando vengono passati training e validation frame - I dati di validation_frame sono divisi 50-50 tra validation e leaderboard. * Quando vengono passati tutti e tre i frame - Nessuna divisione.

Implementazione in R e Python

R

H2O importa i dati come Frame, che è diverso dal data frame che usiamo in R e Python per varie manipolazioni.

train <- h2o.importFile("train.csv")
##
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |=================================================================| 100%
test <- h2o.importFile("test.csv")
##
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |=================================================================| 100%

Impostazione dei predittori e della variabile risposta.

y <- "response"
x <- setdiff(names(train), y)

Crea un oggetto AutoML passando i parametri obbligatori. Qui passiamo solo il training frame e il parametro nfolds mantiene il suo valore predefinito. Puoi aumentare il tempo di esecuzione del modello in base alle tue esigenze.

train[,y] <- as.factor(train[,y])

aml <- h2o.automl(x = x, y = y,
                  training_frame = train,
                  max_runtime_secs = 30)
##
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |=                                                                |   1%
  |                                                                       
  |=                                                                |   2%
  |                                                                       
  |==                                                               |   3%
  |                                                                       
  |===                                                              |   4%
  |                                                                       
  |===                                                              |   5%
  |                                                                       
  |====                                                             |   6%
  |                                                                       
  |=====                                                            |   8%
  |                                                                       
  |======                                                           |   9%
  |                                                                       
  |======                                                           |  10%
  |                                                                       
  |========                                                         |  13%
  |                                                                       
  |==========                                                       |  15%
  |                                                                       
  |==========                                                       |  16%
  |                                                                       
  |===========                                                      |  16%
  |                                                                       
  |===========                                                      |  17%
  |                                                                       
  |===========                                                      |  18%
  |                                                                       
  |============                                                     |  18%
  |                                                                       
  |==============================================================   |  95%
  |                                                                       
  |=================================================================| 100%

Visualizzare la classifica dei diversi modelli.

lb <- aml@leaderboard
lb
##                                                model_id       auc
## 1    StackedEnsemble_AllModels_0_AutoML_20181008_110411 0.7823564
## 2 StackedEnsemble_BestOfFamily_0_AutoML_20181008_110411 0.7789898
## 3             GBM_grid_0_AutoML_20181008_110411_model_0 0.7738653
## 4             GBM_grid_0_AutoML_20181008_110411_model_1 0.7720842
## 5             GBM_grid_0_AutoML_20181008_110411_model_2 0.7713380
## 6                          DRF_0_AutoML_20181008_110411 0.7456390
##     logloss mean_per_class_error      rmse       mse
## 1 0.5596939            0.3197364 0.4359927 0.1900896
## 2 0.5628477            0.3112125 0.4374262 0.1913417
## 3 0.5662489            0.3164375 0.4393990 0.1930715
## 4 0.5679111            0.3192612 0.4402417 0.1938127
## 5 0.5679935            0.3297330 0.4405557 0.1940894
## 6 0.5985811            0.3611326 0.4520878 0.2043834
##
## [8 rows x 6 columns]

Python

python

Se vuoi approfondire in Python, segui il corso di DataCamp Parallel Computing with Dask.

Argomenti

Correlato