06-机器学习-数据预处理

数据清洗

数据清洗是数据预处理的核心步骤,旨在修正或移除数据集中的错误、不完整、重复或不一致的部分,为后续分析和建模提供可靠基础。以下是数据清洗的详细流程、方法和实战示例:


一、数据清洗的核心任务

问题类型表现示例影响
缺失值数值型字段为空(NaN)模型无法处理缺失值,导致训练中断或偏差
异常值年龄=200岁,房价=-100万扭曲统计指标(如均值),降低模型泛化性
重复数据两行记录完全相同导致模型过拟合,降低数据代表性
不一致数据日期格式混乱(2023-09-01 vs 01/09/23)解析错误,特征提取失败

二、数据清洗流程与工具

1. 缺失值处理
  • 检测缺失值

    # 统计每列缺失比例
    missing_ratio = data.isnull().mean() * 100
    print(missing_ratio.sort_values(ascending=False))
    
  • 处理方法

    方法适用场景代码示例
    直接删除缺失比例高(>80%)或无关字段data.dropna(axis=1, thresh=len(data)*0.2)
    均值/中位数填充数值型字段,缺失随机分布data['age'].fillna(data['age'].median(), inplace=True)
    众数填充类别型字段data['gender'].fillna(data['gender'].mode()[0], inplace=True)
    插值法时间序列数据(如温度记录)data['temperature'].interpolate(method='time', inplace=True)
    模型预测填充复杂场景(如多变量关联缺失)使用KNN或随机森林预测缺失值(见下方代码)

    KNN填充示例

    from sklearn.impute import KNNImputer
    imputer = KNNImputer(n_neighbors=5)
    data_filled = pd.DataFrame(imputer.fit_transform(data), columns=data.columns)
    

2. 异常值处理
  • 检测方法

    • 描述性统计:检查最小/最大值是否合理
      print(data.describe())
      
    • 箱线图(Boxplot)
      plt.figure(figsize=(8,4))
      sns.boxplot(x=data['income'])
      plt.title("Income Distribution")
      plt.show()
      
    • Z-Score法(正态分布数据):
      z_scores = (data['value'] - data['value'].mean()) / data['value'].std()
      outliers = data[abs(z_scores) > 3]  # Z>3为异常
      
    • IQR法(非正态分布数据):
      Q1 = data['age'].quantile(0.25)
      Q3 = data['age'].quantile(0.75)
      IQR = Q3 - Q1
      lower_bound = Q1 - 1.5 * IQR
      upper_bound = Q3 + 1.5 * IQR
      
  • 处理方法

    方法代码示例
    删除异常值data = data[(data['age'] >= 0) & (data['age'] <= 100)]
    截断(Winsorize)from scipy.stats.mstats import winsorize<br>data['income'] = winsorize(data['income'], limits=[0.05, 0.05])
    分箱(Binning)data['age_bin'] = pd.cut(data['age'], bins=[0,18,35,60,100])

3. 重复数据处理
  • 检测与删除

    # 检测完全重复的行
    duplicates = data.duplicated()
    print(f"重复行数量: {duplicates.sum()}")# 删除重复行(保留第一个出现值)
    data.drop_duplicates(keep='first', inplace=True)
    
  • 部分重复处理(如用户ID重复但信息不同):

    # 按关键字段去重(如用户ID)
    data.drop_duplicates(subset=['user_id'], keep='last', inplace=True)
    

4. 不一致数据修正
  • 格式统一

    # 日期格式标准化
    data['date'] = pd.to_datetime(data['date'], format='mixed')# 文本大小写统一
    data['category'] = data['category'].str.lower()# 单位统一(如货币转换)
    data['price'] = data['price'].apply(lambda x: x * 6.5 if 'USD' in x else x
    )
    
  • 逻辑校验

    # 检查年龄与出生日期是否一致
    current_year = pd.Timestamp.now().year
    data['calculated_age'] = current_year - data['birth_year']
    invalid_age = data[abs(data['age'] - data['calculated_age']) > 1]
    

三、实战案例:电商订单数据清洗

