机器学习的一百个概念(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]
深入理解独热编码 🧠
几何解释
从几何角度看,独热编码将类别映射到多维空间中的正交向量。这种表示方法确保了:
- 所有类别之间的欧氏距离相等
- 没有引入人为的顺序关系
- 在向量空间中形成了线性可分的表示
与其他编码方式的对比
-
标签编码(Label Encoding)
- 直接将类别映射为整数
- 可能引入顺序关系
- 计算效率高
- 适用于有序类别
-
二进制编码(Binary Encoding)
- 使用二进制表示
- 维度增长为log2(n)
- 计算效率较高
- 可能失去可解释性
-
独热编码(One-Hot Encoding)
- 使用独立维度表示每个类别
- 不引入顺序关系
- 维度增长线性
- 保持可解释性

优缺点分析 ⚖️
优点 👍
-
无序性保证
- 消除了类别之间的人为顺序关系
- 保持了特征的独立性
- 适合无序类别变量
-
模型兼容性
- 与大多数机器学习算法兼容
- 特别适合线性模型和神经网络
- 便于特征选择和权重分析
-
可解释性
- 结果直观易懂
- 便于追踪特征重要性
- 方便进行特征工程
缺点 👎
-
维度灾难
- 类别数量大时维度剧增
- 产生稀疏矩阵
- 增加计算复杂度
-
内存消耗
- 需要更多存储空间
- 可能导致内存溢出
- 处理大规模数据集困难
-
计算效率
- 训练时间增加
- 预测速度降低
- 模型复杂度提升
应用场景 🎯
适用场景
-
低基数类别特征
- 性别(男/女)
- 教育程度(小学/中学/大学)
- 职业类别(少量分类)
-
模型类型
- 线性回归
- 逻辑回归
- 神经网络
- 支持向量机
-
任务类型
- 分类问题
- 回归问题
- 推荐系统
不适用场景
-
高基数特征
- 用户ID
- 产品SKU
- 详细地址
-
特定算法
- 决策树
- 随机森林
- XGBoost
实践指南 💻
Python实现示例
- 使用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)
- 使用Pandas
import pandas as pd# 创建示例数据框
df = pd.DataFrame({'color': ['红', '蓝', '绿', '红'],'size': ['大', '中', '小', '中']
})# 对指定列进行独热编码
df_encoded = pd.get_dummies(df, columns=['color', 'size'])print("编码后的数据框:\n", df_encoded)
实际应用案例
- 客户流失预测
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)
常见陷阱与注意事项 ⚠️
-
虚拟变量陷阱
- 问题:完全共线性
- 解决:删除一个类别或使用drop_first=True
-
类别处理
- 训练集和测试集类别不一致
- 新类别出现的处理
- 缺失值的处理
-
维度控制
- 设置最大类别数量
- 合并低频类别
- 使用降维技术
总结与展望 🎓
独热编码作为处理分类变量的基础方法,在机器学习中占据重要地位。它的简单直观和良好的可解释性使其成为数据预处理的首选方法之一。然而,在实际应用中需要注意维度灾难和计算效率等问题,并根据具体场景选择合适的优化策略。
未来发展趋势
-
高效编码方法
- 哈希编码
- 实体嵌入
- 目标编码
-
自动化特征工程
- AutoML集成
- 智能编码选择
- 动态特征生成
-
混合编码策略
- 多种编码方法组合
- 上下文感知编码
- 自适应编码机制
通过深入理解和灵活运用独热编码,我们可以更好地处理分类数据,为后续的机器学习模型训练打下坚实基础。在实践中,需要根据具体问题和场景,选择合适的编码策略,并注意平衡表达能力和计算效率。
相关文章:
机器学习的一百个概念(7)独热编码
前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...
用LLama factory时报类似Process 2504721 got signal: 1的解决方法
之前用nohup来远程跑LLama factory微调脚本,是没有问题的,但今天发现运行类似下面这个命令时, nohup llamafactory-cli train examples/train_qlora/qwen_lora.yaml 只要一关闭ssh session,就会终止训练,报类似&…...
解决 Git 通过 SSH 克隆仓库时自动转换为 HTTPS 的问题
解决 Git 通过 SSH 克隆仓库时自动转换为 HTTPS 的问题 在使用 Git 通过 SSH 协议克隆私有仓库时,如果遇到类似以下错误: fatal: unable to access https://itlab.stack.net:stack.git/: Could not resolve host: gitlab.stack这通常是因为 Git 配置错…...
从实用的角度聊聊Linux下文本编辑器VIM
本文从实用的角度聊聊Vim的常用命令。何为实用?我举个不实用的例子大家就明白了,用vim写代码。;) “vim是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成…...
多电机显示并排序
多电机显示并排序 要实现根据后端传递过来的驱动电机数据的数量来显示不同数量的数据列表,我们可以使用 Vue 的 v-for 指令来遍历 driveMotorData 数组,并为每个驱动电机生成一个数据列表。这样,无论后端传来多少个驱动电机的数据࿰…...
佳能imageRUNNER 2206N基本参数及管理员密码
基本参数: 产品类型 激光数码复合机 颜色类型 黑白 涵盖功能 复印/打印/扫描 速度类型 低速 最大原稿尺寸 A3 复印/打印方式 激光静电转印方式 感光材料 OPC 显影系统 干式单组分显影 定影…...
社交类 APP 设计:打造高用户粘性的界面
在当今数字化时代,社交类APP已成为人们日常生活中不可或缺的一部分。然而,随着市场竞争的加剧,如何通过设计提升用户粘性成为社交类APP成功的关键。本文将从设计的关键要素、用户界面优化、功能创新、个性化体验以及持续优化等方面࿰…...
数据编排与Dagster:解锁现代数据管理的核心工具
在数据驱动的时代,如何高效管理复杂的数据管道、确保数据质量并实现团队协作?本文深入探讨数据编排的核心概念,解析其与传统编排器的差异,并聚焦开源工具Dagster如何以“资产为中心”的理念革新数据开发流程,助力企业构…...
网络安全中的“后门”:概念、类型、作用与攻防技术
目录 什么是后门? 后门的常见类型 2.1 按植入方式分类 2.2 按功能分类 后门在安全测试中的作用 后门的玩法与免杀技术 4.1 常见后门技术 4.2 如何实现免杀(Bypass AV) 如何检测和防御后门? 总结 1. 什么是后门ÿ…...
AI | 大模型入门介绍
以下是关于AI大模型中蒸馏、量化、MoE和MHA技术的介绍: 1. 模型蒸馏(Model Distillation) • 定义:模型蒸馏是一种将大型复杂模型(教师模型)的知识转移到小型简单模型(学生模型)的技…...
Jmeter的压测使用
Jmeter基础功能回顾 一、创建Jmeter脚本 1、录制新建 (1)适用群体:初学者 2、手动创建 (1)需要了解Jmeter的常用组件 元件:多个类似功能组件的容器(类似于类) 各元件作用 组件…...
kubernetes》》k8s》》Deployment》》ClusterIP、LoadBalancer、Ingress 内部访问、外边访问
Nginx部署 K8s 集群内外访问服务的方式 节点 Kubernetes 集群中的服务器(指单台) 集群 Kubernetes 管理的一组服务器的集合 边界路由器 为局域网和Internet路由数据包的路由器,执行防火墙保护局域网络 集群网络 遵循Kubernetes网络模型实现集…...
Transformer 通关秘籍8:词向量如何表示近义词?
上一节已经完成了 token 到词向量的转换。那么,使用转换后的词嵌入向量便可以表示 token 之间的语义了吗?便可以表示两个单词是否是近义词,是否是反义词了吗? 是的。 接下来先通过一个例子,来直观地理解一下词嵌入向…...
Vue + Scss项目中实现自定义颜色主题的动态切换
当时面试的时候遇到面试官问的一个问题如何实现自定义颜色主题切换,当时我做的只是elementUIPlus提供的暗黑和默认主题切换 theme.scss // 增加自定义主题类型 $themes: (light: (/* 原有配置保持不变 */),dark: (/* 原有配置保持不变 */),custom: () // 空映射…...
搭建qemu环境
1.安装qemu apt install qemu-system2.编译内核 设置gcc软链接sudo ln -s arm-linux-gnueabihf-gcc arm-linux-gccsudo ln -s arm-linux-gnueabihf-ld arm-linux-ldsudo ln -s arm-linux-gnueabihf-nm arm-linux-nmsudo ln -s arm-linux-gnueabihf-objcopy arm-linux-objc…...
【MVC简介-产生原因、演变历史、核心思想、组成部分、使用场景】
MVC简介 产生原因: MVC(Model-View-Controller)模式诞生于20世纪70年代,由Trygve Reenskaug在施乐帕克研究中心(Xerox PARC)为Smalltalk语言设计,目的是解决图形用户界面(GUI&…...
基于NebulaGraph构建省市区乡镇街道知识图谱(二)
上次我们有讲到构建知识图谱,但是在实际使用的时候会发现某些乡镇街道丢失的问题,因为VID必须全局唯一,覆盖导致原因,另外在全国大批量导入时速度非常慢,为此,我们重新优化表结构与导入语法。 1. 表及索引…...
论文浅尝 | Interactive-KBQA:基于大语言模型的多轮交互KBQA(ACL2024)
转载至:何骏昊 开放知识图谱 原文地址:论文浅尝 | Interactive-KBQA:基于大语言模型的多轮交互KBQA(ACL2024) 笔记整理:何骏昊,东南大学硕士,研究方向为语义解析 论文链接ÿ…...
线性规划工具推荐篇 开源+商用 按需取用
一、开源免费工具 1. GLPK (GNU Linear Programming Kit) 特点: 支持线性规划(LP)、混合整数规划(MIP)使用MathProg语言建模,可通过glpsol命令行求解适合中小规模问题,性能低于商业求解器 适用…...
linux -- php 扩展之xlswriter
xlswriter - PHP 最强性能 Excel 扩展 linux 安装 完整编译安装步骤 ## 下载wget https://pecl.php.net/get/xlswriter tar -zxvf xlswriter cd xlswriterphpize # 执行配置 ./configure # 编译 make make install ./configure 如果报错,就指定配置路径 …...
Dockerfile文件构建镜像Anaconda+Python教程
文章目录 前言Dockerfile 核心模块解析**一、Dockerfile基础镜像选择二、系统基础配置1、时区设置2、镜像源替换 三、系统依赖安装四、复制本地文件五、指定路径六、Anaconda环境配置1、anaconda环境安装2、配置虚拟环境3、创建conda虚拟环境4、启动和安装环境 七、完整dockerf…...
本地部署大模型-web界面(ollama + open-webui)
一、安装ollama 二、安装部署open-webui 1、项目运行环境 (1)配置python环境—官方下载链接 可通过命令行直接更改python镜像源为阿里云镜像源: >pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/也可手动修…...
Uniapp 实现微信小程序滑动面板功能详解
文章目录 前言一、功能概述二、实现思路三、代码实现总结 前言 Uniapp 实现微信小程序滑动面板功能详解 一、功能概述 滑动面板是移动端常见的交互组件,通常用于在页面底部展开内容面板。本文将介绍如何使用 Uniapp 开发一个支持手势滑动的底部面板组件࿰…...
redis一些常用的命令(1)
启动redis redis-server /home/XXX/myredis/redis.conf 默认不是后台运行的,修改配置文件,daemonized on /var/run/redis.pid when daemonized port 6380 默认端口的6379 bind:127.0.0.1 默认是本地 连接不同的端口 redis-cli -p 6380 制…...
Java虚拟机JVM知识点(已完结)
JVM内存模型 介绍下内存模型 根据JDK8的规范,我们的JVM内存模型可以拆分为:程序计数器、Java虚拟机栈、堆、元空间、本地方法栈,还有一部分叫直接内存,属于操作系统的本地内存,也是可以直接操作的。 详细解释一下 程…...
【C++进阶四】vector模拟实现
目录 1.构造函数 (1)无参构造 (2)带参构造函数 (3)用迭代器构造初始化函数 (4)拷贝构造函数 2.operator= 3.operator[] 4.size() 5.capacity() 6.push_back 7.reserve 8.迭代器(vector的原生指针) 9.resize 10.pop_back 11.insert 12.erase 13.memcpy…...
VUE3+Mapbox-GL 实现鼠标绘制矩形功能的详细代码和讲解
以下是如何使用 Mapbox GL JS 实现鼠标绘制矩形功能的详细代码和讲解。Mapbox GL JS 是一个强大的 JavaScript 库,可以用来创建交互式地图。下面将通过监听鼠标事件并动态更新地图图层来实现这一功能。 实现步骤 初始化地图 在 HTML 文件中引入 Mapbox GL JS 库&…...
《筋斗云的K8s容器化迁移》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章:斗战胜佛的延迟焦虑****第二章:微服务化的紧箍咒****第三章:混沌中的流量劫持****第四章:量子筋斗的终极形态****终章&…...
面试遇到的几个问题小记20250401
一、echarts设置数据的几种方式 在 ECharts 里,设置数据存在多种方式,下面为你详细介绍: 在初始化配置项时设置数据 这是最为常见的方式,也就是在创建 ECharts 实例的时候,于配置项 option 里直接设置数据。 // 基于…...
java swing 密码框如何在获取到焦点时,输入法自动切换为英文状态
一、java swing 密码框如何在获取到焦点时,输入法自动切换为英文状态 在 Java Swing 中,JPasswordField 用于输入密码,默认情况下,输入法状态不受控。要在获取焦点时自动切换为英文状态,可以通过以下步骤实现…...
