Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Apache spark 如何在pyspark中找到几列的模式_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 如何在pyspark中找到几列的模式

Apache spark 如何在pyspark中找到几列的模式,apache-spark,pyspark,Apache Spark,Pyspark,我正试图在二元分类问题上获得几个不同模型的多数票 我设法用几个不同的spark表创建并编译了一个spark表 LR.createOrReplaceTempView("lr") RF.createOrReplaceTempView("rf") DT.createOrReplaceTempView("dt") GBT.createOrReplaceTempView("gbt") majority = spark.sql("SELECT lr.label, lr, rf, dt, gbt FROM l

我正试图在二元分类问题上获得几个不同模型的多数票

我设法用几个不同的spark表创建并编译了一个spark表

LR.createOrReplaceTempView("lr")
RF.createOrReplaceTempView("rf")
DT.createOrReplaceTempView("dt")
GBT.createOrReplaceTempView("gbt")
majority = spark.sql("SELECT lr.label, lr, rf, dt, gbt FROM lr, rf, dt, gbt")
大多数的输出看起来像

+-----+---+---+---+---+
|label| lr| rf| dt|gbt|
+-----+---+---+---+---+
|  0.0|0.0|0.0|0.0|0.0|
|  0.0|0.0|0.0|0.0|0.0|
|  0.0|0.0|0.0|0.0|0.0|
|  0.0|0.0|0.0|0.0|0.0|
|  0.0|0.0|0.0|0.0|0.0|
|  0.0|0.0|0.0|0.0|0.0|
|  0.0|0.0|0.0|0.0|0.0|
|  0.0|0.0|0.0|0.0|0.0|
|  0.0|0.0|0.0|0.0|0.0|
|  0.0|0.0|0.0|0.0|0.0|
+-----+---+---+---+---+
我正在尝试创建一个列,该列采用这四个列中的多数票模式。我已经调查过了,但没能得到我想要的


非常感谢你的帮助

如果要了解如何计算spark中的行模式,请参阅。但是,您可以在不计算模式的情况下获得所需的结果

由于这是一个二进制分类问题,因此每列只能取1.0或0.0的值。因此,您可以简化投票过程,只需采取以下步骤

您可以使用以下规则:

如果行中值的平均值>=0.5,则至少有一半分类器预测为1,且标签应为1 如果值的平均值小于0.5,则大多数分类器预测为0,标签应为0。 我假设平局有利于正面的班级标签

您可以这样实现:

# adapted from https://stackoverflow.com/a/32672278
from functools import reduce
from operator import add
from pyspark.sql.functions import col, lit

n = lit(len([c for c in majority.columns if c != "label"]))
rowMean  = (reduce(add, (col(x) for x in majority.columns if x != "label")) / n)   

majority = majority.withColumn("label", (rowMean >= 0.5).cast("int"))
或者,您可以只检查大于0的列数是否至少为n/2:


主要使用Spark SQL:

df.createOrReplaceTempViewdf cols_至_模式=[lm、lr、dt、gbt] qry_pt1=,.join[f agg_{c}as 从df group中选择count*,{c}作为mode_col,按{c}顺序选择cols_to_mode中c的count*desc] qry_pt2=union all.join[fselect mode_col,{c}作为cols_to_mode中c的agg_{c}limit 1中的col] df_模式=spark.sqlqry_pt1+qry_pt2 Scala等效物:

val colsToMode=序列LR、lm、dt、gbt val qryPt1=with+colsToMode.mapc=>s agg{c}as 按${c}顺序按计数*描述从df group中选择计数*,${c}作为模式列 .mkString, val qryPt2=colsToMode.mapc=>s选择mode_col,${c}作为agg_${c}limit 1.mkString union all中的col val dfModes=spark.sqlqryPt1+qryPt2
那么您想要的是,而不是列方式?如果打成平局怎么办?@pault行模式正是我想要的。关于平局,我想我会添加另一列,所以它是奇数。我有一个平均概率表,使用相同的想法,但这也完成了工作,谢谢!使用平均概率不一定会产生相同的结果,因为没有规则规定每个模型必须使用相同的阈值,即p>0.5。您可能有其他要求,最大化KS,最小化误报率,等等,这可能会导致为每个模型选择不同的阈值。我将在代码中编辑的一件事是,在多数情况下,c的n=litlenc。如果c!=标签,因为我得到一个错误,说找不到该数据类型的长度。我只是做了n=lenmostary.columns-1。你是对的,除了括号之外,它应该是方括号,这将使它成为一个列表,而不是一个生成器。更新了,但你的方式也很有效。
n = lit(len([c for c in majority.columns if c != "label"]))

# count of columns with a positive label
positiveCount = reduce(
    add, 
    ((col(x)>0).cast("int") for x in majority.columns if x != "label")
 )

majority = majority.withColumn(
    "label", 
     (positiveCount >= (n / 2.0)).cast("int")
)