Python中的标签编码和独热编码示例详解

 更新时间:2023年07月24日 15:31:34   作者:吃肉的小馒头  
标签编码是一种用于将分类列转换为数值列的技术,以便它们可以通过仅采用数值数据的机器学习模型进行拟合,这篇文章主要介绍了Python中的标签编码和独热编码,需要的朋友可以参考下

在机器学习项目中,我们通常处理具有不同分类列的数据集,其中一些列的元素在有序变量类别中,例如列收入水平具有低,中或高的元素,在这种情况下,我们可以用1,2,3替换这些元素。其中1表示“低”,2表示“中”,3表示“高”。通过这种类型的编码,我们试图保留元素的含义,其中较高的权重被分配给具有较高优先级的元素。

标签编码

标签编码是一种用于将分类列转换为数值列的技术,以便它们可以通过仅采用数值数据的机器学习模型进行拟合。它是机器学习项目中重要的预处理步骤。

标签编码示例

假设我们在某个数据集中有一个列Height,其中包含Tall,Medium和short元素。要将此分类列转换为数值列,我们将对此列应用标签编码。在应用标签编码之后,“高度”列被转换为具有元素0、1和2的数值列,其中0是高的标签,1是中等的标签,2是矮的标签。

在这里插入图片描述

我们将在目标列Species上的虹膜数据集上应用Label Encoding。它包含三个物种Iris-setosa,Iris-versicolor,Iris-virginica。

# Import libraries 
import numpy as np
import pandas as pd
# Import dataset
df = pd.read_csv('../../data/Iris.csv')
df['species'].unique()
'''
array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object)
'''

使用LabelEncoder()应用Label Encoding后,我们的分类值将替换为数值[int]。

# Import label encoder
from sklearn import preprocessing
# label_encoder object knows 
# how to understand word labels.
label_encoder = preprocessing.LabelEncoder()
# Encode labels in column 'species'.
df['species']= label_encoder.fit_transform(df['species'])
df['species'].unique()
'''
array([0, 1, 2], dtype=int64)
'''

标签编码的局限

标签编码将分类数据转换为数字数据,但它为每个数据类别分配一个唯一的数字(从0开始)。这可能导致在数据集的模型训练期间产生优先级问题。具有高值的标签可以被认为具有比具有较低值的标签高的优先级。

具有输出类Mexico、Paris、Dubai的属性。在“标签编码”上,此列允许将“Mexico”替换为“0”,将“Paris”替换为“1”,将“Dubai”替换为“2”。由此,可以解释为在训练模型时,Dubai具有比Mexico和Paris更高的优先级,但实际上,这些城市之间不存在这种优先级关系。

独热编码

我们在数据科学项目开发过程中遇到的大多数现实数据集都具有混合数据类型的列。这些数据集由分类列和数值列组成。然而,各种机器学习模型不适用于分类数据,为了将这些数据拟合到机器学习模型中,需要将其转换为数值数据。例如,假设数据集有一个Gender列,其中包含Male和Female等分类元素。这些标签没有特定的偏好顺序,而且由于数据是字符串标签,机器学习模型会误解其中存在某种层次结构。解决这个问题的一种方法是标签编码,我们将为这些标签分配一个数值,例如映射到0和1的男性和女性。但这可能会在我们的模型中增加偏差,因为它将开始对女性参数给予更高的偏好,因为1>0,但理想情况下,两个标签在数据集中同等重要。为了解决这个问题,我们将使用独热编码技术。

独热编码是我们用来在机器学习模型中将分类变量表示为数值的技术。

使用独热编码的优点包括:

  • 它允许在需要数值输入的模型中使用分类变量。
  • 它可以通过向模型提供有关分类变量的更多信息来提高模型性能。
  • 它可以帮助避免排序问题,当分类变量具有自然排序时可能发生这种情况(例如,“小”、“中”、“大”)。

使用独热编码的缺点包括:

  • 它可能导致维度增加,因为为变量中的每个类别创建了单独的列。这可能会使模型更加复杂,训练速度更慢。
  • 它可能导致稀疏数据,因为大多数观测值在大多数独热编码列中的值为0。
  • 它可能会导致过度拟合,特别是当变量中有许多类别并且样本量相对较小时。
  • 独热编码是一种处理分类数据的强大技术,但它可能导致增加的维度,稀疏性和过拟合。重要的是要谨慎使用它,并考虑其他方法,如序数编码或二进制编码。

示例

在独热编码中,分类参数将为男性和女性标签准备单独的列。因此,只要有男性,男性列中的值将为1,女性列中的值将为0,反之亦然。让我们用一个例子来理解:考虑给定水果、其对应的分类值和价格的数据。

在这里插入图片描述

在对数据应用独热编码之后的输出如下给出,

在这里插入图片描述

