跳到主要内容

离散化

一、直观理解:把连续尺子刻成几段有名字的区间​

离散化(Discretization / Binning)是把连续数值切成有限个区间,并用区间标签替代原精确值。

例如年龄 0–17、18–34、35–59、60+ 四段,不再区分 22 与 23 岁的差别,而只保留“青年”这一档。这像把一把毫米刻度的尺子改成“低/中/高”三色区域:读数变粗了,但规则更清楚,也更容易写成 if-else 或评分卡。

离散化通常出于三类动机:

  1. 可解释:业务本身按区间决策(血压分级、收入档、风险评分卡);
  2. 稳健:削弱极端值与轻微测量误差的影响;
  3. 建模需要:某些方法更擅长处理类别/分段常数关系,或要捕捉非线性阈值而不想上复杂模型。

代价也很明确:区间内部的顺序细节被丢掉,切点附近的样本可能被硬性分开。因此离散化不是默认必做,而是“用信息粒度换规则清晰”的主动选择。

二、适用场景与优缺点​

类型说明
适用场景存在公认分级标准;要做评分卡/规则模型;要降低异常值杠杆;怀疑变量对目标呈分段常数或阈值效应;需要把连续量并入类别特征体系。
核心优点结果易讲、易落地;对单调变换和轻度噪声更不敏感;便于构造跨变量的组合规则。
局限与缺点损失区间内信息;切点选得差会引入人为跳跃;切点若偷看了全样本标签易泄漏;区间过多时既不简洁也不稳。

使用前检查:

  1. 是否已有行业/国标/题面给出的分级?有则优先采用;
  2. 样本量是否支撑每个区间都有足够观测;
  3. 目标关系更像平滑曲线还是台阶/阈值;
  4. 后续模型是否本身就能学非线性(如树、样条),从而可能无需手工分箱;
  5. 切点是只基于自变量分布,还是利用了 yy(后者必须在训练折内做)。

三、核心原理:切点把实轴分成互斥区间​

给定切点 −∞≤c0<c1<⋯<cR≤+∞-\infty\le c_0<c_1<\cdots<c_R\le+\infty,若

cr−1<x≤crc_{r-1}<x\le c_r

则把 xx 映射为第 rr 个区间(边界开闭约定需固定,MATLAB discretize 默认左开右闭,首区间例外)。

1. 等宽分箱​

把 [xmin⁡,xmax⁡][x_{\min},x_{\max}] 均分为 RR 段。实现简单,但对偏态分布会出现“有的箱很满、有的箱很空”。

2. 等频(分位数)分箱​

按分位数切,使各箱样本数大致相近。适合要保证每箱都有足够样本时,但切点受分布形状影响,业务含义可能不直观。

3. 业务/专家切点​

如 BMI、血糖、信用分档。这类切点解释性最强,建模竞赛中应优先对齐题意与常识。

4. 监督分箱(简要)​

利用 yy 来合并相邻区间(如卡方分箱、决策树单变量切分)。可能提高预测力,但:

  • 必须只在训练集/训练折上学切点;
  • 容易过拟合,需要交叉验证。

离散化后,区间标签常再接哑变量编码进入线性模型;树模型也可直接使用有序箱编号,但仍要说明有序假设是否合理。

四、关键决策​

1. 箱数 RR​

  • 太少:欠拟合,掩盖真实变化;
  • 太多:每箱样本稀、估计不稳,也失去“简化”的意义;
  • 实务上从 3~7 箱试起,或由业务等级决定。

2. 切点来源优先级​

  1. 题面/国标/行业规范;
  2. 分位数或等宽的可复现规则;
  3. 仅在训练数据上的监督分箱 + 验证。

3. 空箱与稀疏箱​

若某区间样本过少,应合并相邻箱,或扩大该段宽度,并在报告中记录合并规则。

4. 训练范围外的新值​

测试集出现比训练更小/更大的 xx 时,要预先规定:

  • 并入端点箱;
  • 或单独标记为“范围外”;
  • 禁止用测试集重新计算分位数切点。

5. 是否真的需要离散化​

若线性模型加样条、多项式或广义可加模型已能表达非线性,连续建模往往损失更小。离散化更适合解释导向或规则导向任务。

五、MATLAB 示例​

% 示例:年龄离散化
age = [16; 18; 22; 35; 48; 67; 81];

% --- 方式 A:业务切点 ---
edgesBiz = [0, 18, 35, 60, Inf];
labelsBiz = ["未成年", "青年", "中年", "老年"];
binBiz = discretize(age, edgesBiz, "categorical", labelsBiz);

% --- 方式 B:等频(分位数)切点,仅用“训练”部分估计 ---
ageTrain = age(1:5); % 模拟训练集
ageTest = age(6:end); % 模拟测试集
K = 3;
% 分位数切点;加上 -Inf/Inf 覆盖两端
q = quantile(ageTrain, linspace(0, 1, K+1));
q(1) = -Inf; q(end) = Inf;
q = unique(q); % 防止重复切点
binTrain = discretize(ageTrain, q);
binTest = discretize(ageTest, q); % 使用同一组切点

disp(table(age, binBiz, "VariableNames", ["age", "业务分箱"]));
fprintf("等频切点:\n");
disp(q);
fprintf("训练箱号:%s\n", mat2str(binTrain'));
fprintf("测试箱号:%s\n", mat2str(binTest'));

% --- 方式 C:等宽分箱 ---
binWidth = discretize(age, 4); % 自动 4 个等宽箱
disp(table(age, binWidth, "VariableNames", ["age", "等宽箱号"]));

% 分箱后若进入线性模型,可再 dummy 编码
D = dummyvar(binBiz);
% 含截距时去掉一列
Dreg = D(:, 2:end);

六、如何解释结果​

离散化结果的解释应回到区间含义,而不是箱号本身。

建议报告:

  1. 采用的分箱策略(业务 / 等宽 / 等频 / 监督);
  2. 全部切点与开闭区间约定;
  3. 各箱样本量、基本统计(箱内均值、事件率等);
  4. 切点是否只来自训练集;
  5. 范围外与缺失的归箱规则;
  6. 离散化前后模型指标对比,证明“变粗”换来的收益。

若做评分卡,还应说明各箱得分、单调性约束(如信用风险随账龄上升)是否成立;若出现明显非单调,要解释是真实结构还是分箱噪声。

七、常见误区​

1. 为了“看起来整齐”切很多箱​

箱数接近样本数时,离散化没有简化,只是换了一种过拟合方式。

2. 用全数据(含测试)分位数切箱​

这会把测试分布信息泄漏进预处理,验证分数偏乐观。

3. 把有监督切箱当成因果分段​

树在某个年龄切开只说明样本内预测增益,不等于政策上应以该年龄为制度界线。

4. 忽视边界样本的敏感性​

34.934.9 与 35.135.1 可能被分到完全不同箱。应对切点邻域做敏感性检查,或在业务允许时用模糊边界/重叠规则。

5. 连续关系被生硬台阶化​

若真实关系近似直线或平滑曲线,强行分箱会损失功效,还可能制造虚假交互。

八、小结​

离散化的核心思想可以概括为:

用一组明确切点把连续变量映射到有限区间,以损失部分精度为代价,换取可解释的分段结构与更稳健的规则。

它适合评分卡、分级标准、规则模型和需要抗轻度噪声的场景;不适合把一切连续量都切成任意细箱。切点来源、箱内样本量和训练测试一致性写清楚后,离散化才能成为加分项而不是信息自残。