다른 알고리즘 사용
지금까지 동일한 rxLinMod 알고리즘을 사용하는 두 모델을 살펴 보았습니다. 이 둘을 비교하면서, 우리는 모델을 만드는 데 사용된 변수들이 각각의 예측에 미치는 영향도를 포착하는 방법을 살펴 보았습니다. 이러한 비교를 위해서, 모델을 만드는 데 사용되는 모든 변수들의 조합을 사용하여 데이터 세트를 만들고, rxPredict를 사용하여 두 모델로 해당 데이터 세트에 대하여 스코어링을 수행하였습니다. 그렇게 함으로써 우리는 예측이 어떻게 분포되어 있는지를 알 수는 있습니다만 ,그러나 여전이 이러한 예측이 옳은지는 아직 알 수가 없습니다. 모델의 성능에 대한 진정한 테스트는 샘플 데이터 이외의 자료에 대하여 예측할 수 있는 능력에 있습니다. 따라서 우리는 데이터를 두 개로 나누고, 모델의 테스트를 위해 한 부분을 따로 보관 합니다.
데이터를 트레이닝과 테스트의 두 부분으로 나누기 위해, 먼저 rxDataStep을 사용하여 split이라는 새 factor 열을 작성하였습니다. 이 열에는 "train"또는 "test" 값이 부여되어, 이를 통하여 주어진 데이터 비율(여기서는 75 %)이 모델 트레이닝에, 나머지는 모델의 예측 능력을 테스트하는 데 사용됩니다. 이어서 rxSplit 함수를 사용하여 데이터를 두 부분으로 나눕니다. 여기에서 우리가 만드는 rx_split_xdf 함수는 앞서의 두 단계를 하나로 결합하고, 일부 인수들에 대하여 기본값을 설정합니다.
dir.create('output', showWarnings = FALSE)
rx_split_xdf <- function(xdf = mht_xdf,
split_perc = 0.75,
output_path = "output/split",
...) {
# first create a column to split by
outFile <- tempfile(fileext = 'xdf')
rxDataStep(inData = xdf,
outFile = xdf,
transforms = list(
split = factor(ifelse(rbinom(.rxNumRows, size = 1, prob = splitperc), "train", "test"))),
transformObjects = list(splitperc = split_perc),
overwrite = TRUE, ...)
# then split the data in two based on the column we just created
splitDS <- rxSplit(inData = xdf,
outFilesBase = file.path(output_path, "train"),
splitByFactor = "split",
overwrite = TRUE)
return(splitDS)
}
# we can now split to data in two
mht_split <- rx_split_xdf(xdf = mht_xdf, varsToKeep = c('payment_type', 'fare_amount', 'tip_amount', 'tip_percent', 'pickup_hour',
'pickup_dow', 'pickup_nb', 'dropoff_nb'))
names(mht_split) <- c("train", "test")
이제 데이터에 대해 세 가지의 다른 알고리즘을 실행합니다.
- rxLinMod, 앞서의 선형 모델이며 다음 인자를 사용 : tip_percent ~ pickup_nb:dropoff_nb + pickup_dow:pickup_hour
- rxDTree, 의사 결�� 트리 알고리즘 : tip_percent ~ pickup_nb + dropoff_nb + pickup_dow + pickup_hour(factor간 조합 분석이 알고리즘 자체에 내장되어 있기 때문에 의사 결정 트리에는 조합 factor가 필요하지 않음)
- rxDForest, 랜덤 포리스트 알고리즘은 의사 결정 트리와 같은 인자를 사용
우리 코스는 모델링 과정이 아니기 때문에, 알고리즘 구현 방법에 대해서는 다루지 않을 것입니다. 대신 우리는 알고리즘을 실행하고, 테스트 데이터의 팁 퍼센트를 예측하여, 어느 알고리즘이 더 효과적인지 알 수 있습니다.
system.time(linmod <- rxLinMod(tip_percent ~ pickup_nb:dropoff_nb + pickup_dow:pickup_hour,
data = mht_split$train, reportProgress = 0))
system.time(dtree <- rxDTree(tip_percent ~ pickup_nb + dropoff_nb + pickup_dow + pickup_hour,
data = mht_split$train, pruneCp = "auto", reportProgress = 0))
system.time(dforest <- rxDForest(tip_percent ~ pickup_nb + dropoff_nb + pickup_dow + pickup_hour,
mht_split$train, nTree = 10, importance = TRUE, useSparseCube = TRUE, reportProgress = 0))
user system elapsed
0.00 0.00 1.62
user system elapsed
0.03 0.00 778.00
user system elapsed
0.02 0.00 644.17
위의 알고리즘들은 실행하는 데 시간이 꽤 걸릴 수 있으므로, 각각의 반환된 모델을 저장하는 것이 좋습니다.
trained.models <- list(linmod = linmod, dtree = dtree, dforest = dforest)
save(trained.models, file = 'trained_models.Rdata')