【发布时间】:2017-08-23 21:39:17
【问题描述】:
我想在交叉验证中使用分组的 brier 分数来比较多项式 logit 模型和随机森林。这种方法的理论基础是:https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3702649/pdf/nihms461154.pdf
我的因变量有三个结果,我的数据集包含生命周期数据,其中生命周期介于 0-5 之间。
为了使事情可重现,我的数据集看起来像:
library(data.table)
N <- 1000
X1 <- rnorm(N, 175, 7)
X2 <- rnorm(N, 30, 8)
length <- sample(0:5,N,T)
Ycont <- 0.5*X1 - 0.3*X2 + 10 + rnorm(N, 0, 6)
Ycateg <- ntile(Ycont,3)
df <- data.frame(id=1:N,length,X1, X2, Ycateg)
df$Ycateg=ifelse(df$Ycateg==1,"current",ifelse(df$Ycateg==2,"default","prepaid"))
df=setDT(df)[,.SD[rep(1L,length)],by = id]
df=df[ , time := 1:.N , by=id]
df=df[,-c("length")]
head(df)
id X1 X2 Ycateg time
1: 1 178.0645 10.84313 1 1
2: 2 169.4208 34.39831 1 1
3: 2 169.4208 34.39831 1 2
4: 2 169.4208 34.39831 1 3
5: 2 169.4208 34.39831 1 4
6: 2 169.4208 34.39831 1 5
到目前为止我所做的是:
library(caret)
fitControl <- trainControl(method = 'cv',number=5)
cv=train(as.factor(Ycateg)~.,
data = df,
method = "multinom",
maxit=150,
trControl = fitControl)
cv
由于模型用于预测每个时间点的概率,我想为每个折叠计算以下内容:
因变量的每个类别的 Brier 分数:BS_i=(Y_it,k - p_it,k)² - 其中 i 表示测试折叠的观察 i,t 时间,k 表示第 k 类因变量
总结这一折 1. 通过计算 1/n_t (BS_i) 其中 n_t 是确实具有观察时间 t 的观察数 - 所以是分组计算
所以最后,我想要报告的内容 - 例如对于 3 倍的 CV 并且知道时间范围为 0-5 - 是这样的输出:
fold time Brier_0 Brier_1 Brier_2
1 1 0 0.39758714 0.11703814 0.8711775
2 1 1 0.99461281 0.95051037 0.1503217
3 1 2 0.01791559 0.83653814 0.1553521
4 1 3 0.92067849 0.55275340 0.6466206
5 1 4 0.73112563 0.07603891 0.5769286
6 1 5 0.29500600 0.66219814 0.7590742
7 2 0 0.24691469 0.06736522 0.8612998
8 2 1 0.13629191 0.55973431 0.5617303
9 2 2 0.48006915 0.01357407 0.4515544
10 2 3 0.01257112 0.40250469 0.1814620
. . . . . .
我知道我必须设置summaryFunction 的自定义版本,但我真的不知道如何做到这一点。所以我的主要目标不是调整模型,而是验证它。
【问题讨论】:
标签: r customization r-caret