数学建模-数据预处理(数据清洗、标准化)

在数学建模的比赛中,数据分析类的题目中往往我们要面对大量的数据,在给出的数据中,如果数据缺失会影响到判断和后序的操作

这里我们给出一个数据预处理 的办法:数据清洗(Data Clearning):涉及到检测和纠正数据中的错误、不完整、不准确或不适用的部分,以确保数据质量和可靠性。数据清洗的主要目标是使数据集合适合于后续分析和建模工作。

原理:

  • 数据适应性:将数据调整为适合分析和建模的形式。这包括数据类型的转换、格式的统一、数据集成等操作,以确保数据能够被正确理解和使用。

  • 数据完整性:确保数据集中没有缺失重要信息的记录。处理缺失值是数据清洗中重要的一部分,可以通过填充、删除或者推断等方法来处理缺失数据,以确保分析和建模的准确性。

在数据清洗的过程中你可以自己判断需不需要标准化

进行数据标准化是数据预处理中的一项重要步骤,其主要目的是消除不同特征之间由于量纲不同而导致的数据差异,使得数据更加可比较和可解释。以下是进行数据标准化的主要原因:

  1. 消除量纲影响:不同特征可能由于其量纲不同(如单位、量级等)而导致数据值范围差异很大。这种差异会影响到某些基于距离或相似度计算的算法,例如K近邻算法和支持向量机等。通过标准化,可以将不同特征的值都缩放到相似的范围内,避免某些特征对距离计算的影响过大。

  2. 提高模型收敛速度和性能:在使用基于梯度的优化算法(如梯度下降法)训练模型时,特征的值范围如果差异很大,可能会导致优化过程变得缓慢,甚至难以收敛。通过标准化,可以加快优化算法的收敛速度,提高模型训练的效率和性能。

  3. 增强特征的可解释性:标准化后,所有特征都具有相似的尺度和分布,这使得特征的权重更容易解释。在某些模型(如线性回归)中,特征的权重直接反映了其对输出的影响程度,标准化可以确保权重的解释更为准确和可靠。

  4. 改善数据分布的对称性:某些机器学习模型(如逻辑回归、支持向量机等)要求特征服从某种特定的分布,例如服从正态分布。标准化可以使得数据更接近正态分布,有助于提升模型的表现。

  5. 增强模型的稳定性:标准化可以减少数据中的噪声和异常值对模型的影响,提升模型的稳定性和泛化能力。

py代码模板:

cpp 复制代码
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from multiprocessing import Pool, cpu_count  # 多进程处理
from sklearn.preprocessing import StandardScaler  # 导入标准化器

# 1. 加载数据(分块读取)
def load_large_data(csv_file, chunksize):
    """
    分块读取大型 CSV 文件,并返回一个生成器对象。
    """
    reader = pd.read_csv(csv_file, chunksize=chunksize)
    return reader

# 2. 处理缺失值
def handle_missing_values(chunk):
    """
    处理缺失值,用均值填充数值型列的缺失值。
    """
    numeric_columns = chunk.select_dtypes(include=[np.number]).columns.tolist()
    chunk[numeric_columns] = chunk[numeric_columns].fillna(chunk[numeric_columns].mean())
    return chunk

# 3. 标准化数据(根据数据判断需不需要)
# def standardize_data(chunk):
#     """
#     使用 Z-score 标准化对数值型特征进行标准化处理。
#     """
#     numeric_columns = chunk.select_dtypes(include=[np.number]).columns.tolist()
#     scaler = StandardScaler()
#     chunk[numeric_columns] = scaler.fit_transform(chunk[numeric_columns])
#     return chunk

# 4. 处理异常值
def handle_outliers(chunk):
    """
    使用 IQR 方法处理异常值。
    """
    for column in chunk.columns:
        if pd.api.types.is_numeric_dtype(chunk[column]):
            Q1 = chunk[column].quantile(0.25)
            Q3 = chunk[column].quantile(0.75)
            IQR = Q3 - Q1
            lower_bound = Q1 - 1.5 * IQR
            upper_bound = Q3 + 1.5 * IQR
            chunk = chunk[(chunk[column] >= lower_bound) & (chunk[column] <= upper_bound)]
    return chunk

# 5. 保存处理后的数据
def save_processed_data(processed_data, output_file):
    """
    将处理后的数据保存为 CSV 文件。
    """
    pd.concat(processed_data).to_csv(output_file, index=False)
    print(f"Processed data saved to {output_file}")

# 主程序
if __name__ == "__main__":
    # 读取大型数据集,每次读取的行数
    input_file = '问题一数据(未处理).csv'  # 替换为你的输入文件路径
    chunksize = 1000  # 每次读取的行数,根据实际情况调整
    reader = load_large_data(input_file, chunksize)

    # 多进程处理数据
    pool = Pool(cpu_count())  # 使用 CPU 核心数作为进程数
    processed_chunks = pool.map(handle_missing_values, reader)
    pool.close()
    pool.join()

    # 标准化数据
    #根据数据判断需要需要进行标准化
    # processed_chunks = [standardize_data(chunk) for chunk in processed_chunks]

    # 处理异常值
    processed_chunks = [handle_outliers(chunk) for chunk in processed_chunks]

    # 保存处理后的数据
    output_file = 'processed_data.csv'  # 替换为你的输出文件路径
    save_processed_data(processed_chunks, output_file)

实例:

在这个比赛当中的第一问:

就需要用到数据清洗

加油

相关推荐
limingade1 小时前
手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨)
物联网·算法·智能手机·数据分析·信息与通信
jiao000014 小时前
数据结构——队列
c语言·数据结构·算法
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
leon6255 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林5 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
Navigator_Z6 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
Aic山鱼6 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
天玑y6 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
sjsjs117 小时前
【数据结构-一维差分】力扣1893. 检查是否区域内所有整数都被覆盖
数据结构·算法·leetcode
redcocal7 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