对分类变量进行独热编码

R 中的监督学习:回归

Nina Zumel and John Mount

Win-Vector, LLC

为何手动转换分类变量?

  • 大多数 R 函数会替你完成转换
    • model.matrix()
  • xgboost() 不会
    • 必须将分类变量转为数值表示
  • 转为指示变量:独热编码
R 中的监督学习:回归

使用 `vtreat` 进行独热编码与数据清洗

基本思路:

  • designTreatmentsZ() 基于训练数据设计"处理方案",然后
  • prepare() 生成"干净"数据
    • 全为数值
    • 无缺失值
      • 对所有后续数据都用该处理方案配合 prepare()
R 中的监督学习:回归

小型 vtreat 示例

【训练数据】

x u y
one 44 0.4855671
two 24 1.3683726
three 66 2.0352837
two 22 1.6396267

【测试数据】

x u y
one 5 2.6488148
three 12 1.5012938
one 56 0.1993731
two 28 1.2778516
R 中的监督学习:回归

创建处理方案

vars <- c("x", "u")
treatplan <- designTreatmentsZ(dframe, varslist, verbose = FALSE)

designTreatmentsZ() 的输入:

  • dframe: 训练数据
  • varlist: 输入变量名列表
  • 将 verbose = FALSE 以抑制进度信息
R 中的监督学习:回归

获取新变量

scoreFrame 描述了变量映射与类型

(scoreFrame <- treatplan$scoreFrame %>% 
     select(varName, origName, code))
        varName origName  code
1   x_lev_x.one        x   lev
2 x_lev_x.three        x   lev
3   x_lev_x.two        x   lev
4        x_catP        x  catP
5       u_clean        u clean

获取新的 levclean 变量名

(newvars <- scoreFrame %>% 
     filter(code %in% c("clean", "lev")) %>%
     use_series(varName))
"x_lev_x.one"   "x_lev_x.three" "x_lev_x.two"   "u_clean"
R 中的监督学习:回归

为建模准备训练数据

training.treat <- prepare(treatmentplan, dframe, varRestriction = newvars)

prepare() 的输入:

  • treatmentplan: 处理方案
  • dframe: 数据框
  • varRestriction: 要处理的变量列表(可选)
    • 默认:处理所有变量
R 中的监督学习:回归

处理前后对比

训练数据

x u y
one 44 0.4855671
two 24 1.3683726
three 66 2.0352837
two 22 1.6396267

处理后的训练数据

x_lev _x. one x_lev _x. three x_lev _x. two u_clean
1 0 0 44
0 0 1 24
0 1 0 66
0 0 1 22
R 中的监督学习:回归

在应用模型前准备测试数据

(test.treat <- prepare(treatplan, test, varRestriction = newvars))
  x_lev_x.one x_lev_x.three x_lev_x.two u_clean
1           1             0           0       5
2           0             1           0      12
3           1             0           0      56
4           0             0           1      28
R 中的监督学习:回归

vtreat 处理具备鲁棒性

之前未见过的 x 水平:four

x u y
one 4 0.2331301
two 14 1.9331760
three 66 3.1251029
four 25 4.0332491

four 编码为 (0, 0, 0)

prepare(treatplan, toomany, ...)
x_lev _x. one x_lev _x. three x_lev _x. two u_clean
1 0 0 4
0 0 1 14
0 1 0 66
0 0 0 25
R 中的监督学习:回归

让我们来练习!

R 中的监督学习:回归

Preparing Video For Download...