7种分类数据编码技术详解:从原理到实战

news2025/6/10 7:46:35

在数据分析和机器学习领域,分类数据(Categorical Data)的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型,如性别(男/女)、颜色(红/绿/蓝)或产品类别(电子产品/服装/食品)等。由于大多数机器学习算法只能处理数值型数据,因此我们需要将分类数据转换为数值形式,这一过程称为“编码”。

本文将深入探讨7种最常用的分类数据编码技术,包括One-hot encoding、Dummy encoding、Effect encoding、Label encoding、Ordinal encoding、Count encoding和Binary encoding。每种技术都有其独特的优势和适用场景,理解它们的差异对于构建高效的机器学习模型至关重要。

1. One-hot Encoding(独热编码)

原理与特点

One-hot encoding是最常用的分类数据编码技术之一。它的核心思想是为每个类别创建一个新的二进制特征(0或1),表示该类别是否存在。对于有N个不同类别的分类变量,One-hot encoding会生成N个新的二进制特征。

特点

  • 每个类别由0和1的二进制向量表示

  • 每个样本中只有一个特征为1(“热”),其余为0

  • 生成的特征数量等于唯一分类标签的数量

  • 消除了类别间的隐含顺序关系

生活化案例

想象你正在为一家冰淇淋店记录顾客最喜欢的口味。假设有三种口味:香草、巧克力和草莓。使用One-hot encoding,我们可以这样表示:

  • 香草:[1, 0, 0]

  • 巧克力:[0, 1, 0]

  • 草莓:[0, 0, 1]

代码实现

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

# 示例数据
data = pd.DataFrame({'Flavor': ['Vanilla', 'Chocolate', 'Strawberry', 'Chocolate', 'Vanilla']})

# 创建OneHotEncoder实例
encoder = OneHotEncoder(sparse_output=False)

# 拟合并转换数据
encoded_data = encoder.fit_transform(data[['Flavor']])

# 转换为DataFrame并添加列名
encoded_df = pd.DataFrame(encoded_data, columns=encoder.get_feature_names_out(['Flavor']))

print("原始数据:")
print(data)
print("\nOne-hot编码后的数据:")
print(encoded_df)

优缺点分析

优点

  1. 简单直观,易于实现

  2. 保留了所有类别信息

  3. 消除了类别间的顺序关系,适合没有内在顺序的分类变量

缺点

  1. 当类别数量很多时(高基数特征),会导致特征维度急剧增加(维度灾难)

  2. 生成的稀疏矩阵可能占用大量内存

  3. 对于某些模型(如线性回归),可能导致多重共线性问题

2. Dummy Encoding(虚拟编码)

原理与特点

Dummy encoding是One-hot encoding的一种变体,它通过删除一个类别来避免“虚拟变量陷阱”(Dummy Variable Trap)。虚拟变量陷阱指的是当所有虚拟变量都为0时,可以确定被删除的那个类别,这会导致多重共线性问题,影响某些模型的性能(如线性回归)。

特点

  • 与One-hot encoding相同,但删除一个特征

  • 特征数量 = 唯一分类标签数量 - 1

  • 避免了虚拟变量陷阱问题

  • 被删除的类别成为“参考类别”

生活化案例

继续使用冰淇淋口味的例子,如果我们选择“香草”作为参考类别,Dummy encoding表示如下:

  • 香草:[0, 0](参考类别)

  • 巧克力:[1, 0]

  • 草莓:[0, 1]

代码实现

# 使用pandas的get_dummies函数实现Dummy encoding
dummy_encoded = pd.get_dummies(data['Flavor'], prefix='Flavor', drop_first=False)

# 删除一列以创建Dummy encoding(通常删除第一个或最后一个类别)
dummy_encoded = dummy_encoded.iloc[:, 1:]  # 删除'Flavor_Vanilla'列

print("\nDummy编码后的数据(删除Vanilla作为参考类别):")
print(dummy_encoded)

优缺点分析

优点

  1. 解决了多重共线性问题

  2. 比One-hot encoding更节省空间(少一列)

  3. 在线性模型中有更好的解释性

