☰
【机器学习】(16)—— 数值数据
2026/10/10 10:50:34 网站建设 项目流程

数值数据:画图、统计与异常值

文章目录

  • 数值数据:画图、统计与异常值
    • 1. 拼特征向量之前,先别急着写代码
    • 2. 可视化:用图代替「凭感觉」
      • 2.1 散点图:特征与标签的关系
      • 2.2 直方图:单列分布长什么样
      • 2.3 变换之后还要再看
    • 3. 统计描述:给数据一张「体检报告」
      • 3.1 中心位置:均值与中位数
      • 3.2 离散程度:标准差
      • 3.3 分位数:从最小到最大
    • 4. 什么是异常值
      • 4.1 别只信一张统计表
      • 4.2 两类典型来源
    • 5. 异常值怎么处理
      • 5.1 明确是错误:删
      • 5.2 真实极端值:看推理时要不要覆盖
      • 5.3 裁剪:折中手段
    • 6. 贯穿管道:每一步都复核假设
    • 7. 动手:用 pandas 快速探索
    • 8. 与专栏前文的衔接
    • 9. 能力边界与常见误区
      • 9.1 适用边界
      • 9.2 常见误区
    • 10. 关键术语速查
    • 11. 延伸阅读
    • 12. 小结

摘要:上一篇讲清了特征向量是什么,但拼向量之前,有一步常被跳过——先把数值列「看清楚」。本文以专栏一贯的汽车重量与油耗数据为例,讲两条基本功:可视化(散点图、直方图)与统计描述(均值、中位数、标准差、分位数),并说明如何发现与处理异常值(Outlier)。适合准备动手做特征工程的读者。


1. 拼特征向量之前,先别急着写代码

很多教程的流程是:read_csv→fit→ 看准确率。真做项目时,中间少了一大块:

读入数据 → 看图、算统计量 → 发现问题 → 清洗/变换 → 拼特征向量 → 训练

第 15 篇说过,模型吃的是浮点向量,不是表格整行。可向量里的数从哪来?若原始列里混着录入错误、极端长尾、特征与标签关系反常,后面再怎么归一化、调学习率都救不回来。

阶段你在回答什么
探索这列数长什么样?和标签什么关系?
诊断有没有错、有没有离群?
决策删、留、裁剪,还是换变换方式?

这一步不炫技,却最省时间——坏数据越早发现,后面返工越少。


2. 可视化:用图代替「凭感觉」

数字表格很难一眼看出规律。图能把分布和关系摊开给你看。拼特征向量前,至少建议看两类图。

2.1 散点图:特征与标签的关系

专栏第 01 篇用汽车重量预测油耗 MPG,散点图已经出现过:车越重,MPG 往往越低,负相关一目了然。

重量(千磅)MPG
3.5018
3.6915
3.4418
3.4316
4.3415
4.4214
2.3724

7 个点排成一条向下倾斜的带,说明「用重量做特征」在直觉上说得通。若散点像一团随机噪声,就要怀疑:特征选错、标签噪声大,或还需别的列。

假设数据录入时多打了一个 0,多了一行weight=34.3, mpg=16:

红点远远脱离主簇——不用等训练结束,画图当天就能警觉。

2.2 直方图:单列分布长什么样

散点图看两列关系;直方图(Histogram)看一列自己的分布。

7 辆正常车的重量都挤在 2.4~4.5 千磅;加上 34.3 那一行后,直方图会在远端多出一根孤零零的柱。这种「一头挤满、一头孤立」的形状,是异常值的典型信号。

2.3 变换之后还要再看

归一化、分桶、对数变换会改变分布形状。第 14 篇讲过这些手段,但不能只在原始数据上看一次图。每做一步变换,都值得快速扫一眼:主簇是否还在合理范围、是否制造出新的极端值。


3. 统计描述:给数据一张「体检报告」

看图靠眼睛,统计量用数字概括整列,适合写进实验记录、做自动化监控。

3.1 中心位置:均值与中位数

对 7 辆正常车重量求均值(Mean):

