Python机器学习数据清洗到特征工程策略

Python机器学习数据清洗到特征工程策略

目录

  1. ✨ 数据清洗:处理缺失值与异常值的策略
  2. 🔄 特征选择:筛选与数据目标高度相关的特征
  3. 🛠 特征工程:数据转换与生成新特征的多样化方法
  4. 📊 类别型变量的数值化:数值编码与独热编码的实践
  5. 🚀 数据标准化与归一化:确保特征数据的一致性
  6. 💡 时间序列数据的预处理:日期特征提取与滞后特征生成

1. ✨ 数据清洗:处理缺失值与异常值的策略

在机器学习任务中,数据预处理的首要步骤是数据清洗。数据清洗的目的是识别和处理缺失值、重复数据以及异常值,以确保数据的完整性与质量。未经过清洗的原始数据通常存在各种不完美,这些问题若不处理,将直接影响模型的训练效果与预测结果。常见的数据清洗步骤包括处理缺失值、重复值和异常值。

处理缺失值

缺失值是数据预处理中最常见的问题之一。缺失值的处理方式有很多种,包括删除缺失值所在的行、用统计量(如均值、中位数等)填充,或使用插值法、建模填充等高级方法。以下是几种处理缺失值的方式:

  • 删除缺失值 :当缺失值的比例较小或该特征对模型无关紧要时,可以选择直接删除这些数据行。Pandas库中的dropna()函数可以方便地执行这一操作:

    python 复制代码
    import pandas as pd
    
    # 创建包含缺失值的DataFrame
    data = {'Age': [25, 30, None, 35], 'Salary': [50000, None, 60000, 65000]}
    df = pd.DataFrame(data)
    
    # 删除包含缺失值的行
    df_cleaned = df.dropna()
    print(df_cleaned)
  • 填充缺失值 :如果删除数据行会导致样本量不足,可以采用均值、中位数或众数来填充缺失值。Pandas库的fillna()函数可以直接进行填充操作:

    python 复制代码
    # 用列的均值填充缺失值
    df_filled = df.fillna(df.mean())
    print(df_filled)
  • 插值法填充:对于时间序列数据或有序数据,可以采用插值法来填充缺失值,以保证数据的连续性和合理性。通过插值法,可以根据数据的趋势进行预测填充:

    python 复制代码
    # 使用插值法填充缺失值
    df_interpolated = df.interpolate()
    print(df_interpolated)

处理重复值

重复值通常会降低模型的泛化能力,使模型对某些特定模式产生偏倚。因此,必须检测并处理重复数据。在Pandas中,可以使用duplicated()drop_duplicates()方法来检测和删除重复值。

python 复制代码
# 检查重复值
duplicates = df.duplicated()

# 删除重复值
df_no_duplicates = df.drop_duplicates()
print(df_no_duplicates)

处理异常值

异常值(outliers)是指偏离数据整体分布规律的值,它们可能对模型产生极大的负面影响。在处理异常值时,可以采用统计分析法(如箱线图法)或基于算法的检测方法(如局部异常因子)。一种常见的处理方法是将异常值替换为特定的统计值,或者通过过滤策略删除异常值。

python 复制代码
import numpy as np

# 创建包含异常值的数据
data_with_outliers = {'Age': [22, 25, 30, 120, 28], 'Salary': [50000, 60000, 55000, 90000, 65000]}
df_outliers = pd.DataFrame(data_with_outliers)

# 使用Z-score方法识别异常值
df_outliers['Age_Zscore'] = (df_outliers['Age'] - df_outliers['Age'].mean()) / df_outliers['Age'].std()
df_outliers = df_outliers[(df_outliers['Age_Zscore'].abs() <= 3)]  # 保留Z-score在3以内的数据
print(df_outliers)

清洗后的数据更加可靠且具备更好的模型适应性。通过合理处理缺失值、重复值与异常值,可以大大提高机器学习模型的训练效果。


2. 🔄 特征选择:筛选与数据目标高度相关的特征

特征选择是机器学习中提高模型性能和可解释性的重要步骤。特征选择的目的是筛选出对目标变量最有帮助的特征,同时删除不相关或冗余的特征,以减少数据噪音、提高模型效率。

