zoukankan      html  css  js  c++  java
  • 特征变化--->标签到向量的转换(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])|
    +---+-----+-----------+-------------+


  • 相关阅读:
    jq封装的tab切换
    jquery高级函数
    jquery一些基本函数
    javascript中的事件冒泡和事件捕获
    prototype数组方法的实现
    瀑布流布局
    flex弹性布局
    js鼠标点击版tab切换
    js拖拽效果
    js根据className获取元素封装
  • 原文地址:https://www.cnblogs.com/soyo/p/7763614.html
Copyright © 2011-2022 走看看