最近学习机器学习,接触到独热编码相关内容,参考了一些资料,加上自己的思考,做出了如下总结:

一、什么是独热编码

独热编码,即One-Hot编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

说起来这么复杂,举个例子就很容易理解了:

比如爱吃的水果有3种:苹果、葡萄和橙子,转换成独热编码分别表示为(此时上述描述中的N=3):001, 010, 100。(当然转换成100, 010, 001也可以,只要有确定的一一对应关系即可)。

那么提出一个问题,苹果、葡萄和橙子分别转换成1, 2, 3行不行?

一般不这样处理,这样处理也不叫独热编码了,只能说是文本转换成数字,具体原因可以往下看。

二、为什么要进行独热编码

在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的。而常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。

使用独热编码(One-Hot Encoding),将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用独热编码(One-Hot Encoding),会让特征之间的距离计算更加合理。

接下来举例说明:

我们选取离散型特征,共有五个取值,不使用独热编码(One-Hot Encoding),其表示分别是:

演员 =0;厨师 =1;公务员 =2;工程师 =3;律师 =4

两个工作之间的距离是:

d(演员,厨师) = 1
d(厨师,公务员) = 1
d(公务员,工程师) = 1
d(工程师,律师) = 1
d(演员,公务员) = 2
d(演员,工程师) = 3

显然这样的表示,计算出来的特征的距离是不合理。那如果使用独热编码(One-Hot Encoding),则得到d(演员,厨师) = 1与d(演员,公务员)都是1。那么,两个工作之间的距离就都是sqrt(2)。即每两个工作之间的距离是一样的,显得更合理。

此处参考文章为:

https://www.jianshu.com/p/42e93acacc52

三、如何用Python实现独热编码

方法1:get_dummies

将类别变量转换成虚拟变量/指示变量,也叫哑变量。

我们看一下它的定义:

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)

各参数的含义:

data: array-like, Series, or DataFrame

prefix: string, list of strings, or dict of strings, default None

prefix_sep: str, default ‘_’ (转换后列名的前缀)

dummy_na: bool, default False(增加一列表示空缺值,如果False就忽略空缺值)

columns: list-like, default None (指定需要实现类别转换的列名)

sparse: bool, default False

drop_first: bool, default False (获得k中的k-1个类别值,去除第一个)

dtype: dtype, default np.uint8

举例说明一下:

import numpy as np
import pandas as pd
s=pd.Series(list('abcd'))
s_=pd.get_dummies(s)
print(s_)

我们看一下结果:

   a  b  c  d
0  1  0  0  0
1  0  1  0  0
2  0  0  1  0
3  0  0  0  1

我们换一种表示方法:

import numpy as np
import pandas as pd
s=pd.Series(list('abcd'))
s_=pd.get_dummies(s,drop_first=True)
print(s_)
   b  c  d
0  0  0  0
1  1  0  0
2  0  1  0
3  0  0  1

再来看一个例子:

import numpy as np
import pandas as pd
df=pd.DataFrame({'city':['hang zhou','shang hai','bei jing'],'population':[20,32,51],'class':['A','A+','A+']})
print(df)
df_=pd.get_dummies(df)
print(df_)

首先看一下df的输出结果:

        city  population class
0  hang zhou          20     A
1  shang hai          32    A+
2   bei jing          51    A+

看一下df_的输出结果:

   population  city_bei jing  city_hang zhou  city_shang hai  class_A  class_A+
0          20              0               1               0        1         0
1          32              0               0               1        0         1
2          51              1               0               0        0         1

方法2:sklearn

Sklearn提供了一个编码器OneHotEncoder,用于将整数分类值转换成独热向量。

我们举一个例子:

from scipy.io import loadmat
from sklearn.preprocessing import OneHotEncoderdataset=loadmat('neural_network_dataset.mat')
print('数据集展示为:\n',dataset)

展示一下数据集的样子:

数据集展示为:{'__header__': b'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Sun Oct 16 13:09:09 2011', '__version__': '1.0', '__globals__': [], 'X': array([[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.],...,[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.]]), 'y': array([[10],[10],[10],...,[ 9],[ 9],[ 9]], dtype=uint8)}

接下来我们把标签向量转换为独热向量:

