我有一个包含三列的数据文件,我想规范化最后一列以将ALS应用于ML(Spark和Scala),我该怎么做?
以下是我Dataframe
的摘录:
val view_df = spark.createDataFrame(view_RDD, viewSchema)
val viewdd = view_df.withColumn("userIdTemp", view_df("userId").cast(IntegerType)).drop("userId")
.withColumnRenamed("userIdTemp", "userId")
.withColumn("productIdTemp", view_df("productId").cast(IntegerType)).drop("productId")
.withColumnRenamed("productIdTemp", "productId")
.withColumn("viewTemp", view_df("view").cast(FloatType)).drop("view")
.withColumnRenamed("viewTemp", "view")`
答案 0 :(得分:3)
当要进行任何缩放/规范化时,通常使用StandardScaler
。但是,在这种情况下,只有一列可以扩展,而且它不属于Vector
类型(但Float
)。由于StandardScaler
仅适用于Vectors
,因此可以先应用VectorAssembler
,但在缩放后需要将Vector
重新转换为Float
。
在这种情况下,更简单的方法是自己动手。首先得到列的平均值和标准偏差,然后执行缩放。它可以在view
列上完成,如下所示:
val (mean_view, std_view) = viewdd.select(mean("view"), stddev("view"))
.as[(Double, Double)]
.first()
viewdd.withColumn("view_scaled", ($"view" - mean_view) / std_view)