Spark OneHotEncoder

Stella981
• 阅读 664

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])|
+--------------+--------------+-------------+-------------+
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Souleigh ✨ Souleigh ✨
2年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
25、二分类、多分类与多标签问题的区别
二分类、多分类与多标签的基本概念二分类:表示分类任务中有两个类别,比如我们想识别一幅图片是不是猫。也就是说,训练一个分类器,输入一幅图片,用特征向量x表示,输出是不是猫,用y0或1表示。二类分类是假设每个样本都被设置了一个且仅有一个标签0或者1。多类分类(Multiclassclassification):表示分类任务中有多
Wesley13 Wesley13
2年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Wesley13 Wesley13
2年前
KNN算法详解
  简单的说,K近邻算法是采用不同特征值之间的距离方法进行分类。  该方法优点:精确值高、对异常值不敏感、无数据输入假定  缺点:计算复杂度高、空间复杂度高  适用范围:数据型和标称型  现在我们来讲KNN算法的工作原理:存在一个样本数据集,也称作训练样本集,并且样本中每条数据都存在标签。将新输入的没有标签的数据与训练样本数据集中
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究