【问题标题】:how to avoid test data having categorical value that training data didn`t have如何避免测试数据具有训练数据没有的分类价值
【发布时间】:2017-11-08 10:20:21
【问题描述】:

在我的spark 学习期间,我经常遇到应用程序崩溃,并带有一些类似“can not find key xxx”的痕迹。 在与来自崩溃跟踪的不明确消息作斗争后,我发现这是因为测试数据具有一些训练数据没有的价值。
例如:
有一个分类特征包含 4 个唯一值 (1,2,3,4)。 在split之后,数据集到训练/测试数据集,训练数据只有(1,2,3)这个特征,测试数据集有(..., 4)。 训练模型后,应用程序在使用测试数据集评估模型时会崩溃。

在数据预处理时有没有针对这种情况的最佳实践,或者有没有办法避免这种情况?


更新更多细节:

  1. 我正在用几个分类特征和数字特征训练决策树。

  2. 训练/测试数据集为 70/30,然后评估失败并显示“Caused by: java.util.NoSuchElementException: key not found: 5.0”

  3. 然后我将训练/测试更改为 100/30,错误消失了。

所以我认为问题出在训练数据中缺少分类值,我需要一种方法来避免这种情况。

【问题讨论】:

  • 您考虑过分层抽样吗?这是我对此的回答stackoverflow.com/a/32241887/3415409
  • 分层抽样只能是纯实验室环境中的解决方案。当您随意提出解决方案时,您可以并且将会遇到海报描述的问题,并且没有抽样可以解决它。
  • Ryan,你能给我们举一个更具体的例子吗?您是在 Spark 中使用模型,还是与使用 Map 之类的 scala 问题有关?如果一个类别不是由一组有限的已知值定义的,那么您需要稍微不同地看待问题。如果它是一组已知的有限值,则应将这些值从字典/分类法/等输入到模型描述中,而不是数据驱动。
  • tks @eliasah,但它支持多功能吗?
  • 不是。这甚至是不可能的。当你对数据进行分区时,你总是有主键、辅助键等顺序,所以在某些时候你无法证明非主键在数据集中的分布

标签: apache-spark machine-learning classification decision-tree


【解决方案1】:

使用分层抽样

您按标签拆分数据集,然后在每个标签内进行抽样。

然后你加入并重新洗牌所有标签。

您可以对分类属性尝试相同的方法。但当然,您最终可能会观察到您从未见过的独特价值。一个好的实现不应该因此而崩溃!

【讨论】:

  • 如果我按标签拆分数据集,比如 ABC 和抽样,但我仍然有机会获得样本中没有的分类特征的值,那么我还是赢了` t 通过测试评估。
  • 好吧,无论如何,您的代码必须能够处理这个问题。因为最终可能会出现一个新的类别...
猜你喜欢
  • 2019-10-07
  • 2019-04-27
  • 2017-02-20
  • 1970-01-01
  • 2017-06-07
  • 2020-12-01
  • 2018-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多