在H2O中使用分类变量的最佳实践?

时间:2018-01-26 21:47:48

标签: machine-learning h2o feature-selection categorical-data

我尝试使用H2O的随机森林进行多项式分类,分为71个班级和38,000个训练集示例。我有一个字符串,在许多情况下是预测字符串,所以我想将它用作分类功能。

顺便说一句,即使规范化字符串(大写,删除数字,标点符号等),我仍然有7,000个不同的字符串(一些是由于拼写或OCR错误等)我有代码删除字符串比较少见,但我不确定合理的截止值是多少。 (我似乎无法在文档中找到任何帮助。)

我也不确定应该使用nbin_cats超参数做什么。我应该使它等于我拥有的不同分类变量的数量吗? [补充:nbin_cats的默认值是1024,而且我远低于大约300个不同的分类值,所以我想我不必对此参数做任何事情]

我也在考虑,如果一个分类值与我试图预测的太多不同类别相关联,也许我也应该放弃它。

我还猜测我需要增加树深度来更好地处理这个问题。

此外,是否有特殊价值表明"不知道"对于我过滤掉的字符串? (我将它映射到一个唯一的字符串,但我想知道是否有更好的值表明H2O的分类值是未知的。)

非常感谢提前。

1 个答案:

答案 0 :(得分:5)

高基数分类预测器有时会损害模型性能,特别是在基于树的模型的情况下,树集合(GBM或随机森林)最终会记住训练数据。该模型在验证数据上的推广时间很短。

是否发生这种情况的一个很好的迹象是你的字符串/分类列是否具有非常高的变量重要性。这意味着树木将继续在此列上拆分以记忆训练数据。另一个迹象是,如果您发现训练数据的误差小于验证数据的误差。这意味着树木过度拟合训练数据。

处理高基数预测因子的一些方法是:

  • 从模型中删除预测变量
  • 执行分类编码[pdf]
  • nbins_catscategorical_encoding
  • 上执行网格搜索

H2O tutorials GitHub repo中有一个Python示例,展示了从模型中删除预测变量并执行网格搜索here的效果。