Python实战:.csv格式数据增强的5种高效方法及避坑指南

1次阅读
没有评论

共计 2082 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

问题背景:为什么结构化数据也需要增强?

在机器学习项目中,我们常遇到.csv 格式的结构化数据样本不足或类别不平衡的问题。与图像数据通过旋转 / 裁剪等视觉变换增强不同,结构化数据的增强需要保持字段间的逻辑关系。例如:

Python 实战:.csv 格式数据增强的 5 种高效方法及避坑指南

  • 数值字段的扰动不能超出合理范围(如年龄不可能为负值)
  • 类别字段的增强必须维持原有的分布规律
  • 时间序列数据需保持前后连贯性

5 种核心增强方法实战

1. 基于统计特性的数值扰动

适用于连续型字段,通过概率分布保持原始数据特性:

import pandas as pd
import numpy as np

def numerical_perturbation(df, columns, scale=0.1):
    """
    df: 原始 DataFrame
    columns: 需要扰动的数值列名列表
    scale: 扰动强度系数(标准差比例)"""
    result = df.copy()
    for col in columns:
        # 获取原始数据的统计特性
        mean = df[col].mean()
        std = df[col].std()

        # 生成高斯噪声(注意 clip 防止极端值)noise = np.random.normal(0, std*scale, size=len(df))
        result[col] = np.clip(df[col] + noise, 
                             df[col].min(), 
                             df[col].max())
    return result

# 示例:对 age 和 income 列进行扰动
perturbed_data = numerical_perturbation(
    df, 
    columns=['age', 'income'], 
    scale=0.05
)

2. 类别特征的 SMOTE 改进版

传统 SMOTE(Synthetic Minority Over-sampling Technique)需要适配离散特征:

from imblearn.over_sampling import SMOTENC

def categorical_smote(df, target_col, categorical_cols, k_neighbors=3):
    """
    df: 包含特征和目标变量的 DataFrame
    target_col: 需要平衡的目标列名
    categorical_cols: 类别型特征的列名列表
    """
    X = df.drop(columns=[target_col])
    y = df[target_col]

    # 标识类别型特征的索引位置
    cat_indices = [i for i, col in enumerate(X.columns) 
                  if col in categorical_cols]

    smote = SMOTENC(
        categorical_features=cat_indices,
        k_neighbors=k_neighbors
    )
    X_res, y_res = smote.fit_resample(X, y)
    return pd.concat([X_res, y_res], axis=1)

# 示例:平衡信用卡欺诈检测中的 class 列
balanced_data = categorical_smote(
    df,
    target_col='class',
    categorical_cols=['education', 'marital_status']
)

(因字数限制,以下展示部分内容,完整版包含 5 种方法完整实现)

生产环境优化策略

内存优化:分块处理

# 使用 chunksize 参数分批处理大文件
chunk_size = 10_000
result_chunks = []

for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
    processed = numerical_perturbation(chunk, columns=['value'])
    result_chunks.append(processed)

final_result = pd.concat(result_chunks)

分布可视化检查

import seaborn as sns

# 对比原始数据与增强数据的分布
sns.kdeplot(data=df['age'], label='Original')
sns.kdeplot(data=augmented_df['age'], label='Augmented')
plt.legend()

三大常见陷阱及解决方案

  1. 标签泄漏(Label Leakage)
  2. 现象:增强过程中意外使用了测试集信息
  3. 解决:始终先划分 train/test 再增强训练集

  4. 数值溢出(Numerical Overflow)

  5. 现象:扰动导致数值超出合理范围
  6. 解决:使用 np.clip 约束上下限

  7. 类别失衡加剧(Category Distortion)

  8. 现象:SMOTE 生成不合理的类别组合
  9. 解决:设置合理的 k_neighbors 参数

完整代码获取

本文所有方法的可执行版本已整理至 Colab:
点击访问实践笔记本

延伸阅读推荐:
–《Feature Engineering for Machine Learning》第 5 章
– Pandas 官方文档:GroupBy 高级用法
– imbalanced-learn 文档:SMOTENC 参数详解

正文完
 0
评论(没有评论)