数据预处理全攻略:从缺失值到特征工程,一站式解决方案

关系型数据库机器学习微服务

picture.image

背景

数据预处理是机器学习和数据分析过程中的关键步骤,其重要性不可忽视,无论是缺失值、异常值的处理,还是数据的标准化和编码,数据预处理的质量直接影响模型的准确性和稳定性,通过科学合理的数据预处理,能够消除数据中的噪声和偏差,使数据更符合模型的假设,进而提高模型的预测能力和泛化能力,一个完善的数据预处理流程不仅能提升模型性能,还能避免由于数据问题引发的错误结果,确保分析的有效性和可靠性,因此,在整个数据分析过程中,数据预处理至关重要,是成功构建模型的基础

流程

当拿到一个原始数据集时

  • 首先需要进行数据预处理,这是构建有效模型的基础,首先处理数据中的缺失值,可以选择删除缺失值较多的样本或特征,使用合理的值进行填补,或者通过标记来保留缺失值的信息,接下来,识别并处理数据中的异常值,采用删除、修正或数据变换的方法来减轻其对模型的影响
  • 在确保数据的完整性之后,接下来对数据进行标准化或归一化处理,以确保不同特征在相同的尺度上,从而避免特征间因量纲差异而引起的偏差。对于类别数据,应用编码技术,如独热编码或标签编码,将类别变量转换为数值形式,使其能够被模型正确理解和处理
  • 之后,进行特征工程,通过特征选择筛选出对模型最重要的特征,并通过特征组合生成新的特征,以捕捉更复杂的模式,从而提升模型的表现力,为了减少数据中的噪声和波动,可以对数据进行平滑处理,并根据需要进行分箱,将连续变量离散化
  • 最后,检查样本的类别分布,通过样本均衡方法处理类别不平衡问题,如过采样少数类或欠采样多数类,以防止模型偏向于多数类。为了进一步优化模型效果,可以对数据进行必要的变换,如对数变换或平方根变换,以处理偏态分布或减少数据的非线性

这一系列的数据预处理步骤能够确保数据更加干净、平衡,最终有助于构建出性能更好的模型,数据预处理的步骤在一定程度上是可以调整顺序的,当然像缺失值这种通常应首先处理,因为它会影响后续的步骤,如标准化、编码等

代码实现

缺失值处理

首先需要检查数据中是否存在缺失值,这是处理缺失值的前提,下面是一个Python实现的代码示例,展示如何检查数据集中的缺失值,并输出每列缺失值的数量和比例


          
import pandas as pd
          
# 假设我们有一个数据集 df
          
df = pd.read_csv('your_dataset.csv')  # 读取数据集
          
# 检查每列的缺失值数量
          
missing_values_count = df.isnull().sum()
          
# 计算每列缺失值的比例
          
missing_values_percentage = (missing_values_count / len(df)) * 100
          
# 将结果合并成一个数据框便于展示
          
missing_data = pd.DataFrame({
          
    'Missing Values': missing_values_count,
          
    'Percentage': missing_values_percentage
          
})
          
# 输出缺失值情况
          
print("Missing Values in Each Column:")
          
print(missing_data)
      

如果数据集中存在缺失值,可以选择不同的方法来处理,下面是一些常见的处理方式,以及相应的Python代码示例,文章链接——Python实现数据预处理:常见缺失值处理方法解析,包含方法有:

删除法: 删除含有缺失值的样本、删除含有缺失值的特征

插补法: 均值/中位数/众数插补、前向/后向填充、线性插值、回归插补、多重插补

模型预测法: 使用机器学习模型预测缺失值

填补指示法: 引入缺失指示变量

不处理: 直接使用缺失值

异常值

如果数据集中存在异常值,可以选择不同的方法来检测和处理,下面是一些常见的处理方式,以及相应的Python代码示例,文章链接——Python实现数据预处理:常见异常值检验方法解析,包含方法有:

箱线图法:使用基于分位数的箱线图检测异常值,通过绘制数据的四分位数并将超出上下四分位数1.5倍IQR的数据点视为异常值

标准差法:基于数据的均值和标准差判断异常值,通常将超出均值±3倍标准差范围的数据点视为异常值