过滤法

过滤法通过统计指标(如相关系数、卡方检验、互信息等)来评估每个特征与目标变量之间的关联性。相关性高的特征保留,相关性低的特征则删除。这种方法简单高效,适用于大规模数据集。

python 复制代码
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.datasets import load_iris

# 加载Iris数据集
X, y = load_iris(return_X_y=True)

# 选择与目标变量最相关的两个特征
selector = SelectKBest(score_func=f_classif, k=2)
X_new = selector.fit_transform(X, y)
print(X_new)

包装法

包装法则通过反复训练模型来评估特征的组合效果。递归特征消除(Recursive Feature Elimination, RFE)是一种常见的包装法,通过递归地移除最不重要的特征,最终选出最优特征子集。

python 复制代码
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier

# 使用随机森林作为基模型
model = RandomForestClassifier()

# 实例化递归特征消除工具
rfe = RFE(estimator=model, n_features_to_select=2)

# 进行特征选择
X_rfe = rfe.fit_transform(X, y)
print(X_rfe)

嵌入法

嵌入法则结合了模型训练和特征选择过程,直接通过模型的权重或特征重要性来决定特征的去留。例如,决策树和随机森林等模型本身就能够评估特征的重要性。

python 复制代码
# 使用随机森林评估特征重要性
model.fit(X, y)
importances = model.feature_importances_

# 打印特征的重要性
for i, importance in enumerate(importances):
    print(f"Feature {i}: Importance {importance}")

特征选择不仅能够提高模型的性能,还可以减少过拟合风险,使模型的泛化能力更强。通过合理选择特征,可以有效提高机器学习模型的精度和效率。


3. 🛠 特征工程:数据转换与生成新特征的多样化方法

特征工程是一项非常关键的任务,涉及对原始数据进行处理、转化甚至生成新特征。高质量的特征工程可以极大提升模型的表现。特征工程包括对连续变量的处理、离散化,以及生成派生特征等。

数值特征的处理

数值型特征往往需要进行适当的变换,以便更好地用于机器学习模型中。常见的操作包括对数变换、平方根变换等,以解决特征的分布不均衡问题。

python 复制代码
import numpy as np

# 对数变换
df['log_Age'] = np.log(df['Age'] + 1)

# 平方根变换
df['sqrt_Age'] = np.sqrt(df['Age'])

离散化

对于连续变量,可以将其离散化为多个区间,从而帮助模型更好地捕捉变量的分布特征。cut()函数可以将数据分箱处理:

python 复制代码
# 使用Pandas对连续变量进行分箱
df['Age_binned'] = pd.cut(df['Age'], bins=[0, 20, 40, 60, 80], labels=['Young', 'Adult', 'Middle-aged', 'Senior'])
print(df)

派生特征

派生特征是从已有数据中创建的新特征。例如,在时间序列数据中,可以提取出月份、季度等时间特征,这样能够增强模型对时间模式的捕捉能力。

python 复制代码
# 提取日期特征
df['date'] = pd.to_datetime(df['date'])
df['month'] = df['date'].dt.month
df['quarter'] = df['date'].dt.quarter

特征工程通过合理转换与生成特征,能够帮助模型更好地学习数据中的模式,提高预测效果。


相关推荐
cwj&xyp9 分钟前
Python(二)str、list、tuple、dict、set
前端·python·算法
是十一月末13 分钟前
Opencv实现图片的边界填充和阈值处理
人工智能·python·opencv·计算机视觉
Kisorge41 分钟前
【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
c语言·开发语言
机智的叉烧1 小时前
前沿重器[57] | sigir24:大模型推荐系统的文本ID对齐学习
人工智能·学习·机器学习
凳子花❀1 小时前
强化学习与深度学习以及相关芯片之间的区别
人工智能·深度学习·神经网络·ai·强化学习
轻口味2 小时前
命名空间与模块化概述
开发语言·前端·javascript
泰迪智能科技013 小时前
高校深度学习视觉应用平台产品介绍
人工智能·深度学习
晓纪同学3 小时前
QT-简单视觉框架代码
开发语言·qt
威桑3 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服3 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt