特征變化--->標簽到向量的轉換(OneHotEncoder)


一、One-Hot Encoding

    One-Hot編碼,又稱為一位有效編碼,主要是采用位狀態寄存器來對個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候只有一位有效。
    在實際的機器學習的應用任務中,特征有時候並不總是連續值,有可能是一些分類值,如性別可分為“male”和“female”。在機器學習任務中,對於這樣的特征,通常我們需要對其進行特征數字化,如下面的例子:
有如下三個特征屬性:
  • 性別:["male","female"]
  • 地區:["Europe","US","Asia"]
  • 瀏覽器:["Firefox","Chrome","Safari","Internet Explorer"]
對於某一個樣本,如["male","US","Internet Explorer"],我們需要將這個分類值的特征數字化,最直接的方法,我們可以采用序列化的方式:[0,1,3]。但是這樣的特征處理並不能直接放入機器學習算法中。

二、One-Hot Encoding的處理方法

    對於上述的問題,性別的屬性是二維的,同理,地區是三維的,瀏覽器則是思維的,這樣,我們可以采用One-Hot編碼的方式對上述的樣本“["male","US","Internet Explorer"]”編碼,“male”則對應着[1,0],同理“US”對應着[0,1,0],“Internet Explorer”對應着[0,0,0,1]。則完整的特征數字化的結果為:[1,0,0,1,0,0,0,0,1]。這樣導致的一個結果就是數據會變得非常的稀疏。

One-Hot Encoding 作用也就是為了將特征數字化為一個特征向量

package Spark_MLlib

import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer}
import org.apache.spark.sql.SparkSession


object 特征變換_OneHotEncoder {
  val spark=SparkSession.builder().master("local[2]").appName("IndexToString").getOrCreate()
  import spark.implicits._

  def main(args: Array[String]): Unit = {
    val df=spark.createDataFrame(Seq(
      (0,"log"),
      (1,"text"),
      (2,"text"),
      (3,"soyo"),
      (4,"text"),
      (5,"log"),
      (6,"log"),
      (7,"log"),
      (8,"hadoop")
    )).toDF("id","label")
    val df2=spark.createDataFrame(Seq(
      (0,"log"),
      (1,"soyo"),
      (2,"soyo")
    )).toDF("id","label")
    val indexer=new StringIndexer().setInputCol("label").setOutputCol("label_index")
    val model=indexer.fit(df)
    val indexed1=model.transform(df)//這里測試數據用的是df
       indexed1.show()
    val indexed=model.transform(df2)//測試數據換為df2
    val encoder=new OneHotEncoder().setInputCol("label_index").setOutputCol("lable_vector").setDropLast(false)  //setDropLast:被編碼為全0向量的標簽也可以占有一個二進制特征
    val encodered1=encoder.transform(indexed1)
    encodered1.show()
    val encodered=encoder.transform(indexed)//(4,[2],[1.0]) //這里的4表示訓練數據中有4中類型的標簽
    encodered.show()
  }
}

結果:

+---+------+-----------+
| id| label|label_index|
+---+------+-----------+
|  0|   log|        0.0|
|  1|  text|        1.0|
|  2|  text|        1.0|
|  3|  soyo|        2.0|
|  4|  text|        1.0|
|  5|   log|        0.0|
|  6|   log|        0.0|
|  7|   log|        0.0|
|  8|hadoop|        3.0|
+---+------+-----------+

+---+------+-----------+-------------+
| id| label|label_index| lable_vector|
+---+------+-----------+-------------+
|  0|   log|        0.0|(4,[0],[1.0])|
|  1|  text|        1.0|(4,[1],[1.0])|
|  2|  text|        1.0|(4,[1],[1.0])|
|  3|  soyo|        2.0|(4,[2],[1.0])|
|  4|  text|        1.0|(4,[1],[1.0])|
|  5|   log|        0.0|(4,[0],[1.0])|
|  6|   log|        0.0|(4,[0],[1.0])|
|  7|   log|        0.0|(4,[0],[1.0])|
|  8|hadoop|        3.0|(4,[3],[1.0])|
+---+------+-----------+-------------+

+---+-----+-----------+-------------+
| id|label|label_index| lable_vector|
+---+-----+-----------+-------------+
|  0|  log|        0.0|(4,[0],[1.0])|
|  1| soyo|        2.0|(4,[2],[1.0])|
|  2| soyo|        2.0|(4,[2],[1.0])|
+---+-----+-----------+-------------+



免責聲明!

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



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