代码之家  ›  专栏  ›  技术社区  ›  OBarros

RandomForestClassifier用于多类分类Spark 2。x个

  •  1
  • OBarros  · 技术社区  · 7 年前

    我正在尝试使用spark 2.1.1将随机林用于多类分类

    在像往常一样定义管道之后,它在索引阶段失败了。

    我有一个包含许多字符串类型列的数据框架。我已经为它们中的每一个创建了一个StringIndexer。

    我正在创建一个管道,将StringIndexer与VectorAssembler链接,最后是一个RandomForestClassifier,后面是一个标签转换器。

    我已经用 distinct().count() 为了确保我没有太多的类别等等。。。

    经过一些调试,我了解到每当我开始对某些列进行索引时,都会出现以下错误。。。 呼叫时:

      val indexer = udf { label: String =>
      if (labelToIndex.contains(label)) {
        labelToIndex(label)
      } else {
        throw new SparkException(s"Unseen label: $label.")
      }
    }
    
    Error evaluating methog: 'labelToIndex'
    Error evaluating methog: 'labels'
    

    那么在转换内部,定义元数据时会出现以下错误:

    错误评估方法:org$apache$spark$ml$feature$StringIndexerModel$$labelToIndex 方法抛出了“java”。lang.NullPointerException异常。无法评估组织。阿帕奇。火花sql。类型。元数据。toString()

    发生这种情况是因为我正在索引的某些列上有null。

    我可以用下面的例子再现这个错误。

    val df = spark.createDataFrame(
      Seq(("asd2s","1e1e",1.1,0), ("asd2s","1e1e",0.1,0), 
          (null,"1e3e",1.2,0), ("bd34t","1e1e",5.1,1), 
          ("asd2s","1e3e",0.2,0), ("bd34t","1e2e",4.3,1))
    ).toDF("x0","x1","x2","x3")
    
    val indexer = new 
    StringIndexer().setInputCol("x0").setOutputCol("x0idx")
    
    indexer.fit(df).transform(df).show
    
    // java.lang.NullPointerException
    

    https://issues.apache.org/jira/browse/SPARK-11569

    https://github.com/apache/spark/blob/branch-2.1/mllib/src/main/scala/org/apache/spark/ml/feature/StringIndexer.scala

    2 回复  |  直到 7 年前
        1
  •  0
  •   OBarros    7 年前

    存在的解决方案 here 可以使用,并且在 Spark 2.2.0 ,问题已在上游修复。

        2
  •  0
  •   user9367073    7 年前

    您可以使用 数据帧。不适用。填充(映射(“colName1”,val1),(“colName2”,val2),…)

    哪里:

    DataFrame—DataFrame对象;“colName”-列的名称(&N);val—用于替换列“colName”中的空值(如果有)。

    填充所有空值后,使用要素变换。

    您可以检查as的所有列中的Null数:

    for(column<-DataFrame.columns){ 数据帧。筛选器(数据帧(列)==null | |数据帧(列)。isNull | |数据帧(列)。伊斯南)。计数()

    }

    数据帧。count()将给出数据框中的总行数。然后,可以通过数据帧判断空值的数量。描述()