当前位置: 首页 > news >正文

机器学习数据预处理:数据编码

机器学习数据预处理:数据编码(超通俗完整版)

数据编码就是把文字、类别、标签,转换成计算机能看懂的数字,是处理分类特征必做步骤,不管是本科作业、研究生论文、工业项目都高频使用。


一、什么是数据编码?为什么必须做?

1. 一句话理解

机器只认识数字,不认识文字
“男/女、红/绿/蓝、北京/上海、低/中/高”这类特征,必须转成数字才能建模,这个过程就是数据编码

2. 不编码会怎样?

  • 模型直接报错,无法训练
  • 文字类别无法参与计算
  • 无法做距离计算、梯度下降、树分裂

二、4 种最常用编码方法(通俗易懂版)

1. 标签编码 Label Encoding

把每个类别直接映射成一个整数。

  • 男→0,女→1
  • 红→0,绿→1,蓝→2

优点:简单、不升维度
缺点:会引入虚假顺序
模型可能误以为:蓝(2) > 绿(1) > 红(0)

适合:有序类别(低<中<高、小<中<大)


2. 独热编码 One-Hot Encoding(最常用)

每个类别单独一列,用 0/1 表示是否属于该类。

  • 红 → [1,0,0]
  • 绿 → [0,1,0]
  • 蓝 → [0,0,1]

优点:无顺序误解,最安全
缺点:类别多会维度爆炸

适合:无序、类别少的特征(性别、颜色、品种)


3. 目标编码 Target Encoding(高级上分技巧)

用该类别对应的目标均值来编码。
例如:颜色→购买率

  • 红色类别购买率 0.7 → 红色=0.7
  • 蓝色类别购买率 0.3 → 蓝色=0.3

优点:不降信息、不升维度
缺点:容易信息泄露/过拟合

适合:树模型(XGBoost、LightGBM、RF)


4. 二进制编码 Binary Encoding

先标签编码 → 再转二进制 → 按位展开
既保留信息,又不会维度爆炸。

适合:类别非常多的特征(城市、商品ID)


三、一张表看懂怎么选编码

编码方法无序类别有序类别类别很多优点缺点
标签编码❌不适合✅适合简单、快引入顺序
独热编码✅最适合❌不适合❌爆炸安全、通用维度爆炸
目标编码✅适合✅适合✅适合强表达力易过拟合
二进制编码✅适合✅适合✅极适合低维、高效可解释性差

四、最简单选择口诀

  • 有序类别(低中高)→标签编码
  • 无序、类别少 →独热编码
  • 树模型、类别多 →目标编码
  • 超多类别(ID类)→二进制/Embedding

五、完整可运行代码(含3种编码+对比+可视化)

直接复制运行,包含:数据集、标签编码、独热编码、目标编码、模型对比、PCA可视化。

importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.preprocessingimportLabelEncoder,OneHotEncoderfromsklearn.decompositionimportPCAfromsklearn.model_selectionimporttrain_test_splitfromsklearn.ensembleimportRandomForestClassifierfromsklearn.metricsimportaccuracy_score# ======================# 1. 构造数据集# ======================np.random.seed(42)n=500df=pd.DataFrame({"Color":np.random.choice(["Red","Green","Blue","Yellow"],n),"City":np.random.choice(["Beijing","Shanghai","Guangzhou","Shenzhen"],n),"Rating":np.random.choice(["Low","Medium","High"],n),"Age":np.random.randint(18,60,n),"Income":np.random.randint(3000,15000,n),})# 构造标签df["Purchased"]=(((df["Color"]=="Red")&(df["Rating"]=="High"))|((df["City"].isin(["Beijing","Shanghai"]))&(df["Age"]<30))).astype(int)print("原始数据:")print(df.head())# ======================# 2. 标签编码# ======================df["Color_LE"]=LabelEncoder().fit_transform(df["Color"])df["City_LE"]=LabelEncoder().fit_transform(df["City"])df["Rating_LE"]=df["Rating"].map({"Low":0,"Medium":1,"High":2})# ======================# 3. 独热编码# ======================df_onehot=pd.get_dummies(df[["Color","City","Rating"]])# ======================# 4. 目标编码# ======================color_mean=df.groupby("Color")["Purchased"].mean()df["Color_TE"]=df["Color"].map(color_mean)# ======================# 5. 编码分布可视化# ======================plt.figure(figsize=(16,10))plt.subplot(331)sns.countplot(x=df["Color"])plt.title("原始颜色分布")plt.subplot(332)sns.histplot(x=df["Color_LE"])plt.title("标签编码")plt.subplot(333)sns.histplot(x=df["Color_TE"])plt.title("目标编码")plt.show()# ======================# 6. 模型效果对比# ======================X1=df[["Color_LE","City_LE","Rating_LE","Age","Income"]]X2=pd.concat([df_onehot,df[["Age","Income"]]],axis=1)X3=df[["Color_TE","City_LE","Rating_LE","Age","Income"]]y=df["Purchased"]deftest_acc(X):X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)m=RandomForestClassifier(random_state=42)m.fit(X_train,y_train)returnaccuracy_score(y_test,m.predict(X_test))print("标签编码准确率:",test_acc(X1))print("独热编码准确率:",test_acc(X2))print("目标编码准确率:",test_acc(X3))# ======================# 7. PCA 空间分布对比# ======================defpca_plot(X,title):pca=PCA(2)x_pca=pca.fit_transform(X)plt.scatter(x_pca[:,0],x_pca[:,1],c=y,cmap="coolwarm")plt.title(title)plt.show()pca_plot(X1,"Label Encoding")pca_plot(X2,"One-Hot Encoding")pca_plot(X3,"Target Encoding")

