【机器学习6】数据预处理(三)——处理类别数据(有序数据和标称数据)

处理类别数据

  • 🌱简要理解处理类别数据的重要性
  • ☘️类别数据的分类
  • ☘️方便研究——用pandas创建包含多种特征的数据集
  • 🍀映射有序特征
  • 🍀标称特征标签编码
  • 🍀标称特征的独热编码
  • 🌱独热编码的优缺点

🌱简要理解处理类别数据的重要性

在【机器学习4】构建良好的训练数据集——数据预处理(一)处理缺失值及异常值这一篇文章中,主要说明热数据预处理的重要性以及如何处理缺失值及异常值这些数值特征。然而,在现实生活中遇到的数据集往往不仅仅只会包含数值型特征,还会包含一个或者多个类别特征,比如说性别分为男和女,比如说我们之前经常用的数据集——鸢尾花数据集,分为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)等等等等,学会如何处理类别数据,将此量化,将会对之后进一步的数据分析带来更大的益处。

许多机器学习库都要求将类别标签编码为整数值。尽管Scikit-Learn中大多数分类器或者估计器可以在内部将类别标签转换为整数,但给分类器提供整数数组的形式的类别标签在实践中被认为是一种很好的做法,可以从技术上避免很多问题。

☘️类别数据的分类

当谈到类别数据时,我们首先需要将此区分为有序(ordinal)特征标称(nominal)特征
有序特征可以理解为可以排序的类别值。例如说,颜色,浅蓝->蓝->蓝绿->深蓝,再比如说,不抽烟与抽烟,这些特征都可以定义为有序特征
相比之下,标称特征没有任何意义排序。比如说,性别,男和女,再比如说,颜色蓝色绿色和红色,如果给这些特征排序,是没有意义的,所以一般把性别、颜色等等看作是标称特征

☘️方便研究——用pandas创建包含多种特征的数据集

为了后面更方便的举例说明,我们先用pandas创建一个新的DataFrame数据集,让这个数据集包含标称特征,有序特征和数值特征。

import pandas as pd
df=pd.DataFrame([['green','M','10.1','class2'],['red','L',13.5,'class1'],['blue','XL',15.3,'class2']])
df.columns=['color','size','price','classlabel']
df

在这里插入图片描述

新创建的DataFrame包含color这个标称特征,size有序特征,price数值特征,还有类别标签classlabel。

🍀映射有序特征

为了确保机器学习算法可以正确理解有序特征,需要将类别字符串转化为整数。因为没有现成的函数可以到处类别特征标签的正确顺序,所以我们需要自己手动来定义一个映射关系

在上面创建的数据框中,size为有序特征,我们根据生活经验和实际情况,将其合理地映射为数值即可。
比如将M映射为1L映射为2XL映射为3.

我们可以使用pandas中的map方法将原数据框中的size这一列数据进行替换,将此替换为数值类型。

df['size']=df['size'].map({'M':1,'L':2,'XL':3})
df

在这里插入图片描述

🍀标称特征标签编码

对于有序特征,可以使用有序特征映射的方法,将类别字符串转化为整数。对于标称特征,它的类别是无序的,因此把某个特定的字符串转化为哪一个数字并不重要。一般简单地从0开始枚举标签。

对于我们创建的数据框,颜色(color)和类别(classlabel)这两列的数据是无序的,因此是标称特征列。我们对这两列分别从0开始枚举类别标签
对于颜色(color)这一列,我们让green映射为0,red映射为1,blue映射为2.对于类别标签(classlabel)这一列,我们将classlabel1映射为1,classlabel2映射为2。
同样地,我们依然采用映射字典将类别标签转换为整数

df['color']=df['color'].map({'green':0,'red':1,'blue':2})
df['classlabel']=df['classlabel'].map({'class1':0,'class2':1})

在这里插入图片描述

字典映射是一种简单的映射。因为Scikit-Learn中的分类器将类别标签看作是无法排序的类别数据。所以可以使用LabelEncoder将字符型标签类别转换为整型类别标签。

调用Scikit-Learn中的LabelEncoder类实现上述工作:

from sklearn.preprocessing import LabelEncoder
class_le=LabelEncoder()
y=class_le.fit_transform(df['classlabel'].values)
print(y)

在这里插入图片描述

x=class_le.fit_transform(df['color'].values)

