查阅了很多资料,逐渐知道了one hot 的编码,但是始终没理解sklearn. preprocessing.OneHotEncoder()如何进行fit()的?自己琢磨了一下,后来终于明白是怎么回事了。

先看one hot 的编码的理解:引用至:https://blog.csdn.net/wy250229163/article/details/52983760

网上关于One-hot编码的例子都来自于同一个例子,而且结果来的太抖了。查了半天,终于给搞清楚这个独热编码是怎么回事了,其实挺简单的,这里再做个总结。 首先,引出例子:

已知三个feature,三个feature分别取值如下: feature1=[“male”, “female”] feature2=[“from Europe”, “from US”, “from Asia”] feature3=[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]

如果做普通数据处理,那么我们就按0,1,2,3进行编号就行了。例如feature1=[0,1],feature2=[0,1,2],feature3=[0,1,2,3]。 那么,如果某个样本为[“male”,“from Asia”, “uses Chrome”],它就可以表示为[0,2,1]。 以上为普通编码方式。 独热编码(One-hot)换了一种方式编码,先看看百科定义的:

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。 例如对六个状态进行编码: 自然顺序码为 000,001,010,011,100,101 独热编码则是 000001,000010,000100,001000,010000,100000

通过以上可以看到,独热编码每一个码的总的位数取决于状态的种类数,每一个码里的“1”的位置,就代表了哪个状态生效。 还是回到我们最开始的例子,那么我们将它换成独热编码后,应该是: feature1=[01,10] feature2=[001,010,100] feature3=[0001,0010,0100,1000]

注意,独热编码还有个特性是,当某个特征里的某一状态生效后,此特征的其他状态因为是互斥的关系,必须全部为0,切必须全部添加到特征里,不能省略不写。 所以,对于前边样本[“male”,“from Asia”, “uses Chrome”],经过独热编码后,它应该为: [01,00, 000,000,100, 0000,0010,0000,0000] 。

以上的独热编码可以写成简写形式: [1,0, 0,0,1, 0,1,0,0]

最后,摘抄下独热编码的好处:

由于分类器往往默认数据数据是连续的,并且是有序的,但是在很多机器学习任务中,存在很多离散(分类)特征,因而将特征值转化成数字时,往往也是不连续的, One-Hot 编码解决了这个问题。 并且,经过独热编码后,特征变成了稀疏的了。这有两个好处,一是解决了分类器不好处理属性数据的问题,二是在一定程度上也起到了扩充特征的作用。

然后网上很多人举了一个sklearn. preprocessing.OneHotEncoder()的例子:例子如下:

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder() >>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) >>> enc.n_values_
array([2, 3, 4]) >>> enc.feature_indices_
array([0, 2, 5, 9]) >>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]])

看了很多人的博客,都没懂,于是自己琢磨,原来是fit是看可以取多少个值。比如在

enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) 

这个fit中,所有的数组第一个元素取值分别为:0,1,0,1(黄色标注的),最大为1,且为两种元素(0,1),说明用2个状态位来表示就可以了,且该维度的value值为2(该值只与最大值有关系,最大值为1)

所有的数组第二个元素取值分别为:0,1,2,0(红色标注的),最大为2,且为两种元素(0,1,2),说明用3个状态位来表示就可以了,且该维度的value值为3(该值只与最大值有关系,最大值为2)

所有的数组第三个元素取值分别为:3,0,1,2(天蓝色标注的),最大为3,且为两种元素(0,1,2,3),说明用4个状态位来表示就可以了,且该维度的value值为4(该值只与最大值有关系,最大值为4)

所以整个的value值为(2,3,4),这也就解释了 enc.n_values_等于array([2,3,4])的原因。而enc.feature_indices_则是特征索引,该例子中value值为(2,3,4),则特征索引从0开始,到2的位置为第一个,到2+3=5的位置为第二个,到2+3+4的位置为第三个,索引为array([0,2,5,9])

那么接下来理解

>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]]) 这个就好办了,enc.transform就是将[0,1,1]这组特征转换成one hot编码,toarray()则是转成数组形式。[0,1,1],
第一个元素是0,由于之前的fit的第一个维度为2(有两种表示:10,01.程序中10表示0,01表示1),所以用1,0表示用黄色标注);
第二个元素是1,由于之前的fit的第二个维度为3(有三种表示:100,010,001.程序中100表示0,010表示1,001表示2),所以用0,1,0表示用红色标注);
第三个元素是1,由于之前的fit的第三个维度为4(有四种表示:1000,0100,0010,0001.程序中1000表示0,0100表示1,0010表示2,0001表示3),
所以用0,1,0,0(用天蓝色标注)表示。综上所述:[0,1,1]就被表示为array([[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]])。 排版不易,怎么排着排着就字体变成这样了,而且 还没找到格式刷。不过,总算理解了one hot编码和sklearn. preprocessing.OneHotEncoder()如何进行fit()的
有什么问题的欢迎指正,谢谢!
 

