SPARK ONEHOTENCODER-如何排除用户定义的类别



考虑以下火花数据框:

df.printSchema()
     |-- predictor: double (nullable = true)
     |-- label: double (nullable = true)
     |-- date: string (nullable = true)
df.show(6)
    predictor      label              date    
    4.23           6.33               20160510
    4.77           7.18               20160510
    4.09           5.94               20160511
    4.23           6.33               20160511
    4.77           7.18               20160512
    4.09           5.94               20160512

本质上,我的数据帧由日常频率的数据组成。我需要将日期列映射到二进制向量的一列。使用StringIndexer&这很容易实现。onehotencoder:

val dateIndexer = new StringIndexer()
  .setInputCol("date")
  .setOutputCol("dateIndex")
  .fit(df)
val indexed = dateIndexer.transform(df)
val encoder = new OneHotEncoder()
  .setInputCol("dateIndex")
  .setOutputCol("date_codeVec")
val encoded = encoder.transform(indexed)

我的问题是,默认情况下,onehotencoder会删除最后一个类别。但是,我需要删除与数据框中的第一个日期有关的类别(上述示例中的20160510(,因为我需要计算相对于第一个日期的时间趋势。

如何为上述示例实现此目标(请注意,我的数据框中有100多个日期(?

您可以尝试将setDropLast设置为false

val encoder = new OneHotEncoder()
  .setInputCol("dateIndex")
  .setOutputCol("date_codeVec")
  .setDropLast(false)
val encoded = encoder.transform(indexed)

使用VectorSlicer

手动下降级别选择
import org.apache.spark.ml.feature.VectorSlicer
val slicer = new VectorSlicer()
  .setInputCol("date_codeVec")
  .setOutputCol("data_codeVec_selected")
  .setNames(dateIndexer.labels.diff(Seq(dateIndexer.labels.min)))
slicer.transform(encoded)
+---------+-----+--------+---------+-------------+---------------------+
|predictor|label|    date|dateIndex| date_codeVec|data_codeVec_selected|
+---------+-----+--------+---------+-------------+---------------------+
|     4.23| 6.33|20160510|      0.0|(3,[0],[1.0])|            (2,[],[])|
|     4.77| 7.18|20160510|      0.0|(3,[0],[1.0])|            (2,[],[])|
|     4.09| 5.94|20160511|      2.0|(3,[2],[1.0])|        (2,[1],[1.0])|
|     4.23| 6.33|20160511|      2.0|(3,[2],[1.0])|        (2,[1],[1.0])|
|     4.77| 7.18|20160512|      1.0|(3,[1],[1.0])|        (2,[0],[1.0])|
|     4.09| 5.94|20160512|      1.0|(3,[1],[1.0])|        (2,[0],[1.0])|
+---------+-----+--------+---------+-------------+---------------------+

最新更新