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

人工智能基础知识笔记八:数据预处理

1、简介       

        在进行数据分析之前,数据预处理是一个至关重要的步骤。它包括了数据清洗、转换和特征工程等过程,以确保数据的质量并提高模型的性能。数据预处理是机器学习和数据分析中至关重要的步骤,其中分类变量的编码是核心任务之一。本文详细讲解四种常用编码方法(One-Hot Encoding、Label Encoding、Frequency Encoding、Target Encoding)。

 2、为什么需要编码?

        大多数机器学习算法(如线性回归、决策树等)无法直接处理文本型分类变量(如“男/女”、“北京/上海/广州”)。通过编码技术,可将分类变量转换为数值形式,同时保留其语义信息。

3、常用编码方法

3.1、 One-Hot Encoding(独热编码)

        One-Hot编码是将分类变量转换为可以提供给机器学习算法的形式的一种方式。通过创建新的二进制列(0或1),每个代表原始类别中的一个可能值。

核心思想
  • 将每个类别转换为一个独立的二进制列(0或1)

  • 适用于无序分类变量(如城市、颜色)

优点
  • 避免人为引入顺序关系

缺点

  •  高基数(类别多)时会导致维度爆炸

示例代码:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder# 示例数据
data = pd.DataFrame({'City': ['北京', '上海', '广州', '北京', '深圳']})# 方法一:使用pandas
df_encoded = pd.get_dummies(data, columns=['City'])# 方法二:使用sklearn
encoder = OneHotEncoder(sparse=False)
encoded_array = encoder.fit_transform(data[['City']])
df_sklearn = pd.DataFrame(encoded_array, columns=encoder.get_feature_names_out(['City']))

3.2、 Label Encoding(标签编码)

Label编码是一种将分类变量转换成整数的方法。对于具有自然顺序的类别变量尤其有用。

注意:使用label encoding时要小心,因为某些模型可能会错误地认为这些整数值之间存在某种顺序关系。

核心思想:
  • 为每个类别分配一个唯一的整数

  • 适用于有序分类变量(如学历:小学<初中<高中)

示例代码:

from sklearn.preprocessing import LabelEncoder# 示例数据
data = pd.DataFrame({'Education': ['小学', '初中', '高中', '大学', '硕士']})# 编码
le = LabelEncoder()
data['Education_encoded'] = le.fit_transform(data['Education'])print(data)
#    Education  Education_encoded
# 0       小学                  0
# 1       初中                  1
# 2       高中                  2
# 3       大学                  3
# 4       硕士                  4

3.3、 Frequency Encoding(频率编码)

频率编码是根据每个类别的出现频率来替换该类别。这种方法有助于捕捉类别与目标变量之间的潜在关系。

核心思想:
  • 用类别出现的频率代替原始类别

  • 适用于高基数分类变量(如邮政编码)

优点:
  • 有效控制维度

缺点:

  •  可能丢失重要类别信息

示例代码:

# 计算频率
freq = data['City'].value_counts(normalize=True)# 映射到原始数据
data['City_Freq'] = data['City'].map(freq)# 结果示例:
# 北京 → 0.4, 上海 → 0.2, 广州 → 0.2, 深圳 → 0.2

3.4、 Target Encoding(目标编码)

目标编码基于每个类别的平均目标值来进行编码。这种方法特别适用于高基数的分类变量。

注意事项:为了避免过拟合,通常会在训练集上计算编码,在验证集/测试集上应用这些编码。同时必须使用交叉验证防止数据泄露,以及需添加平滑处理防止过拟合。

核心思想
  • 用目标变量的统计量(如均值)代表类别

  • 适用于分类任务中的高基数特征

示例代码:

import numpy as np# 示例数据(含目标变量)
data = pd.DataFrame({'City': ['A','A','B','B','C','C'],'Target': [1,0,1,1,0,0]
})# 计算各城市的目标均值
mean_encoding = data.groupby('City')['Target'].mean().to_dict()# 添加平滑(假设alpha=2,smoothing_factor=10)
n = data.groupby('City').size()
global_mean = data['Target'].mean()
data['City_Target'] = (data['City'].map(mean_encoding)*n + global_mean*10) / (n + 10)# 结果示例:
# City A: (0.5*2 + 0.5*10)/(2+10) = 0.5

