OneHotEncoder 可用于将分类特征的每个元素转化为一个可直接计算的数值,也即特征值数字化,常用于特征工程中的数据预处理。

其本质是One-Hot编码在scikit-learn中的实现。

One-Hot
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候只有一位有效。

One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值,然后,每个整数值被表示为二进制向量,将整数索引标记为1,其余都标为0。

sklearn 中的 OneHotEncoder
直达官网: sklearn.preprocessing.OneHotEncoder

基本参数:
# Encode categorical integer features as a one-hot numeric array.
OneHotEncoder(n_values=None,  
                        categorical_features=None, 
                        categories=None, 
                        drop=None, 
                        sparse=True,
                    dtype=np.float64,
                        handle_unknown='error')
示例:

#-*- coding: utf-8 -*-
from sklearn.preprocessing import  OneHotEncoder

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

ans = enc.transform([[0, 1, 3]]).toarray() 
'''
如果不加 toarray() 的话,输出的是稀疏的存储格式,即索引加值的形式,也可以通过参数指定 sparse = False 来达到同样的效果
'''
print(ans) 
#输出 [[ 1.  0.  0.  1.  0.  0.  0.  0.  1.]]

解释:

对于输入数组,依旧是把每一行当作一个样本,每一列当作一个特征,

先来看第一个特征,即第一列 [0,1,0,1],也就是说它有两个取值 0 或者 1,那么 one-hot 就会使用两位来表示这个特征,[1,0] 表示 0, [0,1] 表示 1,在上例输出结果中的前两位 [1,0…] 也就是表示该特征为 0;

第二个特征,第二列 [0,1,2,0],它有三种值,那么 one-hot 就会使用三位来表示这个特征,[1,0,0] 表示 0, [0,1,0] 表示 1,[0,0,1] 表示 2,在上例输出结果中的第三位到第六位 […0,1,0,0…] 也就是表示该特征为 1;

第二个特征,第三列 [3,0,1,2],它有四种值,那么 one-hot 就会使用四位来表示这个特征,[1,0,0,0] 表示 0, [0,1,0,0] 表示 1,[0,0,1,0] 表示 2,[0,0,0,1] 表示 3,在上例输出结果中的最后四位 […0,0,0,1] 也就是表示该特征为 3;

注意:

在scikit-learn 0.20版本中有一个比较重要的改动,就是sklearn.preprocessing.OneHotEncoder 除了支持整数外,还支持字符串。
否则如果特征是字符串,就需要先使用 sklearn.preprocessing.LabelEncoder 将离散特征值转换为数字。
常用参数解释

  • n_values=’auto’
    -(scikit-learn 0.20 中以categories替代,也即: categories=’auto’ )

表示每个特征使用几维的数值由数据集自动推断,即几种类别就使用几位来表示。当然也可以自己指定,示例:

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(categories= [2, 3, 4])

enc.fit([[0, 0, 3],

[1, 1, 0]])

ans = enc.transform([[0, 2, 3]]).toarray()

print(ans)

#输出 [[ 1.  0.  0.  0.  1.  0.  0.  0.  1.]]

drop=None
-用于从每个特征中舍去特定的分类,默认为None,且不能与categories、n_values同用。

dtype=np.float64
表示编码数值格式,默认是浮点型。

sparse=True
表示编码的格式,默认为 True,即为稀疏的格式,指定 False 则就不用 toarray() 了

handle_unknown=’error’
,其值可以指定为 “error” 或者 “ignore”,即如果碰到未知的类别,是返回一个错误还是忽略它。

categorical_features = 'all’
这个参数指定了对哪些特征进行编码,默认对所有类别都进行编码。也可以自己指定选择哪些特征,通过索引或者 bool 值来指定,看下例:

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(categorical_features = [0,2])         # 等价于 [True, False, True]
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) 
#输出 [[ 1.  0.  0.  0.  0.  1.  2.]]
以下为jupyter notebook 输出示例,可以看到运行结果之外,还有一串Warnings

出现 警告的原因 是:

scikit-learn 0.20 中将此参数进行了剥离,后续的OneHotEncoder将不再支持categorical_features 参数,但新增了sklearn.compose.ColumnTransformer 类,
通过这个类我们可以对输入的特征分别做不同的预处理,并且最终的结果还在一个特征空间里面。

ColumnTransformer 的具体使用方法在此不再展开,
下面示例演示 利用OneHotEncoder结合ColumnTransformer ,实现categorical_features 参数 对指定的特征类编码
from sklearn.preprocessing import  OneHotEncoder
from sklearn.compose import ColumnTransformer

categorical_features = [0,2]
enc = OneHotEncoder(handle_unknown='ignore')
clt = ColumnTransformer([('name',enc,categorical_features)],remainder='passthrough')

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

ans = clt.transform([[0, 2, 3]])         # 此处不能再使用toarray()
print(ans)
#输出 [[1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2]]

[color=rgba(0, 0, 0, 0.75)]fit_transform()
[color=rgba(0, 0, 0, 0.75)]方法 transform( X ) 就是对 X 进行编码了。在实际应用中,我们更常用方法fit_transform( ) ,它相当于fit( X ).transform( X ) ,也就是一步到位,看下例:

[color=rgba(0, 0, 0, 0.749019607843137)]from sklearn.preprocessing import  OneHotEncoder
[color=rgba(0, 0, 0, 0.749019607843137)]