缺点

  1. 参考类别的选择可能影响模型解释

  2. 仍然存在高基数特征维度问题

  3. 不如One-hot encoding直观

3. Effect Encoding(效应编码)

原理与特点

Effect encoding(也称为Sum Contrast Coding)是Dummy encoding的另一种变体。它不是简单地将参考类别编码为全0,而是将其编码为-1。这使得生成的二元特征不仅表示特定类别的存在与否,还表示参考类别与任何类别之间的对比。

特点

  • 类似于Dummy encoding,但将全零行更改为-1

  • 特征数量 = 唯一分类标签数量 - 1

  • 适用于线性模型,可以更好地估计类别效应

  • 参考类别的系数是其他类别系数的负和

生活化案例

使用冰淇淋口味的例子,Effect encoding表示如下(选择“香草”作为参考类别):

  • 香草:[-1, -1]

  • 巧克力:[1, 0]

  • 草莓:[0, 1]

代码实现

import patsy
import pandas as pd
import statsmodels.api as sm

# 示例数据
data = pd.DataFrame({'Flavor': ['Vanilla', 'Chocolate', 'Strawberry', 'Chocolate', 'Vanilla']})

# 使用 patsy 进行 Effect 编码
effect_encoded = patsy.dmatrix(
    "C(Flavor, Sum)",  # Sum 表示 Effect 编码
    data=data,
    return_type='dataframe'
)

# 重命名列(可选)
effect_encoded.columns = ['Intercept', 'Flavor_Chocolate', 'Flavor_Strawberry']

print("\nEffect编码后的数据:")
print(effect_encoded.drop(columns='Intercept'))  # 去掉截距项

优缺点分析

优点

  1. 特别适合线性模型和方差分析

  2. 可以更好地估计类别间的相对效应

  3. 参考类别的处理更加对称

缺点

  1. 实现较为复杂,不是所有库都直接支持

  2. 解释性不如One-hot或Dummy encoding直观

  3. 对于非线性和树模型可能没有优势

4. Label Encoding(标签编码)

原理与特点

Label encoding是最简单的编码方式之一,它为每个类别分配一个唯一的整数标签。这种编码方式非常节省空间,因为它只增加一个特征列。

特点

  • 为每个类别分配一个唯一的整数标签

  • 特征数量 = 1

  • 极其节省空间

  • 可能引入不存在的顺序关系

生活化案例

对于冰淇淋口味:

  • 香草:0

  • 巧克力:1

  • 草莓:2

代码实现

from sklearn.preprocessing import LabelEncoder

# 创建LabelEncoder实例
label_encoder = LabelEncoder()

# 拟合并转换数据
label_encoded = label_encoder.fit_transform(data['Flavor'])

# 转换为DataFrame
label_encoded_df = pd.DataFrame(label_encoded, columns=['Flavor_Label'])

print("\nLabel编码后的数据:")
print(label_encoded_df)
print("\n类别映射:", dict(zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_))))

优缺点分析

优点

  1. 极其简单高效

  2. 不增加数据维度

  3. 适用于树模型(如随机森林、梯度提升树)

缺点

  1. 引入了可能不存在的顺序关系(如算法可能认为香草(2) > 草莓(1) > 巧克力(0))

  2. 不适合线性模型、神经网络等

  3. 数值大小可能被误解为重要性或权重

5. Ordinal Encoding(序数编码)

原理与特点

Ordinal encoding与Label encoding类似,但它专门用于具有内在顺序的分类变量。编码时按照类别的自然顺序分配数值,保留了顺序信息。

特点

  • 为有序类别分配具有顺序意义的整数值

  • 特征数量 = 1

  • 保留了类别间的顺序关系

  • 数值大小反映类别顺序

生活化案例

考虑教育程度分类:高中 < 本科 < 硕士 < 博士:

  • 高中:0

  • 本科:1

  • 硕士:2

  • 博士:3

代码实现

# 示例数据:教育程度
education_data = pd.DataFrame({'Education': ['High School', 'Bachelor', 'Master', 'PhD', 'Bachelor']})

