数学建模——数据预处理

一、为什么要进行数据预处理前的分析

在获得数据以后,需要将数据进行分类,以便进行后续数据处理以及建模步骤,譬如,当数据中出现0/1表示否/是,成本行指标,效益型指标等等类型时,需要将其进行分割,不同数据类型使用不同模型或归一化至同一类型。其次,数据可视化分析能够更直观看出异常值,缺失值,数据走势,甚至有时可以看出数据是否为噪声数据进而进行去除噪声,看出是否为时间序列数据进而使用正确的模型。总而言之,数据预处理前的分析步骤能够大大提高后续的效率。

二、为什么要数据预处理

  1. 缺失值处理:实际数据往往会存在缺失值,如果不处理这些缺失值,可能导致分析结果不准确或模型训练失败。因此,需要采取适当的方法来处理缺失值,比如删除缺失值、插补缺失值等。

  2. 异常值处理:异常值可能会对数据分析和建模产生负面影响,因为它们可能会干扰统计模型的准确性和稳定性。因此,需要识别并处理异常值,以确保分析结果的可靠性。

  3. 数据标准化/归一化:如果数据的不同变量具有不同的尺度或单位,可能会导致分析结果偏向于某些变量,从而影响分析的准确性,标准化/归一化即是去量纲化的过程。通过数据标准化或归一化,可以消除这些尺度效应,确保各个变量对分析结果的影响相对均衡。

  4. 去除重复数据:数据集中可能存在重复的观测值,这些重复数据可能会导致分析结果出现偏差。因此,需要去除重复数据,以避免对分析结果的影响。

  5. 数据转换:在某些情况下,需要对数据进行转换,以满足分析或建模的要求。例如,对数转换、幂次转换等可以使数据更符合正态分布假设,从而提高分析的效果。

  6. 数据降维:通过保留数据集的关键信息,将高维数据映射到低维空间的过程。在实际应用中,数据通常具有很高的维度,但其中的信息可能存在冗余或噪声。

  7. 提高模型性能:经过数据预处理后的数据更加干净、规范,可以帮助建立更准确、稳健的模型,提高模型的性能和预测能力。

三、数据分析

1、散点图判断数据走势

以2024年美赛C题为例:

通过对数据进行散点图的绘画,很容易发现其中存在异常值,并且异常值出现的范围的大概位置,也能通过观察该数据分布的密集程度,判断出其中可能存在缺失值(需要进一步分析),并且该数据峰值集中在2022-02,不具有时间性。

2、箱型图观察离群数据,info判断空值情况

可以观察到存在不少离群点需要处理,而info结果为不存在空值

四、数据预处理

1、异常值处理

通常情况下会选择将异常值先变为空值,后使用填补空值的方法进行填补

1)箱线图

优点:

  1. 直观性: 箱型图提供了直观的数据分布可视化,可以快速识别出数据的中位数、四分位数、异常值等重要统计量,使得异常值的检测更加直观。

  2. 有效性: 箱型图基于数据的分位数来识别异常值,而不受整体数据分布的影响,因此在一定程度上能够有效地检测出异常值。

  3. 鲁棒性: 箱型图对数据的分布情况不敏感,不受极端值的影响,具有一定的鲁棒性。这意味着即使数据存在一些极端值,箱型图仍能够反映出数据的整体分布情况。

缺点:

  1. 参数选择: 箱型图中关于异常值的定义是基于箱体长度的一个固定比例(通常为1.5倍的四分位距),这个参数的选择可能对结果产生影响,而且这个选择是相对任意的。

  2. 信息丢失: 箱型图虽然提供了数据的重要统计量,但它也丢失了一些数据分布的细节信息,比如分布的形状、峰度等,因此可能无法完全捕捉到数据的复杂性。

  3. 不适用于非对称分布: 箱型图假设数据服从对称分布,对于非对称分布的数据可能无法准确反映异常值的情况。

  4. 局限性: 箱型图只能用于单变量数据的异常值检测,对于多变量数据的异常值检测并不适用。

s = df.describe()