4、方法对比与选择建议

方法适用场景优点缺点
One-Hot Encoding类别少(<15),无序数据保留完整信息维度爆炸
Label Encoding明确有序的分类变量保持顺序关系误导数值关系
Frequency Encoding高基数类别降维效果好丢失部分信息
Target Encoding监督学习中的高基数特征携带目标信息需防过拟合

 5、最佳实践建议

  1. 分类型变量处理流程

    • 类别数 < 10 → 优先考虑One-Hot

    • 类别数 ≥ 10 → 尝试Frequency/Target Encoding

    • 明确有序 → 使用Label Encoding

  2. 防止Target Encoding过拟合

    • 使用K-Fold交叉验证

    • 添加平滑处理(如Bayesian平均)

    • 在验证集上计算编码值

  3. 混合使用策略

    1. 对高基数特征使用Target Encoding
    2. 对其他特征使用One-Hot Encoding

完整示例代码:

# 综合处理示例
import pandas as pd
from sklearn.model_selection import train_test_split# 加载数据
data = pd.read_csv('your_data.csv')
X = data.drop('target', axis=1)
y = data['target']# 划分数据集
X_train, X_val = train_test_split(X, test_size=0.2)# Target Encoding函数
def target_encode(train, val, col, target, alpha=5):# 计算全局均值global_mean = train[target].mean()# 计算各组的统计量agg = train.groupby(col)[target].agg(['count', 'mean'])counts = agg['count']means = agg['mean']# 计算平滑后的值smooth = (counts * means + global_mean * alpha) / (counts + alpha)# 应用到验证集val[col+'_encoded'] = val[col].map(smooth)return train, val# 对分类变量应用不同编码
categorical_cols = ['city', 'gender', 'education']for col in categorical_cols:if col == 'education':  # 有序变量le = LabelEncoder()X_train[col] = le.fit_transform(X_train[col])X_val[col] = le.transform(X_val[col])elif col == 'city':     # 高基数变量X_train, X_val = target_encode(X_train, X_val, col, 'target')else:                   # 普通分类变量X_train = pd.get_dummies(X_train, columns=[col])X_val = pd.get_dummies(X_val, columns=[col])

通过合理选择编码方法,可以显著提升模型性能。建议在实践中根据数据特性和业务场景灵活组合使用这些技术。

http://www.xdnf.cn/news/5018.html

相关文章:

  • 【K8S系列】Kubernetes常用 命令
  • Java学习手册:单体架构到微服务演进
  • PCA降维
  • Linux 文件目录管理常用命令
  • 如何减少极狐GitLab 容器镜像库存储?
  • 基于卷积神经网络和Pyqt5的猫狗识别小程序
  • Femap许可使用数据分析
  • NestJS 框架深度解析
  • 《让歌声跨越山海:Flutter借助Agora SDK实现高质量连麦合唱》
  • 力扣题解:21.合并两个有序链表(C语言)
  • 对遗传算法思想的理解与实例详解
  • Redis 主从复制集群搭建教程
  • 基于vue框架的电子商城m8qu8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 构筑芯片行业的“安全硅甲”
  • SSL证书格式详解:PEM、CER、DER、JKS、PKCS12等
  • k8s之探针
  • 数据结构【二叉搜索树(BST)】
  • opencv中的图像特征提取
  • 解构C++高级命名空间:构建空间作用域·控制兼容
  • 【MySQL】第二弹——MySQL表的增删改查(CRUD)
  • 多态(c++详细版)
  • 大模型(LLMs)agent
  • 图像匹配导航定位技术 第 8 章
  • 编专利或委托他人编专利属于学术不端行为吗?
  • C++ 函数类型及实用例题
  • 前端如何处理精度丢失问题
  • 影响服务器性能的主要因素是什么
  • 量子通信技术及其在信息安全中的应用:开启无条件安全通信的新时代
  • 【Python】pyinstaller 反编译 exe
  • 手撕基于AMQP协议的简易消息队列-4(项目需求分析)