# 定义类别顺序
education_order = ['High School', 'Bachelor', 'Master', 'PhD']

# 创建OrdinalEncoder实例
from sklearn.preprocessing import OrdinalEncoder
ordinal_encoder = OrdinalEncoder(categories=[education_order])

# 拟合并转换数据
ordinal_encoded = ordinal_encoder.fit_transform(education_data[['Education']])

# 转换为DataFrame
ordinal_encoded_df = pd.DataFrame(ordinal_encoded, columns=['Education_Ordinal'])

print("\n原始教育程度数据:")
print(education_data)
print("\nOrdinal编码后的数据:")
print(ordinal_encoded_df)

优缺点分析

优点

  1. 保留了有序分类变量的顺序信息

  2. 不增加数据维度

  3. 适用于能够利用顺序信息的模型

缺点

  1. 不适用于无序分类变量

  2. 仍然可能引入数值大小的误解(如认为博士(3)是本科(1)的3倍)

  3. 需要预先知道类别的正确顺序

6. Count Encoding(计数编码)

原理与特点

Count encoding(也称为频率编码)用每个类别在数据集中出现的次数(或频率)替换类别标签。这种方法特别适用于高基数分类特征。

特点

  • 用类别的出现次数或频率替换类别

  • 特征数量 = 1

  • 保留了类别的分布信息

  • 对高基数特征有效

生活化案例

假设我们有一个城市的客户数据集,其中“城市”是一个高基数分类变量(如100个不同城市)。我们可以用每个城市在数据集中出现的次数来编码:

  • 北京(出现85次):85

  • 上海(出现120次):120

  • 广州(出现60次):60

代码实现

import pandas as pd

# 示例数据
city_data = pd.DataFrame({'City': ['Beijing', 'Shanghai', 'Guangzhou', 
                                  'Beijing', 'Shanghai', 'Shanghai']})

city_data['City_Count'] = city_data.groupby('City')['City'].transform('count')

# 输出结果
print("\n原始城市数据:")
print(city_data['City'])
print("\nCount编码后的数据:")
print(city_data)
print("\n计数映射:", city_data['City'].value_counts().to_dict())

优缺点分析

优点

  1. 对高基数分类变量非常有效

  2. 不增加数据维度

  3. 保留了类别的分布信息

  4. 可以揭示流行度或频率信息

缺点

  1. 不同但出现次数相同的类别会被编码为相同值

  2. 可能对罕见类别不友好(可能需要进行平滑处理)

  3. 如果类别出现次数与目标变量无关,可能引入噪声

7. Binary Encoding(二进制编码)

原理与特点

Binary encoding是One-hot encoding和Label encoding的组合。它首先将类别转换为数值(类似Label encoding),然后将这些数值转换为二进制代码,最后将二进制代码的每一位拆分为单独的特征列。

特点

  • 将类别表示为二进制代码

  • 特征数量 = log₂(n)(以2为底,n为类别数量)

  • 介于One-hot和Label encoding之间的折中方案

  • 特别适用于高基数分类特征

生活化案例

假设有8种冰淇淋口味,Binary encoding过程如下:

  1. 首先Label encoding:香草-0,巧克力-1,草莓-2,...,芒果-7

  2. 转换为二进制:0-000,1-001,2-010,...,7-111

  3. 拆分为单独的特征列:

    • 香草:0,0,0

    • 巧克力:0,0,1

    • 草莓:0,1,0

    • ...

    • 芒果:1,1,1

代码实现

import pandas as pd
import category_encoders as ce