原始数据问题
import pandas as pd
data = pd.DataFrame({'order_id': [101, 102, 103, 104, 105, 106],'user_id': [1, 2, 2, 3, 4, None],'price': [29.9, 199.0, 199.0, -50.0, 89.9, 120.0],'order_date': ['2023-09-01', '01/09/2023', '2023-09-01', '2023-10-32', None, '2023-09-05']
})
清洗步骤
  1. 处理缺失值

    # 填充user_id缺失值(假设新用户ID为999)
    data['user_id'].fillna(999, inplace=True)# 删除order_date缺失的行
    data.dropna(subset=['order_date'], inplace=True)
    
  2. 修正异常价格

    # 删除价格为负的订单
    data = data[data['price'] > 0]# 截断价格超过200的订单(假设业务上限为200)
    data['price'] = data['price'].clip(upper=200)
    
  3. 标准化日期格式

    # 转换日期并过滤无效日期(如2023-10-32)
    data['order_date'] = pd.to_datetime(data['order_date'], errors='coerce')
    data.dropna(subset=['order_date'], inplace=True)
    
  4. 去重

    # 按user_id和order_date去重(保留最后一条)
    data.drop_duplicates(subset=['user_id', 'order_date'], keep='last', inplace=True)
    
清洗后数据
order_iduser_idpriceorder_date
101129.92023-09-01
1022199.02023-09-01
105489.9NaT(已删除)
106999120.02023-09-05

四、注意事项

  1. 避免过度清洗:保留合理的数据多样性(如正常的价格波动)。
  2. 记录清洗日志:跟踪每一步操作的影响(如删除了多少行数据)。
  3. 业务规则优先:与领域专家确认异常定义(如“用户年龄>100是否合理”)。
  4. 自动化流水线:对持续更新的数据,使用Pipeline封装清洗步骤:
    from sklearn.pipeline import Pipelineclean_pipeline = Pipeline([('fill_na', SimpleImputer(strategy='constant', fill_value=999)),('remove_duplicates', DropDuplicates(subset=['user_id'])),('clip_outliers', ColumnTransformer([('clip', FunctionTransformer(lambda x: x.clip(0, 200)), ['price'])])),
    ])
    

数据变换

以下是对数据变换的更紧凑、更细节化的总结,突出核心要点与实用技巧:


一、标准化/归一化:核心差异

方法公式适用场景异常值敏感度Scikit-learn工具
Z-score z = x − μ σ z = \frac{x - \mu}{\sigma} z=σxμ数据近似正态分布,线性模型(SVM、回归)StandardScaler
Min-Max x ′ = x − x min ⁡ x max ⁡ − x min ⁡ x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}} x=xmaxxminxxmin图像像素、神经网络输入层MinMaxScaler
Robust x ′ = x − median I Q R x' = \frac{x - \text{median}}{IQR} x=IQRxmedian存在异常值,非正态分布RobustScaler

关键技巧

  • 树模型(如随机森林、XGBoost)无需标准化,但对特征组合敏感的模型(FM、NN)需要。
  • 归一化到[-1,1]可能对某些激活函数(如tanh)更友好。

二、非线性变换:快速选择

  1. 对数变换:右偏数据(如收入),用np.log1p避免零值。
  2. Box-Cox变换:需数据严格为正,自动优化λ值(scipy.stats.boxcox)。
  3. 分位数变换:强制数据服从均匀/正态分布(QuantileTransformer)。

示例代码

from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='yeo-johnson')  # 兼容零/负值
X_transformed = pt.fit_transform(X)

三、分类变量编码:场景化方案

方法优点缺点适用模型
One-Hot无顺序假设,兼容所有模型高维稀疏,需处理共线性线性模型、神经网络
Target编码保留类别与目标的关系需防过拟合(如交叉验证)树模型、高基数类别
Embedding低维稠密,捕捉语义相似性需预训练或端到端学习深度学习(NLP/推荐系统)

关键点

  • 高基数类别优先用Target EncodingCatBoost内置处理。
  • 树模型可尝试Label Encoding,但需验证类别顺序是否合理。

四、特征工程:高效操作

  1. 数值特征
    • 交叉特征:加减乘除(如电商中“单价×购买量=总金额”)。
    • 分箱:等频分箱(pd.qcut)或等宽分箱(pd.cut),捕捉非线性。
  2. 时间特征
    • 提取周期性(星期、月份),滑动窗口统计(均值、标准差)。
  3. 文本特征
    • 短文本用TF-IDF,长文本用BERT嵌入,高维稀疏时用TruncatedSVD降维。

代码示例

# 时间特征处理
df['hour'] = df['timestamp'].dt.hour
df['is_weekend'] = df['timestamp'].dt.weekday >= 5

五、降维:选择策略

方法核心思想适用场景注意事项
PCA线性投影最大化方差高维数据可视化/去噪需先标准化,可能丢失非线性信息
t-SNE非线性保留局部结构可视化高维聚类计算代价高,不用于特征输入
UMAP平衡速度与局部/全局结构大规模数据可视化/预处理参数敏感,需调参

