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
Kommentar veröffentlichen