Spark OneHotEncoder


1、概念

  獨熱編碼(One-Hot Encoding) 
  * 將表示為標簽索引的分類特征映射到二進制向量,該向量最多具有一個單一的單值,該單值表示所有特征值集合中特定特征值的存在。
  * 此編碼允許期望連續特征(例如邏輯回歸)的算法使用分類特征。
  * 對於字符串類型的輸入數據,通常首先使用StringIndexer對分類特征進行編碼
  *
  * OneHotEncoderEstimator可以轉換多列,為每個輸入列返回一個熱編碼的輸出矢量列。通常使用VectorAssembler將這些向量合並為單個特征向量。
  *
  * OneHotEncoderEstimator支持handleInvalid參數,以選擇在轉換數據期間如何處理無效輸入。
  * 可用的選項包括“keep”(將任何無效輸入分配給額外的分類索引)和“error”(引發錯誤)。
在數據處理和特征工程中,經常會遇到類型數據,如性別分為[男,女],手機運營商分為[移動,聯通,電信]等,
我們通常將其轉為數值帶入模型,如[0,1], [-1,0,1]等,但模型往往默認為連續型數值進行處理,這樣其實是違背我們最初設計的,也會影響模型效果。

獨熱編碼便是解決這個問題,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候,其中只有一位有效。

如自然編碼為:0,1

獨熱編碼為:10,01           

可以理解為對有m個取值的特征,經過獨熱編碼處理后,轉為m個二元特征,每次只有一個激活。


如數字字體識別0~9中,6的獨熱編碼為:

0000001000

優點

獨熱編碼的優點為:

1.能夠處理非連續型數值特征。 
2.在一定程度上也擴充了特征。比如性別本身是一個特征,經過one hot編碼以后,就變成了男或女兩個特征。

 

當然,當特征類別較多時,數據經過獨熱編碼可能會變得過於稀疏。

2、code

package com.home.spark.ml

import org.apache.spark.SparkConf
import org.apache.spark.ml.feature.OneHotEncoderEstimator
import org.apache.spark.sql.SparkSession

/**
  * @Description: 獨熱編碼(One-Hot Encoding) 
  * 將表示為標簽索引的分類特征映射到二進制向量,該向量最多具有一個單一的單值,該單值表示所有特征值集合中特定特征值的存在。
  * 此編碼允許期望連續特征(例如邏輯回歸)的算法使用分類特征。
  * 對於字符串類型的輸入數據,通常首先使用StringIndexer對分類特征進行編碼
  *
  * OneHotEncoderEstimator可以轉換多列,為每個輸入列返回一個熱編碼的輸出矢量列。通常使用VectorAssembler將這些向量合並為單個特征向量。
  *
  * OneHotEncoderEstimator支持handleInvalid參數,以選擇在轉換數據期間如何處理無效輸入。
  * 可用的選項包括“keep”(將任何無效輸入分配給額外的分類索引)和“error”(引發錯誤)。
  **/
object Ex_oneHotEncoder {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf(true).setMaster("local[2]").setAppName("spark ml")
    val spark = SparkSession.builder().config(conf).getOrCreate()

    val df = spark.createDataFrame(Seq(
      (0.0, 1.0),
      (1.0, 0.0),
      (2.0, 1.0),
      (0.0, 2.0),
      (0.0, 1.0),
      (2.0, 0.0),
      (6.0, 1.0)
    )).toDF("categoryIndex1", "categoryIndex2")

    val encoder = new OneHotEncoderEstimator()
      .setInputCols(Array("categoryIndex1", "categoryIndex2"))
      .setOutputCols(Array("categoryVec1", "categoryVec2"))
      //默認情況下不包括最后一個類別(可通過“dropast”配置),因為它使向量項的總和為1,因此線性相關。
      .setDropLast(false)
    val model = encoder.fit(df)
    
    val encoded = model.transform(df)

    encoded.show(false)

    spark.stop()
  }
}
+--------------+--------------+-------------+-------------+
|categoryIndex1|categoryIndex2|categoryVec1 |categoryVec2 |
+--------------+--------------+-------------+-------------+
|0.0           |1.0           |(7,[0],[1.0])|(3,[1],[1.0])|
|1.0           |0.0           |(7,[1],[1.0])|(3,[0],[1.0])|
|2.0           |1.0           |(7,[2],[1.0])|(3,[1],[1.0])|
|0.0           |2.0           |(7,[0],[1.0])|(3,[2],[1.0])|
|0.0           |1.0           |(7,[0],[1.0])|(3,[1],[1.0])|
|2.0           |0.0           |(7,[2],[1.0])|(3,[0],[1.0])|
|6.0           |1.0           |(7,[6],[1.0])|(3,[1],[1.0])|
+--------------+--------------+-------------+-------------+


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM