数据的预处理是数据分析,或者机器学习训练前的重要步骤。
通过数据预处理,可以

  • 提高数据质量,处理数据的缺失值、异常值和重复值等问题,增加数据的准确性和可靠性
  • 整合不同数据,数据的来源和结构可能多种多样,分析和训练前要整合成一个数据集
  • 提高数据性能,对数据的值进行变换,规约等(比如无量纲化),让算法更加高效

本篇介绍的分类编码处理,主要用于将类别型数据转换为可以用于分析或机器学习的形式。
类别型数据是指具有离散、不连续取值的数据,例如性别(男/女)、等级(优/良/中/差)之类数据。
对这些数据进行适当的编码,可以提高数据处理效率和准确度。

1. 原理

分类编码的原理比较简单,常用的两种是顺序编码独热编码

1.1. 顺序编码

顺序编码很好理解,就是按照顺序给离散的数据编码,比如下面成绩和班级信息的数据:

data = np.array(
[
["优", "三班"],
["及格", "二班"],
["良", "一班"],
["优", "五班"],
["中", "八班"],
["良", "六班"],
["不及格", "三班"],
["优", "十班"],
]
)

原始数据是用中文描述的,无法直接用于机器学习算法之中,所以要编码。
scikit-learn库的OrdinalEncoder就是用来顺序编码的。

from sklearn import preprocessing as pp

data = np.array(
[
["优", "三班"],
["及格", "二班"],
["良", "一班"],
["优", "五班"],
["中", "八班"],
["良", "六班"],
["不及格", "三班"],
["优", "十班"],
]
)
oenc = pp.OrdinalEncoder() # 顺序编码
oenc.fit_transform(data) # 运行结果
array([[2., 1.],
[3., 2.],
[4., 0.],
[2., 3.],
[1., 4.],
[4., 5.],
[0., 1.],
[2., 6.]])

从运行结果可以看出,虽然"优", "良", "中"等成绩等级,"一班", "二班", "三班"等班级信息都被编码成顺序的数字。
但是,并不是按照中文含义的顺序来编码的,比如优对应2及格对应3三班对应1二班却对应2等等。

为了让编码后的数字和原来的中文含义的顺序有对应,我们可以定义编码的顺序。

# 定义中文的顺序
catagories = [
["优", "良", "中", "及格", "不及格"],
["一班", "二班", "三班", "五班", "六班", "八班", "十班"],
] oenc = pp.OrdinalEncoder(categories=catagories)
oenc.fit_transform(data) # 运行结果
array([[0., 2.],
[3., 1.],
[1., 0.],
[0., 3.],
[2., 5.],
[1., 4.],
[4., 2.],
[0., 6.]])

这样,编码后的数字的顺序就能和中文所代表的含义对应起来了。

1.2. 独热编码

上面示例中的成绩等级班级信息都有顺序,如果对没有顺序含义的信息进行顺序编码的话,
就会赋予给信息添加了顺序的含义,对于后续算法的应用可能会产生影响。

这时,就可以用独热编码的方式来处理,比如对于下面的科目信息:

data = np.array([["语文"], ["数学"], ["英语"], ["物理"], ["化学"]])

这些科目信息之间是没有顺序概念的,语文不一定排在数学前面,化学也不一定要排在英语后面。
这时,用独热编码就比较合适了。

data = np.array([["语文"], ["数学"], ["英语"], ["物理"], ["化学"]])

enc = pp.OneHotEncoder()
enc.fit_transform(data).toarray() # 运行结果
array([[0., 0., 0., 0., 1.],
[0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 1., 0., 0.],
[1., 0., 0., 0., 0.]])

从中可以看出,语文编码成了数组[0., 0., 0., 0., 1.],数学编码成了[0., 1., 0., 0., 0.]数组等等。
科目信息之间不存在顺序。

2. 作用

分类编码是数据挖掘和机器学习领域中非常重要的一个环节,主要的作用有:

  1. 转换数据格式:将类别型数据转换为数值型数据,从而使其能够被计算机处理和建模。
  2. 提高处理效率:分类编码可以将多个类别型变量转换为多个数值型变量,从而简化了数据处理过程,提高了数据处理效率。
  3. 提高性能:分类编码可以通过独热编码等方式,将类别型变量转换为多个二元特征,从而增加了模型的非线性能力和表达能力,从而提高了模型的性能。
  4. 降低复杂度:分类编码可以将多个类别型变量转换为多个数值型变量,从而降低了模型的复杂度。这有利于减少模型的过拟合,提高模型的泛化能力。
  5. 处理不平衡类别:分类编码可以通过生成额外的特征或者使用其他技术来处理不平衡类别的数据。
  6. 去除噪声和冗余特征:分类编码可以通过删除不相关或冗余的特征来减少数据的噪声和冗余,从而提高数据的质量和模型的性能。