x ˉ = 3.50 + 3.69 + 3.44 + 3.43 + 4.34 + 4.42 + 2.37 7 ≈ 3.74 \bar{x} = \frac{3.50 + 3.69 + 3.44 + 3.43 + 4.34 + 4.42 + 2.37}{7} \approx 3.74xˉ=73.50+3.69+3.44+3.43+4.34+4.42+2.37​≈3.74

中位数(Median)是把样本从小到大排列后正中间那个数。7 个数的中位数是第 4 个:3.50。

统计量7 辆正常车混入 34.3 后
均值≈ 3.74≈ 7.55(被拉偏)
中位数3.503.50(较稳健)

均值对极端值敏感;中位数更「抗离群」。两列对比,若均值和中位数差很多,往往说明分布偏斜或有异常点。

3.2 离散程度:标准差

标准差(Standard Deviation)衡量数据离均值有多远:

s = 1 n − 1 ∑ i = 1 n ( x i − x ˉ ) 2 s = \sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar{x})^2}s=n−11​i=1∑n​(xi​−xˉ)2​

7 辆正常车重量s ≈ 0.68 s \approx 0.68s≈0.68千磅。混入 34.3 后,s ss会暴涨——又一个报警信号。

3.3 分位数:从最小到最大

分位数(Percentile)把有序数据切成百分位点。常看五档:

记号含义7 辆正常车(约)
P0最小值2.37
P25第一四分位3.43
P50中位数3.50
P75第三四分位4.34
P100最大值4.42

P0 就是最小值,P100 就是最大值。P50 即中位数。

粗判异常的小技巧:若「低端跨度」P25 − P0 与「高端跨度」P100 − P75严重不对称,可能要查高端或低端的极端点。正常 7 辆车:P25 − P0 ≈ 1.06,P100 − P75 ≈ 0.08,比较均衡。混入 34.3 后,P100 − P75 ≈ 29.96,高端突然拉长——值得重点核对。


4. 什么是异常值

异常值(Outlier)指在某一特征(有时也包括标签)上,明显远离大多数样本的取值。

它不自动等于「错误」。但若不处理,线性回归的最小二乘会被大残差点猛拉,逻辑回归、神经网络也可能被极端输入干扰梯度。

4.1 别只信一张统计表

分位数、均值、标准差很有用,但不能迷信。数据看起来「平衡」,仍可能藏着:

  • 少量错误值夹在中间,图上不易看见
  • 多列联合异常(单看重量正常、重量与排量交叉才离谱)
  • 标签错误(重量对但 MPG 录错)

所以正确姿势是:统计 + 可视化 + 业务常识三者交叉验证。

4.2 两类典型来源

类型例子常见处理
录入/测量错误34.3 本是 3.43;传感器故障修正或删除该样本
真实但极端合法的重型卡车、超长里程视业务决定保留、裁剪或单独建模

5. 异常值怎么处理

发现可疑点之后,按决策树想一遍,比「一律删除」稳妥。

5.1 明确是错误:删

weight=34.3若核对行车证应是 3.43,这条记录应从训练集删掉(或改对原始值)。让错误点参与训练,等于教模型学噪声。

5.2 真实极端值:看推理时要不要覆盖

若业务上线上也会出现这类重型车,且你希望模型对它们给出合理预测,可以保留,但要意识到:极端点有时与标签的极端表现相关,反而携带信息;有时则只是特征空间的噪声,会伤害泛化。

若线上几乎不会出现,或你不在乎这类样本的预测,可以删除训练中的这些行。

5.3 裁剪:折中手段

裁剪(Clipping)把数值限制在区间[ L , U ] [L, U][L,U]内,例如按 P1~P99 或业务上下界:

x clip = min ⁡ ( U , max ⁡ ( L , x ) ) x_{\text{clip}} = \min\bigl(U,\ \max(L,\ x)\bigr)xclip​=min(U,max(L,x))

汽车重量若设U = 5 U=5U=5千磅,34.3 会被压到 5,既保留「偏重」信号,又避免梯度爆炸。裁剪会损失信息,适合「不想删样本、又要压住极端」的场景。


6. 贯穿管道:每一步都复核假设

特征工程不是一次性任务。推荐在链路关键节点重复「画图 + 关键统计量」:

节点建议检查
原始数据散点、直方图、P0/P50/P100
删错/补缺后行数、均值/中位数是否合理
裁剪或分桶后是否堆在边界、桶是否太空
标准化后是否近似均值 0、方差 1(训练集上)

第 15 篇强调:训练与推理必须用同一套变换。探索阶段就要把「当时看到了什么、决定了删哪几行、裁剪阈值多少」记下来,否则三个月后很难复现。


7. 动手:用 pandas 快速探索

下面用与正文相同的数据做最小探索(含一行故意录入错误):

importpandasaspd df=pd.DataFrame({"weight":[3.50,3.69,3.44,3.43,4.34,4.42,2.37,34.3],"mpg":[18,15,18,16,15,14,24,16],})# 1. 描述性统计:均值、标准差、分位数一次看齐print(df["weight"].describe(percentiles=[.25,.5,.75]))# 2. 散点:看 weight 与 mpg 关系df.plot.scatter(x="weight",y="mpg",title="weight vs mpg")# 3. 直方图:看 weight 分布df["weight"].plot.hist(bins=8,title="weight distribution")# 4. 粗筛:重量超过 10 千磅视为可疑(业务阈值示例)suspect=df[df["weight"]>10]print("rows to review:\n",suspect)# 5. 确认是录入错误后删除df_clean=df[df["weight"]<10].copy()print("median weight:",df_clean["weight"].median())

运行后你会看到:describe里max飙到 34.3;median仍接近 3.5;散点图红点孤立。确认错误后df_clean才适合进入「拼特征向量 → 训练」环节。


8. 与专栏前文的衔接

篇章本篇补上的环节
第 01 篇已用散点图建立重量–油耗直觉
第 14 篇讲归一化、分桶、清洗,默认你「知道要处理」
第 15 篇讲向量结构,默认输入已是浮点数组
本篇回答:处理之前,如何发现该处理什么

可以把流程记成:

探索(本篇)→ 清洗与变换(第 14 篇)→ 拼向量(第 15 篇)→ 模型(第 01 篇起)

9. 能力边界与常见误区

9.1 适用边界

  • 本篇针对表格型数值列的初探;图像、文本有各自的探索工具(像素直方图、词频等),但「先看再建模」的思路相同。
  • 自动化异常检测算法(Isolation Forest 等)是进阶话题,初学阶段肉眼 + 基础统计通常够用。

9.2 常见误区

误区正解
「数据不大,不用看图」小数据集一个错值就能毁掉回归线
「均值正常就没问题」均值会被少数极端值掩盖,要看中位数与分位数
「发现异常值一律删除」先分清错误 vs 真实,再决定删/留/裁剪
「只在开头看一次图」每次变换后都应快速复查
「统计量可以代替业务判断」34.3 是否可能,要对照真实世界(轿车重量量级)
「探索集和测试集混着洗」清洗规则应只根据训练/探索划分拟定,避免泄漏

10. 关键术语速查

术语一句话解释
探索性分析训练前对数据看图、算统计、提假设
散点图两列数值的关系图,常用来观察特征与标签
直方图单列数值的分布图,看集中与长尾
均值算术平均,对极端值敏感
中位数排序后的中间值,较稳健
标准差衡量数据离散程度
分位数如 P25、P75,描述分布位置
异常值远离主流样本的取值
裁剪把数值限制在预设上下界内

11. 延伸阅读

资源适合看什么
pandas describe一键输出均值、分位数等
pandas 可视化plot.scatter、plot.hist快速出图
NumPy 百分位数np.percentile计算分位点
专栏第 14 篇归一化、分桶与清洗
专栏第 15 篇从表格到特征向量

12. 小结

拼特征向量之前,请养成两个习惯:画图看关系与分布,算统计量给每列做体检。异常值未必是垃圾数据,但必须先分清是录入错误还是真实极端,再选择删除、保留或裁剪。

记住:

可视化 + 统计描述 → 发现异常 → 清洗决策 → 再拼特征向量

下一篇进入类别特征:品牌、颜色这类非数值字段,如何编码进特征向量。

系列导航:

  • 上一篇:【机器学习】(15)—— 特征向量
  • 下一篇(预告):类别特征处理入门——词表、One-Hot 与特征交叉

如果本篇对你有帮助,欢迎点赞、收藏、关注博主,机器学习专栏持续更新中,下次更新不迷路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询