Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何使用Dataframe API计算Spark MLlib中的二进制分类度量_Scala_Apache Spark_Spark Dataframe_Apache Spark Mllib_Decision Tree - Fatal编程技术网

Scala 如何使用Dataframe API计算Spark MLlib中的二进制分类度量

Scala 如何使用Dataframe API计算Spark MLlib中的二进制分类度量,scala,apache-spark,spark-dataframe,apache-spark-mllib,decision-tree,Scala,Apache Spark,Spark Dataframe,Apache Spark Mllib,Decision Tree,鉴于以下示例代码,我将Spark MLlib与DataFrame API一起使用: val dtc = new DecisionTreeClassifier() val testResults = dtc.fit(training).transform(test) 我可以使用DataFrame API计算testResult上的模型质量度量吗 如果没有,我如何正确转换我的测试结果(包含“标签”、“特征”、“rawPrediction”、“概率”、“预测”),以便使用二进制分类度量(RDDAPI

鉴于以下示例代码,我将Spark MLlib与DataFrame API一起使用:

val dtc = new DecisionTreeClassifier()
val testResults = dtc.fit(training).transform(test)
我可以使用DataFrame API计算
testResult
上的模型质量度量吗

如果没有,我如何正确转换我的
测试结果
(包含“标签”、“特征”、“rawPrediction”、“概率”、“预测”),以便使用
二进制分类度量(RDDAPI)


注意:我对“byThreshold”指标也感兴趣

如果您查看的是的构造函数,它需要RDD[(Double,Double)]、分数和标签。您可以将数据帧转换为如下所示的正确格式:

val scoreAndLabels = testResults.select("label", "probability")
    .rdd
    .map(row => 
            (row.getAs[Vector]("probability")(1), row.getAs[Double]("label"))
    )
编辑:


存储在
向量中,该向量的长度与要预测的类数相同。在二进制分类的情况下,第一个对应于label=0,第二个对应于label=1,您应该选择作为正标签的列(通常为label=1)。

如果您查看的构造函数,它需要RDD[(Double,Double)]、分数和标签。您可以将数据帧转换为如下所示的正确格式:

val scoreAndLabels = testResults.select("label", "probability")
    .rdd
    .map(row => 
            (row.getAs[Vector]("probability")(1), row.getAs[Double]("label"))
    )
编辑:


存储在
向量中,该向量的长度与要预测的类数相同。在二进制分类的情况下,第一个对应于label=0,第二个对应于label=1,您应该选择作为正标签的列(通常label=1)。

我是这样想的。然而,
“概率”
是一个2元素向量,我不确定选择哪一个。如果你看看它是如何工作的,它需要索引1中的
rawPrediction
,这让我感到困惑,原因有二:为什么要使用
rawPrediction
而不是
概率
?为什么总是使用索引1?我很想用
“概率(1)”
来表示
BinaryClassificationMetrics
对象。你能详细解释一下为什么“…选择一列作为你的正面标签”?我不明白为什么BinaryClassificationEvaluator总是根据预测结果独立选择索引1。BinaryClassificationEvaluator假设label=0为负标签,label=1为正标签。在某些ML库(即scikit learn)中,您可以选择哪个列是正/负标签(),就像在
mllib
中一样,它是硬编码的。如果您总是采用概率(1),那么对于非常接近1和非常接近0的值,预测更可能是正确的(此处我们预测为高概率阴性)。这是预期结果吗?是的,概率(1)表示P(标签=1),其中高概率更可能是标签1,低概率是标签0。如果采用概率(0),则高概率更可能是标签0,低概率更可能是标签1(作为概率(0)+概率(1)=1)。我是这样想的。然而,
“概率”
是一个2元素向量,我不确定选择哪一个。如果你看看它是如何工作的,它需要索引1中的
rawPrediction
,这让我感到困惑,原因有两个:为什么要使用
rawPrediction
而不是
probability
?为什么总是使用索引1?我很想使用
“probability(1)”
用于
BinaryClassificationMetrics
对象。请详细说明为什么“…选择作为正面标签的列”?我不明白为什么BinaryClassificationEvaluator总是根据预测结果独立选择索引1。BinaryClassificationEvaluator假设label=0为负标签,label=1为正标签。在某些ML库中,(即scikit learn),您可以选择哪个列是您的正/负标签(),看起来像是在
mllib
中,它是硬编码的。如果您总是采用概率(1),那么对于非常接近1和非常接近0的值,预测更有可能是正确的(其中我们预测的负概率很高).这是预期结果吗?是的,概率(1)表示P(标签=1),其中高概率更可能是标签1,低概率是标签0。如果你取概率(0),那么高概率更可能是标签0,低概率更可能是标签1(概率(0)+概率(1)=1)。