我正在尝试使用 H2O 的随机森林将多名义分类为 71 个类,其中包含 38,000 个训练集示例。 我有一个特征,它是一个字符串,在许多情况下是预测性的,所以我想把它用作分类特征。
问题是,即使在规范化字符串(大写、去掉数字、标点符号等)之后,我仍然有 7,000 个不同的字符串(有些是由于拼写或 OCR 错误等)。 我有代码可以删除相对罕见的字符串,但我不确定合理的截止值是什么。 (我似乎在文档中找不到任何帮助。
我也不确定nbin_cats超参数会导致什么。 我应该让它等于我拥有的不同分类变量的数量吗? [补充:nbin_cats的默认值是 1024,我在大约 300 个不同的分类值中远低于这个值,所以我想我不必对这个参数做任何事情]
我也在想,如果一个分类值与我试图预测的太多不同类别相关联,也许我也应该放弃它。
我还猜测我需要增加树的深度才能更好地处理这个问题。
另外,对于我过滤掉的字符串,是否有一个特殊的值来指示"不知道"? (我正在将其映射到一个唯一的字符串,但我想知道是否有更好的值向 H2O 指示分类值未知。
提前非常感谢。
高基数分类预测因子有时会损害模型性能,特别是在基于树的模型的情况下,树系综(GBM 或随机森林)最终会记住训练数据。 模型在验证数据上泛化的时间很差。
是否发生这种情况的一个很好的指示是,您的字符串/分类列是否具有非常高的变量重要性。 这意味着树继续在此列上拆分以记忆训练数据。 另一个指示是,如果训练数据上的误差比验证数据上的误差小得多。 这意味着树与训练数据过度拟合。
处理高基数预测变量的一些方法是:
- 从模型中删除预测变量
- 执行分类编码 [PDF]
- 对
nbins_cats
和categorical_encoding
执行网格搜索
H2O 教程 GitHub 存储库中有一个 Python 示例,展示了从模型中删除预测变量并在此处执行网格搜索的效果。