āđāļāļāļāļīāļāļāļĩāđāđāļĢāļĩāļĒāļāļ§āđāļēāđāļāđāļ Golden Standard āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļĨāļ°āļāļāļŠāļāļ Machine Learning Model āļāļ·āļ “K-Fold Cross Validation” āļŦāļĢāļ·āļāđāļĢāļĩāļĒāļāļŠāļąāđāļāđāļ§āđāļē k-fold cv āđāļāđāļāļŦāļāļķāđāļāđāļāđāļāļāļāļīāļāļāļēāļĢāļāļģ Resampling
āđāļāđāļāļĩāļĒāļāļāļ k-fold cv āļāļ·āļāļāļēāļĢāđāļāđāļāļāđāļāļĄāļđāļĨāđāļāđāļ k āļŠāđāļ§āļāđāļāđāļēāđāļāļąāļāđāļāļ·āđāļāļŠāļĢāđāļēāļāđāļĨāļ°āļāļāļŠāļāļāđāļĄāđāļāļĨ (train + validate) āļāļģāļāļ§āļāļāđāļēāđāļāļĨāļĩāđāļĒ accuracy āļŦāļĢāļ·āļ error (i.e. model performance) āļāđāļāļāļāļĩāđāļāļ°āļāļģāđāļĄāđāļāļĨāđāļāđāļāđāļāļģāļāļēāļĒāļāđāļāļĄāļđāļĨ test set āļĢāļđāļāļāđāļēāļāļĨāđāļēāļāđāļŠāļāļāļāļēāļĢāđāļāđāļāļāđāļāļĄāļđāļĨāđāļāđāļ 5 folds āđāļāđāļēāđāļāļąāļ āđāļāļĒāļāļēāļĢāđāļāđāļāļāđāļāļĄāļđāļĨāļāđāļāļāđāļāđāļāđāļāļāļĒāđāļēāļ random
āļāļģāđāļĄāļāđāļāļ random? āđāļāļĢāļēāļ° randomness āļāļ°āļāđāļ§āļĒāđāļŦāđāļāđāļāļĄāļđāļĨāđāļāđāļāđāļĨāļ° fold āļĄāļĩāļāļēāļĢāļāļĢāļ°āļāļēāļĒāļāļąāļ§āđāļāļĨāđāđāļāļĩāļĒāļāļāļąāļ āļāđāļ§āļĒāļĨāļ bias āđāļ§āļĨāļēāļāļĩāđāđāļĢāļēāļŠāļĢāđāļēāļāđāļĨāļ°āļāļāļŠāļāļāđāļĄāđāļāļĨ āļāļģāļāļ§āļ k āļāļĩāđāļāļīāļĒāļĄāđāļāđāļāļąāļāđāļāļāļēāļāļāļāļīāļāļąāļāļīāļĄāļĩāļŠāļāļāļāđāļēāļāļ·āļ k=5 āļŦāļĢāļ·āļ k=10