经验

  • 输入特征>50时优先用PCA,保留95%方差(n_components=0.95)。
  • 避免对树模型使用降维,可能破坏特征重要性。

六、避坑指南

  1. 数据泄露
    • 所有变换必须仅用训练集统计量!用Pipeline确保流程:
      from sklearn.pipeline import make_pipeline
      pipe = make_pipeline(StandardScaler(), SVM())
      pipe.fit(X_train, y_train)
      
  2. 异常值处理
    • 缩尾处理(np.clip)或中位数填充,避免破坏分布。
  3. 评估验证
    • 对KNN、SVM等敏感模型,对比不同缩放方法的分类边界(如决策边界图)。

七、端到端流程

  1. 输入检查:分布(直方图/Q-Q图)、缺失值、异常值。
  2. 数值特征:缩放→非线性变换→分箱。
  3. 分类特征:编码→嵌入(可选)。
  4. 特征构造:领域知识驱动交叉/聚合。
  5. 输出验证:模型在验证集的表现波动是否<5%。

总结:数据变换需与模型特性深度耦合,通过实验迭代优化。记住:“Garbage in, garbage out”——宁可花80%时间在数据准备,而非调参!


特征工程

特征工程:从原始数据到模型燃料的核心技术

特征工程是机器学习的“炼金术”,旨在将原始数据转化为模型可理解的强特征,直接影响模型性能上限。以下是结构化拆解:


一、核心目标与价值
  • 目标:构造高信息量、低冗余、适配模型的特征。
  • 价值
    • 提升模型准确率(如添加用户历史行为统计特征)
    • 降低计算成本(通过降维/特征选择)
    • 增强可解释性(如分箱后的年龄组代替原始值)

二、特征构造:从原始数据中“挖掘金子”
  1. 时间特征

    • 基础字段:年、月、日、小时、星期几、是否节假日
    • 衍生特征:时间间隔(如上次购买距今的天数)、滑动窗口统计(过去7天均值)
    df['purchase_hour'] = df['timestamp'].dt.hour
    df['days_since_last_purchase'] = (current_date - df['last_purchase_date']).dt.days
    
  2. 交互特征(组合特征)

    • 数值交互:加减乘除(如“单价×数量=总价”)
    • 类别交叉:笛卡尔积(如“地区×产品类型”生成组合标签)
    df['price_per_sqmeter'] = df['total_price'] / df['area']
    
  3. 统计聚合特征

    • 单维度统计:用户历史购买金额的均值、最大值、方差
    • 跨表关联:订单表按用户ID聚合的订单数、退货率
    user_stats = orders.groupby('user_id')['amount'].agg(['mean', 'max'])
    
  4. 文本/图像特征

    • 文本:TF-IDF关键词权重、BERT句向量、情感分析得分
    • 图像:边缘特征、颜色直方图、预训练CNN提取的特征图

三、特征变换:提升模型适配性
  1. 分箱(Binning)

    • 等宽分箱:固定区间宽度(如年龄每10年一档)
    • 等频分箱:保证每箱样本量均衡
    • 模型分箱:使用决策树寻找最优分割点
    df['age_bin'] = pd.cut(df['age'], bins=[0,18,35,60,100], labels=['child', 'young', 'adult', 'senior'])
    
  2. 非线性变换

    • 对数变换:处理右偏分布(np.log1p避免零值)
    • Box-Cox变换:自动优化正态性(仅适用于正值)
    • 分位数变换:强制服从指定分布(如正态、均匀)
  3. 高基数类别处理

    • 目标编码(Target Encoding):用目标变量的统计量(如均值)代替类别
    • 频率编码:使用类别出现频率作为特征值
    • 嵌入编码(Embedding):通过神经网络学习低维表示(如Word2Vec)

四、特征选择:剔除噪声与冗余
方法原理适用场景
过滤法基于统计指标(如方差、卡方检验)快速初筛,计算成本低
包裹法通过模型性能迭代选择特征子集精确但计算代价高(递归特征消除)
嵌入法模型训练中自动选择(如L1正则化)与模型耦合,高效

实用技巧

  • 对树模型,直接使用feature_importances_筛选重要性>阈值特征
  • 对线性模型,结合Lasso回归的系数稀疏性做特征剔除