# 计算分位差
q1 = s.loc['25%', 'value']
q3 = s.loc['75%',"value"]
iqr = q3 - q1
mi = q1 - 1.5*iqr
ma = q3 + 1.5*iqr
print('分位差为:%.3f,下限为:%.3f,上限为:%.3f' % (iqr,mi,ma))

# 筛选出异常值error、剔除异常值之后的数据data_c
ls1 = []
ax2=fig.add_subplot(2,1,2)
error = df["value"][(df["value"] < mi) | (df["value"] > ma)]
ls1.append(error)
df['value'] = df['value'].apply(lambda x: None if np.isin(x, ls) else x)
num_missing_2 = df['value'].isnull().sum()
print('异常值共%i条' % len(error))
print(df.info())
print(num_missing_2)
2)3σ原则

如果数据服从正态分布,异常值被定义为一组测定值中与平均值的偏差超过3倍的值 → p(|x - μ| > 3σ) ≤ 0.003

优点:

  1. 基于统计学原理:该方法基于数据的标准差,有一定的理论基础。
  2. 广泛适用:适用于符合正态分布或近似正态分布的数据。

缺点:

  1. 对非正态分布的数据效果较差:如果数据不符合正态分布,使用3σ原则可能会导致误判。
  2. 忽略了数据的分布特征:3σ原则仅基于数据的均值和标准差,忽略了数据的分布特征,可能无法发现一些真实存在的异常情况。
  3. 对极端值不敏感:3σ原则仅考虑了数据中大部分值的分布情况,对于极端值不够敏感,容易将一些真实的异常值排除在外。
u = df["value"].mean()  # 计算均值
std = df["value"].std()  # 计算标准差
print('均值为:%.3f,标准差为:%.3f' % (u,std))

#正态性检验
fig=plt.figure(figsize=(10,6))
ax1=fig.add_subplot(2,1,1)

# 绘制数据密度曲线
df["value"].plot(kind = 'kde',grid = True,style = '-k',title = '密度曲线')

# 筛选出异常值error、剔除异常值之后的数据data_c
ls = []
ax2=fig.add_subplot(2,1,2)
error=df["value"][np.abs(data-u)>3*std]
ls.append(error)
# data_c=data[np.abs(data-u)<=3*std]

df['value'] = df['value'].apply(lambda x: None if np.isin(x, ls) else x)
num_missing = df['value'].isnull().sum()

print("异常值共%d条"%(len(error)))
print(df.info())
print(num_missing)

# 图表表达
plt.scatter(df["value"].index,df["value"],color = 'k',marker='.',alpha = 0.3)
plt.scatter(error.index,error,color = 'r',marker='.',alpha = 0.5)
plt.xlim([-10,10010])
plt.grid()
plt.show()
3)LOF(局部离群因子)

LOF(局部离群因子)是一种用于检测数据集中异常值的算法。它通过比较每个数据点与其邻近数据点之间的密度来识别异常值。其基本思想是,对于每个数据点,首先计算其与其邻近点的密度,然后将该点的密度与其邻近点的密度进行比较,得出一个局部离群因子(LOF)值。LOF值越大,则表示该点相比于其邻近点来说更有可能是异常点。

优点:

  1. 能够发现各种形状和大小的异常值,不依赖于数据分布的假设。
  2. 能够捕捉到局部异常,而不仅仅是全局异常。
  3. 相对于基于距离的方法,对于高维数据的处理能力更强。

缺点:

  1. 对于大数据集和高维数据的计算开销较大。
  2. 对于噪声数据和密度差异较大的数据集,可能会产生不准确的结果。
  3. 需要手动选择邻近点的数量和其他参数,对参数的选择敏感。
import pandas as pd
from sklearn.neighbors import LocalOutlierFactor

X = df[['feature1', 'feature2']].values

# 创建一个LocalOutlierFactor对象,并指定参数
lof = LocalOutlierFactor(n_neighbors=10, contamination=0.1)

# 训练模型并预测异常值
y_pred = lof.fit_predict(X)

# 将预测结果添加到原始DataFrame中
df['LOF_pred'] = y_pred

# 将预测为异常值的数据点设置为缺失值
df.loc[y_pred == -1, ['feature1', 'feature2']] = np.nan

LocalOutlierFactor中的超参数设置&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值