对one hot 编码的理解,sklearn. preprocessing.OneHotEncoder()如何进行fit()的?
查阅了很多资料,逐渐知道了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()的?的更多相关文章
- sklearn.preprocessing OneHotEncoder——仅仅是数值型字段才可以,如果是字符类型字段则不能直接搞定
>>> from sklearn.preprocessing import OneHotEncoder >>> enc = OneHotEncoder() > ...
- sklearn preprocessing 数据预处理(OneHotEncoder)
1. one hot encoder sklearn.preprocessing.OneHotEncoder one hot encoder 不仅对 label 可以进行编码,还可对 categori ...
- sklearn.preprocessing.StandardScaler 离线使用 不使用pickle如何做
Having said that, you can query sklearn.preprocessing.StandardScaler for the fit parameters: scale_ ...
- 【sklearn】数据预处理 sklearn.preprocessing
数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...
- sklearn学习笔记(一)——数据预处理 sklearn.preprocessing
https://blog.csdn.net/zhangyang10d/article/details/53418227 数据预处理 sklearn.preprocessing 标准化 (Standar ...
- sklearn.preprocessing.LabelEncoder的使用
在训练模型之前,我们通常都要对训练数据进行一定的处理.将类别编号就是一种常用的处理方法,比如把类别"男","女"编号为0和1.可以使用sklearn.prepr ...
- 从ord()中对Unicode编码的理解
刚开始学习编程的时候,老对字符串编码的理解模模糊糊.也一直看这方便的资料,今天在看Dive in python时,突然有了新的理解(不知道是否正确). Python有个built-in函数ord(), ...
- 数据规范化——sklearn.preprocessing
sklearn实现---归类为5大类 sklearn.preprocessing.scale()(最常用,易受异常值影响) sklearn.preprocessing.StandardScaler() ...
- sklearn.preprocessing.LabelBinarizer
sklearn.preprocessing.LabelBinarizer
随机推荐
- JWT实现token-based会话管理(转)
JWT实现token-based会话管理 阅读目录 认识JWT demo要点说明 小结 上文<3种web会话管理的方式>介绍了3种会话管理的方式,其中token-based的方式有必要 ...
- vue element 表头添加斜线
<template> <div class="app-container"> <el-table :data="tableData3&quo ...
- Git push时不需要总输入密码
遇到问题: 最近因为换了自己的邮箱密码后,每次push的时候都需要填写密码,账号.很烦 解决方法: [戎马半生的答案] (http://www.cnblogs.com/zhaoyu1995/p/650 ...
- BFC的语法
先说一下什么是BFC(Block Formatting Contexts) BFC:块级格式化上下文(独立的渲染区).通俗的说是块级元素布局逻辑或规则,想要触发BFC就要是块级元素,要不把它转为块级元 ...
- [20200129]子光标不共享BIND_EQUIV_FAILURE.txt
[20200129]子光标不共享BIND_EQUIV_FAILURE.txt --//生产系统再次遇到大量BIND_EQUIV_FAILURE原因导致子光标的情况.我看了我以前测试遇到的情况.--// ...
- luogu2173 [ZJOI2012]网络
题目链接 problem 给出一个无向图,每条边有一种颜色.每种颜色都构成一个森林.需要完成以下操作. 修改点权 修改边的颜色 询问某种颜色的森林中某条路径上点权最大值 solution 颜色数量不超 ...
- TampeMonkey 关于 youtube的两个插件
一个是 Video Speed Buttons 负责调速 一个是 YouTube Links 负责下载不同分辨率的视频
- 使用JDK工具进行Java服务器应用程序故障排除
Java性能调优指南–有关提高Java代码性能的各种技巧. 最近又学到了很多新知识,感谢优锐课老师细致地讲解,这篇博客记录下自己所学所想. 1. 介绍 在Java世界中,我们大多数人习惯于在Java应 ...
- java 上传文件到七牛云中
import com.alibaba.fastjson.JSONObject;import com.qiniu.common.QiniuException;import com.qiniu.commo ...
- jQuery---on注册事件的2种方式
on注册事件的2种方式 on注册事件的语法 on注册简单事件 // 这个是p自己注册的事件(简单事件) $("p").on("click", function ...