创建一个dataframe来实现CSV文件的独热编码。

# Program for demonstration of one hot encoding
# import libraries
import numpy as np
import pandas as pd
# import the data required
data = pd.read_csv('employee_data.csv')
print(data.head())

在这里插入图片描述

分类列中的唯一元素

print(data['Gender'].unique())
print(data['Remarks'].unique())
'''
array(['Male', 'Female'], dtype=object)
array(['Nice', 'Good', 'Great'], dtype=object)
'''

列中元素的计数

data['Gender'].value_counts()
data['Remarks'].value_counts()
'''
Female    7
Male      5
Name: Gender, dtype: int64
Nice     5
Great    4
Good     3
Name: Remarks, dtype: int64
'''

我们有两种方法可用于对分类列执行one-hot编码。

利用Pandas库实现分类列的独热编码

我们可以使用pandas中的pd.get_dummies()函数对分类列进行one-hot编码。

one_hot_encoded_data = pd.get_dummies(data, columns = ['Remarks', 'Gender'])
print(one_hot_encoded_data)

在这里插入图片描述

我们可以观察到数据中有3个备注和2个性别列。但是,如果它有n个唯一标签,则可以只使用n-1列来定义参数。例如,如果我们只保留Gender_Female列并删除Gender_Male列,那么我们也可以传达整个信息,当标签为1时,它表示女性,当标签为0时,它表示男性。通过这种方式,我们可以对分类数据进行编码,并减少参数的数量。

使用Scikit Learn Library进行独热编码

Scikit-learn(sklearn)是Python中一个流行的机器学习库,它提供了许多用于数据预处理的工具。它提供了一个OneHotEncoder函数,我们使用该函数将分类和数值变量编码为二进制向量,也是在实现该算法之前。确保分类值必须被标记和编码,因为独热编码仅采用数字分类值。

# importing libraries
import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder
# Retrieving data
data = pd.read_csv('Employee_data.csv')
# Converting type of columns to category
data['Gender'] = data['Gender'].astype('category')
data['Remarks'] = data['Remarks'].astype('category')
# Assigning numerical values and storing it in another columns
data['Gen_new'] = data['Gender'].cat.codes
data['Rem_new'] = data['Remarks'].cat.codes
# Create an instance of One-hot-encoder
enc = OneHotEncoder()
# Passing encoded columns
enc_data = pd.DataFrame(enc.fit_transform(
    data[['Gen_new', 'Rem_new']]).toarray())
# Merge with main
New_df = data.join(enc_data)
print(New_df)

在这里插入图片描述

注意:这里我们已经将enc.fit_transform()方法转换为数组,因为OneHotEncoder的fit_transform方法返回SpiPy稀疏矩阵,因此当我们有大量分类变量时,首先转换为数组可以保存空间。

到此这篇关于Python中的标签编码和独热编码的文章就介绍到这了,更多相关Python标签编码和独热编码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Python_Openpyxl使用(最全总结)

    浅谈Python_Openpyxl使用(最全总结)

    这篇文章主要介绍了浅谈Python_Openpyxl使用(最全总结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • python urllib库的使用详解

    python urllib库的使用详解

    这篇文章主要介绍了python urllib库的使用详解,帮助大家更好的利用python学习爬虫,感兴趣的朋友可以了解下
    2021-04-04
  • 利用python发送和接收邮件

    利用python发送和接收邮件

    这篇文章主要为大家详细介绍了如何利用python发送和接收邮件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Python机器学习之Kmeans基础算法

    Python机器学习之Kmeans基础算法

    这篇文章主要介绍了Python机器学习之Kmeans基础算法,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • python实现类之间的方法互相调用

    python实现类之间的方法互相调用

    下面小编就为大家分享一篇python实现类之间的方法互相调用,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 对python:print打印时加u的含义详解

    对python:print打印时加u的含义详解

    今天小编就为大家分享一篇对python:print打印时加u的含义详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 基于python和pygame库实现刮刮乐游戏

    基于python和pygame库实现刮刮乐游戏

    这篇文章主要介绍了如何基于python和pygame库实现刮刮乐游戏,文中通过代码示例和图文给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-03-03
  • python mysql 字段与关键字冲突的解决方式

    python mysql 字段与关键字冲突的解决方式

    这篇文章主要介绍了python mysql 字段与关键字冲突的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 手把手教你使用Python绘制时间序列图

    手把手教你使用Python绘制时间序列图

    这篇文章主要介绍了手把手教你使用Python绘制时间序列图,本文将以股价数据集为例,指导你从Quandl下载股价数据集,并将这些数据绘制在价格和成交量图表上,需要的朋友可以参考下
    2022-01-01
  • Python文件处理、os模块、glob模块

    Python文件处理、os模块、glob模块

    这篇文章介绍了Python处理文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论