标签编码和独热编码(One-Hot)优劣及应用

火山方舟向量数据库大模型

1. 背景介绍

1.1 什么是特征编码

特征编码是机器学习中的一项关键任务,它涉及将非数值型的数据转换为模型可用的形式。在现实生活中,我们的数据往往包含各种各样的信息,例如文本、类别、标签等,而机器学习模型通常要求输入的数据是数值型的。因此,特征编码的目标是将这些非数值型的数据转化为数值形式,以便模型能够理解和处理,接下来将深入浅出的讲解标签编码和独热编码(One-Hot)优劣及应用

1.2 案例引入

以房价预测为例,房屋的类型可能是"公寓"、"别墅"、"联排屋"等,这些文本信息无法直接用于训练模型。特征编码的任务就是将这些房屋类型的文字描述转换为机器学习模型可以理解的数字形式,从而帮助模型更好地学习并做出准确的预测

2. 独热编码(One-Hot )

独热编码(One-Hot Encoding)是一种常用的特征编码方法,特别适用于处理分类变量

2.1 好处:

避免了顺序关系:独热编码将每个类别表示为一个独立的向量,避免了引入类别之间的顺序关系。这对于大多数机器学习算法来说是很重要的,因为它们通常不应该假设类别之间存在等距或有序关系

防止数值间隔的误导:如果使用标签编码将类别映射为整数,可能会误导模型认为类别之间存在数值上的间隔关系。独热编码避免了这个问题,每个类别的表示是独立的二进制向量

适用于大多数机器学习算法:独热编码生成的向量是稀疏的,仅有一个元素为1,其余为0。这种稀疏表示适用于大多数机器学习算法,节省了存储空间和计算成本

处理不同数量的类别:独热编码可以处理不同数量的类别,因为每个类别都被表示为固定长度的向量,与其他类别的数量无关

2.2 坏处:

维度灾难:对于具有大量不同类别的特征,独热编码可能导致维度灾难,即数据的维度迅速增加。这可能使得模型更难以训练,尤其是在数据量有限的情况下

不适用于高基数特征:当类别数量非常大时,独热编码可能变得不切实际。在这种情况下,可以考虑其他编码方式,如哈希编码或嵌入编码

可能导致冗余性:当特征之间存在相关性时,独热编码可能导致冗余性,因为每个类别的信息都是相互独立的

3. 标签编码

标签编码(Label Encoding)是一种将类别型数据映射为整数标签的编码方法

3.1 好处:

节省空间:相对于独热编码,标签编码生成的表示是稠密的,只使用一个整数表示每个类别。这样可以节省存储空间,尤其是在处理大规模数据集时

适用于有序类别:在某些情况下,类别之间可能存在自然的有序关系。标签编码能够保留这种有序性,因为整数标签的大小反映了类别之间的相对关系

不引入维度爆炸:相对于独热编码,标签编码不会引入维度爆炸问题。它不会像独热编码那样为每个类别创建一个独立的维度,因此不会导致高维数据

3.2 坏处:

引入虚假的序关系:标签编码将类别映射为整数,可能引入虚假的序关系。模型可能错误地认为类别之间存在数值上的间隔关系,而实际上它们只是标签而已

可能影响模型性能:某些机器学习算法可能会误以为标签之间的距离有实际的意义。这在一些算法中可能导致模型性能下降,特别是在没有实际有序关系的情况下

不适用于无序类别:对于没有自然顺序的类别,使用标签编码可能不合适。模型可能会误解标签之间的关系,并且无序的类别之间的距离没有实际的意义

不适用于高基数特征:当类别数量非常大时,标签编码可能不切实际。这可能导致模型性能下降,并且在存储和计算上的成本可能变得很高

4. 实际应用举例

4.1 读取数据集并查看需要编码的列类别


          
import pandas as pd
          
data = pd.read_csv('新加坡房价数据集.csv')
          
data.head()
      

picture.image


        
            

          data['room\_type'].value\_counts() # 这是需要进行编码的数据
        
      

picture.image

4.2 标签编码


          
from sklearn.preprocessing import LabelEncoder
          

          
# 使用 LabelEncoder 对 'room_type' 列进行标签编码
          
label_encoder = LabelEncoder()
          
data['room_type_encoded'] = label_encoder.fit_transform(data['room_type'])
          

          
# 输出每个类别及其编码结果
          
print("各类型 标签编码结果:")
          
for class_label, encoded_label in zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_)):
          
    print(f"{class_label}: {encoded_label}")
      

picture.image


        
            

          data['room\_type\_encoded']
        
      

picture.image

4.3 独热编码(One-hot)


          
# 使用 get_dummies 对 'room_type' 列进行独热编码 新的列将以 'room_type_' 作为前缀,后跟原始类别的名称
          
df_encoded = pd.get_dummies(data, columns=['room_type'], prefix='room_type')
          

          
# 将特定列从布尔型转换为整数类型
          
columns_to_convert = ['room_type_Entire home/apt', 'room_type_Private room', 'room_type_Shared room']
          
df_encoded[columns_to_convert] = df_encoded[columns_to_convert].astype(int)
          

          
df_encoded[columns_to_convert]
      

picture.image

5. 总结

通过文章,我们深入了解了特征编码(标签编码、独热编码)在机器学习中的实际应用,以及在实际数据集中如何进行标签编码和独热编码,这些技术不仅是提高模型性能的关键一步,也是机器学习工程师和数据科学家日常工作中不可或缺的工具。希望本文能够为读者提供清晰的指导,使其更加熟悉和灵活运用特征编码技术

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
云原生机器学习系统落地和实践
机器学习在字节跳动有着丰富业务场景:推广搜、CV/NLP/Speech 等。业务规模的不断增大对机器学习系统从用户体验、训练效率、编排调度、资源利用等方面也提出了新的挑战,而 Kubernetes 云原生理念的提出正是为了应对这些挑战。本次分享将主要介绍字节跳动机器学习系统云原生化的落地和实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论