āļāļāđāļāđāļāļāđāļāļĄāļđāļĨāđāļŠāļĢāđāļāđāļĨāđāļ§ (k=5) āđāļĢāļēāļāļ°āļŠāļĢāđāļēāļāđāļĨāļ°āļāļāļŠāļāļāđāļĄāđāļāļĨāļāļāļāļ§āđāļēāļāđāļāļĄāļđāļĨāļāļļāļ fold āļāļ°āļāļđāļāļāļģāļĄāļēāđāļāđ āļāđāļē k=5 āđāļĢāļēāļāđāļāļāđāļāļĢāļāđāļĄāđāļāļĨāļāļąāđāļāļŦāļĄāļ 5 āļĢāļāļāļāđāļ§āļĒ {train folds} āđāļĨāļ°āļāļāļŠāļāļāđāļĄāđāļāļĨāļāļąāđāļāļŦāļĄāļ 5 āļĢāļāļāļāđāļ§āļĒ {validation fold}
āđāļāđāļāđāļĨāļ° iteration (āļĢāļāļ) āđāļĢāļēāļāđāļāļāļāļąāļāļāļķāļāļāđāļē validation error āđāļ§āđāļāđāļ§āļĒāđāļāļ·āđāļāļāļģāđāļāļŠāļĢāļļāļāļāļĨāļŦāļĨāļąāļāļāļāļāļĢāļ°āļāļ§āļāļāļēāļĢ cross validation āļāļąāđāļāļŦāļĄāļ āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļēāļāļāđāļēāļāļĨāđāļēāļāđāļĢāļēāļŠāļēāļĄāļēāļĢāļāļāļģāļāļ§āļāļāđāļēāđāļāļĨāļĩāđāļĒ validation error āđāļāđāđāļāđāļēāļāļąāļ (.20 + .25 + .22 + .20 + .18)/ 5 = 0.21 āđāļĨāļ°āļāļĩāđāļāļ·āļāļāļĩāđāļĄāļēāļāļāļāļāļģāļ§āđāļē “Cross Validation (Error)” āļĄāļĩāđāļŦāļāļļāļāļĨ!
Iteration | Train Folds | Validation Fold | Validation Error |
---|---|---|---|
1 | {1, 2, 3, 4} | 5 | .20 |
2 | {1, 2, 3, 5} | 4 | .25 |
3 | {1, 2, 4, 5} | 3 | .22 |
4 | {1, 3, 4, 5} | 2 | .20 |
5 | {2, 3, 4, 5} | 1 | .18 |
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļāļāļ°āļŠāļāļāđāļāļĩāļĒāļ k-fold cross validation āđāļāļ programmatically āļāđāļ§āļĒāļ āļēāļĐāļē R āļāļ§āļēāļĄāļĢāļđāđāļāļ·āđāļāļāļēāļāļŠāļģāļŦāļĢāļąāļ tutorial āļāļĩāđāļāļ·āļ data structures (list), function āđāļĨāļ° control flow (for loop)
- Load Dataset
- Create Fold ID
- Look at Data in Each Fold
- Build a Simple Model
- Full R Code
Load Dataset
āļāđāļāļĄāļđāļĨ Boston Housing āļāļĩāđāđāļāļāđāļāđāđāļāļāļāļāļ§āļēāļĄāļāļĩāđāļāļĒāļđāđāđāļ package mlbench āđāļŦāļĨāļāļāđāļāļĄāļđāļĨāđāļāđāļēāļŠāļđāđ RStudio āļāđāļ§āļĒāļāļąāļāļāļąāđāļ data() āđāļĨāļ°āđāļāļĨāļĩāđāļĒāļāļāđāļāļĄāļđāļĨāđāļāđāļ tibble āđāļāļ·āđāļāđāļŦāđāđāļŠāļāļāļāļĨāđāļ console āđāļāđāļāļĩāļāļķāđāļāļāđāļ§āļĒāļāļąāļāļāļąāđāļ as.tbl()
## load libraries
library(caret)
library(mlbench)
library(dplyr)
## load dataset
data("BostonHousing")
BostonHousing <- as.tbl(BostonHousing)
Create Fold ID
āļ§āļīāļāļĩāļāļēāļĢ split āļāđāļāļĄāļđāļĨāđāļāđāļ k folds āđāļāđāļēāđāļāļąāļāđāļ R āļāļģāđāļāđāļāđāļēāļĒāđāļāđāļ§āļĒāļāļąāļāļāļąāđāļ createFolds() āļāļāļ caret āļāļąāđāļāđāļāđāđāļāļĩāļĒāļ R āļĄāļē āđāļāļāļāļīāļāļ§āđāļēāļāļąāļāļāļąāđāļāļāļĩāđāđāļāđāļāđāļēāļĒāļŠāļļāļāđāļĨāđāļ§ āļāļāļāļīāđāļāļāđāļāđāļāļąāļāļāļąāđāļ train() āđāļĨāļ° trainControl() āļāļāļ caret āđāļāļ·āđāļāļŠāļĢāđāļēāļāđāļĨāļ°āļāļāļŠāļāļāđāļĄāđāļāļĨ ML āļĨāļāļāļāđāļēāļāļāļāļāļ§āļēāļĄ caret āļāļāļāđāļĢāļēāđāļāđāļāļĩāđāļāļĩāđ
āđāļĢāļēāļŠāļēāļĄāļēāļĢāļāđāļāļĨāļĩāđāļĒāļāļāđāļē k argument āđāļāļāļąāļāļāļąāđāļ createFolds() āđāļāļ·āđāļāļāļģāļŦāļāļāļāļģāļāļ§āļ folds āļāđāļēāļāļĒāļēāļāđāļŦāđāļāļĨāļĨāļąāļāļāđ reproducible āļāđāļāļāđāļāļĩāļĒāļāļāļąāļāļāļąāđāļ set.seed() āļāđāļāļāļāļĩāđāđāļĢāļēāļāļ°āđāļāđāļ folds
## create folds
folds <- createFolds(BostonHousing$medv, k=5, list=TRUE)

āļāļāļīāļāļēāļĒ – āļāļąāļ§āđāļĨāļāđāļāđāļāđāļĨāļ° fold āļāļ·āļ row index āļāļāļāļāđāļāļĄāļđāļĨ BostonHousing āļāļąāļ§āđāļĨāļ [9, 26, 27, 42, 56 … 475, 487, 491, 496, 500] āđāļāļēāđāļ§āđāđāļāđ subset āđāļāļ·āđāļāļŠāļĢāđāļēāļāļāđāļāļĄāļđāļĨ Fold1 āļāļąāļ§āđāļĨāļ row index āđāļāđāļāđāļĨāļ° fold āļāļ°āđāļĄāđāļāđāļģāļāļąāļāđāļĨāļĒ
Look at Data in Each Fold
Output āļāļĩāđāđāļāđāļāļēāļāļāļąāļāļāļąāđāļ createFolds() āļāļāļ caret āļāļ°āļāļĒāļđāđāđāļāļĢāļđāļāđāļāļāļāļāļ list āđāļĢāļēāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļąāļāļāļąāđāļ lapply() āđāļāļ·āđāļ loop through list āđāļāļ·āđāļāļŠāļĢāđāļēāļ dataframe āļāļāļāđāļāđāļĨāļ° fold āđāļĨāļ°āļŠāļĢāđāļēāļ object āđāļŦāļĄāđāļāļ·āđāļāļ§āđāļē dataFolds
āđāļ R āđāļĢāļēāđāļāļĩāļĒāļ [[ ]] āđāļāļ·āđāļ subset list āļāļāļāļĄāļēāļāļđāļāđāļāļĄāļđāļĨ āļāđāļēāļāļĒāļēāļāđāļāđāļāđāļāļĄāļđāļĨāđāļ fold1 āđāļāđāđāļŠāđāđāļĨāļ 1 (index) āđāļāđāļ [[ ]] āļŦāļĢāļ·āļāļāđāļēāļāļĒāļēāļāđāļāđāļāđāļāļĄāļđāļĨāđāļ fold5 āđāļāđāđāļāļĨāļĩāđāļĒāļāđāļĨāļāļŦāļāļķāđāļāđāļāđāļāđāļĨāļāļŦāđāļēāđāļŠāļĢāđāļāđāļĨāļĒ āļāļģāđāļĄāļāđāļēāļĒāļāļĒāđāļēāļāļāļĩāđ 555+
## look at data in each fold
dataFolds <- lapply(folds, FUN = function(x) BostonHousing[x, ])
## data in fold1
dataFolds[[1]]

Build A Simple Model
āļĄāļēāļĨāļāļāđāļāļĢāļ linear regression āļāđāļēāļĒāđāļāļąāļāļāđāļāļĄāļđāļĨāļāļąāđāļ 5-fold āļŦāļēāļāđāļēāđāļāļĨāļĩāđāļĒāđāļĨāļ°āļŠāđāļ§āļāđāļāļĩāđāļĒāļāđāļāļāļĄāļēāļāļĢāļāļēāļāļāļāļāļāđāļē R-Squared āļāļĩāđāđāļāđāļāļēāļāļāļēāļĢāđāļāļĢāļāđāļĄāđāļāļĨāļāļąāđāļ 5 āļĢāļāļ (i.e. cross validation error/ accuracy)

## create linear regression k-fold function
kfoldLM <- function(data, k) {
folds <- createFolds(BostonHousing$medv, k=k, list=T)
result <- vector()
for(fold in folds) {
trainData <- data[-fold, ]
testData <- data[fold, ]
r2 <- summary(lm(trainData))$r.squared
result <- append(result, r2)
}
cat("Average R2:", round(mean(result),4) )
cat("\nStandard Deviation R2:", round(sd(result),4) )
}
Note – āļāļāļāļīāđāļĢāļēāļāļīāļĒāļĄāđāļāđ k-fold cv āļāļąāļāđāļĄāđāļāļĨāļāļĩāđāļāđāļāļāļĄāļĩāļāļēāļĢāļāļđāļāļāđāļē parameters āđāļāđāļ decision tree (cp, max depth, split rule), random forest (mtry, ntree), knn (k, distance) āđāļāđāļāļāđāļ
Full R Code
A learning curve is essential to growth.
Tammy Bjelland
āđāļāđāļ R āđāļāļāđāļāđāļĄāđāļŠāļģāļŦāļĢāļąāļāļāļģ cross validation āļāđāļ§āļĒāļāļąāļāļāļąāđāļ kfoldLM() āļŠāļģāļŦāļĢāļąāļāđāļāļĢāļ linear regression āļāļīāļāļāļĢāļāđāļŦāļ comment āļŠāļāļāļāļēāļĄāđāļāļāđāļāđāđāļāļāļāļāļ§āļēāļĄāļāļĩāđāđāļāđāđāļĨāļĒ ð
## R version 3.6.1 | |
## Created by DataRockie 15 November 2019 | |
## load library | |
library(caret) | |
library(mlbench) | |
library(dplyr) | |
## load dataset | |
data("BostonHousing") | |
## tibble dataframe | |
BostonHousing <- as.tbl(BostonHousing) | |
## create folds | |
(folds <- createFolds(BostonHousing$medv, k=5, list=T)) | |
## train linear regression | |
kfoldLM <- function(data, k) { | |
folds <- createFolds(BostonHousing$medv, k=k, list=T) | |
result <- vector() | |
for(fold in folds) { | |
trainData <- data[–fold, ] | |
testData <- data[fold, ] | |
r2 <- summary(lm(trainData))$r.squared | |
result <- append(result, r2) | |
} | |
cat("Average R2:", round(mean(result),4) ) | |
cat("\nStandard Deviation R2:", round(sd(result),4) ) | |
} | |
## test function with k=5 | |
kfoldLM(data = BostonHousing, k = 5) |
Leave a Reply