小编Fan*_* L.的帖子

为什么Mutable映射在Spark中的UserDefinedAggregateFunction(UDAF)中自动变为不可变

我试图在Spark中定义UserDefinedAggregateFunction(UDAF),它计算组的列中每个唯一值的出现次数.

这是一个例子:假设我有一个df这样的数据帧,

+----+----+
|col1|col2|
+----+----+
|   a|  a1|
|   a|  a1|
|   a|  a2|
|   b|  b1|
|   b|  b2|
|   b|  b3|
|   b|  b1|
|   b|  b1|
+----+----+
Run Code Online (Sandbox Code Playgroud)

我将有一个UDAF DistinctValues

val func = new DistinctValues
Run Code Online (Sandbox Code Playgroud)

然后我将它应用于数据帧df

val agg_value = df.groupBy("col1").agg(func(col("col2")).as("DV"))
Run Code Online (Sandbox Code Playgroud)

我期待有这样的事情:

+----+--------------------------+
|col1|DV                        |
+----+--------------------------+
|   a|  Map(a1->2, a2->1)       |
|   b|  Map(b1->3, b2->1, b3->1)|
+----+--------------------------+
Run Code Online (Sandbox Code Playgroud)

所以我推出了像这样的UDAF,

import org.apache.spark.sql.expressions.MutableAggregationBuffer
import org.apache.spark.sql.expressions.UserDefinedAggregateFunction
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types.DataType
import org.apache.spark.sql.types.ArrayType
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.types.MapType
import …
Run Code Online (Sandbox Code Playgroud)

scala mutable user-defined-aggregate apache-spark

7
推荐指数
1
解决办法
1569
查看次数

如何从交叉验证器获得训练有素的最佳模型

我构建了一个包含这样的DecisionTreeClassifier(dt)的管道

val pipeline = new Pipeline().setStages(Array(labelIndexer, featureIndexer, dt, labelConverter))
Run Code Online (Sandbox Code Playgroud)

然后我使用这个管道作为CrossValidator中的估算器,以获得具有这样的最佳超参数集的模型

val c_v = new CrossValidator().setEstimator(pipeline).setEvaluator(new MulticlassClassificationEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction")).setEstimatorParamMaps(paramGrid).setNumFolds(5)
Run Code Online (Sandbox Code Playgroud)

最后,我可以使用这个交叉验证器在训练测试中训练模型

val model = c_v.fit(train)
Run Code Online (Sandbox Code Playgroud)

但问题是,我想查看受过最佳训练的决策树模型,参数.toDebugTreeDecisionTreeClassificationModel.但模型是一个CrossValidatorModel.是的,你可以使用model.bestModel,但它仍然是类型Model,你不能申请.toDebugTree它.而且我也承担bestModel仍包括pipline labelIndexer,featureIndexer,dt,labelConverter.

那么有谁知道我如何从拟合的模型中获得decisionTree模型crossvalidator,我可以通过它查看实际模型toDebugString?或者有没有可以查看decisionTree模型的解决方法?

scala machine-learning decision-tree cross-validation apache-spark

6
推荐指数
1
解决办法
1669
查看次数