獨熱編碼(One-Hot Encoding) 是指把一列類別性特征(或稱名詞性特征,nominal/categorical features)映射成一系列的二元
連續特征的過程,原有的類別性特征有幾種可能取值,這一特征就會被映射成幾個二元連續特征,每一個特征代表一種取值,若該樣
本表現出該特征,則取1,否則取0。
One-Hot編碼適合一些期望類別特征為連續特征的算法,比如說邏輯斯蒂回歸等。
首先創建一個DataFrame,其包含一列類別性特征,需要注意的是,在使用OneHotEncoder進行轉換前,DataFrame需要先使用
StringIndexer將原始標簽數值化:
#導入相關的類庫
from pyspark.sql import SparkSession
from pyspark.ml.feature import OneHotEncoder,StringIndexer
#創建SparkSession對象,配置spark
spark = SparkSession.builder.master('local').appName('OneHotEncoderDemo').getOrCreate()
#創建一個簡單的DataFrame訓練集
df = spark.createDataFrame([
(0, "a"),
(1, "b"),
(2, "c"),
(3, "a"),
(4, "a"),
(5, "c")
], ["id", "category"])
#創建StringIndexer對象,設置輸入輸出參數
indexer = StringIndexer(inputCol='category', outputCol='categoryIndex')
#生成訓練模型
model = indexer.fit(df)
#利用生成的model對DataFrame進行轉換
indexed = model.transform(df)
#創建OneHotEncoder對象,設置輸入輸出參數
onehotencoder = OneHotEncoder(inputCol='categoryIndex', outputCol='categoryVec')
#我們創建OneHotEncoder對象對處理后的DataFrame進行編碼,可以看見,編碼后的二進制特征呈稀疏
#向量形式,與StringIndexer編碼的順序相同,需注意的是最后一個Category(”b”)被編碼為全0向
#量,若希望”b”也占有一個二進制特征,則可在創建OneHotEncoder時指定setDropLast(false)。
oncoded = onehotencoder.transform(indexed)
oncoded.show()
