【问题标题】:spark OneHotEncoder - how to exclude user-defined category?spark OneHotEncoder - 如何排除用户定义的类别?
【发布时间】:2017-09-26 22:30:27
【问题描述】:

考虑以下 spark 数据框:

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 drops the last category by default。但是,我需要删除与数据框中第一个日期相关的类别(上例中为 20160510),因为我需要计算相对于第一个日期的时间趋势。

对于上述示例,我如何才能实现这一点(请注意,我的数据框中有 100 多个日期)?

【问题讨论】:

    标签: scala apache-spark one-hot-encoding


    【解决方案1】:

    您可以尝试将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])|
    +---------+-----+--------+---------+-------------+---------------------+
    

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 2020-03-10
      • 2017-07-06
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 2017-01-22
      • 2021-06-13
      • 1970-01-01
      相关资源
      最近更新 更多