Grubbs假设检验:使用Grubbs检验检测单个异常值,适用于假设数据为正态分布的场景

散点图法:通过绘制散点图直观地识别数据中的离群点,尤其适用于双变量或多变量数据的异常值检测

集成学习方法(孤立森林):使用孤立森林方法检测高维数据中的异常值,通过构建森林并根据数据点被孤立的程度判断其是否为异常值

DBSCAN聚类法:利用基于密度的DBSCAN聚类算法识别噪声点或异常值,这些点不会被分配到任何簇中,从而被视为异常值

如果识别到数据集中存在异常值,就可以进行异常值的处理, 删除异常值:根据识别出的异常值索引,将这些异常值从数据集中删除,处理删除后产生的缺失值,可以采用前文的缺失值处理,如果删除的异常值较多,且这些值的缺失对分析影响不大,也可以直接删除这些包含缺失值的样本或特征


          
# 假设你已经识别了异常值并获取了它们的索引
          
outlier_indices = [2, 5, 10]  # 这些是异常值所在的索引
          
# 直接删除包含异常值的行
          
df_cleaned = df.drop(outlier_indices) # 其中df为你的数据 dataframe格式
      

直接删除异常值:使用 drop 方法根据异常值索引删除相应的行,这些行将被完全移除


          
import numpy as np
          
# 假设你已经识别了异常值并获取了它们的索引
          
outlier_indices = [2, 5, 10]  # 这些是异常值所在的索引
          
# 将异常值替换为缺失值NaN
          
df_with_nans = df.copy()
          
df_with_nans.loc[outlier_indices] = np.nan
      

删除并保留为缺失值:使用 loc 方法将异常值所在的行替换为 NaN,这些 NaN 可以在后续处理中使用缺失值填补方法进行处理

数据标准化/归一化

如果数据集需要进行数据变换,可以选择不同的方法来处理,下面是一些常见的处理方式,以及相应的Python代码示例,文章链接——特征工程——数据转换,包含方法有:

标准化:将数据转换为均值为0、标准差为1的分布,适用于数据分布接近正态分布的情况

归一化:将数据缩放到固定范围(通常是0到1),适用于不同量纲特征之间的比较或用于特征输入到某些特定的机器学习算法(如神经网络)

Robust Scaler:基于数据的中位数和IQR(四分位距)进行缩放,适用于数据中存在异常值的情况,因为该方法对异常值不敏感

对数转换:将数据取对数,以减小数据的范围,特别适用于数据分布具有偏态或长尾分布的情况

倒数转换:将数据取倒数,以减小数据范围,特别适用于数据分布具有偏态或长尾分布的情况,但需要注意处理零值

平方根转换:通过对数据取平方根来减少数据的偏态,通常用于正偏态的数据

Box-Cox转换:一种能够将非正态分布数据转换为接近正态分布的方法,适用于正值数据,并可以调整lambda参数以获得最佳变换效果

编码

如果数据集需要进行编码,可以选择不同的方法来处理,下面是一些常见的处理方式,以及相应的Python代码示例,文章链接——标签编码和独热编码(One-Hot)优劣及应用,包含方法有:

独热编码(One-Hot):将分类变量转换为一组二进制(0和1)值,每个类别都独占一列。适用于无序类别数据

标签编码:将分类变量转换为整数值,每个类别分配一个唯一的整数值,适用于有序类别数据或模型能够识别类别间顺序关系的情况

特征工程

如果要提升模型的表现力,特征工程是一个关键步骤,通过特征选择、特征组合、平滑处理和分箱,可以提高模型的准确性和泛化能力一下是相关参考文章链接:

特征筛选(过滤法)—— ANOVA

过滤法是一种独立于模型的特征选择方法,基于特征的统计性质对特征进行筛选。常见的方法包括ANOVA(方差分析),它通过比较不同特征的方差来选择最具区分度的特征,文章链接—— 特征筛选(过滤法)—— ANOVA

特征筛选(封装法)—— SFS、SBS

