用于多类分类的 RandomForestClassifier Spark 2.x
RandomForestClassifier for multiclass classification Spark 2.x
我正在尝试使用 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'
然后在转换内部,定义元数据时出现这个错误:
Error evaluating method: org$apache$spark$ml$feature$StringIndexerModel$$labelToIndex
Method threw 'java.lang.NullPointerException' exception. Cannot evaluate 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
目前的解决方案 can be used, and on the Spark 2.2.0,问题已在上游修复。
你可以使用
DataFrame.na.fill(地图("colName1", val1), ("colName2", val2),..))
其中:
DataFrame - DataFrame 对象; "colName" - 列的名称和 val - 如果在 "colName" 列中找到空值,则用于替换空值的值。
填充所有空值后使用特征转换。
您可以检查 as:
的所有列中的空值数
for ( 列 <- DataFrame.columns ) {
DataFrame.filter(DataFrame(列) === null || DataFrame(列).isNull || DataFrame(列).isNan).count()
}
或
DataFrame.count() 将为您提供 DataFrame 中的总行数。然后可以通过 DataFrame.describe()
判断空值的数量
我正在尝试使用 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'
然后在转换内部,定义元数据时出现这个错误:
Error evaluating method: org$apache$spark$ml$feature$StringIndexerModel$$labelToIndex Method threw 'java.lang.NullPointerException' exception. Cannot evaluate 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
目前的解决方案
你可以使用 DataFrame.na.fill(地图("colName1", val1), ("colName2", val2),..))
其中:
DataFrame - DataFrame 对象; "colName" - 列的名称和 val - 如果在 "colName" 列中找到空值,则用于替换空值的值。
填充所有空值后使用特征转换。
您可以检查 as:
的所有列中的空值数for ( 列 <- DataFrame.columns ) { DataFrame.filter(DataFrame(列) === null || DataFrame(列).isNull || DataFrame(列).isNan).count()
}
或
DataFrame.count() 将为您提供 DataFrame 中的总行数。然后可以通过 DataFrame.describe()
判断空值的数量