在这里插入图片描述
可以看到,分类器将blue转换为0,green转换为1,red转换为2。

fit_transform方法相当于先后调用fit方法transform方法。可以使用inverse_transform方法将整数类别标签转换回其他原始字符串表示形式:

class_le.inverse_transfrom(y)

🍀标称特征的独热编码

我们对于有序特征的映射,其数字是有大小意义的。然而,对于离散特征的取值之间没有意义的特征比如颜色,它们本身red、blue、green它们三者本身没有大小比较或者层次上递进的意义,然而我们采用映射的方法,将此映射为0,1,2三个整数,但整数之间又存在大小的比较。那么分类器在处理类别数据时,就会假设red大于green大于blue。
为了解决这个问题,一种常见的方法是独热编码(one-hot encoding).

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有他独立的寄存器位,并且在任意时候,其中只有一位有效。
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征,比如,如成绩这个特征有好,中,差变成one-hot就是100, 010,001
再比如说,关于病人对于病人的既往史研究调查,有冠心病、高血压、糖尿病、哮喘、和其他,我们可以利用独热编码,将冠心病编码为10000,高血压编码为01000,糖尿病编码为00100,哮喘编码为00010,其他编码为00001。将同时患有冠心病和糖尿病的编码为10100,将同时患有高血压和其他疾病的编码为01001…
这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。

这样做的好处主要有:
①解决了分类器不好处理属性数据的问题
②在一定程度上也起到了扩充特征的作用

下面,我们将color特征转换为三个新特征:blue、green和blue。然后使用二进制来表示颜色。例如,可以编码blue=1,green=0,red=0.
为了执行此转换,可以使用Scikit-Learn中的preprocessing模块中的OneHotEncoder方法:

from sklearn.preprocessing import OneHotEncoder
X=df[['color','size','price']].values
color_ohe=OneHotEncoder()
array=color_ohe.fit_transform(X[:,0].reshape(-1,1)).toarray()
print(array)

在这里插入图片描述

在上面代码中,仅将OneHotEncoder应用于一个列X[:,0],如果想要有选择地变换数组中的某些列,可以使用ColumnTransformer方法。

from sklearn.compose import ColumnTransformer
X=df[['color','size','price']].values
c_transf=ColumnTransformer([('onehot',OneHotEncoder(),[0]),('nothing','passthrough',[1,2])])
array=c_transf.fit_transform(X).astype(float)
print(array)

在这里插入图片描述

🌱独热编码的优缺点

优点: 独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
缺点: 当类别的数量很多时,会导致稀疏矩阵问题,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且One Hot Encoding+PCA这种组合在实际中也非常有用。
并且在某些应用中,可能并不需要将所有分类都作为分开的一个特征,此时独热编码可能不是最优选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/44790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ListNode相关

目录 2. 链表相关题目 2.1 合并两个有序链表(简单):递归 2.2 删除排序链表中的重复元素(简单):一次遍历 2.3 两链表相加(中等):递归 2.4 删除链表倒数第N个节点&…

MySQL 索引为什么使用 B+ 树,而不使用红黑树 / B 树 ?

面试官问 :索引为什么使用 B 树,而不使用 B 树,不使用红黑树呢 首先 B 树和 B 树 都是多叉搜索树,然后我们先来观察一下 B 树和 B 树的数据结构: B 树的数据结构实现 >> B 树的数据结构实现 >> 【B 树相…

2023国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法&#xff0c…

代码随想录算法训练营day39 | 62. 不同路径,63. 不同路径 II

目录 62. 不同路径 63. 不同路径 II 62. 不同路径 类型:动态规划 难度:medium 思路: 应用二维数组的动态规划,到达某个方格的方法数目,为这个方格的上一个方格和左一个方格的方法数目和。 需要先初始化第一行和第一…

08.SpringBoot请求相应

文章目录 1 请求1.1 Postman1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 日期参数1.6 JSON参数1.7 路径参数 2 响应2.1 ResponseBody注解2.2 统一响应结果…

GAN!生成对抗网络GAN全维度介绍与实战

目录 一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2 数学背景2.2.1 损失函数生成器损失判别器损失 2.2.2 优化方法优化代…

收集的一些比较好的git网址

1、民间故事 https://github.com/folkstory/lingqiu/blob/master/%E4%BC%A0%E8%AF%B4%E9%83%A8%E5%88%86/%E4%BA%BA%E7%89%A9%E4%BC%A0%E8%AF%B4/%E2%80%9C%E6%B5%B7%E5%BA%95%E6%8D%9E%E6%9C%88%E2%80%9D%E7%9A%84%E6%AD%A6%E4%B8%BE.md 2、童话故事 https://gutenberg.org/c…

12. Docker可视化工具

目录 1、前言 2、Docker UI 2.1、部署Docker UI 2.2、管理容器 3、Portainer 3.1、部署Portainer 3.2、管理容器 3.3、添加远程Docker 4、Shipyard 1、前言 Docker 提供了命令行工具来管理 Docker 的镜像和运行 Docker 的容器。我们也可以使用图形工具来管理 Docker。…

C# 观察者模式

一、概述 观察者模式是一种常用的设计模式,它属于行为型模式。在C#中,观察者模式通过定义一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现松耦合,…

Ribbon负载均衡

Ribbon与Eureka的关系 Eureka的服务拉取与负载均衡都是由Ribbon来实现的。 当服务发送http://userservice/user/xxxhtt://userservice/user/xxx请求时,是无法到达userservice服务的,会通过Ribbon会把这个请求拦截下来,通过Eureka-server转换…

常见排序集锦-C语言实现数据结构

目录 排序的概念 常见排序集锦 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 hoare 挖坑法 前后指针法 非递归 7.归并排序 非递归 排序实现接口 算法复杂度与稳定性分析 排序的概念 排序 :所谓排序,就是使一串记录&#…

排名前 6 位的数学编程语言

0 说明 任何对数学感兴趣或计划学习数学的人,都应该至少对编程语言有一定的流利程度。您不仅会更有就业能力,还可以更深入地理解和探索数学。那么你应该学习什么语言呢? 1.python 对于任何正在学习数学的人来说,Python都是一门很棒…

【Linux从入门到精通】动静态库的原理与制作详解

本篇文章主要是围绕动静态库的原理与制作进行展开讲解的。其中涉及到了inode的概念引入和软硬连接的讲解。会结合实际操作对这些抽象的概念进行解释,希望会对你有所帮助。 文章目录 一、inode 概念 二、软硬链接 2、1 软连接 2、2 硬链接 三、动静态库概念 3、1 静态…

编织梦想:SpringBoot AOP 教程与自定义日志切面完整实战

什么是 AOP AOP 是指通过预编译方式和运行期动态代理的方式,在不修改源代码的情况下对程序进行功能增强的一种技术。AOP 不是面向对象编程(OOP)的替代品,而是 OOP 的补充和扩展。它是一个新的维度,用来表达横切问题&a…

常见前端基础面试题(HTML,CSS,JS)(三)

JS 中如何进行数据类型的转换? 类型转换可以分为两种,隐性转换和显性转换 显性转换 主要分为三大类:数值类型、字符串类型、布尔类型 三大类的原始类型值的转换规则我就不一一列举了 数值类型(引用类型转换) Numbe…

设计模式之状态模式(State)的C++实现

1、状态模式的提出 在组件功能开发过程中,某些对象的状态经常面临变化,不同的状态,其对象的操作行为不同。比如根据状态写的if else条件情况,且这种条件变化是经常变化的,这样的代码不易维护。可以使用状态模式解决这…

如何在window下cmd窗口执行linux指令?

1.Git:https://git-scm.com/downloads(官网地址) 2.根据自己的实际路径,添加两个环境变量 3.重启电脑

删除有序链表中重复的元素-II(链表)

乌!蒙!山!连!着!山!外!山! 题目: 思路: 双指针,slow和fast,并且增加标记flag初始为1。 如果slow指向节点值等于fast指向节点值&…

Servlet 初步学习

文章目录 Servlet1 简介2 快速入门3 执行流程4 生命周期5 方法介绍6 体系结构7 urlPattern配置8 XML配置 Servlet 1 简介 Servlet是JavaWeb最为核心的内容,它是Java提供的一门 动态 web资源开发技术。 使用Servlet就可以实现,根据不同的登录用户在页面…

什么是cURL?

cURL无处不在。它几乎隐藏在所有设备中,例如汽车,蓝光播放器等。它通过互联网协议传输任意类型数据。 在本文中,我们将揭开cURL神秘命令行工具的面纱,解释它是如何成为一种通用代码的,并举例说明其用法。 cURL是什么意…