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])| +--------------+--------------+-------------+-------------+
