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

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

相关文章
|
1天前
|
数据采集 机器学习/深度学习 人工智能
【机器学习】在使用K-means算法之前,如何预处理数据?
【5月更文挑战第12天】【机器学习】在使用K-means算法之前,如何预处理数据?
|
4天前
|
机器学习/深度学习
【机器学习】噪声数据对贝叶斯模型有什么样的影响?
【5月更文挑战第10天】【机器学习】噪声数据对贝叶斯模型有什么样的影响?
|
8天前
|
机器学习/深度学习 数据采集 算法
数据分享|R语言机器学习预测案例合集:众筹平台、机票折扣、糖尿病患者、员工满意度
数据分享|R语言机器学习预测案例合集:众筹平台、机票折扣、糖尿病患者、员工满意度
|
8天前
|
机器学习/深度学习 数据采集 人工智能
构建高效机器学习模型:从数据预处理到性能优化
【5月更文挑战第6天】 在机器学习领域,构建一个高效的模型并非一蹴而就的过程。它要求开发者具备从数据预处理、特征工程到算法选择和性能调优的全面技能。本文将深入探讨如何通过精确的数据处理流程、细致的特征提取以及先进的模型调优技巧来提升机器学习模型的准确性和效率。我们将分享实用的技术策略,并通过案例分析展示如何应对过拟合、欠拟合以及其他常见的性能瓶颈。
24 6
|
9天前
|
数据采集
【大模型】大语言模型训练数据中的偏差概念及其可能的影响?
【5月更文挑战第5天】【大模型】大语言模型训练数据中的偏差概念及其可能的影响?
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
【AI 生成式】如何利用生成式人工智能进行机器学习的数据增强?
【5月更文挑战第4天】【AI 生成式】如何利用生成式人工智能进行机器学习的数据增强?
|
14天前
|
机器学习/深度学习 存储 数据采集
【Python 机器学习专栏】PCA(主成分分析)在数据降维中的应用
【4月更文挑战第30天】本文探讨了主成分分析(PCA)在高维数据降维中的应用。PCA通过线性变换找到最大化方差的主成分,从而降低数据维度,简化存储和计算,同时去除噪声。文章介绍了PCA的基本原理、步骤,强调了PCA在数据降维、可视化和特征提取上的优势,并提供了Python实现示例。PCA广泛应用在图像压缩、机器学习和数据分析等领域,但降维后可能损失解释性,需注意选择合适主成分数量及数据预处理。
|
14天前
|
机器学习/深度学习 Python
【Python机器学习专栏】时间序列数据的特征工程
【4月更文挑战第30天】本文探讨了时间序列数据的特征工程,强调其在捕捉季节性、揭示趋势、处理异常值和提升模型性能中的重要性。介绍了滞后特征、移动窗口统计特征、时间戳特征、频域特征和波动率特征等方法,并提供了Python实现示例。通过有效特征工程,可提高时间序列分析的准确性和预测可靠性。
|
14天前
|
机器学习/深度学习 计算机视觉 Python
【Python 机器学习专栏】图像数据的特征提取与预处理
【4月更文挑战第30天】本文探讨了图像数据的特征提取与预处理在机器学习中的重要性。图像数据具有大容量、信息丰富和冗余性高的特点。特征提取涉及颜色、纹理和形状特征;预处理包括图像增强、去噪和分割。Python的OpenCV和Scikit-image库在处理这些任务时非常有用。常见的特征提取方法有统计、变换和基于模型的方法,而预处理应注意保持图像真实性、适应性调整及验证评估。有效的特征提取和预处理能提升模型性能,Python工具使其更高效。
|
14天前
|
机器学习/深度学习 自然语言处理 算法
【Python机器学习专栏】文本数据的特征提取与表示
【4月更文挑战第30天】本文探讨了文本特征提取与表示在机器学习和NLP中的重要性。介绍了词袋模型、TF-IDF和n-gram等特征提取方法,以及稀疏向量和词嵌入等表示方式。Python中可利用sklearn和gensim库实现这些技术。有效的特征提取与表示有助于将文本数据转化为可处理的数值形式,推动NLP和机器学习领域的进步。