机器学习的一百个概念(7)独热编码

前言

本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见[《机器学习的一百个概念》


ima 知识库

知识库广场搜索:

知识库创建人
机器学习@Shockang
机器学习数学基础@Shockang
深度学习@Shockang

正文

在这里插入图片描述

引言 🌟

在机器学习的数据预处理阶段,我们经常会遇到分类变量(categorical variables)的处理问题。这些变量可能是性别、职业、教育程度等非数值型数据。由于大多数机器学习算法只能处理数值型数据,如何有效地将这些分类变量转换为数值型特征就成为了一个关键问题。独热编码(One-Hot Encoding)作为最常用的解决方案之一,在这个过程中扮演着重要角色。

核心原理 🔍

基本概念

独热编码的核心思想是将每个类别值转换为一个包含0和1的向量,向量的长度等于类别的总数。在这个向量中,只有一个位置的值为1(表示当前类别),其余位置都为0。

编码流程

在这里插入图片描述

数学表示

对于具有 k k k 个不同类别的特征,独热编码会创建一个 k k k 维向量空间,每个类别映射到这个空间中的一个标准基向量。形式化表示如下:

设类别集合 C = { c 1 , c 2 , . . . , c k } C = \{c_1, c_2, ..., c_k\} C={c1,c2,...,ck}
对于类别 c i c_i ci, 其独热编码为:
e i = [ 0 , 0 , . . . , 1 , . . . , 0 ] e_i = [0,0,...,1,...,0] ei=[0,0,...,1,...,0]
其中第 i i i 个位置为1,其余位置为0

示例说明

考虑一个包含颜色特征的数据集:

原始数据: ['红', '蓝', '绿', '红', '绿']独热编码后:: [1, 0, 0]: [0, 1, 0]
绿: [0, 0, 1]: [1, 0, 0]
绿: [0, 0, 1]

深入理解独热编码 🧠

几何解释

从几何角度看,独热编码将类别映射到多维空间中的正交向量。这种表示方法确保了:

  1. 所有类别之间的欧氏距离相等
  2. 没有引入人为的顺序关系
  3. 在向量空间中形成了线性可分的表示

与其他编码方式的对比

  1. 标签编码(Label Encoding)

    • 直接将类别映射为整数
    • 可能引入顺序关系
    • 计算效率高
    • 适用于有序类别
  2. 二进制编码(Binary Encoding)

    • 使用二进制表示
    • 维度增长为log2(n)
    • 计算效率较高
    • 可能失去可解释性
  3. 独热编码(One-Hot Encoding)

    • 使用独立维度表示每个类别
    • 不引入顺序关系
    • 维度增长线性
    • 保持可解释性

在这里插入图片描述

优缺点分析 ⚖️

优点 👍

  1. 无序性保证

    • 消除了类别之间的人为顺序关系
    • 保持了特征的独立性
    • 适合无序类别变量
  2. 模型兼容性

    • 与大多数机器学习算法兼容
    • 特别适合线性模型和神经网络
    • 便于特征选择和权重分析
  3. 可解释性

    • 结果直观易懂
    • 便于追踪特征重要性
    • 方便进行特征工程

缺点 👎

  1. 维度灾难

    • 类别数量大时维度剧增
    • 产生稀疏矩阵
    • 增加计算复杂度
  2. 内存消耗

    • 需要更多存储空间
    • 可能导致内存溢出
    • 处理大规模数据集困难
  3. 计算效率

    • 训练时间增加
    • 预测速度降低
    • 模型复杂度提升

应用场景 🎯

适用场景

  1. 低基数类别特征

    • 性别(男/女)
    • 教育程度(小学/中学/大学)
    • 职业类别(少量分类)
  2. 模型类型

    • 线性回归
    • 逻辑回归
    • 神经网络
    • 支持向量机
  3. 任务类型

    • 分类问题
    • 回归问题
    • 推荐系统

不适用场景

  1. 高基数特征

    • 用户ID
    • 产品SKU
    • 详细地址
  2. 特定算法

    • 决策树
    • 随机森林
    • XGBoost

实践指南 💻

Python实现示例

  1. 使用Scikit-learn
from sklearn.preprocessing import OneHotEncoder
import numpy as np# 示例数据
data = np.array([['男'], ['女'], ['男'], ['女']])# 创建编码器
encoder = OneHotEncoder(sparse=False)# 训练并转换数据
encoded_data = encoder.fit_transform(data)# 获取特征名称
feature_names = encoder.get_feature_names_out(['gender'])print("编码结果:\n", encoded_data)
print("特征名称:", feature_names)
  1. 使用Pandas
import pandas as pd# 创建示例数据框
df = pd.DataFrame({'color': ['红', '蓝', '绿', '红'],'size': ['大', '中', '小', '中']
})# 对指定列进行独热编码
df_encoded = pd.get_dummies(df, columns=['color', 'size'])print("编码后的数据框:\n", df_encoded)

实际应用案例

  1. 客户流失预测
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression# 假设数据准备
data = pd.DataFrame({'age': [25, 35, 45, 55],'gender': ['男', '女', '男', '女'],'occupation': ['工程师', '教师', '医生', '工程师'],'churn': [0, 1, 1, 0]
})# 定义分类特征和数值特征
categorical_features = ['gender', 'occupation']
numeric_features = ['age']# 创建预处理流水线
preprocessor = ColumnTransformer(transformers=[('num', 'passthrough', numeric_features),('cat', OneHotEncoder(drop='first'), categorical_features)])# 创建完整流水线
pipeline = Pipeline([('preprocessor', preprocessor),('classifier', LogisticRegression())
])# 分割数据
X = data.drop('churn', axis=1)
y = data['churn']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 训练模型
pipeline.fit(X_train, y_train)

高级技巧与优化 🚀

1. 稀疏矩阵优化

from scipy.sparse import csr_matrix# 使用稀疏矩阵存储
encoder = OneHotEncoder(sparse=True)
sparse_encoded = encoder.fit_transform(data)# 转换为CSR格式
csr_matrix = sparse_encoded.tocsr()

2. 特征选择策略

在这里插入图片描述

3. 内存优化技巧

# 使用类别数据类型
df['category'] = df['category'].astype('category')# 指定dtypes减少内存使用
encoded_df = pd.get_dummies(df, columns=['category'], dtype=np.int8)

常见陷阱与注意事项 ⚠️

  1. 虚拟变量陷阱

    • 问题:完全共线性
    • 解决:删除一个类别或使用drop_first=True
  2. 类别处理

    • 训练集和测试集类别不一致
    • 新类别出现的处理
    • 缺失值的处理
  3. 维度控制

    • 设置最大类别数量
    • 合并低频类别
    • 使用降维技术

总结与展望 🎓

独热编码作为处理分类变量的基础方法,在机器学习中占据重要地位。它的简单直观和良好的可解释性使其成为数据预处理的首选方法之一。然而,在实际应用中需要注意维度灾难和计算效率等问题,并根据具体场景选择合适的优化策略。

未来发展趋势

  1. 高效编码方法

    • 哈希编码
    • 实体嵌入
    • 目标编码
  2. 自动化特征工程

    • AutoML集成
    • 智能编码选择
    • 动态特征生成
  3. 混合编码策略

    • 多种编码方法组合
    • 上下文感知编码
    • 自适应编码机制

通过深入理解和灵活运用独热编码,我们可以更好地处理分类数据,为后续的机器学习模型训练打下坚实基础。在实践中,需要根据具体问题和场景,选择合适的编码策略,并注意平衡表达能力和计算效率。

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

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

相关文章

RHCSA复习

在Linux中, wrx 分别代表写(write)、读(read)和执行(execute)权限,它们对应的权限值分别是: - r (读权限):权限值为4。 - w &am…

“乐企“平台如何重构业财税票全流程生态?

2025年,国家税务总局持续推进的"便民办税春风行动"再次推进数字化服务升级,其中"乐企"平台作为税务信息化的重要载体,持续优化数电票服务能力,为企业提供更高效、更规范的税务管理支持。在这一背景下&#xf…

Android audio(6)-audiopolicyservice介绍

AudioPolicyService 是策略的制定者,比如某种 Stream 类型不同设备的音量(index/DB)是多少、某种 Stream 类型的音频数据流对应什么设备等等。而 AudioFlinger 则是策略的执行者,例如具体如何与音频设备通信,维护现有系…

Boost库搜索引擎项目(版本1)

Boost库搜索引擎 项目开源地址 Github:https://github.com/H0308/BoostSearchingEngine Gitee:https://gitee.com/EPSDA/BoostSearchingEngine 版本声明 当前为最初版本,后续会根据其他内容对当前项目进行修改,具体见后续版本…

git分支合并信息查看

TortoiseGit工具 1、选择"Revision graph" 2、勾选view中的 Show branchings and merges Arrows point towards merges 3、图案说明 红色部分‌:代表当前分支 橙色部分‌:代表远程分支 黄色部分‌:代表一个tag 绿色部分‌&#xf…

Java学习笔记(多线程):ReentrantLock 源码分析

本文是自己的学习笔记,主要参考资料如下 JavaSE文档 1、AQS 概述1.1、锁的原理1.2、任务队列1.2.1、结点的状态变化 1.3、加锁和解锁的简单流程 2、ReentrantLock2.1、加锁源码分析2.1.1、tryAcquire()的具体实现2.1.2、acquirQueued()的具体实现2.1.3、tryLock的具…

在C++11及后续标准中,auto和decltype是用于类型推导的关键特性,它们的作用和用法。

在C11及后续标准中,auto和decltype是用于类型推导的关键特性,它们的作用和用法有所不同。以下是详细说明: 1. auto 关键字 基本作用 自动推导变量的类型(根据初始化表达式)主要用于简化代码,避免显式书写…

Linux:进程程序替换execl

目录 引言 1.单进程版程序替换 2.程序替换原理 3.6种替换函数介绍 3.1 函数返回值 3.2 命名理解 3.3 环境变量参数 引言 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),我们所创建的所有的子进程,执行的代码&#x…

