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

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

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

【机器学习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这种组合在实际中也非常有用。

并且在某些应用中,可能并不需要要将所有分类都作为分开的一个特征,此时独热编码可能不是最优选择。

相关文章
|
8天前
|
机器学习/深度学习 数据采集 Python
从零到一:手把手教你完成机器学习项目,从数据预处理到模型部署全攻略
【10月更文挑战第25天】本文通过一个预测房价的案例,详细介绍了从数据预处理到模型部署的完整机器学习项目流程。涵盖数据清洗、特征选择与工程、模型训练与调优、以及使用Flask进行模型部署的步骤,帮助读者掌握机器学习的最佳实践。
31 1
|
22天前
|
机器学习/深度学习 存储 人工智能
揭秘机器学习背后的神秘力量:如何高效收集数据,让AI更懂你?
【10月更文挑战第12天】在数据驱动的时代,机器学习广泛应用,从智能推荐到自动驾驶。本文以电商平台个性化推荐系统为例,探讨数据收集方法,包括明确数据需求、选择数据来源、编写代码自动化收集、数据清洗与预处理及特征工程,最终完成数据的训练集和测试集划分,为模型训练奠定基础。
33 3
|
23天前
|
机器学习/深度学习 算法 Python
“探秘机器学习的幕后英雄:梯度下降——如何在数据的海洋中寻找那枚失落的钥匙?”
【10月更文挑战第11天】梯度下降是机器学习和深度学习中的核心优化算法,用于最小化损失函数,找到最优参数。通过计算损失函数的梯度,算法沿着负梯度方向更新参数,逐步逼近最小值。常见的变种包括批量梯度下降、随机梯度下降和小批量梯度下降,各有优缺点。示例代码展示了如何用Python和NumPy实现简单的线性回归模型训练。掌握梯度下降有助于深入理解模型优化机制。
26 2
|
2月前
|
机器学习/深度学习 数据采集 监控
探索机器学习:从数据到决策
【9月更文挑战第18天】在这篇文章中,我们将一起踏上一段激动人心的旅程,穿越机器学习的世界。我们将探讨如何通过收集和处理数据,利用算法的力量来预测未来的趋势,并做出更加明智的决策。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。
|
25天前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
28 0
|
2月前
|
机器学习/深度学习 数据采集 算法
利用未标记数据的半监督学习在模型训练中的效果评估
本文将介绍三种适用于不同类型数据和任务的半监督学习方法。我们还将在一个实际数据集上评估这些方法的性能,并与仅使用标记数据的基准进行比较。
183 8
|
1月前
|
机器学习/深度学习 算法 数据建模
【机器学习】类别不平衡数据的处理
【机器学习】类别不平衡数据的处理
|
3月前
|
Java 前端开发 容器
Struts 2:在技术变革的风暴中航行,探索框架的革命性未来与创新融合之路
【8月更文挑战第31天】Struts 2作为一款成熟的企业级Java Web框架,凭借其稳定性和灵活性自2007年以来广受欢迎。它基于MVC设计模式,支持插件架构和RESTful服务,并能与Spring框架良好集成。然而,面对微服务架构和容器化技术(如Docker和Kubernetes)的兴起,Struts 2需提供更轻量级和支持指南来适应变化。通过深化与现代前端框架(如React和Vue.js)及AI技术的集成,并强化安全性与开发工具,Struts 2有望保持竞争力并迎接未来挑战。
47 0
|
3月前
|
缓存 开发者 测试技术
跨平台应用开发必备秘籍:运用 Uno Platform 打造高性能与优雅设计兼备的多平台应用,全面解析从代码共享到最佳实践的每一个细节
【8月更文挑战第31天】Uno Platform 是一种强大的工具,允许开发者使用 C# 和 XAML 构建跨平台应用。本文探讨了 Uno Platform 中实现跨平台应用的最佳实践,包括代码共享、平台特定功能、性能优化及测试等方面。通过共享代码、采用 MVVM 模式、使用条件编译指令以及优化性能,开发者可以高效构建高质量应用。Uno Platform 支持多种测试方法,确保应用在各平台上的稳定性和可靠性。这使得 Uno Platform 成为个人项目和企业应用的理想选择。
54 0
|
3月前
|
机器学习/深度学习 缓存 TensorFlow
TensorFlow 数据管道优化超重要!掌握这些关键技巧,大幅提升模型训练效率!
【8月更文挑战第31天】在机器学习领域,高效的数据处理对构建优秀模型至关重要。TensorFlow作为深度学习框架,其数据管道优化能显著提升模型训练效率。数据管道如同模型生命线,负责将原始数据转化为可理解形式。低效的数据管道会限制模型性能,即便模型架构先进。优化方法包括:合理利用数据加载与预处理功能,使用`tf.data.Dataset` API并行读取文件;使用`tf.image`进行图像数据增强;缓存数据避免重复读取,使用`cache`和`prefetch`方法提高效率。通过这些方法,可以大幅提升数据管道效率,加快模型训练速度。
46 0