六、编码常见误区(面试/作业必看)

  1. 对无序特征用标签编码→ 模型学错规律
  2. 类别太多还用独热→ 维度爆炸、训练变慢
  3. 目标编码不做平滑→ 严重过拟合
  4. 先编码再划分数据集→ 信息泄露
  5. 树模型用独热→ 效果不如目标编码

七、总结(背诵版)

  1. 数据编码 = 文字类别 → 数字
  2. 有序 → 标签编码
  3. 无序少类 → 独热编码
  4. 树模型多类 → 目标编码
  5. 编码选对,模型效果直接起飞
http://www.jsqmd.com/news/700439/

相关文章:

  • 终极MDCX Docker容器化部署指南:从架构解析到高效运维
  • Duolingo免费开放九种语言高级学习内容
  • Algorithm-Implementations 部署与扩展:Web应用与Android应用完整开发指南
  • 如何快速上手Pointer-Generator:10分钟构建你的第一个摘要模型
  • SMS Backup+:安卓短信备份终极指南,一键安全保护你的通信记录
  • GetSSL高级配置指南:双RSA/ECDSA证书和多服务器部署
  • gh_mirrors/lib/libnetwork:终极容器网络解决方案完全指南
  • Elementary测试框架详解:构建可靠的数据质量监控
  • 第69篇:从Transformer到扩散模型——主流AI生成模型的核心思想演进(原理解析)
  • VSCode + Prettier 配置全攻略:让你的微信小程序开发体验提升一个档次
  • 用自家产品构建自家产品:Cloudflare Images 的工程架构解析
  • 如何快速上手ModernGL:10个简单步骤掌握Python 3D图形编程
  • SQL报表聚合中间结果过大_分阶段统计
  • 10个Electron Release Server最佳实践:提升应用发布效率
  • ml-intern更新日志:了解最新功能与改进
  • 终极Windows系统优化指南:5分钟掌握WinUtil一键管理工具
  • Go-arg高级用法:子命令、环境变量和自定义验证的完整教程
  • FigmaCN:3分钟搞定Figma中文界面的终极指南
  • GPT-5.5降临:OpenAI打造最强智能体,引领AI工作新纪元!
  • PHP Server Monitor高级监控技巧:服务端口与网站URL监控实战
  • 木及简历开发者入门教程:从源码构建到本地部署
  • Ryujinx Switch模拟器终极配置指南:5步快速提升游戏性能
  • FuckFuckadblock开发者指南:如何贡献和扩展过滤规则
  • 华为云CodeArts IDE Python实战:从零搭建高效开发环境
  • 从零到精通:AI大模型学习路线图,助你月薪30K+!2026年AI大模型学习路线终极指南
  • source-map-support 高级用法:自定义源映射检索与内存优化全指南
  • 深度解析游戏插件加载机制:专业工具全面指南
  • 从 CDS Cube 到 Analytical Query,理解 ABAP CDS 分析查询的运行机制
  • 从‘振铃’到‘死区’:深入PMSM单电阻采样的那些硬件坑,你的采样电路真的调好了吗?
  • [独眼情报](http://wechat.doonsec.com/wechat_echarts/?biz=MzkzNDIzNDUxOQ==)