LeetCode.02.04.分割链表

分割链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输入:head [1,4,3,2,5,2], x …

Johnson算法 流水线问题 java实现

某印刷厂有 6项加工任务J1,J2,J3,J4,J5,J6,需要在两台机器Mi和M2上完 成。 在机器Mi上各任务所需时间为5,1,8,5,3,4单位; 在机器M2上各任务所需时间为7,2,2,4,7,4单位。 即时间矩阵为: T1 {5, …

按键++,--在操作uint8_t类型(一个取值为1~10的数)中,在LCD中显示两位数字问题

问题概况 在执行按键,--过程中,本来数值为1~10.但是在执行过程中,发现数值在经过10数值后,后面的“0”会一直在LCD显示屏中显示。 就是执行操作中,从1,2,3,4,5&#xf…

【QT】QTreeWidgetItem的checkState/setCheckState函数和isSelected/setSelected函数

目录 1、函数原型1.1 checkState/setCheckState1.2 isSelected/setSelected2、功能用途3、示例QTreeWidget的checkState/setCheckState函数和isSelected/setSelected这两组函数有着不同的用途,下面具体说明: 1、函数原型 1.1 checkState/setCheckState Qt::CheckState QTr…

005 vue项目结构 vue请求页面执行流程(vue2)

文章目录 vue项目结构vue请求页面执行流程main.jsrouterHelloWorld.vueApp.vueindex.html vue项目结构 config目录存放的是配置文件,比如index.js可以配置端口 node_modules存放的是该项目依赖的模块,这些依赖的模块在package.json中指定 src目录分析 1…

汇丰xxx

1. Spring Boot 的了解,解决什么问题? 我的理解: Spring Boot 是一个基于 Spring 框架的快速开发脚手架,它简化了 Spring 应用的初始搭建和开发过程。解决的问题: 简化配置: 传统的 Spring 应用需要大量的…

基于 Spring Boot 瑞吉外卖系统开发(一)

基于 Spring Boot 瑞吉外卖系统开发(一) 系统概述 系统功能 技术选型 初始项目和数据准备 初始项目和SQL文件下载 创建数据库并导入数据 打开reggie项目 运行效果 主函数启动项目,访问URL: http://127.0.0.1:8080/backend/pag…

大型语言模型智能应用Coze、Dify、FastGPT、MaxKB 对比,选择合适自己的LLM工具

大型语言模型智能应用Coze、Dify、FastGPT、MaxKB 对比,选择合适自己的LLM工具 Coze、Dify、FastGPT 和 MaxKB 都是旨在帮助用户构建基于大型语言模型 (LLM) 的智能应用的平台。它们各自拥有独特的功能和侧重点,以下是对它们的简要对比: Coz…

【项目管理】第6章 信息管理概论 --知识点整理

项目管理 相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应&…

Zapier MCP:重塑跨应用自动化协作的技术实践

引言:数字化协作的痛点与突破 在当今多工具协同的工作环境中,开发者与办公人员常常面临数据孤岛、重复操作等效率瓶颈。Zapier推出的MCP(Model Context Protocol)协议通过标准化数据交互框架,为跨应用自动化提供了新的…

echart实现动态折线图(vue3+ts)

最近接到个任务,需要用vue3实现动态折线图。之前没有用过,所以一路坎坷,现在记录一下,以后也好回忆一下。 之前不清楚echart的绘制方式,以为是在第一秒的基础上绘制第二秒,后面实验过后,发现并…

Java学习——day24(反射进阶:注解与动态代理)

文章目录 1. 反射与注解2. 动态代理3. 实践:编写动态代理示例4. 注解定义与使用5. 动态代理6. 小结与思考 1. 反射与注解 注解:注解是 Java 提供的用于在代码中添加元数据的机制。它不会影响程序的执行,但可以在运行时通过反射获取和处理。反…