项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.one hot编码的由来

在实际的应用场景中,有非常多的特征不是连续的数值变量,而是某一些离散的类别。比如在广告系统中,用户的性别,用户的地址,用户的兴趣爱好等等一系列特征,都是一些分类值。这些特征一般都无法直接应用在需要进行数值型计算的算法里,比如CTR预估中最常用的LR。那针对这种情况最简单的处理方式是将不同的类别映射为一个整数,比如男性是0号特征,女性为1号特征。这种方式最大的优点就是简单粗暴,实现简单。那最大的问题就是在这种处理方式中,各种类别的特征都被看成是有序的,这显然是非常不符合实际场景的。

为了解决上述问题,其中一种可能的解决方法是采用独热编码(One-Hot Encoding)。
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。(本段内容来自网络)

2.one hot 编码的优点

由第一部分的分析,很容易看出one hot编码的优点:
1.能够处理非连续型数值特征。
2.在一定程度上也扩充了特征。比如性别本身是一个特征,经过one hot编码以后,就变成了男或女两个特征。

3.为什么能使用one hot

1.使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
2.将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
3.将离散型特征使用one-hot编码,可以会让特征之间的距离计算更加合理。比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。

4.sklearn里的one hot

sklearn作为广泛使用深受推崇的机器学习库,自然少不了one hot编码。
首先上一段sklearn的自带例子:

import numpy as np
from sklearn.preprocessing import OneHotEncoderenc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2]])
print "enc.n_values_ is:",enc.n_values_
print "enc.feature_indices_ is:",enc.feature_indices_
print enc.transform([[0, 1, 1]]).toarray()

代码运行结果

enc.n_values_ is: [2 3 4]
enc.feature_indices_ is: [0 2 5 9]
[[ 1.  0.  0.  1.  0.  0.  1.  0.  0.]]

