在 Spark 中将连续变量转换为分类变量

Turning a continuous variable into categorical in Spark

我正在尝试将一些连续变量转换为分类变量,以便对它们应用一些 ML 算法,并且我想创建从 6:00 到 12:00 这样的类别 --> "Morning" 或格式如 ddMM 到 "Summer" 或其他格式的日期。 这些变量已经转换为整数。我认为就像 R 中的 recode 函数一样。

+----------+
|CRSDepTime|
+----------+
|       745|
|      1053|
|      1915|
|      1755|
|       832|
|       630|
|       820|
|       945|
|      1245|
|      1645|
|       620|
|      1125|
|      2045|
|      1340|
|      1540|
|       730|
|      1145|
|       525|
|       630|
|      1520|
+----------+

我用这句话解决了这个问题!!

df = df.withColumn("Season", when(df("Month") >= 12 and df("Month") <=3, "Fall")
  .when(df("Month") >= 4 and df("Month") <= 6, "Spring")
  .when(df("Month") >= 7 and df("Month") <= 9, "Summer").otherwise("Autumm"))

有两个Transformers可用于将连续变量转换为分类变量:

  • Bucketizer
  • QuantileDiscretizer

Bucketizer 进行拆分,因此可以在此处使用:

import org.apache.spark.ml.feature._

val df = Seq(
  745, 1053, 1915, 1755, 832, 630, 820, 945,
  1245, 1645, 620, 1125, 2045, 1340, 1540, 730,
  1145, 525, 630, 1520
).toDF("CRSDepTime")

val bucketizer = new Bucketizer()
  .setInputCol("CRSDepTime")
  .setOutputCol("bucketedFeatures")
  .setSplits(Array(0, 600, 1200, 1800, 2400))

// +----------+----------------+
// |CRSDepTime|bucketedFeatures|
// +----------+----------------+
// |       745|             1.0|
// |      1053|             1.0|
// |      1915|             3.0|
// |      1755|             2.0|
// |       832|             1.0|
// |       630|             1.0|
// |       820|             1.0|
// |       945|             1.0|
// |      1245|             2.0|
// |      1645|             2.0|
// +----------+----------------+
// only showing top 10 rows

通常会与 OneHotEncoder:

import org.apache.spark.ml.Pipeline

val encoder = new OneHotEncoder()
  .setInputCol(bucketizer.getOutputCol)
  .setOutputCol("CRSDepTimeencoded")

val pipeline = new Pipeline().setStages(Array(bucketizer, encoder))

pipeline.fit(df).transform(df).show(10)

// +----------+----------------+-----------------+
// |CRSDepTime|bucketedFeatures|CRSDepTimeencoded|
// +----------+----------------+-----------------+
// |       745|             1.0|    (3,[1],[1.0])|
// |      1053|             1.0|    (3,[1],[1.0])|
// |      1915|             3.0|        (3,[],[])|
// |      1755|             2.0|    (3,[2],[1.0])|
// |       832|             1.0|    (3,[1],[1.0])|
// |       630|             1.0|    (3,[1],[1.0])|
// |       820|             1.0|    (3,[1],[1.0])|
// |       945|             1.0|    (3,[1],[1.0])|
// |      1245|             2.0|    (3,[2],[1.0])|
// |      1645|             2.0|    (3,[2],[1.0])|
// +----------+----------------+-----------------+
// only showing top 10 rows