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])|
    +--------------+--------------+-------------+-------------+
  • 相关阅读:
    Java Spring Boot VS .NetCore (十) Java Interceptor vs .NetCore Interceptor
    Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
    IdentityServer4 And AspNetCore.Identity Get AccessToken 问题
    Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute
    Java Spring Boot VS .NetCore (七) 配置文件
    Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml
    Java Spring Boot VS .NetCore (五)MyBatis vs EFCore
    Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore
    Java Spring Boot VS .NetCore (三)Ioc容器处理
    Java Spring Boot VS .NetCore (二)实现一个过滤器Filter
  • 原文地址:https://www.cnblogs.com/asker009/p/12192210.html
Copyright © 2011-2022 走看看