# 示例数据:大型分类变量
large_cat_data = pd.DataFrame({'Category': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']})

# 创建 BinaryEncoder 实例
binary_encoder = ce.BinaryEncoder(cols=['Category'])

# 拟合并转换数据
binary_encoded = binary_encoder.fit_transform(large_cat_data)

print("\n原始分类数据:")
print(large_cat_data)
print("\nBinary 编码后的数据:")
print(binary_encoded)

优缺点分析

优点

  1. 大幅降低高基数特征的维度(相比One-hot)

  2. 保留了部分类别信息

  3. 比Label encoding保留了更多区分能力

  4. 适用于各种模型类型

缺点

  1. 实现相对复杂

  2. 解释性不如One-hot直观

  3. 对于类别数量不是2的幂的情况,可能仍有信息损失

编码技术对比

编码技术特征数量保留顺序避免虚拟陷阱适用场景高基数适用性示例
One-hotN无顺序分类变量,少量类别颜色、性别
DummyN-1线性模型,少量类别地区、品牌
EffectN-1线性模型,方差分析实验组别
Label1是(伪)-树模型,任意基数ID类特征
Ordinal1-有序分类变量教育程度
Count1部分-高基数特征城市、邮编
Binarylog₂N部分-高基数特征

如何选择合适的编码技术

选择适当的编码技术取决于多个因素:

分类变量的性质

  • 是否有内在顺序?(有序→Ordinal)

  • 类别数量多少?(高基数→Count/Binary)

使用的模型类型

  • 线性模型→Dummy/Effect encoding

  • 树模型→Label/Ordinal encoding

  • 神经网络→One-hot/Binary encoding

数据规模和计算资源

  • 大数据集→避免One-hot(维度灾难)

  • 有限资源→考虑Binary/Count encoding

业务需求和解释性

  • 需要强解释性→One-hot/Dummy

  • 更注重性能→Binary/Count

编码技术数值关系风险示例风险说明
Ordinal博士(3)≠3×本科(1),只是顺序关系
Label草莓(2)≠2×巧克力(1),只是随机编号
One-hot[0,1,0]与[1,0,0]无数值关系
Count上海(120次)比北京(85次)多35次是实际计数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【字节拥抱开源】字节团队开源视频模型 ContentV: 有限算力下的视频生成模型高效训练

本项目提出了ContentV框架&#xff0c;通过三项关键创新高效加速基于DiT的视频生成模型训练&#xff1a; 极简架构设计&#xff0c;最大化复用预训练图像生成模型进行视频合成系统化的多阶段训练策略&#xff0c;利用流匹配技术提升效率经济高效的人类反馈强化学习框架&#x…

本地部署drawDB结合内网穿透技术实现数据库远程管控方案

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下&#xff0c;数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统&#xff0c;还是初创…

可视化预警系统:如何实现生产风险的实时监控?

在生产环境中&#xff0c;风险无处不在&#xff0c;而传统的监控方式往往只能事后补救&#xff0c;难以做到提前预警。但如今&#xff0c;可视化预警系统正在改变这一切&#xff01;它能够实时收集和分析生产数据&#xff0c;通过直观的图表和警报&#xff0c;让管理者第一时间…

多模态大语言模型arxiv论文略读(112)

Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文标题&#xff1a;Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文作者&#xff1a;Jea…

【向量库】Weaviate概述与架构解析

文章目录 一、什么是weaviate二、High-Level Architecture1. Core Components2. Storage Layer3. 组件交互流程 三、核心组件1. API Layer2. Schema Management3. Vector Indexing3.1. 查询原理3.2. 左侧&#xff1a;Search Process&#xff08;搜索流程&#xff09;3.3. 右侧&…

统计按位或能得到最大值的子集数目

我们先来看题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出 nums 子集 按位或 可能得到的 最大值 &#xff0c;并返回按位或能得到最大值的 不同非空子集的数目 。 如果数组 a 可以由数组 b 删除一些元素&#xff08;或不删除&#xff09;得到&#xff0c;…

vue3 手动封装城市三级联动

要做的功能 示意图是这样的&#xff0c;因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…

Linux【5】-----编译和烧写Linux系统镜像(RK3568)

参考&#xff1a;讯为 1、文件系统 不同的文件系统组成了&#xff1a;debian、ubuntu、buildroot、qt等系统 每个文件系统的uboot和kernel是一样的 2、源码目录介绍 目录 3、正式编译 编译脚本build.sh 帮助内容如下&#xff1a; Available options: uboot …

Heygem50系显卡合成的视频声音杂音模糊解决方案

如果你在使用50系显卡有杂音的情况&#xff0c;可能还是官方适配问题&#xff0c;可以使用以下方案进行解决&#xff1a; 方案一&#xff1a;剪映替换音色&#xff08;简单适合普通玩家&#xff09; 使用剪映换音色即可&#xff0c;口型还是对上的&#xff0c;没有剪映vip的&…

Gitlab + Jenkins 实现 CICD

CICD 是持续集成&#xff08;Continuous Integration, CI&#xff09;和持续交付/部署&#xff08;Continuous Delivery/Deployment, CD&#xff09;的缩写&#xff0c;是现代软件开发中的一种自动化流程实践。下面介绍 Web 项目如何在代码提交到 Gitlab 后&#xff0c;自动发布…

无头浏览器技术:Python爬虫如何精准模拟搜索点击

1. 无头浏览器技术概述 1.1 什么是无头浏览器&#xff1f; 无头浏览器是一种没有图形用户界面&#xff08;GUI&#xff09;的浏览器&#xff0c;它通过程序控制浏览器内核&#xff08;如Chromium、Firefox&#xff09;执行页面加载、JavaScript渲染、表单提交等操作。由于不渲…

SDU棋界精灵——硬件程序ESP32实现opus编码

一、 ​​音频处理框架​ 该项目基于Espressif的音频处理框架构建,核心组件包括 ESP-ADF 和 ESP-SR,以下是完整的音频处理框架实现细节: 1.核心组件 (1) 音频前端处理 (AFE - Audio Front-End) ​​main/components/audio_pipeline/afe_processor.c​​功能​​: 声学回声…

Spring AI中使用ChatMemory实现会话记忆功能

文章目录 1、需求2、ChatMemory中消息的存储位置3、实现步骤1、引入依赖2、配置Spring AI3、配置chatmemory4、java层传递conversaionId 4、验证5、完整代码6、参考文档 1、需求 我们知道大型语言模型 &#xff08;LLM&#xff09; 是无状态的&#xff0c;这就意味着他们不会保…

Qt 按钮类控件(Push Button 与 Radio Button)(1)

文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button&#xff08;鼠标点击不放连续移动快捷键&#xff09; Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…

生成对抗网络(GAN)损失函数解读

GAN损失函数的形式&#xff1a; 以下是对每个部分的解读&#xff1a; 1. ⁡, ​ &#xff1a;这个部分表示生成器&#xff08;Generator&#xff09;G的目标是最小化损失函数。 &#xff1a;判别器&#xff08;Discriminator&#xff09;D的目标是最大化损失函数。 GAN的训…

汇编语言学习(三)——DoxBox中debug的使用

目录 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 二、debug是什么 三、debug中的命令 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 链接&#xff1a; https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…

数据可视化交互

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装 pyecharts 二、下载数据 三、实验任务 实验 1&#xff1a;AQI 横向对比条形图 代码说明&#xff1a; 运行结果&#xff1a; 实验 2&#xff1a;AQI 等级分布饼图 实验 3&#xff1a;多城市 AQI…

安宝特方案丨从依赖经验到数据驱动:AR套件重构特种装备装配与质检全流程

在高压电气装备、军工装备、石油测井仪器装备、计算存储服务器和机柜、核磁医疗装备、大型发动机组等特种装备生产型企业&#xff0c;其产品具有“小批量、多品种、人工装配、价值高”的特点。 生产管理中存在传统SOP文件内容缺失、SOP更新不及、装配严重依赖个人经验、产品装…

【JavaEE】万字详解HTTP协议

HTTP是什么&#xff1f;-----互联网的“快递小哥” 想象我们正在网上购物&#xff1a;打开淘宝APP&#xff0c;搜索“蓝牙耳机”&#xff0c;点击商品图片&#xff0c;然后下单付款。这一系列操作背后&#xff0c;其实有一个看不见的“快递小哥”在帮我们传递信息&#xff0c;…

华为云Flexus+DeepSeek征文 | MaaS平台避坑指南:DeepSeek商用服务开通与成本控制

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 一、技术架构概览 1.1 整体架构设…