簡體   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