五、自动化特征工程工具
  1. FeatureTools:自动生成跨表聚合特征(如“用户最近3次登录时间标准差”)
  2. TSFresh:针对时间序列自动提取数百种统计特征(如自相关性、傅里叶变换系数)
  3. AutoFeat:自动构造多项式特征并进行显著性筛选
# FeatureTools示例
import featuretools as ft
es = ft.EntitySet()
es = es.entity_from_dataframe(entity_id='users', dataframe=users_df, index='user_id')
features, feature_defs = ft.dfs(entityset=es, target_entity='users')

六、避坑指南与最佳实践
  1. 避免数据泄露

    • 所有统计量(如Target Encoding的均值)必须仅从训练集计算!
    • 使用Pipeline封装预处理与模型训练:
      from sklearn.pipeline import Pipeline
      pipe = Pipeline([('encoder', TargetEncoder()), ('model', RandomForest())])
      
  2. 领域知识驱动

    • 在电商场景中,构造“商品价格与类目平均价格的比值”可能比单纯价格更有效
    • 在风控场景中,组合“申请时间与工作时段的重叠度”作为特征
  3. 迭代验证

    • 通过AB测试对比不同特征组合的模型性能
    • 监控特征稳定性(如PSI指标)防止线上数据分布偏移

七、终极心法
  • “Less is More”:优先构造10个强特征,而非100个弱特征。
  • “Think Like a Model”:理解模型如何利用特征(如线性模型依赖线性可分性,NN偏好稠密低维输入)。
  • “Data First, Algorithm Second”:特征工程提升的上限远高于调参!

总结:特征工程是融合领域知识、数据直觉与工程技巧的艺术。掌握核心方法后,需在业务场景中反复迭代,才能炼出“模型友好”的金牌特征。


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

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

相关文章

【统计的思想】假设检验(二)

假设检验是根据人为设定的显著水平&#xff0c;对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设&#xff0c;只是说明在设定的显著水平下&#xff0c;零假设成立的概率比较小&#xff0c;并不是说零假设就肯定不成立。如果零假设事实上是成立…

2025多目标优化创新路径汇总

多目标优化是当下非常热门且有前景的方向&#xff01;作为AI领域的核心技术之一&#xff0c;其专注于解决多个相互冲突的目标的协同优化问题&#xff0c;核心理念是寻找一组“不完美但均衡”的“帕累托最优解”。在实际中&#xff0c;几乎处处都有它的身影。 但随着需求场景的…

DeepSeek-R1试用

最近DeepSeek太火了&#xff0c;对配置要求不高。刚好放假&#xff0c;下载试试。发现开源大模型的生态做的挺好的&#xff0c;几分钟就能在本地部署一个大模型。 配置 NVIDIA RTX 2060 6GB&#xff08;最低要求 NVIDIA GTX 1060 6GB &#xff09; 下载Ollama Ollama是一个…

Android中Service在新进程中的启动流程2

目录 1、Service在客户端的启动入口 2、Service启动在AMS的处理 3、Service在新进程中的启动 4、Service与AMS的关系再续 上一篇文章中我们了解了Service在新进程中启动的大致流程&#xff0c;同时认识了与客户端进程交互的接口IApplicationThread以及与AMS交互的接口IActi…

C语言--数据在内存中的存储

在C语言中&#xff0c;数据在内存中的存储方式主要取决于数据的类型和存储位置。以下是C语言中数据在内存中的存储方式的详细说明&#xff1a; 1. 数据类型与存储方式 基本数据类型 • 整数类型&#xff08;如int、short、long等&#xff09;&#xff1a; • 存储方式&#x…

【PySide6快速入门】QDialog对话框的使用

文章目录 PySide6快速入门&#xff1a;QDialog对话框的使用前言QDialog的基本用法创建和显示对话框 QDialog的常用函数1. exec()2. accept()3. reject()4. setWindowTitle()5. setModal()6. setFixedSize()7. resize()8. reject()9. setLayout()10. open() 总结 PySide6快速入门…

2748. 美丽下标对的数目(Beautiful Pairs)

2748. 美丽下标对的数目&#xff08;Beautiful Pairs&#xff09; 题目分析 给定一个整数数组 nums&#xff0c;我们需要找出其中符合条件的“美丽下标对”。美丽下标对是指&#xff0c;数组中的某一对数字 nums[i] 和 nums[j]&#xff08;其中 0 ≤ i < j < nums.leng…

计网week1+2

计网 一.概念 1.什么是Internet 节点&#xff1a;主机及其运行的应用程序、路由器、交换机 边&#xff1a;通信链路&#xff0c;接入网链路主机连接到互联网的链路&#xff0c;光纤、网输电缆 协议&#xff1a;对等层的实体之间通信要遵守的标准&#xff0c;规定了语法、语义…

