05.08.2021

Einführung

Wissensstand

  • Entscheidungsbäume?
  • Ensembles?
  • Gradient Boosting?
  • Neural Networks / Deep Learning?

Entscheidungsbäume

  • Datenraum wird schrittweise aufgeteilt
  • Jede Aufteilung: Entscheidung mit einer Variablen

Gradient Boosting (GB)

  • Ensemble Methode
  • Verknüpft einzelne ‘schwache’ Modelle zu ‘starkem’ Ensemble
  • Gewichtete Summe der Komponenten-Modelle
  • Komponenten werden sequentiell trainiert
  • Können parallel ausgewertet werden
  • Sehr häufig: Entscheidungsbäume als Komponenten-Modelle

GB Erfolge

Performance von 13 Modellen auf 165 Klassifikationsproblemen

Bild übernommen von: Olson et al. (2018), Data-driven Advice for Applying Machine Learning to Bioinformatics Problems, https://arxiv.org/pdf/1708.05070.pdf

Deep Learning, Neuronale Netzwerke (NN)

  • Ungefähre Nachbildung eines biologischen Gehirns
  • Netzwerk aus Neuronen
  • Neuronen:
    • Gewichtete Summe aller Eingaben bestimmen
    • Nichtlineare Funktion anwenden (Aktivierungsfunktion)

NN Erfolg: Reinforcement Learning (AlphaGo)

NN Erfolg: Protein Folding (AlphaFold)

Vergleich von NN und GB

Mögliche Betrachtungsweisen für Vergleich

  • Genauigkeit des Modells
  • Sensitivität bzgl. Hyperparameter
  • Interpretierbarkeit / Erklärbarkeit
  • Bedarf an Zeit / Rechenressourcen
  • Parallelisierbarkeit
  • Eignung für Aufgabenstellungen / Daten
  • Deployment / Implementationen
  • Ease-of-use

Take-Home-Message: Vergleiche meist fallabhängig.

Interpretierbarkeit

  • Gesamtmodell in beiden Fällen schwer zu interpretieren
  • GB
    • Bei Entscheidungsbäumen können zumindest die ersten Bäume interpretiert werden
  • NN
    • u.a.: ‘Attention’ Mechanismen

Einige typische Anwendungsbereiche

  • GB
    • Tabellarische Daten
    • Strukturierte Daten
    • Statische Daten
    • Heterogene Daten


  • NN
    • Bild- und Videodaten
    • Text und Sprache
    • Reinforcement learning
    • Datenströme

Aktivität der Community:

Auszug aus: Nguyen et al., 2019, Machine Learning and Deep Learning frameworks and libraries for large-scale data mining: a survey

Vergleich anhand eines Beispiels

Beispieldatensatz: Auto-MPG

data <- read.table("auto-mpg.data",na.strings = "?")
names(data) <- c("mpg","cylinders","displacement","horsepower",
                 "weight","acceleration","model_year","origin","car_name")
str(data)
## 'data.frame':    398 obs. of  9 variables:
##  $ mpg         : num  18 15 18 16 17 15 14 14 14 15 ...
##  $ cylinders   : int  8 8 8 8 8 8 8 8 8 8 ...
##  $ displacement: num  307 350 318 304 302 429 454 440 455 390 ...
##  $ horsepower  : num  130 165 150 150 140 198 220 215 225 190 ...
##  $ weight      : num  3504 3693 3436 3433 3449 ...
##  $ acceleration: num  12 11.5 11 12 10.5 10 9 8.5 10 8.5 ...
##  $ model_year  : int  70 70 70 70 70 70 70 70 70 70 ...
##  $ origin      : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ car_name    : chr  "chevrolet chevelle malibu" "buick skylark 320" "plymouth satellite" "amc rebel sst" ...

http://archive.ics.uci.edu/ml/datasets/Auto+MPG

Vorverarbeitung der Daten

## Spalte "car_name" entfernen
data$car_name <- NULL
## Zeilen mit fehlenden Werten entfernen
data <- data[!is.na(data$horsepower),]
## Seed für Zufallszahlengenerator
set.seed(0)
## Aufteilen in Trainings- und Validierungsdaten
## und umwandeln in Datentyp 'matrix'
indices <- sample(1:nrow(data), 0.7 * nrow(data))
train_data <- as.matrix(data[indices,-1])
train_label <- data[indices,1]
val_data <- as.matrix(data[-indices,-1])
val_label <- data[-indices,1]

Aber welches Modell nehmen wir jetzt?

Aber welches Modell nehmen wir jetzt?

  • “Übliche” Wahl für derartige Daten wäre GB
  • Ausprobieren!

Implementation: xgboost

  • xgboost: Extreme Gradient Boosting
  • Moderne Implementation von Gradient Boosting
  • Auch in R verfügbar:
