
vtreat的目的是生成可用于监督式预测建模的纯数字data.frame,什么情况下表示数据准备就绪:
纯数字数据框
无缺失值:缺失值用指示符(indicators)重新编码
列数合理:高度分类的使用效果(effects)代码或影响(impact)代码进行重新编码
vtreat理念是假定vtreat变量处理后下一步骤就可以进行复杂的监督机器学习方法。在此假设下,我们假设机器学习方法(回归,树方法,随机森林,增强或神经网络)能够胜任冗余变量,变量联合分布,整体正则化和联合维数减少的工作。
但是,一个重要的例外是:变量筛选。在现实中,我们已经看到大量的数据仓库,其中每个表有数百列,导致模型不堪重负,并且由于过度拟合而使现有的机器学习算法失效。我们有一些综合示例。
结果是:即使在2021年,您也无法将在数据仓库中中的任一列都视为一个变量,您至少必须先执行一些基本筛查。
为了帮助解决此问题,vtreat合并每个变量的线性重要性报告。该报告包含在线性或广义线性模型中单独使用每个变量的有用性。但是,这种计算是针对速度而不是发现特征的有效性进行了优化的,所以说这个方法不能完美的解决特征筛选问题。
vtreat现在包括直接变量评估系统,该系统可以很好地处理复杂的数字关系。
vtreat::valuevariablesN() 回归问题
vtreat::valuevariablesC() 二项式分类。
它通过将每个数字变量的两个转换后的副本拟合到结果中起作用。
一种变换是一种低频变换,实现为k适度选择的最佳段线性模型k。
另一个拟合是实现为a的k近邻平均的高频变换k。
我们建议将其vtreat::valuevariables*()用作初始变量。
让我们使用“segment fitter example”中的数据进行演示。在我们的情况下,先用上帝视角构建数据集合,其中关系为要预测的值(“y”)就是的sin(x)。让我们设置示例数据:
set.seed(1999)
d <- data.frame(x = seq(0, 15, by = 0.25))
d$y_ideal <- sin(d$x)
d$x_noise <- d$x[sample.int(nrow(d), nrow(d), replace = FALSE)]
d$y <- d$y_ideal + 0.5*rnorm(nrow(d))
dim(d)
[1] 61 4 现在,可以按如下所示对变量进行简单的线性评估。
cfe <- vtreat::mkCrossFrameNExperiment(
d,
varlist = c("x", "x_noise"),
outcomename = "y")
sf <- cfe$treatments$scoreFrame
knitr::kable(sf[, c("varName", "rsq", "sig")]
| varName | rsq | sig |
|---|---|---|
| x | 0.003136 | 0.6681673 |
| x_noise | 0.025578 | 0.2182462 |
请注意,协变量的得分不比噪声变量更好。这是因为之间的关系x,并y不是线性的。
现在开始尝试vtreat::valuevariablesN()。
vf = vtreat::value_variables_N(
d,
varlist = c("x", "x_noise"),
outcomename = "y")
knitr::kable(vf[, c("var", "rsq", "sig")])
| var | rsq | sig |
|---|---|---|
| x | 0.1999094 | 0.0009099 |
| x_noise | 0.0255780 | 0.6547385 |
结果显然更符合预期了。重要变量会x被单独选出来(得分非常高),而无关紧要的变量x_noise往往得分不高。但是,与所有显着性检验一样,无用的变量有时会很幸运。
我们的建模建议是:
使用 vtreat::valuevariables*()
选择所有符合条件的变量 sig 小于等于 1/numberofvariablesbeingconsidered。
这个想法是:每个“纯噪声”变量的意义均在0和1之间均匀分布。因此,经过上述筛选的无用变量的预期数量为 无用变量的数量 * P[uselesssig <= 1/numberofvariablesbeingconsidered等于numberofuselessvaraibles * 1/numberofvariablesbeingconsidered。numberofuselessvaraibles <= numberofvariablesbeing_considered我们得到的数量不超过一个。因此,我们希望有一定数量的无用变量可以通过此过滤器。这应该没有太多的无用变量影响下一阶段的受监督机器学习。
显然,在某些情况下,如果不考虑联合分布,就无法发现变量的重要性。最著名的一个是“异或”,其中要学习的概念是指标变量的奇数或偶数是零还是1(每个变量对结果完全无益,直到您同时拥有所有变量)。但是,对于实际问题,您通常会发现大多数变量单独具有比最终联合模型中更高的边际预测能力(因为更好的是,变量消耗了联合模型中一些公共变量的预测能力)。考虑到这一点,单变量筛选通常至少可以指示在哪里寻找。
总之,该vtreat软件包vtreat::valuevariables*()可以成为您有监督的学习实践的宝贵补充。
谢谢大家

