繁体   English   中英

用于多类分类Spark 2.x的RandomForestClassifier

[英]RandomForestClassifier for multiclass classification Spark 2.x

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

在照常定义管道之后,在索引阶段它会失败。

我有一个包含许多字符串类型列的数据框。 我为他们每个人创建了一个StringIndexer。

我正在通过将StringIndexers与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”异常。 无法评估org.apache.spark.sql.types.Metadata.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

可以使用此处提供的解决方案,并且在Spark 2.2.0上 ,此问题已在上游修复。

您可以使用DataFrame.na.fill(Map(“ colName1”,val1),(“ colName2”,val2),..))

哪里:

DataFrame-DataFrame对象; “ colName”-列名,val-替换为“ colName”列中的空值的值。

填充所有空值后,使用特征转换。

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

for(列<-DataFrame.columns){DataFrame.filter(DataFrame(column)=== null || DataFrame(column).isNull || DataFrame(column).isNan).count()

}

要么

DataFrame.count()将为您提供DataFrame中的总行数。 然后可以通过DataFrame.describe()判断空数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM