【机器学习】(16)—— 数值数据

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

文章目录

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

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


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

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

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

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

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

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


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

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

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

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

重量(千磅) MPG
3.50 18
3.69 15
3.44 18
3.43 16
4.34 15
4.42 14
2.37 24

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.74 xˉ=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.50 3.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−11i=1∑n(xi−xˉ)2

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

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=5 U=5 千磅,34.3 会被压到 5,既保留「偏重」信号,又避免梯度爆炸。裁剪会损失信息,适合「不想删样本、又要压住极端」的场景。


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

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

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

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


7. 动手:用 pandas 快速探索

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

python 复制代码
import pandas as pd

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())

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


8. 与专栏前文的衔接

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

可以把流程记成:

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

9. 能力边界与常见误区

9.1 适用边界

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

9.2 常见误区

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

10. 关键术语速查

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

11. 延伸阅读

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

12. 小结

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

记住:

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

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

系列导航


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

相关推荐
赤龙ERP1 小时前
赤龙一周观察 · 2026年7月第1周(07-06 ~ 07-12)
人工智能·创业创新·erp
gr95ZS6E61 小时前
基础入门java安全(一)--CC1基础分析
开发语言·python
极度的坦诚就是无坚不摧1 小时前
数据分析DAY1-Python基础
python·数据分析
console.log('npc')1 小时前
AI Agent 前端流式渲染核心技术文档(SSE \+ WebSocket \+ 打字机渲染)
前端·人工智能·websocket
泠不丁1 小时前
Next.js AI 应用路由设计:页面轻一点,边界清楚一点
人工智能
SelectDB技术团队2 小时前
AB 实验指标计算场景:Apache Doris / SelectDB 的技术能力、选型对比与实践
大数据·数据库·数据分析·apache·用户运营·apache doris·selectdb
法外狂徒12 小时前
将 Pi Agent 接入 HagiCode 的实践之路
服务器·前端·人工智能
CoderIsArt2 小时前
使用深度学习方法进行纺织品和颜色缺陷检测
人工智能·深度学习