作为机器学习流程的一部分,我一直在探索新的recipes
变量转换包。由于所有的新扩展,我选择了这种升级方法,不再使用caret
的preProcess
函数。但我发现这两个包对转换后的数据给出非常不同的结果:
library(caret) # V6.0-79
library(recipes) # V0.1.2
library(MASS) # V7.3-47
# transform variables using recipes
rec_box <- recipe(~ ., data = as.data.frame(state.x77)) %>%
step_BoxCox(., everything()) %>%
prep(., training = as.data.frame(state.x77)) %>%
bake(., as.data.frame(state.x77))
> head(rec_box)
# A tibble: 6 x 8
Population Income Illiteracy `Life Exp` Murder `HS Grad` Frost Area
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 8.19 138. 0.647 60171653. 6.89 651. 20. 56.0
2 5.90 185. 0.376 61218586. 5.52 1632. 152. 106.
3 7.70 155. 0.527 66409311. 4.08 1253. 15. 69.4
4 7.65 133. 0.570 66885876. 5.05 609. 65. 56.4
5 9.96 165. 0.0936 71570875. 5.13 1445. 20. 75.5
6 7.84 161. -0.382 73188251. 3.62 1503. 166. 67.7
# transform variables using preProcess
pre_box <- preProcess(x = as.data.frame(state.x77), method = c('BoxCox')) %>%
predict(. ,newdata = as.data.frame(state.x77))
> head(pre_box)
# A tibble: 6 x 8
Population Income Illiteracy `Life Exp` Murder `HS Grad` Frost Area
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 8.19 118. 0.642 2383. 6.83 618. 20. 38.7
2 5.90 157. 0.374 2401. 5.47 1538. 152. 65.7
3 7.70 133. 0.524 2488. 4.05 1183. 15. 46.3
4 7.65 114. 0.566 2496. 5.01 579. 65. 38.9
5 9.96 141. 0.0935 2571. 5.09 1363. 20. 49.7
6 7.84 138. -0.383 2596. 3.60 1418. 166. 45.4
## Subtract recipe transformations from MARS::boxcox via caret::preProcess
colMeans(rec_box - pre_box)
> colMeans(rec_box - pre_box)
Population Income Illiteracy Life Exp Murder HS Grad Frost Area
0.000000e+00 2.215800e+01 2.515464e-03 6.803437e+07 2.638715e-02 5.883549e+01 0.000000e+00 1.745788e+01
看起来他们在某些列上达成了一致,但其他列的差异非常大。这些转换之间为什么会有如此不同?还有其他人发现类似的差异吗?
recipe
与preProcess
的比较都是如此。我想知道在caret
包中应用了什么通用规则 - 如果存在任意舍入规则,那将会非常令人沮丧,因为你从哪里开始查找呢?在我的实际工作流程中,我使用了8种不同的转换方法,就性能而言,使用preProcess
的结果比recipe
转换要好得多,测试ROC也更好。 - Hanjo Odendaalround(x, digits = 1)
。测试ROC提高了多少?如果您使用另一个测试集,也许“recipe”的lambda值会表现更好,这可能只是随机改进。 - missusepreProcess
的方法BoxCox
、YeoJohnson
和spatialSign
,并且没有进行数据转换,我得到了0.88-0.92的ROC值(平均改进了0.03个单位)。而使用recipes
进行所有转换后的数据集都只有约0.55的ROC值,而原始数据则给出了约0.88的ROC值。显然这是我的用例(caret::data(segmentationData)),但看起来差距太大了。 - Hanjo Odendaal