作者 |SHIPRA SAXENA
编译 |Flin
起源 |analyticsvidhya
总览
- 理解什么是分类数据编码
- 理解不同的编码技术以及何时应用它们
介绍
机器学习模型的性能不仅取决于模型和超参数,还取决于咱们如何解决并将不同类型的变量输出模型。因为大多数机器学习模型仅承受数值变量,因而对分类变量进行预处理成为必要的步骤。咱们须要将这些分类变量转换为数字,以便该模型可能了解和提取有价值的信息。
典型的数据科学家破费 70-80%的工夫来清理和筹备数据。转换分类数据是不可避免的流动。它不仅能够进步模型品质,而且能够帮忙进行更好的特色工程。当初的问题是,咱们如何进行?咱们应该应用哪种分类数据编码办法?
在本文中,我将解释各种类型的分类数据编码办法以及在 Python 中的实现。
如果你想学习视频格式的数据迷信概念,请查看咱们的课程:
-
数据迷信导论
- https://courses.analyticsvidh…
目录
- 什么是分类数据?
- 标签编码或有序编码
- 独热编码
- 虚构编码
- 成果编码
- 二进制编码
- BaseN 编码
- 哈希编码
- 指标编码
什么是分类数据?
因为咱们将在本文中解决类别变量,因而这里有一些示例,能够疾速温习。分类变量通常示意为“字符串”或“类别”,并且数量无限。这里有一些例子:
- 一个人寓居的城市:德里,孟买,艾哈迈达巴德,班加罗尔等。
- 一个人工作的部门:财务,人力资源,生产部。
- 一个人领有的最高学位:高中,学士,硕士,博士学位。
- 学生的问题:A +,A,B +,B,B- 等。
在以上示例中,变量仅具备确定的可能值。此外,咱们能够看到有两种分类数据:
有序数据:类别具备固有程序
名义数据:类别没有固有程序
在有序数据中,在进行编码时,应保留无关类别提供程序的信息。就像下面的例子一样,一个人领有的最高学位,给出了无关他的资格的重要信息。学位是决定一个人是否适宜负责职位的重要特色。
在编码名义数据时,咱们必须思考特色的存在与否。在这种状况下,不存在程序的概念。例如,一个人寓居的城市。对于数据,保留一个人寓居的地位很重要。在这里,咱们没有任何程序。如果一个人住在德里或班加罗尔,这是平等的,与程序无关。
为了编码分类数据,咱们有一个 python 包 category_encoders。以下代码可帮忙你轻松装置。
pip install category_encoders
标签编码或有序编码
当分类特色有序时,咱们应用这种分类数据编码技术。在这种状况下,保留程序很重要。因而编码应该反映程序。
在标签编码中,每个标签都被转换成一个整数值。咱们将创立一个变量,该变量蕴含代表一个人的教育资格的类别。
import category_encoders as ce
import pandas as pd
train_df=pd.DataFrame({'Degree':['High school','Masters','Diploma','Bachelors','Bachelors','Masters','Phd','High school','High school']})
# 创立 Ordinalencoding 的对象
encoder= ce.OrdinalEncoder(cols=['Degree'],return_df=True,
mapping=[{'col':'Degree',
'mapping':{'None':0,'High school':1,'Diploma':2,'Bachelors':3,'Masters':4,'phd':5}}])
#原始数据
train_df
# 调整并转换数据
df_train_transformed = encoder.fit_transform(train_df)
独热编码
当特色没有任何程序时,咱们应用这种分类数据编码技术。在独热编码中,对于一个分类特色的每个级别,咱们创立一个新的变量。每个类别都映射有一个蕴含 0 或 1 的二进制变量。在这里,0 代表该类别不存在,1 代表该类别存在。
这些新创建的二进制个性称为虚构变量。虚构变量的数量取决于类别变量中的级别。这听起来可能很简单。
让咱们举个例子来更好地了解这一点。假如咱们有一个动物分类数据集,有不同的动物,如狗、猫、羊、牛、狮子。当初咱们必须对这些数据进行独热编码。
编码后,在第二个表中,咱们有一个虚构变量,每个变量代表动物的类别。当初,对于每个存在的类别,咱们在该类别的列中都有 1,其余列为 0。让咱们看看如何在 python 中实现独热编码。
import category_encoders as ce
import pandas as pd
data=pd.DataFrame({'City':['Delhi','Mumbai','Hydrabad','Chennai','Bangalore','Delhi','Hydrabad','Bangalore','Delhi']})
#创立用于独热编码的对象
encoder=ce.OneHotEncoder(cols='City',handle_unknown='return_nan',return_df=True,use_cat_names=True)
# 原始数据
data
# 调整和转换数据
data_encoded = encoder.fit_transform(data)
data_encoded
当初,让咱们转到另一种十分乏味且宽泛应用的编码技术,即虚构编码。
虚构编码
虚构编码方案相似于独热编码。这种分类数据编码办法将分类变量转换为一组二进制变量(也称为虚构变量)。在独热编码的状况下,对于变量中的 N 个类别,它应用 N 个二进制变量。虚构编码是对独热编码的一个小改良。虚构编码应用 N - 1 个特色来示意 N 个标签 / 类别。
为了更好地了解这一点,让咱们看上面的图片。在这里,咱们应用独热编码和虚构编码技术对雷同的数据进行编码。独热编码应用 3 个变量示意数据,而虚构编码应用 2 个变量编码 3 个类别。
让咱们在 python 中实现它。
import category_encoders as ce
import pandas as pd
data=pd.DataFrame({'City':['Delhi','Mumbai','Hyderabad','Chennai','Bangalore','Delhi,'Hyderabad']})
# 原始数据
data
# 编码数据
data_encoded=pd.get_dummies(data=data,drop_first=True)
data_encoded
在这里,应用 drop_first 参数,咱们应用 0 示意第一个标签 Bangalore。
独热和虚构编码的毛病
独热编码器和虚构编码器是两种功能强大且无效的编码方案。它们在数据科学家中也很受欢迎,但在以下这些状况下可能不那么无效:
- 数据中存在大量级别。在这种状况下,如果一个特色变量中有多个类别,则咱们须要类似数量的虚构变量来对数据进行编码。例如,具备 30 个不同值的列将须要 30 个新变量进行编码。
- 如果咱们在数据集中具备多个分类特色,则将产生相似的状况,并且咱们最终会有几个二进制特色,每一个都代表分类特色和它们的多个类别,例如一个蕴含 10 个或更多分类列的数据集。
在以上两种状况下,这两种编码方案都会在数据集中引入稠密性,即几列为 0,而另几列为 1。换句话说,它在数据集中创立了多个虚构特色而无需增加太多信息。
此外,它们可能会导致虚构变量陷阱。这是特色高度相干的景象。这意味着应用其余变量,咱们能够轻松预测变量的值。
因为数据集的大量减少,编码使模型的学习变慢,并且整体性能降落,最终使模型的计算低廉。此外,在应用基于树的模型时,这些编码不是最佳抉择。
成果编码(Effect Encoding)
这种编码技术也称为偏差编码(Deviation Encoding)或求和编码(Sum Encoding)。成果编码简直与虚构编码相似,只是有一点点差别。在虚构编码中,咱们应用 0 和 1 示意数据,但在成果编码中,咱们应用三个值,即 1,0 和 -1。
在虚构编码中仅蕴含 0 的行在成果编码中被编码为 -1。在虚构编码示例中,索引为 4 的班加罗尔城市被编码为 0000。而在成果编码中,它是由 -1-1-1- 1 示意的。
让咱们看看咱们如何在 python 中实现它
import category_encoders as ce
import pandas as pd
data=pd.DataFrame({'City':['Delhi','Mumbai','Hyderabad','Chennai','Bangalore','Delhi,'Hyderabad']}) encoder=ce.sum_coding.SumEncoder(cols='City',verbose=False,)
# 原始数据
data
encoder.fit_transform(data)
成果编码是一种先进的技术。如果你有趣味理解更多对于成果编码的信息,请参阅这篇乏味的文章。
- https://www.researchgate.net/…
哈希编码器
要了解哈希编码,就必须理解哈希。哈希是以固定大小值的模式对任意大小的输出进行的转换。咱们应用哈希算法来执行哈希操作,即生成输出的哈希值。
此外,哈希是一个单向过程,换句话说,不能从哈希示意生成原始输出。
散列有几个利用,如数据检索、检查数据损坏以及数据加密。咱们有多个哈希函数可用,例如音讯摘要(MD、MD2、MD5)、平安哈希函数(SHA0、SHA1、SHA2)等等。
就像独热编码一样,哈希编码器应用新的维度来示意分类个性。在这里,用户能够应用 n_component 参数来确定转换后的维度数量。这就是我的意思——一个有 5 个类别的特色能够用 N 个新特色来示意。同样,一个有 100 个类别的特色也能够用 N 个新特色来转换。听起来不错吧?
默认状况下,哈希编码器应用 md5 哈希算法,但用户能够传递他抉择的任何算法。如果你想摸索 md5 算法,我倡议你浏览这篇文章。
- https://ieeexplore.ieee.org/d…
import category_encoders as ce
import pandas as pd
#Create the dataframe
data=pd.DataFrame({'Month':['January','April','March','April','Februay','June','July','June','September']})
#Create object for hash encoder
encoder=ce.HashingEncoder(cols='Month',n_components=6)
# 调整和转换数据
encoder.fit_transform(data)
因为哈希将数据转换为较小的维度,因而可能导致信息失落。哈希编码器面临的另一个问题是 抵触。因为此处将大量特色描绘成较小的尺寸,因而能够用雷同的哈希值示意多个值,这称为抵触。
此外,哈希编码器在某些 Kaggle 较量中十分胜利。最好尝试一下数据集是否具备高基数特色。
二进制编码
二进制编码是哈希编码和独热编码的组合。在这种编码方案中,首先应用有序编码器将分类特色转换为数值。而后将数字转换为二进制数。之后,该二进制值将拆分为不同的列。
当类别很多时,二进制编码的成果很好。例如,公司提供产品的国家 / 地区的城市。
#Import the libraries
import category_encoders as ce
import pandas as pd
#Create the Dataframe
data=pd.DataFrame({'City':['Delhi','Mumbai','Hyderabad','Chennai','Bangalore','Delhi','Hyderabad','Mumbai','Agra']})
#Create object for binary encoding
encoder= ce.BinaryEncoder(cols=['city'],return_df=True)
# 原始数据
data
# 调整和转换数据
data_encoded=encoder.fit_transform(data)
data_encoded
二进制编码是一种节俭内存的编码方案,因为它比独热编码应用更少的个性。此外,它还缩小了高基数数据的维数劫难。
BaseN 编码
在开始应用 BaseN 编码之前,咱们首先尝试理解什么是 Base。
在数字零碎中,“底数”或“基数”是数字的数目或用于示意数字的数字和字母的组合。咱们毕生中最罕用的基数是 10 或十进制,因为在这里咱们应用 10 个惟一数字,即 0 到 9 来代表所有数字。另一个宽泛应用的零碎是二进制,即基数为 2。它应用 0 和 1,即 2 位数字来示意所有数字。
对于二进制编码,基数为 2,这意味着它将类别的数值转换为其各自的二进制模式。如果要更改根本编码方案,则能够应用 BaseN 编码器。如果类别更多,而二进制编码无奈解决维数,则能够应用更大的底数,例如 4 或 8。
#Import the libraries
import category_encoders as ce
import pandas as pd
#Create the dataframe
data=pd.DataFrame({'City':['Delhi','Mumbai','Hyderabad','Chennai','Bangalore','Delhi','Hyderabad','Mumbai','Agra']})
#Create an object for Base N Encoding
encoder= ce.BaseNEncoder(cols=['city'],return_df=True,base=5)
# 原始数据
data
# 调整和转换数据
data_encoded=encoder.fit_transform(data)
data_encoded
在下面的例子中,我应用了 base5,也就是所谓的五元体系。它相似于二进制编码的例子。二进制编码用 4 个新个性示意雷同的数据,而 BaseN 编码只应用 3 个新变量。
因而,BaseN 编码技术进一步缩小了无效示意数据和进步内存使用率所需的特色数量。基数 N 的默认基数是 2,这相当于二进制编码。
指标编码
指标编码是一种贝叶斯编码技术。
贝叶斯编码器应用来自相干 / 指标变量的信息对分类数据进行编码。
在指标编码中,咱们计算每个类别的指标变量的平均值,并用平均值替换类别变量。在分类指标变量的状况下,指标的后验概率代替每个类别。
#import the libraries
import pandas as pd
import category_encoders as ce
#创立数据框
data=pd.DataFrame({'class':['A,','B','C','B','C','A','A','A'],'Marks':[50,30,70,80,45,97,80,68]})
#创立指标编码对象
encoder=ce.TargetEncoder(cols='class')
# 原始数据
Data
# 调整并转换数据
encoder.fit_transform(data['class'],data['Marks'])
咱们仅对训练数据执行指标编码,并应用从训练数据集中取得的后果对测试数据进行编码。只管这是一种十分高效的编码零碎,但它具备以下问题,这些问题会导致模型性能降落
-
它可能导致指标透露(target leakage)或过拟合。为了解决过拟合问题,咱们能够应用不同的技术。
- 在留一法编码中,将以后目标值从指标的整体平均值中减小以防止透露。
- 在另一种办法中,咱们可能会在指标统计信息中引入一些高斯噪声。这种噪声的值是模型的超参数。
- 咱们可能面临的第二个问题是训练和测试数据中类别的不正确调配。在这种状况下,类别可能采纳极其值。因而,类别的指标平均值与指标的边际平均值混合在一起。
尾注
总而言之,对分类数据进行编码是特色工程中不可避免的局部。晓得咱们应该应用哪种编码方案更为重要。思考到咱们正在应用的数据集和将要应用的模型。在本文中,咱们曾经看到了各种编码技术以及它们的问题和适合的用例。
如果你想理解无关解决分类变量的更多信息,请参阅本文
-
预测建模中解决分类变量的简略办法
- https://www.analyticsvidhya.c…
原文链接:https://www.analyticsvidhya.c…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/