对one hot 编码的理解,sklearn. preprocessing.OneHotEncoder()如何进行fit()的?的更多相关文章

  1. sklearn.preprocessing OneHotEncoder——仅仅是数值型字段才可以,如果是字符类型字段则不能直接搞定

    >>> from sklearn.preprocessing import OneHotEncoder >>> enc = OneHotEncoder() > ...

  2. sklearn preprocessing 数据预处理(OneHotEncoder)

    1. one hot encoder sklearn.preprocessing.OneHotEncoder one hot encoder 不仅对 label 可以进行编码,还可对 categori ...

  3. sklearn.preprocessing.StandardScaler 离线使用 不使用pickle如何做

    Having said that, you can query sklearn.preprocessing.StandardScaler for the fit parameters: scale_ ...

  4. 【sklearn】数据预处理 sklearn.preprocessing

    数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...

  5. sklearn学习笔记(一)——数据预处理 sklearn.preprocessing

    https://blog.csdn.net/zhangyang10d/article/details/53418227 数据预处理 sklearn.preprocessing 标准化 (Standar ...

  6. sklearn.preprocessing.LabelEncoder的使用

    在训练模型之前,我们通常都要对训练数据进行一定的处理.将类别编号就是一种常用的处理方法,比如把类别"男","女"编号为0和1.可以使用sklearn.prepr ...

  7. 从ord()中对Unicode编码的理解

    刚开始学习编程的时候,老对字符串编码的理解模模糊糊.也一直看这方便的资料,今天在看Dive in python时,突然有了新的理解(不知道是否正确). Python有个built-in函数ord(), ...

  8. 数据规范化——sklearn.preprocessing

    sklearn实现---归类为5大类 sklearn.preprocessing.scale()(最常用,易受异常值影响) sklearn.preprocessing.StandardScaler() ...

  9. sklearn.preprocessing.LabelBinarizer

    sklearn.preprocessing.LabelBinarizer

随机推荐

  1. 幻读在 InnoDB 中是被如何解决的?

    在MySQL事务初识中,我们了解到不同的事务隔离级别会引发不同的问题,如在 RR 级别下会出现幻读.但如果将存储引擎选为 InnoDB ,在 RR 级别下,幻读的问题就会被解决.在这篇文章中,会先介绍 ...

  2. ZYNQ入门实例——三种GPIO应用、中断系统及软硬件交叉触发调试

    一.前言 Xlinx的ZYNQ系列SOC集成了APU.各种专用外设资源和传统的FPGA逻辑,为ARM+FPGA的应用提供助力,降低功耗和硬件设计难度的同时极大提高两者间传输的带宽.之前在研究生课题中使 ...

  3. ES6学习笔记(一):轻松搞懂面向对象编程、类和对象

    目录 面向过程编程P OP(Process oriented programming) 面向对象编程OOP(Object Oriented Programming) 总结 @ 面向过程编程P OP(P ...

  4. Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍

    本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...

  5. JavaScript中基本数据类型之间的转换

    在JavaScript中共有六种数据类型,其中有五种是基本数据类型,还有一种则是引用数据类型.五种基本数据类型分别是:Number 数值类型.String 字符串类型.Boolean 布尔类型, nu ...

  6. ELK学习001:Elastic Stack简介

    ELK简介: ELK Stack:ELK是Elasticsearch.Logstash.Kibana的缩写简称,这三者都是开源软件.ELK是5.0版本前的统称:这是一套统一的日志收集分析系统.它能够方 ...

  7. KINDLE 小说下载--超级书库

       网址:https://shuayouxi.cn/

  8. gradle与android studio 关系及gradle配置

    前言 我们一般开发android 使用android studio ,android studio 安装的时候,会帮我们做两件事,配置好自己的jdk. 实际上,使用的其实不是我们在path中配置的jd ...

  9. imx6ull+debian10 构建静态qt交叉编译环境

    # PC:Ubuntu18.04# GCC: arm-linux-gnueabihf- 7.4.0# 开发板:# imx6ull+debian10(文件系统为野火提供的) # 此处需要编译的是带gst ...

  10. linux 开机自启动redis服务

    [Unit] Description=The redis-server Process Manager Documentation=https://redis.io/ After=network.ta ...