[数学建模从入门到入土] 数据预处理
个人导航
知乎:https://www.zhihu.com/people/byzh_rc
CSDN:https://blog.csdn.net/qq_54636039
注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码
参考文章:各方资料
文章目录
- [[数学建模从入门到入土] 数据预处理](#[数学建模从入门到入土] 数据预处理)
- 个人导航
- 检查缺失值
- 数据分析
- 异常值修正
-
-
-
- [1. I Q R IQR IQR](#1. I Q R IQR IQR)
- [2. 3 I Q R 3IQR 3IQR](#2. 3 I Q R 3IQR 3IQR)
- [3. 中位数绝对偏差MAD](#3. 中位数绝对偏差MAD)
- [4. IQR vs MAD](#4. IQR vs MAD)
- 5.处理方法
-
-
- 特征筛选
检查缺失值
可以使用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 不是万能的,确实有几种情况不该乱用:
- 你的业务/题目关心的是绝对差
例如成本差 100 元就是 100 元,不能被压扁成"相对差"- 你必须在原尺度做线性加和约束
例如 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
-
计算第一四分位数 Q 1 Q_1 Q1(25%分位)和第三四分位数 Q 3 Q_3 Q3(75%分位)
-
计算四分位距
IQR = Q 3 − Q 1 I \text{IQR}=Q_3-Q_1I IQR=Q3−Q1I -
定义异常阈值(常用)
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
-
计算第一四分位数 Q 1 Q_1 Q1(25%分位)和第三四分位数 Q 3 Q_3 Q3(75%分位)
-
计算四分位距
IQR = Q 3 − Q 1 \text{IQR}=Q_3-Q_1 IQR=Q3−Q1 -
定义极端异常阈值
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更抗极端点,属于非常稳健的尺度估计
-
中位数
m = median ( x ) m=\text{median}(x) m=median(x) -
MAD
MAD = median ( ∣ x i − m ∣ ) \text{MAD}=\text{median}\bigl(|x_i-m|\bigr) MAD=median(∣xi−m∣) -
稳健 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.处理方法
- 缩尾: 压回阈值
- 用局部信息插补: 插值方法
- 删除: 只有在明确"数据错误/不可用"时删除
特征筛选
并非所有特征都对模型的结果有显著影响
为了提高计算效率并进一步对自变量的重要性(自变量对因变量的影响程度)进行排序