X=dataset['X']
y=dataset['y']
encoder=OneHotEncoder(sparse=False)
y_onehot=encoder.fit_transform(y)
print(y[0])
print(y_onehot[0,:])

我们看一下输出结果:

[10]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

【sklearn】数据预处理之独热编码(含两种实现方式+代码理解)相关推荐

  1. 数据预处理之独热编码(One-Hot)

    1.前言 在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等. 这些特征值并不是连续的,而是离散的,无序的.通常我们需要对其进行特征数字化. 那什么是特征数字化呢 ...

  2. Python数据分析数据预处理特征值独热编码

    [小白从小学Python.C.Java] [Python-计算机等级考试二级] [Python-数据分析] Python数据分析 数据预处理 特征值独热编码 独热编码,是一种将分类变量转换为若干二进制 ...

  3. 数据预处理之独热编码(One-Hot Encoding)

    问题的由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑以下三个特征: ["male","female"] ["from ...

  4. 数据预处理之独热编码(OneHotEncoder)

    前言 ---------------------------------------- 在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等. 这些特征值并不是连续 ...

  5. 机器学习:数据预处理之独热编码(One-Hot)

    前言 ---------------------------------------- 在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等. 这些特征值并不是连续 ...

  6. 机器学习:数据预处理之独热编码(One-Hot)详解

    一. 什么是独热编码? ---------------------------------------- 在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等. 这 ...

  7. python 独热码_数据预处理:独热编码(One-Hot Encoding)

    问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from ...

  8. 【机器学习技巧】之特征工程:数字编码以及One-hot独热编码的几种方式(sklearn与pandas处理方式)

    本文主要对OneHot独热编码进行了简单介绍,同时介绍了在sklearn与pandas中进行数字编码以及One-hot独热编码的几种方式. 目录 1. OneHot独热编码介绍 1.1 为什么要用On ...

  9. 深度学习工作笔记003---数据预处理:独热编码(One-Hot Encoding)

    JAVA技术交流QQ群:170933152 问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "fem ...

最新文章

  1. [转]远程唤醒技术在运维中的应用
  2. java满天星星代码_满天星空的代码实现
  3. Python编程进阶,Python如何实现多进程?
  4. 手动挡五个档位示意图_★手动挡汽车档位图解
  5. 小结Python的中文处理(转)
  6. mysql临时开启二进制_mysql二进制安装 - yunwei-LS的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 初中计算机期末质量分析,初中信息技术教学感悟随笔
  8. 怎样修改MySQL数据库的密码
  9. C语言运算优先级记忆口诀
  10. extmail mysql数据库 重启_linux下安装和配置extmail
  11. 数澜、宜信、贝壳三种数据中台建设模式探讨 | 数澜科技
  12. 第一章 绪论 思维导图
  13. 易语言取php网页数据,易语言爬取网页内容方法
  14. 基于EasyNVR网络摄像机无插件直播流媒体服务器实现文字滤镜处理功能
  15. 潜在因子模型_如何使用潜在因子模型在图形数据库中构建推荐系统
  16. phpstorm中,光标变成一个长方红色块,如何调回来?
  17. 深圳商报 | 跨境电商大会聚焦跨境收款难题
  18. 微信小程序 - 登录获取openid和用户信息(适配getUserProfile)
  19. 苹果Mac电脑清理垃圾软件卸载工具CleanMyMac X
  20. 基于Springboot+vue的在线聊天系统

热门文章

  1. 鸿蒙os将用在哪款机型,鸿蒙OS 2.0正式发布,华为手机将会有哪些改变?
  2. mongodb 无法查出数据_mongodb查询不到数据
  3. java rowmapper 通用实现_将每行映射为MAP对象的RowMapper实现
  4. 将纸质的电话号码导入到手机通讯录(一):使用ABBYY FineReader进行数据识别
  5. android 自由缩放图片大小,android Matrix实现图片随意放大缩小或拖动
  6. Mybatis 批量插入事物问题
  7. 进制+补码+位运算+算法
  8. Android 获取设备开机时间
  9. 2.物业管理项目-主页
  10. 4月份可升级鸿蒙手机型号,华为手机4月份升级鸿蒙OS,包含荣耀共28款机型