在 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
我正在尝试将一些连续变量转换为分类变量,以便对它们应用一些 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