[数学建模从入门到入土] 数据预处理

[数学建模从入门到入土] 数据预处理

个人导航

知乎:https://www.zhihu.com/people/byzh_rc

CSDN:https://blog.csdn.net/qq_54636039

注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码

参考文章:各方资料

文章目录

检查缺失值

可以使用sns.heatmap传入一个pandas矩阵df.isna()

py 复制代码
plt.figure(figsize=(12, 6))
sns.heatmap(df.isna(), cbar=False)   # True/False 的"缺失矩阵"
plt.title("Missing Values Heatmap (df)")
plt.xlabel("Columns")
plt.ylabel("Rows")
plt.tight_layout()
plt.show()

不能是序列

数据分析

1.某列数据长啥样(分布/偏态/长尾/多峰)
  • 直方图 + KDE(密度曲线) :看偏态、长尾、多峰(可能暗示混合人群/不同机制)
    • 右偏: 大多数值偏小, 右边拖着一条很长的尾巴
    • 左偏: 大多数值偏大, 左边拖着一条很长的尾巴
  • ECDF(经验累积分布):比直方图更稳,看"百分位"很直观(比如 95% 都在多少以内)
  • QQ-plot :判断是否近似正态(决定后续用均值方差还是分位数/IQR更合适)
    • 长尾: QQ-plot 右端(或两端)明显"翘飞"
    • 短尾: QQ-plot 两端可能更贴近或向内弯

-> 决定是否要 log 或 Box-Cox:

  • (非负)右偏+长尾 -> data = log1p(x)
  • (非负)左偏+长尾 -> z = x_max - x; data = log1p(z)
2.log做了什么

没改变的:

  • 排序不变: "谁大谁小""百分位""ECDF 的相对位置"这些结构都保留
  • 分组差异方向不变: A 组整体比 B 组大,log 后仍然大

改变了的:

  • 把"加法尺度 "变成"乘法尺度 "
    • 原来差异看的是 x 2 − x 1 x_2-x_1 x2−x1
    • log 后差异看的是 log ⁡ x 2 − log ⁡ x 1 = log ⁡ ( x 2 / x 1 ) \log x_2-\log x_1 = \log(x_2/x_1) logx2−logx1=log(x2/x1),也就是倍率差
  • 压缩右尾,降低极端值对模型的"统治力"

log将乘法噪声变成加法噪声

log 后相当于更在意相对误差

log 不是万能的,确实有几种情况不该乱用:

  1. 你的业务/题目关心的是绝对差
    例如成本差 100 元就是 100 元,不能被压扁成"相对差"
  2. 你必须在原尺度做线性加和约束
    例如 x 1 + x 2 = 总量 x_1+x_2=\text{总量} x1+x2=总量 这类守恒结构,在 log 空间会变复杂

