Apache spark 如何在管道中聚合一个热编码值?

Apache spark 如何在管道中聚合一个热编码值?,apache-spark,apache-spark-mllib,apache-spark-ml,Apache Spark,Apache Spark Mllib,Apache Spark Ml,我能够使用字符串索引器和一个热编码器来创建最右边的features列。注意,ID1有多行。我想知道如何使用管道聚合特征中的稀疏向量 或者其他一些替代方法,使得ID1的特性=(7、[0,3,5]、[1.0,1.0,1.0]) 我想接受以下输入: +---+------+----+-----+ | id|houses|cars|label| +---+------+----+-----+ | 0| M| A| 1.0| | 1| M| C| 1.0| | 1|

我能够使用字符串索引器和一个热编码器来创建最右边的features列。注意,ID1有多行。我想知道如何使用管道聚合特征中的稀疏向量 或者其他一些替代方法,使得ID1的特性=(7、[0,3,5]、[1.0,1.0,1.0])

我想接受以下输入:

+---+------+----+-----+
| id|houses|cars|label|
+---+------+----+-----+
|  0|     M|   A|  1.0|
|  1|     M|   C|  1.0|
|  1|     M|   B|  1.0|
|  2|     F|   A|  0.0|
|  3|     F|   D|  0.0|
|  4|     Z|   B|  1.0|
|  5|     Z|   C|  0.0|
+---+------+----+-----+
然后对houses列和cars列进行热编码,将它们组合起来,并按id进行聚合

并生成此输出:

+-------------------+
|           features|
+-------------------+
|(7,[0,4],[1.0,1.0])|
|(7,[0,3,5],[1.0,1.0,1.0])|
|(7,[2,4],[1.0,1.0])|
|(7,[2,6],[1.0,1.0])|
|(7,[1,3],[1.0,1.0])|
|(7,[1,5],[1.0,1.0])|
+-------------------+
def onehotcoderexample(sqlContext:sqlContext):单位={
//定义数据
val df=sqlContext.createDataFrame(Seq(
(0,“M”,“A”,1.0),
(1,“M”,“C”,1.0),
(1,“M”,“B”,1.0),
(2,“F”,“A”,0.0),
(3,“F”,“D”,0.0),
(4,“Z”,“B”,1.0),
(5,“Z”,“C”,0.0)
)).toDF(“id”、“房屋”、“汽车”、“标签”)
df.show()
//定义管道的阶段
val indexerHouse=new StringIndexer()
.setInputCol(“房屋”)
.setOutputCol(“房屋索引”)
val encoderHouse=新的OneHotEncoder()
.setDropLast(错误)
.setInputCol(“房屋索引”)
.setOutputCol(“打印室”)
val indexerCar=新的StringIndexer()
.setInputCol(“汽车”)
.setOutputCol(“carsIndex”)
val encoderCar=新的OneHotEncoder()
.setDropLast(错误)
.setInputCol(“carsIndex”)
.setOutputCol(“typeCars”)
val assembler=新向量汇编程序()
.setInputCols(数组(“TypeHouse”、“typeCars”))
.setOutputCol(“特性”)
val lr=新逻辑回归()
.setMaxIter(10)
.setRegParam(0.01)
//定义管道
val管道=新管道()
.setStages(数组(
索德勒豪斯酒店,
索引车,编码器,
汇编程序(lr)
//将管道与培训文件相匹配。
val pipelineModel=pipeline.fit(df)
}
//用于模拟和聚合当前管道的帮助程序代码(生成下表)
val indexedHouse=indexerHouse.fit(df).transform(df)
indexedHouse.show()
val encodedHouse=encoderHouse.transform(indexedHouse)
encodedHouse.show()
val indexedCar=indexerCar.fit(df).transform(df)
indexedCar.show()
val encodedCar=encoderCar.transform(indexedCar)
encodedCar.show()
val assembledFeature=assembler.transform(encodedHouse.join(encodedCar,使用columns=Seq(“id”、“house”、“cars”))
assembledFeature.show()

组装后的管道结果是最右侧的“功能”列。在逻辑回归中用作输入。我想通过主键(在这个实例id中)聚合features列(稀疏向量列)。我在问这样做的最佳方式。应该在管道内部还是外部进行,如果是,如何进行?请给出一个输出示例,因为您所要求的并不清楚!我澄清了这个问题,如果你还需要什么,请告诉我。你希望有多少不同的级别?我实际上正在分析患者数据。4级?(年龄、药物、性别、诊断)大约7000个诊断代码,3100个药物代码,10个年龄。这就是你想要的吗?