[color=rgba(0, 0, 0, 0.749019607843137)]enc = OneHotEncoder(sparse = False) 
[color=rgba(0, 0, 0, 0.749019607843137)]ans = enc.fit_transform([[0, 0, 3],
[color=rgba(0, 0, 0, 0.749019607843137)]                         [1, 1, 0],
[color=rgba(0, 0, 0, 0.749019607843137)]                         [0, 2, 1],
[color=rgba(0, 0, 0, 0.749019607843137)]                         [1, 0, 2]])
[color=rgba(0, 0, 0, 0.749019607843137)]

[color=rgba(0, 0, 0, 0.749019607843137)]print(ans)
[color=rgba(0, 0, 0, 0.749019607843137)] ''' 输出
[color=rgba(0, 0, 0, 0.749019607843137)]  [[ 1.  0.  1. ...,  0.  0.  1.]
[color=rgba(0, 0, 0, 0.749019607843137)]   [ 0.  1.  0. ...,  0.  0.  0.]
[color=rgba(0, 0, 0, 0.749019607843137)]   [ 1.  0.  0. ...,  1.  0.  0.]
[color=rgba(0, 0, 0, 0.749019607843137)]   [ 0.  1.  1. ...,  0.  1.  0.]]
[color=rgba(0, 0, 0, 0.749019607843137)]   '''

结束:

以上只是OneHotEncoder的基本用法演示,更多高级的应用,有待进一步研究学习。

scikit-learn中的OneHotEncoder用法相关推荐

  1. 机器学习与Scikit Learn学习库

    摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...

  2. Scikit Learn: 在python中机器学习

    Warning 警告:有些没能理解的句子,我以自己的理解意译. 翻译自:Scikit Learn:Machine Learning in Python 作者: Fabian Pedregosa, Ga ...

  3. [转载]Scikit Learn: 在python中机器学习

    原址:http://my.oschina.net/u/175377/blog/84420 目录[-] Scikit Learn: 在python中机器学习 载入示例数据 一个改变数据集大小的示例:数码 ...

  4. python笔迹识别_python_基于Scikit learn库中KNN,SVM算法的笔迹识别

    之前我们用自己写KNN算法[网址]识别了MNIST手写识别数据 [数据下载地址] 这里介绍,如何运用Scikit learn库中的KNN,SVM算法进行笔迹识别. 数据说明: 数据共有785列,第一列 ...

  5. sql语句中的in用法示例_示例中JavaScript in操作符

    sql语句中的in用法示例 One of the first topics you'll come across when learning JavaScript (or any other prog ...

  6. 【scikit-learn】如何用Python和SciKit Learn 0.18实现神经网络

    本教程的代码和数据来自于 Springboard 的博客教程.本文的作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:https://g ...

  7. python scikit learn 关闭开源_scikit learn 里没有神经网络?

    本教程的代码和数据来自于 Springboard 的博客教程,希望能为你提供帮助.作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:ht ...

  8. scikit - learn 做文本分类

    文章来源: https://my.oschina.net/u/175377/blog/84420 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的句子,我以自 ...

  9. mysql中change用法,mysql 中alter的用法以及一些步骤

    mysql 中alter的用法以及一些方法 在用到alter的时间,查到了这个文章,就copy下来了,详细进入下面链接: MySQL之alter语句用法总结 1:删除列 ALTER TABLE [表名 ...

  10. mysql中正则表达式的用法_Mysql中正则表达式Regexp常见用法

    Mysql中Regexp常见用法 模糊匹配,包含特定字符串 # 查找content字段中包含"车友俱乐部"的记录 select * from club_content where ...

最新文章

  1. SAP 销售与分销模块定价完全实施手册(SAP SD Pricing Handbook)
  2. 深入理解springMVC
  3. Android Jetpack组件之数据库Room详解(三)
  4. LLVM4更新--简化对象定义
  5. 201673020127 词频统计软件项目报告
  6. code128条码c语言,C#生成code128条形码的方法
  7. JDK源码(15)-Class
  8. mysql 服务账号_MySql 账号管理
  9. 上传到服务器的图片访问的时候提示403 You don't have permission to access
  10. Linux下安装AliSQL(MySQL)及相关环境配置
  11. socket连接测试工具,window和linux下
  12. 计算机在网络通信方面的应用,分析计算机技术在通信中的应用
  13. blender建模制作课堂笔记
  14. web期末网站设计大作业 HTML+CSS+JS仿爱奇艺官网影视网站
  15. 网络安全 (九 缓冲区溢出metasploit)
  16. python接受键盘输入_Python读取键盘输入的2种方法
  17. 网吧无盘服务器2021,云更新无盘客户端
  18. Sametime SDK
  19. php获取当前日期所在自然周周一周末以及前后自然周始末
  20. Java 实现替换文件的指定内容

热门文章

  1. hdu 5064 Find Sequence
  2. helm 简介与入门
  3. 毕业好几年,改行学IT哪个岗位容易上手?
  4. 2022五一劳动节虾皮仓库物流放假安排
  5. Misumi米思米数据线驱动无法安装
  6. python爬虫100例--微博评论(5)
  7. android root测试,android检测是否已经具有root权限
  8. 两种典型的解空间树:子集树和排列树
  9. 搜索算法的感悟——解空间
  10. Tesseract-OCR识别中文与训练字库实例(转)