在 Vue 3 中,怎么管理环境变量

在 Vue 3 中&#xff0c;环境变量管理是通过 .env 文件来进行的&#xff0c;利用这些文件可以让开发者根据不同的环境&#xff08;开发、生产、测试等&#xff09;配置不同的变量。这一机制由 Vite 构建工具支持&#xff0c;它帮助开发者根据不同的环境需求做出相应配置。 1. …

Python的那些事第三篇:Python编程的“调味料”与“交流术”运算符与输入输出

运算符与输入输出&#xff1a;Python编程的“调味料”与“交流术” 在编程的世界里&#xff0c;Python不仅仅是一门语言&#xff0c;它更像是一位充满智慧的厨师&#xff0c;而运算符和输入输出则是它手中的“调味料”和“交流术”。没有这些工具&#xff0c;代码就会像没有加…

windows下部署安装 ELK,nginx,tomcat日志分析

1.安装包 如上就是elk- windows下部署需要用到的安装包 &#xff08;ps:注意版本需要对应&#xff0c;另外es7版本对应是 jdk8&#xff0c;若更高版本 请自行查询版本对应号&#xff09;。 下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic 此地址可…

内联函数——减少函数调用开销的高效利器

在C中&#xff0c;内联函数&#xff08;Inline Function&#xff09;是一种优化手段&#xff0c;它通过将函数的代码插入到每个调用点来避免函数调用的开销。本文将详细介绍内联函数的工作原理、应用场景以及注意事项。 1. 什么是内联函数&#xff1f; 内联函数是一种特殊的函…

docker安装MySQL8:docker离线安装MySQL、docker在线安装MySQL、MySQL镜像下载、MySQL配置、MySQL命令

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull mysql:8.0.41 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜…

【AI论文】魔鬼在细节:关于在训练专用混合专家模型时实现负载均衡损失

摘要&#xff1a;本文重新审视了在训练混合专家&#xff08;Mixture-of-Experts, MoEs&#xff09;模型时负载均衡损失&#xff08;Load-Balancing Loss, LBL&#xff09;的实现。具体来说&#xff0c;MoEs的LBL定义为N_E乘以从1到N_E的所有专家i的频率f_i与门控得分平均值p_i的…

游戏策划的分类

P3游戏策划分类 1.程序2.美术3.策划 程序&#xff1a;一般分为客户端程序和服务器程序 客户端程序一般负责游戏的前端画面表现 服务器程序负责游戏的后端运算 美术&#xff1a;角色原画&#xff0c;角色模型动作&#xff0c;场景原画&#xff0c;场景模型&#xff0c;UI设计&a…

C语言编程笔记:文件处理的艺术

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、为什么要用文件二、文件的分…

sqlzoo答案4:SELECT within SELECT Tutorial

sql练习&#xff1a;SELECT within SELECT Tutorial - SQLZoo world表&#xff1a; namecontinentareapopulationgdpAfghanistanAsia6522302550010020343000000AlbaniaEurope28748283174112960000000AlgeriaAfrica238174137100000188681000000AndorraEurope46878115371200000…

OpenAI的真正对手?DeepSeek-R1如何用强化学习重构LLM能力边界——DeepSeek-R1论文精读

2025年1月20日&#xff0c;DeepSeek-R1 发布&#xff0c;并同步开源模型权重。截至目前&#xff0c;DeepSeek 发布的 iOS 应用甚至超越了 ChatGPT 的官方应用&#xff0c;直接登顶 AppStore。 DeepSeek-R1 一经发布&#xff0c;各种资讯已经铺天盖地&#xff0c;那就让我们一起…

Baklib如何重塑内容中台的智能化推荐系统实现个性化服务

内容概要 在数字内容日益丰富的今天&#xff0c;内容中台的智能化推荐系统显得尤为重要。它通过分析和处理海量的数据&#xff0c;为用户提供个性化的内容推荐&#xff0c;从而提升用户体验。在智能化推荐系统中&#xff0c;主要由以下几个部分构成&#xff1a; 部分主要功能…

从零推导线性回归:最小二乘法与梯度下降的数学原理

​ 欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 本文所有内容相关代码都可在以下仓库中找到&#xff1a; Github-MachineLearning 1 线性回归 1.1 什么是线性回归 线性回归是一种用来预测和分析数据之间关系的工具。它的核心思想是找到一条直…