【问题标题】:Spark ML Pipelines: unseen label exception when classifying new examplesSpark ML Pipelines:对新示例进行分类时出现看不见的标签异常
【发布时间】:2017-06-27 17:10:06
【问题描述】:

我找不到如何使用 Spark ML 管道对一组新实例(带有未知标签)进行分类。 我找到的所有示例均基于具有已知标签的测试集(仅用于评估分类的性能)。

我有以下管道:

    StringIndexer indexer = new StringIndexer().setInputCol("category").setOutputCol("categoryIndex");
    Tokenizer tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words");
    HashingTF hashingTF = new HashingTF().setNumFeatures(NUM_FEATURES).setInputCol(tokenizer.getOutputCol())
            .setOutputCol("rawFeatures");
    IDF idf = new IDF().setInputCol(hashingTF.getOutputCol()).setOutputCol("rescaledFeatures");

    NaiveBayes naiveBayes = new NaiveBayes().setFeaturesCol(idf.getOutputCol()).setLabelCol("categoryIndex");
    Pipeline pipeline = new Pipeline()
            .setStages(new PipelineStage[] { indexer, tokenizer, hashingTF, idf, naiveBayes });

它运行完美,既适合估算器又运行转换器(针对包含金色标签的测试集)

但是当我尝试将相同的管道用于没有黄金标签的“真实”示例(标签正是我们想要获得的)时,作为管道一部分的 StringIndexer 会引发异常:

Caused by: org.apache.spark.SparkException: Unseen label: UNKNOWN.

UNKNOWN 是我在使用新的未见示例以编程方式创建新数据集元素时设置的假标签,当然,训练集中不存在这样的标签。我理解为什么会出现这个错误,但是有没有办法告诉管道我不再“训练”或“评估”,而是将它用于真正的分类? 如何从新示例(没有已知标签)开始为管道构建有效输入以对其进行分类?

这是我在 stackoverflow 中的第一个问题,希望我已经解释得足够清楚了。 在此先感谢:-)

【问题讨论】:

    标签: classification apache-spark-mllib


    【解决方案1】:

    我自己找到了解决办法。

    TL;DR: StringIndexer 应该放在管道之外。

    StringIndexer 转换初始数据集以获得每个标签索引,但不要将转换包含在管道中。然后在 管道 的末尾设置一个IndexToString 转换器,以将预测索引(用于分类/回归的 ML 算法的结果)转换回分类标签。

    这样,当 pipeline 模型被存储以供以后在生产中使用时,不会有 StringIndexer 导致上述问题,IndexToString 将解释预测模型的结果输出有意义的标签。

    【讨论】:

      猜你喜欢
      • 2016-04-13
      • 2019-07-14
      • 1970-01-01
      • 2016-05-26
      • 2017-05-18
      • 2014-09-21
      • 1970-01-01
      • 2019-12-09
      相关资源
      最近更新 更多