3. 总结

本篇介绍了两种编码方式,顺序编码(OrdinalEncoder)和独热编码(OneHotEncoder),但scikit-learn库提供的编码方式并不只有这两种。

还有目标编码(TargetEncoder),标签编码(LabelEncoder)等等,可以参考官方文档中的使用方法,在合适的场景中使用。

【scikit-learn基础】--『预处理』之 分类编码的更多相关文章

  1. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  2. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  3. scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)

    scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...

  4. 『TensorFlow』TFR数据预处理探究以及框架搭建

    一.TFRecord文件书写效率对比(单线程和多线程对比) 1.准备工作 # Author : Hellcat # Time : 18-1-15 ''' import os os.environ[&q ...

  5. 『TensorFlow』SSD源码学习_其五:TFR数据读取&数据预处理

    Fork版本项目地址:SSD 一.TFR数据读取 创建slim.dataset.Dataset对象 在train_ssd_network.py获取数据操作如下,首先需要slim.dataset.Dat ...

  6. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  7. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

  8. 『计算机视觉』Mask-RCNN

    一.Mask-RCNN流程 Mask R-CNN是一个实例分割(Instance segmentation)算法,通过增加不同的分支,可以完成目标分类.目标检测.语义分割.实例分割.人体姿势识别等多种 ...

  9. 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍

    一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...

  10. 『TensotFlow』RNN/LSTM古诗生成

    往期RNN相关工程实践文章 『TensotFlow』基础RNN网络分类问题 『TensotFlow』RNN中文文本_上 『TensotFlow』基础RNN网络回归问题 『TensotFlow』RNN中 ...

随机推荐

  1. 淘宝商品详情 API的使用说明

    淘宝平台提供了 API 接口可以用于获取淘宝商品详情信息.通过 API 接口,我们可以获取到商品的基本信息.价格.评论及评价等详细信息.以下是使用说明: 获取淘宝API账号 在获取淘宝商品详情 API ...

  2. 原来你是这样的SpringBoot--Async异步任务

    本节我们一起学习一下SpringBoot中的异步调用,主要用于优化耗时较长的操作,提高系统性能和吞吐量. 一.新建项目,启动异步调用 首先给启动类增加注解@EnableAsync,支持异步调用 @En ...

  3. 一文解锁vue3中hooks的使用姿势

    vue3 中的 hooks 是什么? 简单来说如果你的函数中用到了诸如 ref,reactive,onMounted 等 vue 提供的 api 的话,那么它就是一个 hooks 函数,如果没用到它就 ...

  4. 文盘Rust -- tonic-Rust grpc初体验

    gRPC 是开发中常用的开源高性能远程过程调用(RPC)框架,tonic 是基于 HTTP/2 的 gRPC 实现,专注于高性能.互操作性和灵活性.该库的创建是为了对 async/await 提供一流 ...

  5. Gradle 设置全局镜像源

    复制 init.gradle.kts 文件到 Windows 的 %USERPROFILE%/.gradle 或者 Linux 的 ~/.gradle 目录下.也可以直接复制文末的代码为 init.g ...

  6. Spring Boot RestController接口如何输出到终端

    背景 公司项目的批处理微服务,一般是在晚上固定时段通过定时任务执行,但为了预防执行失败,我们定义了对应的应急接口,必要时可以通过运维在终端中进行curl操作.然而,部分任务耗时较长,curl命令执行后 ...

  7. IDEA工具第一篇:细节使用-习惯设置

    安装好Idea后,直接上手clone代码进入编码时代,有没有那么一刻你会觉用起来没有那么顺手流畅呢? 下面是关于 [Windows] 下安装idea的一些习惯设置[ Mac大致一样 ] 一.修改系统文 ...

  8. Go方法特性详解:简单性和高效性的充分体现

    本文深入探讨了Go语言中方法的各个方面,包括基础概念.定义与声明.特性.实战应用以及性能考量.文章充满技术深度,通过实例和代码演示,力图帮助读者全面理解Go方法的设计哲学和最佳实践. 关注[TechL ...

  9. 创建CI/CD流水线中的IaC前,需要考虑哪些事项?

    许多软件工程团队通常会遵循相似的方法来交付基础设施以支持软件开发生命周期.为了缩小基础设施配置方式与应用程序环境部署方式之间的差距,许多 DevOps 团队将其基础设施即代码(IaC)模块直接连接到其 ...

  10. 字节序:大端和小端(Big endian and Little endian)(转自维基百科)

    简介[编辑] 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100.且x的四个字节将被存储 ...