Supervised Learning in R: Bayesian Methods
Mobiltelefone tracken mittlerweile jeden Schritt von uns. Diese Daten geben nicht nur Aufschluss an welchen Orten wir waren, sondern auch wo wir uns mit einer großen Wahrscheinlichkeit zukünftig befinden werden.
Angenommen das Handy hat festgehalten, dass wir uns 3 Mal in einem Restaurant, 10 Mal zu Hause, 4 Mal in einem Shop und 23 Mal bei der Arbeit befunden haben. Mit einer Wahrscheinlichkeit von 57,5 % (23/40) befinden wir uns also bei der Arbeit. Nicht besonders aussagekräftig für zukünftige Zeitpunkte. Kommt allerdings eine weitere Variable dazu, z.B. die Zeit, dann können schon um einiges genauere Vorhersagen getroffen werden.
Der Satz von Bayes wurde nach dem Mathematiker Thomas Bayes benannt. Er beschreibt die Berechnung von bedingten Wahrscheinlichkeiten. Also z.B. wie wahrscheinlich ist es, dass ich bei der Arbeit bin, wenn gerade Montag 9 Uhr ist.
In folgendem Beispiel wird der Datensatz locations.csv von DataCamp und die library „e1071“ verwendet. Zuerst werden die Daten eingelesen und mit head(), dim() und str() erhalten wir einen Überblick über die Daten.
library(e1071) locations <- read.csv("R/locations.csv", header = TRUE, sep = ",") head(locations) # month day weekday daytype hour hourtype location # 1 1 4 wednesday weekday 0 night home # 2 1 4 wednesday weekday 1 night home # 3 1 4 wednesday weekday 2 night home # 4 1 4 wednesday weekday 3 night home # 5 1 4 wednesday weekday 4 night home # 6 1 4 wednesday weekday 5 night home dim(locations) # [1] 2184 7 str(locations) # 'data.frame': 2184 obs. of 7 variables: # $ month : int 1 1 1 1 1 1 1 1 1 1 ... # $ day : int 4 4 4 4 4 4 4 4 4 4 ... # $ weekday : Factor w/ 7 levels "friday","monday",..: 7 7 7 7 7 7 7 7 7 7 ... # $ daytype : Factor w/ 2 levels "weekday","weekend": 1 1 1 1 1 1 1 1 1 1 ... # $ hour : int 0 1 2 3 4 5 6 7 8 9 ... # $ hourtype: Factor w/ 4 levels "afternoon","evening",..: 4 4 4 4 4 4 3 3 3 3 ... # $ location: Factor w/ 7 levels "appointment",..: 3 3 3 3 3 3 3 3 3 4 ...
Dann erstellen wir mit naiveBayes() unser Model. Wir wollen die Location vorher sagen anhand der Tages Art und der Stunde. Mit laplace = 1 wir die Berechnung etwas geglättet. Das heißt, auch Ereignisse, welche in den Trainingsdaten nicht vorkommen werden mit einbezogen.
locationmodel <- e1071::naiveBayes(location ~ daytype + hour, data = locations, laplace=1)
Jetzt wollen wir natürlich überprüfen, was unser Model für einen bestimmten Zeitpunkt in der Zukunft vorhersagt. Als Beispiel habe ich ein DataFrame mit „weekday“ und 6 Uhr erstellt.
daytype <- "weekday" futurelocation <- data.frame(daytype) futurelocation$hour <- 6
Die predict() Funktion gefüttert mit dem Model und dem zu vorhersagenden Zeitpunkt, liefert uns als Ergebnis „home“. Wird der Parameter „type“ der predict Funktion auf „raw“ gesetzt, sehen wir die Wahrscheinlichkeiten aller möglichen Orte.
predict(locationmodel, futurelocation) # [1] home predict(locationmodel, futurelocation, type="raw") # appointment campus home office restaurant store theater # [1,] 0.0004453673 0.02000083 0.9327182 0.03388309 0.01295256 9.182049e-23 9.926374e-49