zoukankan      html  css  js  c++  java
  • Spark OneHotEncoder

    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])|
    +--------------+--------------+-------------+-------------+
  • 相关阅读:
    HDU 1423 Greatest Common Increasing Subsequence(LICS入门,只要求出最长数)
    HDU 5455 Fang Fang
    hihoCoder 1234 fractal
    二叉排序树
    最大连续子序列和,最大上升子序列和,最长上升子序列,最长公共子串,最长公共子序列,最长上升公共子序列
    C++ string string string string string string string string string string
    pip安装第三方库
    pip安装时使用国内源,加快下载速度
    pip升级命令
    instanceof -- JS
  • 原文地址:https://www.cnblogs.com/asker009/p/12192210.html
Copyright © 2011-2022 走看看