install.packages("xgboost")

Auto-MPG mit xgboost

library(xgboost)
## Zufallszahlengenerator, Seed
set.seed(1234)
## Trainieren des xgbooost Modells
xgb_model <- xgboost(data=train_data,label=train_label,
                     nrounds = 10,
                     nthread = 1, verbose = 0)

Plot der ersten 2 Bäume

p1 <- xgb.plot.tree(model = xgb_model, trees = 0)
p2 <- xgb.plot.tree(model = xgb_model, trees = 1)

NN: keras / tensorflow

Auto-MPG mit NN

## Skalierung der Eingabedaten zu Intervall [0,1]
scalef <- function(x) (x-min(x)) / (max(x)-min(x)) 

## Keras / tensorflow laden
library(keras)

## Seed für tensorflow setzen (Reproduzierbarkeit)
tensorflow::set_random_seed(1234) 

## Modell initialisieren
model <- keras_model_sequential() 

Auto-MPG mit NN

## Füge dem Modell Schichten hinzu
model %>% 
    layer_dense(units = 20, input_shape = ncol(train_data)) %>% 
    layer_dense(units = 1)

## Kompilieren
model %>% compile(loss = 'mse',
     optimizer = "adam")

## Trainieren
histo <- model %>% fit(x=apply(train_data,2,scalef), 
     y=train_label, 
     verbose=0,
     epochs = 100)

Lernverlauf

plotly::ggplotly(plot(histo))

Fehler auf Validierungsdaten

## GB RMSE:
sqrt(mean((predict(xgb_model,val_data) - val_label)^2))
## [1] 2.851855
## NN RMSE:
scores = model %>% evaluate(apply(val_data,2,scalef), val_label, verbose = 0)
print(sqrt(scores))
##     loss 
## 4.856659

Ausreichend für Entscheidung?

Ausreichend für Entscheidung?

  • Problem:
    • tensorflow wählt zufällig initiale Gewichte
    • Daten sind zufällig aufgeteilt
    • Vielleicht Ergebnis ‘nur Zufall’?
  • Lösung:
    • Wiederholungen des Experiments

siehe: experimentReplication.R

Boxplot - Wiederholung des Experimentes

load("rmses.RData")
library(plotly)
plot_ly(x = rmse_gb, type = "box", name="GB") %>%
  add_trace(x = rmse_nn, name="NN") %>% 
  layout(xaxis = list(title = "rmse"), yaxis=list(autorange="reversed")) 

Ausreichend für Entscheidung?

Ausreichend für Entscheidung?

  • Problem:
    • Parameter beeinflussen die Modelle, z. B.:
    • GB: Anzahl Bäume, Lernrate
    • NN: Anzahl Neuronen, Lernrate
  • Lösung:
    • Parameter Tuning

siehe: tuneNN.R, tuneXgboost.R

GB Parameter

  • nrounds:
    • Anzahl Bäume
    • Default: nicht vorhanden
  • max_depth:
    • Tiefe der Bäume
    • Default: 6
  • eta:
    • Lernrate
    • Default: 0.3
  • colsample_bytree:
    • Anteil auswählbarer Splitfeature
    • Default: 1 (100%)

NN Parameter

  • units:
    • Anzahl Neuronen in Schicht
    • Default: nicht vorhanden
  • batch_size:
    • Anzahl Beobachtungen je Gewichtsupdate
    • Default: 32
  • lr:
    • Lernrate (ADAM)
    • Default: 0.001
  • activation:
    • Aktivierungsfunktion
    • Default: “linear”

Tuning: Parameter & Performance GB

load("resultFilexgboost.RData")
source("plotting.R")
plot_parallel(whichopt(resultpp2),yrange = c(1,5))

Tuning: Parameter & Performance NN

load("resultFileNN.RData")
plot_parallel(whichopt(resultpp2),
              yrange = c(1,5))

Boxplot - nach Tuning

plot_ly(x = rmse_gb, type = "box", name="GB") %>% 
  add_trace(x = rmse_nn, name="NN") %>% 
  add_trace(x = rmse_gb_tuned, name="GB*") %>% 
  add_trace(x = rmse_nn_tuned, name="NN*") %>% 
  layout(xaxis = list(title = "rmse"), yaxis=list(autorange="reversed"))

Also: DL / NN oder GB?

  • Kommt auf die Anwendung an
  • Empfehlung: nehmen was man versteht
  • Empirischer Vergleich, Tuning sinnvoll
  • Ausserdem: Kombination möglich, z. B.:
    • GB mit einfachen NNs als Komponentenmodelle
    • Oder Feature Extraction mit convolutional NNs, danach GB
    • Oder Kombination aus GB und NN über stacking

Danke für die Aufmerksamkeit. Fragen?