Spark OneHotEncoder

1、概念

1独热编码(One-Hot Encoding)  2 * 将表示为标签索引的分类特征映射到二进制向量,该向量最多具有一个单一的单值,该单值表示所有特征值集合中特定特征值的存在。 3 * 此编码允许期望连续特征(例如逻辑回归)的算法使用分类特征。 4 * 对于字符串类型的输入数据,通常首先使用StringIndexer对分类特征进行编码 5 * 6 * OneHotEncoderEstimator可以转换多列,为每个输入列返回一个热编码的输出矢量列。通常使用VectorAssembler将这些向量合并为单个特征向量。 7 * 8 * OneHotEncoderEstimator支持handleInvalid参数,以选择在转换数据期间如何处理无效输入。 9 * 可用的选项包括“keep”(将任何无效输入分配给额外的分类索引)和“error”(引发错误)。 10 11在数据处理和特征工程中,经常会遇到类型数据,如性别分为[男,女],手机运营商分为[移动,联通,电信]等, 12我们通常将其转为数值带入模型,如[0,1], [-1,0,1]等,但模型往往默认为连续型数值进行处理,这样其实是违背我们最初设计的,也会影响模型效果。 13 14独热编码便是解决这个问题,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。 15 16如自然编码为:01 17 18独热编码为:1001 19 20可以理解为对有m个取值的特征,经过独热编码处理后,转为m个二元特征,每次只有一个激活。 21 22 23如数字字体识别0~9中,6的独热编码为: 24 250000001000 26 27优点 28 29独热编码的优点为: 30 311.能够处理非连续型数值特征。 322.在一定程度上也扩充了特征。比如性别本身是一个特征,经过one hot编码以后,就变成了男或女两个特征。 33 34 35 36当然,当特征类别较多时,数据经过独热编码可能会变得过于稀疏。

2、code

1package com.home.spark.ml 2 3import org.apache.spark.SparkConf 4import org.apache.spark.ml.feature.OneHotEncoderEstimator 5import org.apache.spark.sql.SparkSession 6 7/** 8 * @Description: 独热编码(One-Hot Encoding)  9 * 将表示为标签索引的分类特征映射到二进制向量,该向量最多具有一个单一的单值,该单值表示所有特征值集合中特定特征值的存在。 10 * 此编码允许期望连续特征(例如逻辑回归)的算法使用分类特征。 11 * 对于字符串类型的输入数据,通常首先使用StringIndexer对分类特征进行编码 12 * 13 * OneHotEncoderEstimator可以转换多列,为每个输入列返回一个热编码的输出矢量列。通常使用VectorAssembler将这些向量合并为单个特征向量。 14 * 15 * OneHotEncoderEstimator支持handleInvalid参数,以选择在转换数据期间如何处理无效输入。 16 * 可用的选项包括“keep”(将任何无效输入分配给额外的分类索引)和“error”(引发错误)。 17 **/ 18object Ex_oneHotEncoder { 19 def main(args: Array[String]): Unit = { 20 val conf: SparkConf = new SparkConf(true).setMaster("local[2]").setAppName("spark ml") 21 val spark = SparkSession.builder().config(conf).getOrCreate() 22 23 val df = spark.createDataFrame(Seq( 24 (0.0, 1.0), 25 (1.0, 0.0), 26 (2.0, 1.0), 27 (0.0, 2.0), 28 (0.0, 1.0), 29 (2.0, 0.0), 30 (6.0, 1.0) 31 )).toDF("categoryIndex1", "categoryIndex2") 32 33 val encoder = new OneHotEncoderEstimator() 34 .setInputCols(Array("categoryIndex1", "categoryIndex2")) 35 .setOutputCols(Array("categoryVec1", "categoryVec2")) 36 //默认情况下不包括最后一个类别(可通过“dropast”配置),因为它使向量项的总和为1,因此线性相关。 37 .setDropLast(false) 38 val model = encoder.fit(df) 39 40 val encoded = model.transform(df) 41 42 encoded.show(false) 43 44 spark.stop() 45 } 46} 47 48+--------------+--------------+-------------+-------------+ 49|categoryIndex1|categoryIndex2|categoryVec1 |categoryVec2 | 50+--------------+--------------+-------------+-------------+ 51|0.0 |1.0 |(7,[0],[1.0])|(3,[1],[1.0])| 52|1.0 |0.0 |(7,[1],[1.0])|(3,[0],[1.0])| 53|2.0 |1.0 |(7,[2],[1.0])|(3,[1],[1.0])| 54|0.0 |2.0 |(7,[0],[1.0])|(3,[2],[1.0])| 55|0.0 |1.0 |(7,[0],[1.0])|(3,[1],[1.0])| 56|2.0 |0.0 |(7,[2],[1.0])|(3,[0],[1.0])| 57|6.0 |1.0 |(7,[6],[1.0])|(3,[1],[1.0])| 58+--------------+--------------+-------------+-------------+
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )