【发布时间】:2017-11-08 10:20:21
【问题描述】:
在我的spark 学习期间,我经常遇到应用程序崩溃,并带有一些类似“can not find key xxx”的痕迹。
在与来自崩溃跟踪的不明确消息作斗争后,我发现这是因为测试数据具有一些训练数据没有的价值。
例如:
有一个分类特征包含 4 个唯一值 (1,2,3,4)。
在split之后,数据集到训练/测试数据集,训练数据只有(1,2,3)这个特征,测试数据集有(..., 4)。
训练模型后,应用程序在使用测试数据集评估模型时会崩溃。
在数据预处理时有没有针对这种情况的最佳实践,或者有没有办法避免这种情况?
更新更多细节:
我正在用几个分类特征和数字特征训练决策树。
训练/测试数据集为 70/30,然后评估失败并显示“Caused by: java.util.NoSuchElementException: key not found: 5.0”
- 然后我将训练/测试更改为 100/30,错误消失了。
所以我认为问题出在训练数据中缺少分类值,我需要一种方法来避免这种情况。
【问题讨论】:
-
您考虑过分层抽样吗?这是我对此的回答stackoverflow.com/a/32241887/3415409
-
分层抽样只能是纯实验室环境中的解决方案。当您随意提出解决方案时,您可以并且将会遇到海报描述的问题,并且没有抽样可以解决它。
-
Ryan,你能给我们举一个更具体的例子吗?您是在 Spark 中使用模型,还是与使用 Map 之类的 scala 问题有关?如果一个类别不是由一组有限的已知值定义的,那么您需要稍微不同地看待问题。如果它是一组已知的有限值,则应将这些值从字典/分类法/等输入到模型描述中,而不是数据驱动。
-
tks @eliasah,但它支持多功能吗?
-
不是。这甚至是不可能的。当你对数据进行分区时,你总是有主键、辅助键等顺序,所以在某些时候你无法证明非主键在数据集中的分布
标签: apache-spark machine-learning classification decision-tree