要想明白上面代码的意思,我们看看源码中的说明就明白了

   """Encode categorical integer features using a one-hot aka one-of-K scheme.The input to this transformer should be a matrix of integers, denotingthe values taken on by categorical (discrete) features. The output will bea sparse matrix where each column corresponds to one possible value of onefeature. It is assumed that input features take on values in the range[0, n_values).This encoding is needed for feeding categorical data to many scikit-learnestimators, notably linear models and SVMs with the standard kernels.Read more in the :ref:`User Guide <preprocessing_categorical_features>`.Attributes----------active_features_ : arrayIndices for active features, meaning values that actually occurin the training set. Only available when n_values is ``'auto'``.feature_indices_ : array of shape (n_features,)Indices to feature ranges.Feature ``i`` in the original data is mapped to featuresfrom ``feature_indices_[i]`` to ``feature_indices_[i+1]``(and then potentially masked by `active_features_` afterwards)n_values_ : array of shape (n_features,)Maximum number of values per feature.

前面一部分是对one-hot的原理解释。Attributes部分是对属性的一些解释:
n_values:是一个数组,长度为每个特征的所有出现类别的总和。具体到代码里,[[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2]]是我们的样本矩阵,[0, 0, 3]是一个样本,每个样本有三维,即三类特征。对于第一维或者说第一类特征,有0,1两种取值;第二类特征,有0,1,2两类特征;第三类特征,有0,1,2,3三类特征,所以

enc.n_values_ is: [2 3 4]

feature_indices_:根据说明,明显可以看出其是对n_values的一个累加。
最后enc.transform([[0, 1, 1]]).toarray(),就是将[0,1,1]这个输入样本,用one-hot编码出来的结果咯。

5.不需要对特征进行归一化的情况

基于树的方法不需要进行特征的归一化。例如随机森林,bagging与boosting等方法。如果是基于参数的模型或者基于距离的模型,因为需要对参数或者距离进行计算,都需要进行归一化。

基于sklearn 的one hot encoding相关推荐

  1. 第十九课.基于sklearn的SVM人脸识别

    目录 数据集 确定人脸的类别标记 划分训练集和测试集与训练 实验为基于sklearn的SVM人脸识别,使用 SVM 算法对戴眼镜的人脸和不戴眼镜的人脸进行分类,从而完成 识别戴眼镜的人脸 的任务:实验 ...

  2. ML之NB:(NLP)基于sklearn库利用不同语种数据集训练NB(朴素贝叶斯)算法,对新语种进行语种检测

    ML之NB:(NLP)基于sklearn库利用不同语种数据集训练NB(朴素贝叶斯)算法,对新语种进行语种检测 目录 输出结果 训练数据集 设计思路 核心代码 输出结果 测试01:I love you ...

  3. ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注

    ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注 目录 输出结果 实现代码 输出结果 实现代码 import numpy as np import matplotlib.pyp ...

  4. DL:基于sklearn的加利福尼亚房价数据集实现GD算法

    DL:基于sklearn的加利福尼亚房价数据集实现GD算法 目录 输出结果 代码设计 输出结果 该数据包含9个变量的20640个观测值,该数据集包含平均房屋价值作为目标变量和以下输入变量(特征):平均 ...

  5. DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率

    DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率 目录 输出结果 核心代码 输出结果 核心代码 #DL之NN:基于sklearn ...

  6. ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测

    ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测 目录 输出结果 数据集展示 输出结果 1.k-NN 2.LoR 4.DT 5.RF ...

  7. 机器学习(一) 基于sklearn库的数据集划分(交叉验证)

    机器学习中首要环节就是数据集的处理,其中数据集的处理从个人理解(如有错误敬请谅解)的角度来说包括两个方面:数据集划分和数据清理.其中数据集划分是指训练集.验证集和测试集的数据类别划分:数据清理是指数据 ...

  8. 基于sklearn的LogisticRegression鸢尾花多类分类实践

    文章目录 1. 问题描述 2. 数据介绍 2.1 数据描述 2.2 数据 2.3 数据可视化 3. 模型选择 3.1 固有的多类分类器 3.2 1对多的多类分类器 3.3 OneVsRestClass ...

  9. python分类算法的应用_Python基于sklearn库的分类算法简单应用示例

    Python基于sklearn库的分类算法简单应用示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python基于sklearn库的分类算法简单应用示例.tx ...

  10. 【ML】异常检测、PCA、混淆矩阵、调参综合实践(基于sklearn)

    [ML]异常检测.PCA.混淆矩阵.调参综合实践(基于sklearn) 加载数据 可视化数据 异常点检测 PCA降维 使用KNN进行分类并可视化 计算混淆矩阵 调节n_neighbors参数找到最优值 ...

最新文章

  1. Linux 双网卡绑定测试
  2. ASP.NET Core 中文文档 第三章 原理(12)托管
  3. jvm性能调优实战 - 43OOM内存溢出发生的原因及可能发生OOM的内存区域
  4. 专访 Christian Posta:Istio 1.7 将成为生产可用的最稳定版本
  5. Linux / 僵尸进程、孤儿进程 产生原因、有什么危害、如何预防(解决方案)
  6. idea的plugins无法使用marketplace plugins are not loaded
  7. mysql定时作业_mysql 让一个存储过程定时作业的代码(转)
  8. ts16949 软件开发流程图_新产品开发流程图:包括APQP,DFMEA,PFMEA,PPAP(FAI),SPC,MSA(GRR)等...
  9. linux查看服务进程发包,11月18日linux服务器后,服务器向外发包,CPU达99%以上
  10. 中国大数据风控企业揭秘系列之航天信息
  11. 当你心情不好的时候,看看这几句话。。。
  12. 【100%通过率】华为OD机试真题 C++ 实现【完美走位】【2022.11 Q4新题】
  13. KMS激活错误解决方法
  14. 如影智能:深度赋能家居行业上下游,共享全屋智能万亿市场红利
  15. Nullpoint及其相关的报错
  16. PHP Fatal error: Uncaught Error: Class ‘\Elasticsearch\Serializers\SmartSerializer‘ not found in /h
  17. 如果编写 if 时不带 else
  18. 全球首发护舒宝敏感肌系列 小豆子李子璇也Pick的姨妈CP
  19. mega盘要_[MEGA DEAL]支付您想要的:2018机器学习套件(99%折扣)
  20. html图片文字环绕

热门文章

  1. Redis 配置文件参数说明
  2. [Java]HashMap的两种排序方式
  3. sql 练习网站答案解析
  4. myeclipse 配置 SVN
  5. CentOS下Redisserver安装配置
  6. 《Web测试囧事》——1.3 测试Web Service能否正常提供JSON数据
  7. H2O中的随机森林算法介绍及其项目实战(python实现)
  8. DOM中 property 和 attribute 详解
  9. Linux Netfilter conntrack对zone的支持
  10. Linux服务器 -- 安全篇