封装法将特征选择与模型训练紧密结合,通过逐步增加或减少特征来选择最优特征集,常见的方法包括: SFS:从空集开始,逐步添加能够最优提升模型性能的特征、SBS:从全部特征开始,逐步移除对模型贡献最小的特征,文章链接—— 特征筛选(封装法)—— SFS、SBS

特征选择(嵌入法)—— 递归特征消除 RFE、 RFE-CV

嵌入法结合模型训练过程,通过递归特征消除(RFE)来选择特征,RFE是一种迭代方法,每次训练模型并消除最不重要的特征,直到找到最优特征集,RFE-CV(带交叉验证的RFE)进一步通过交叉验证来选择特征数量,文章链接—— 特征选择(嵌入法)—— 递归特征消除 RFE、 RFE-CV

以上介绍的三种方法属于特征选择的基础方法,它们是数据预处理中常用的策略,帮助筛选出对模型最重要的特征,然而除了基础的特征选择方法,读者还可以根据模型输出的特征贡献度排名或使用SHAP等模型解释工具,进一步优化和提升模型的表现力,这些公众号皆有相关文章就不一一给出链接了

特征组合

特征组合可以选择不同的方法来处理,下面是一些常见的处理方式,以及相应的Python代码示例,文章链接——特征工程进阶:暴力特征字典的构建与应用 实现模型精度质的飞跃,包含以下功能:

等频分箱:将连续变量按等频率分箱,便于捕捉不同区间内的特征差异

对数变换:通过对数据进行对数变换,压缩数据的范围,减少偏态分布对模型的影响

幂变换:通过幂变换将数据拉伸或压缩到指定范围,改善数据的分布特性

一些数学特征变化:构建复杂的数学特征,如平方、开方、交互项等,以提升模型的非线性表达能力

使用XGBoost模型训练和评估数据,筛选出最重要的20个特征:通过XGBoost模型的特征重要性评估,选择对模型预测影响最大的20个特征,提升模型的精度和表现

平滑处理

如果数据集需要进行数据平滑处理,可以选择不同的方法来处理,下面是一些常见的处理方式,以及相应的Python代码示例,文章链接——时间序列——移动平均(SMA、EMA、WMA)时间序列——平稳性检验,这些方法主要应用于时间序列数据,通过平滑处理来减少噪声和波动,从而更好地分析数据中的趋势和周期性特征

采样

如果数据集需要进行采样处理,可以选择不同的方法来平衡数据集,下面是一些常见的处理方式,以及相应的Python代码示例,文章链接——Python数据欠采样与过采样相关库,这些方法主要用于处理类别不平衡的数据,通过欠采样减少多数类样本或通过过采样增加少数类样本,从而创建一个更平衡的数据集,提升模型的表现

结束语

数据科学与机器学习的实践中,数据处理是确保模型性能的关键步骤,从缺失值处理、异常值检测,到数据变换、编码、特征工程,再到采样处理,每一步都至关重要,通过合理的预处理和特征选择,可以显著提升模型的准确性和稳定性。在具体项目中,灵活应用这些方法,结合数据的特点与分析需求,将助力构建更加精确和可靠的模型,为数据驱动决策提供坚实的基础。希望本系列文章为你在数据处理的道路上提供了有价值的参考,祝你在数据科学的旅程中不断取得进步

往期推荐

利用XGBoost模型进行多分类任务下的SHAP解释附代码讲解及GUI展示

利用SHAP解释二分类模型的四种机器学习GUI工具

模型过拟合与欠拟合的核心原理及其与数据集分割的关系

复现顶刊Streamlit部署预测模型APP

顶刊APP部署复现——基于XGBoost模型的心脏病风险预测与解释:Streamlit应用程序开发

t-SNE 的进化:Barnes-Hut t-SNE 如何应对大规模数据集降维

理解 SHAP 值:如何根据模型性质正确解释 XGBoost 与随机森林的结果

优化XGBoost回归模型:网格搜索与K折交叉验证实现

picture.image

picture.image

picture.image

微信号|deep_ML

欢迎添加作者微信进入Python、ChatGPT群

进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
CV 技术在视频创作中的应用
本次演讲将介绍在拍摄、编辑等场景,我们如何利用 AI 技术赋能创作者;以及基于这些场景,字节跳动积累的领先技术能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论