Direkt zum Hauptbereich

Cross-Validation

Im Folgenden geht es um drei Methoden der Cross-Validation: hold-out, leave one out, und k-fold. Bei der Kreuzvalidierung geht es hauptsächlich darum, zu vermeiden, dass das Modell zu gut ist. Häufig ist ein Modell so stark an die Daten angepasst, dass es bei der Schätzung neuer Werte versagt (overfitting). Bei der ersten Methode wird der Datensatz in ein Trainings- und ein Testsample unterteilt. Das Modell wird nur auf die Trainingsdaten gefittet und die Testdaten werden dann geschätzt. Bei der zweiten Variante wird immer ein Wert bei der Modellbildung ausgelassen und dann vom Modell geschätzt - und das für alle Werte (großer Rechenaufwand!). Die dritte Variante teilt den Datensatz in k Teile und schätzt dann jeden einzelnen mit allen anderen. Eine Ausführliche Einführung hierzu gibt es in: James, Gareth; Witten, Daniela; Hastie, Trevor und Robert Tibshirani. 2013. An introduction to statistical learning. New York [u.a.]: Springer. 


df = read.csv("recs2009_public.csv")
meta = read.csv("public_layout.csv")
dfm = subset(df, select = c("AIA_Zone","YEARMADE","TOTROOMS", "AGERFRI1", "WASHLOAD", "TVCOLOR", "NUMPC", "EQUIPAGE", "HHSEX", "HHAGE", "MONEYPY", "KWH"))

dfm.select = dfm[,c(1,2,3,5,6,7,10,12)]
fit2 = lm(KWH ~., data=dfm.select)
summary(fit2)

#hold-out
set.seed(1)
train = sample(nrow(dfm.select), round(nrow(dfm.select)/2))
fit2 = lm(KWH ~., data=dfm.select, subset=train)
summary(fit2)

# mit Hilfe der predict-Funktion können wir jetzt die Response für die
# übrigen Werte berechnen... und somit auch die Summe der quadrierten
# Abweichungen.

MSE.fit2 = mean((dfm.select$KWH - predict(fit2, dfm.select))[-train]^2)
RMSE.fit2 = sqrt(MSE.fit2)
MSE.fit2
RMSE.fit2
# MAPE.fit2 = 100/(dim(dfm.select)[1]-length(train))*
#   sum(abs((dfm.select$KWH - predict(fit2, dfm.select))[-train])/dfm.select$KWH[-train])
# Nun der Vergleich mit einem Single Predictor Model
fit3 = lm(KWH ~ AIA_Zone, data=dfm.select, subset=train)
MSE.fit3 = mean((dfm.select$KWH - predict(fit3, dfm.select))[-train]^2)
RMSE.fit3 = sqrt(MSE.fit3)
# MAPE.fit3 = 100/(dim(dfm.select)[1]-length(train))*
#   sum(abs((dfm.select$KWH - predict(fit3, dfm.select))[-train])/dfm.select$KWH[-train])

#Leave One Out Cross-Validation (LOOCV)
# requires :: boot
# die Funktion cv.gml() ist aus dem boot-Paket

library(boot)
glm.fit3 = glm(KWH ~ AIA_Zone, data=dfm.select)
# Vorsicht! Der nächste Befehl braucht Zeit
cv.err = cv.glm(dfm.select, glm.fit3)
cv.err$delta

#k-fold Cross-Validation
set.seed(123)
cv.error.10=rep(0,10)
glm.fit4 = glm(KWH ~ TOTROOMS, data=dfm.select)
for (i in 1:10){
  cv.error.10[i] = cv.glm(dfm.select, glm.fit4,K=10)$delta[2]
}
cv.error.10
sqrt(mean(cv.error.10))

Kommentare

Beliebte Posts aus diesem Blog

Deep-Dive Impfeffektivität: Eine kritische Datenanalyse der RKI-Berechnungen / Teil 1: Die Methode

Die Einschätzung, wie effektiv die COVID-Impfung ist, ist eine der politisch relevantesten Kennzahlen derzeit. Insbesondere für die Einschätzungen der Angemessenheit einr Impfpflicht ist diese Zahl extrem wichtig. In der Vergangenheit hat sich immer wieder gezeigt, dass die Berechnungen des RKI nicht in jeder Hinsicht eindeutig sind, sondern auf vielen Annahmen beruhen, die man auch kritisch hinterfragen kann und muss. Für die politische Datenwissenschaft ist es daher essenziell, diese Berechnungen nachvollziehbar zu machen. In diesem Beitrag wird das methodische Vorgehen des RKI zur Berechnung der Impfeffektivität analysiert. Die Informationen dazu entstammen den RKI-Wochenberichten .  In einem zweiten Teil habe ich die konkreten Berechnungen des RKI so weit wie möglich rekonstruiert und kann daher zeigen, wie stark die Ergebnisse schwanken, wenn Annahmen leicht verändert werden. Meine Erkenntnisse aus der folgenden Analyse: Das RKI verwendet zur Berechnung der Impfeffektivität di...

Der Nutzerismus: Eine Ideologie mit totalitärem Potential

Ich glaube, dass wir derzeit den Aufstieg einer Ideologie erleben, die ich Nutzerismus nennen möchte. Hannah Arendt hat darauf hingewiesen, dass jede Ideologie zu einem totalitaristischen Regime führen kann und es gibt ernste Anzeichen, dass dies auch für den Nutzerismus gilt.  Was ist der Nutzerismus? Wie bei jeder Ideologie ist der Kerngedanke sehr einfach: Im Prinzip gibt es für alle gesellschaftlichen Probleme eine technische Lösung. Leider wenden die Menschen die richtigen Technologien nicht an. Sie nehmen ihre Rolle als Nutzer nicht wahr. Es geht dem Nutzerismus also um das Zusammenspiel von Mensch und Technik, allerdings immer wieder aus der gleichen Perspektive. Die Technik kommt vor als potentielle Lösung eines gesellschaftlichen Problems. Eventuell fehlt die perfekte Lösung noch, aber das ist dann als Auftrag an die Wissenschaft und die Ingenieure zu verstehen. Dieser Technikglaube hat etwas sehr Naives. Er abstrahiert zum Beispiel von allen Interessen, für die Technolog...

#RTutorial: Using R to Harvest the Twitter STREAM API

Initializing the Twitter API In this tutorial, the so called STREAMING-API from Twitter is used. This API provides real-time access to Twitter, so the results are dependent from what is actually going on, right now. Before we start, we have to initialize the Twitter-API. To use the Twitter API, a consumer key and consumer secret is required. Therefore, you have to register as a developer who is creating a Twitter app. Create a Twitter account and then sign in at https://apps.twitter.com/. The account has to be verified with a phone number. This can be done on the Twitter webpage in the account settings. Fill in name, description and any valid URL with leading “http://”. It is important NOT to provide any call-back URL, because otherwise the registration from R will not function. After this, you can see a summary of your newly created app with a link to “manage keys and access tokens”. The consumer key and consumer secret that can be found there have to be copied into the following R-...