其实不需要"永久改数据": log变换只用于建模/拟合/稳定方差

  • 建模使用: y ′ = log ⁡ ( 1 + y ) y' = \log(1+y) y′=log(1+y)

  • 还原采用: y = exp ⁡ ( y ′ ) − 1 y = \exp( y') - 1 y=exp(y′)−1

异常值修正

可以画箱线图, 小提琴图展示

1. I Q R IQR IQR

给定数据 x 1 , ... , x n x_1,\dots,x_n x1,...,xn

  1. 计算第一四分位数 Q 1 Q_1 Q1(25%分位)和第三四分位数 Q 3 Q_3 Q3(75%分位)

  2. 计算四分位距
    IQR = Q 3 − Q 1 I \text{IQR}=Q_3-Q_1I IQR=Q3−Q1I

  3. 定义异常阈值(常用)
    L = Q 1 − 1.5 IQR U = Q 3 + 1.5 IQR L = Q_1 - 1.5\text{IQR} \\ U = Q_3 + 1.5\text{IQR} L=Q1−1.5IQRU=Q3+1.5IQR

若 x i < L x_i<L xi<L 或 x i > U x_i>U xi>U,判为异常

更严格可用 3 IQR 3\text{IQR} 3IQR

更适合:

  • 非正态/偏态/长尾的数值数据(IQR不依赖均值方差)
  • 样本量中等及以上(分位数更稳定)
  • 横截面数据:一次性观测、无明显时间结构(例如:地区指标、个人样本特征、实验测量)

不太适合或要小心:

  • 强季节性/趋势的时间序列:高峰可能被误判(更建议对"残差"用IQR)
  • 离散取值很少(例如只有 0/1/2/3)时,分位数可能堆叠,阈值不敏感
  • 多峰分布:不同簇之间的"正常差异"可能被误判为异常(更适合先分群再做IQR)
2. 3 I Q R 3IQR 3IQR

3 I Q R 3IQR 3IQR 是在箱线图规则基础上采用更宽松的阈值,用于只筛出"极端异常值",避免把偏态/长尾分布中的正常大值误判为异常

给定数据 x 1 , ... , x n x_1,\dots,x_n x1,...,xn

  1. 计算第一四分位数 Q 1 Q_1 Q1(25%分位)和第三四分位数 Q 3 Q_3 Q3(75%分位)

  2. 计算四分位距
    IQR = Q 3 − Q 1 \text{IQR}=Q_3-Q_1 IQR=Q3−Q1

  3. 定义极端异常阈值
    L = Q 1 − 3 IQR U = Q 3 + 3 IQR L = Q_1 - 3\text{IQR} \\ U = Q_3 + 3\text{IQR} L=Q1−3IQRU=Q3+3IQR

若 x i < L x_i<L xi<L 或 x i > U x_i>U xi>U,判为极端异常值

3. 中位数绝对偏差MAD

用"中位数 + 绝对偏差"的方式衡量离群程度,比IQR更抗极端点,属于非常稳健的尺度估计

  1. 中位数
    m = median ( x ) m=\text{median}(x) m=median(x)

  2. MAD
    MAD = median ( ∣ x i − m ∣ ) \text{MAD}=\text{median}\bigl(|x_i-m|\bigr) MAD=median(∣xi−m∣)

  3. 稳健 z 分数(常用版本)
    z i = 0.6745 x i − m MAD z_i = 0.6745\frac{x_i-m}{\text{MAD}} zi=0.6745MADxi−m

其中 0.6745 是为了让它在正态分布下与标准差可比

常用判别: ∣ z i ∣ > 3.5 |z_i|>3.5 ∣zi∣>3.5 视为异常

更适合:

  • 含少量极端离群点的数据(MAD受极端点影响很小)
  • 长尾/重尾分布(金融、网络流量、故障数据、能耗等)
  • 样本量较小到中等也能比较稳定(比均值方差靠谱)
  • 你希望检测规则"尽量不被异常值本身带偏"的场景

不太适合或要小心:

  • MAD=0 的情况 :当大量数据重复/离散(比如很多相同值)会出现 MAD 为 0,需改用 IQR、或在分母加很小的 ϵ \epsilon ϵ
  • 强趋势/季节性时间序列同样建议先去趋势/季节或对残差用MAD,否则正常结构会被当异常
  • 多峰分布/混合人群:同样建议先分群再做MAD
4. IQR vs MAD
  • 担心"极端离群点会影响阈值本身" → 优先用 MAD
  • 想要"简单、图形化、容易解释(箱线图)" → 用 IQR
  • 时间序列 :不管用谁,更推荐对残差 e t = x t − x ^ t e_t=x_t-\hat x_t et=xt−x^t 做 IQR/MAD,而不是对原值直接做
5.处理方法
  1. 缩尾: 压回阈值
  2. 用局部信息插补: 插值方法
  3. 删除: 只有在明确"数据错误/不可用"时删除

特征筛选

并非所有特征都对模型的结果有显著影响

为了提高计算效率并进一步对自变量的重要性(自变量对因变量的影响程度)进行排序

相关推荐
Deepoch2 小时前
Deepoc-M低幻觉建模:破解中小发动机企业转型困局,赋能全周期智能升级
科技·数学建模·发动机·deepoc
民乐团扒谱机7 小时前
【微实验】Zhang-Suen 快速并行细化算法与MATLAB实现
人工智能·学习·算法·计算机视觉·数学建模·matlab
byzh_rc1 天前
[数学建模从入门到入土] 模型分析评价
数学建模
byzh_rc1 天前
[数学建模从入门到入土] pandas
数学建模
byzh_rc1 天前
[数学建模从入门到入土] 相关性分析
数学建模
byzh_rc1 天前
[数学建模从入门到入土] matplotlib例图
数学建模·matplotlib
小章UPUP1 天前
数学建模中的机器学习方法
人工智能·机器学习·数学建模
byzh_rc1 天前
[数学建模从入门到入土] seaborn例图
数学建模
田里的水稻2 天前
FA_拟合和插值(FI)-逼近样条03(准均匀B样条的计算)
人工智能·数学建模·机器人·自动驾驶