特征变化--->标签到向量的转换(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])|
+---+-----+-----------+-------------+


原文地址:https://www.cnblogs.com/soyo/p/7763614.html