拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GMM数据生成实战:原理、Matlab实现与踩坑指南

GMM数据生成实战:原理、Matlab实现与踩坑指南

数据不够的时候,我们总习惯说“那就造一批”。可造数据和加噪声是两码事。我最近在做一个仿真项目,手里只有几百条真实观测,下游程序却需要上万条样本,还得保留变量之间的相关结构。直接给每条样本加随机扰动,做出来的数据相关性全被破坏了,分布形状也跟原来对不上;想用GAN来做,几百条样本连训练都训不稳。最后我选了高斯混合模型GMM,用Matlab把整条数据生成链路趟了一遍。这篇就是完整复盘:为什么选GMM、原理怎么落地、代码怎么写、以及实测中我踩过的坑。

1. 先算清楚账:GMM数据生成到底要解决什么问题

1.1 什么场景下需要“造数据”

做数据生成不是闲得没事造一堆数字出来玩,通常背后有明确的需求。我大致归纳成四类,你们可以对号入座。

第一类是数据增强和类别平衡。这个在工业场景里最常见。比如质检系统里,良品样本攒了上万条,次品样本只有几十条,分类模型天然偏向多数类。这时候与其去现场收集次品样本,不如用已有的几十条次品数据拟合一个分布,然后生成几百上千条合成次品样本,把训练集补平衡。这类需求的核心要求是:生成的样本必须和真实次品的分布形态一致,不能只做简单的复制或加噪声。

第二类是隐私脱敏与数据发布。医疗、金融这类领域里,原始数据往往不能直接导出或对外提供,但算法团队和外部合作方又需要数据做开发验证。一种通行做法是用真实数据训练出GMM参数,然后把参数文件公开,谁拿到参数谁就能用random函数生成一批接近原始分布但物理上又不同于任何一条真实记录的样本。因为生成出的样本不是逐条复制,隐私风险会低很多,同时分布结构能保留下来。

第三类是算法评估与压力测试。有时候你需要“按需定制”数据分布,去检验模型在不同形态下的表现。比如你要增加两个变量之间的相关性,或者人为地把某个峰挪远一点,观察聚类算法是否还能正确区分。GMM的参数是显式的,均值、协方差、混合系数可以直接改,改完马上生成新数据集,这种可控性是很多生成方法给不了的。

第四类是系统级仿真。我手头的项目就属于这类:用历史风速、温度、发电功率的联合分布去生成未来的运行场景,喂给能源调度仿真程序。真实记录只有半年,但仿真要求覆盖多种极端组合,靠现有数据根本跑不出来那么多组合场景。

1.2 为什么是GMM,而不是加噪声、KDE或GAN

这个问题几乎每次都会被问到,我统一解释一下几种常见方案的区别。

直接加噪声,也就是在每条原始样本上叠加一个高斯扰动,这是很多新手的第一反应。它的致命问题是破坏了变量间的相关结构。假设两个变量本来强正相关,散点图是一条细长的椭圆带,你给两个维度分别加上相同方差的独立噪声,等于在椭圆上叠加了一个各向同性的圆形分布,相关程度会被明显稀释。加噪声只适合数据本身方差很小、分布很简单的场景,对多峰分布则完全无能为力。

让每个真实样本点作为核中心,生成时随机选一个核再采样,即KDE(核密度估计)方式,理论上能做数据生成,实际操作却不方便。首先是资源问题:几千条样本就要存几千个核,生成大批量数据时内存和速度都受影响。其次是带宽参数不好调,调小了过拟合、调大了把细节全抹平。GMM等于是把几千个核自动聚拢成几个簇,用几个高斯分量去近似整体分布,精度未必比KDE差多少,但模型体积和生成速度会好一个量级。

至于GAN和VAE这些深度生成模型,在小样本场景下我基本不推荐。几百条样本训练GAN,模式坍塌几乎是家常便饭,训练过程还要反复调整网络结构、学习率、损失项,一套调试下来半天就没了,产出还不可控。VAE相对稳一点,但编码器、解码器的结构设计和隐变量维度的选择同样需要大量试错。GMM的优势正好补上这个空档:样本量少也能拟合,参数估计有严格数学保证,训练时间以秒计算,生成数据量可以无限且速度极快。

我整理了一张选型对比表,方便你们快速决策:

方法小样本稳定性可解释性生成速度高维支持适用场景
单高斯高高快中单峰、变量弱相关的简单数据
GMM高高快中低多峰、有相关结构的中低维数据
KDE高中慢低一维二维可视化、小数据量
VAE低低中高大样本量、中等复杂度分布
GAN低低中高超大样本量、图像等高维复杂数据

2. GMM核心原理:读懂了代码才不会用错

2.1 一个混合分布怎么拆

高斯混合模型说的其实是件很直觉的事:任何一个形状复杂的分布,都可能由若干个高斯分布“叠”出来。比如全校学生的身高体重数据画成散点图,往往不是一坨圆圆的点,而是分成几个聚在一起的高密度区域,对应着不同年级或不同性别的群体。你用单高斯去拟合这种数据,等于用一个圆去套几个分离的椭圆团,拟合出来的均值落在几个团之间的空白地带,方差被拉得极大,生成的数据自然全跑到真实数据不会出现的区域去了。

GMM用K个高斯分量来逼近整体分布,数学表达是这样:

p(x) = Σ_{k=1}^{K} π_k · N(x | μ_k, Σ_k)

这里N(x | μ_k, Σ_k)是均值为μ_k、协方差为Σ_k的多元高斯分布,π_k是第k个分量的混合系数,取值范围在0到1之间,并且所有π_k加起来等于1。每个分量的协方差矩阵Σ_k决定了这个高斯“团”的形状:对角线元素控制每个维度的方差,非对角线元素控制变量间的相关方向。一个分量对应一个椭圆状的密度区域,多个椭圆叠加起来,就能近似出任意复杂的联合分布。

你能从GMM里看到具体每个簇的位置、形状、权重,等于模型把“数据长什么样”这件事用几十个参数讲清楚了。

2.2 EM算法的E步与M步到底在交替做什么

估计GMM参数用的是EM算法,全称期望最大化。这个概念听起来高大上,拆开看就是两件事在反复循环:先猜每个样本来自哪个分量,再根据猜测的结果去更新分量参数。

第一步是E步(期望步)。当前已经有了一组参数初值,我对每个样本x_i分别计算它属于第k个分量的后验概率,通常记作γ_ik:

γ_ik = π_k · N(x_i | μ_k, Σ_k) / Σ_j π_j · N(x_i | μ_j, Σ_j)

这个值可以理解成“第i个样本对第k个分量的忠诚度”。如果某个样本正好落在一个分量的中心区域,它对这个分量的归属概率就接近1;如果落在两个分量的交界处,归属概率就会在两个分量之间分摊。

第二步是M步(最大化步)。根据所有样本对这些分量的归属概率,重新估计三个参数。每个分量的新混合系数等于该分量认领的总样本量除以全体样本数:

π_k = N_k / n,其中 N_k = Σ_i γ_ik

新均值是归属概率加权的样本均值:

μ_k = (1/N_k) Σ_i γ_ik · x_i

新协方差同样是加权的样本协方差:

Σ_k = (1/N_k) Σ_i γ_ik · (x_i - μ_k)(x_i - μ_k)^T

E步和M步交替迭代,每轮结束后重新计算对数似然值,直到连续两轮的变化小于设定的阈值,或者达到最大迭代次数。EM算法的妙处在于每一步更新都保证对数似然值不会下降,也就是说模型在每一轮都在往更好的方向移动,最终停在一个稳定的局部最优解上。

实际编程时你不需要自己写这两个步骤,Matlab的fitgmdist内部已经做了,但理解这个流程对排查问题非常有帮助。比如后面要讲的“局部最优”问题,本质上就是因为E步开始时给的初始参数不同,迭代停到了不同的山脚下。

2.3 分量个数K的取舍:BIC/AIC怎么用

GMM里最难选的超参数就是分量个数K。K太小,模型拟合不了多峰结构;K太大,会出现某个分量只覆盖几个样本的过拟合情况,生成数据会出现一堆莫名其妙的离群区域。

通常我用BIC(贝叶斯信息准则)来选K。Matlab的GMMDistribution对象自带BIC和AIC属性,不用手算,但最好知道它背后的逻辑。BIC的计算公式是:

BIC = m · ln(n) - 2 · lnL

其中m是模型的自由参数数量,n是样本量,lnL是最大对数似然。参数越多、样本量越大,BIC对复杂模型的惩罚就越重。对d维数据、K个完整协方差分量来说,自由参数数为:

m = (K-1) + K·d + K·d·(d+1)/2

K-1是混合系数,因为最后一个系数被总和为1的约束固定了;K·d是K个均值向量;K·d·(d+1)/2是K个协方差矩阵的自由参数数量。

实际操作中我一般不只看BIC的最小值,还会结合可解释性。比如K=5时BIC确实最低,但当中有一个分量的混合系数只有0.02,也就是它只描述了约2%的样本,那么这个分量很可能只是抓到了几个离群点,对业务理解没有帮助,我宁可选K=4。分量权重过小是一个很重要的预警信号,后面排查章节我会再展开。

3. Matlab实现:从验证脚本到真实数据

3.1 先用熟这几个关键函数

Matlab的统计和机器学习工具箱已经把GMM的拟合与采样封装好了,主要就是三个接口。

fitgmdist(X, K)用来拟合模型,输入是n行d列的数据矩阵,K是分量个数。输出是一个GMMDistribution对象,里面带着均值、协方差、混合系数、对数似然、BIC等信息。常用参数有以下几个:

参数作用我常用的设置
RegularizationValue给协方差矩阵对角线加一个小常数,防止奇异1e-5 到 1e-2
Replicates用不同初始值重复拟合,选似然最高的结果5 到 10
CovarianceType用完整协方差还是对角协方差'full'
Options控制迭代次数和显示内容statset('MaxIter', 500)
Start指定初始化方式默认即可,必要时用'plus'

random(gm, n)用来从拟合好的GMMDistribution对象中生成n条样本,返回n行d列的矩阵。另一个老接口gmrnd(gm, n)也能用,我建议统一用random,因为它对各种分布对象都适用,记一个就够。

nlogl(gm, X)用来计算模型在给定数据上的负对数似然,这个值在模型对比和评估时会用到,越低说明模型对数据的拟合越好。

3.2 一个可以直接跑通的生成demo

我先给出一段完整脚本。这个脚本有两层作用:第一层是用一个“已知答案”的二维GMM采样几千条数据,然后转身用fitgmdist去还原,检查拟合出来的参数和真实参数是否接近。这相当于验证整条链路的正确性。第二层是把真实数据代进去,拟合、生成、对比。

下面这个demo我建议你们拿到手先原样跑一遍,再改成自己的数据。

% ===== 第1步:构建一个已知的二维GMM作为“标准答案” ===== rng(42); % 固定随机种子,保证结果可复现 mu1 = [-2, 0]; Sigma1 = [1, 0.3; 0.3, 0.8]; mu2 = [2, 1.5]; Sigma2 = [0.6, 0; 0, 1.2]; truePi = [0.6, 0.4]; truthGM = gmdistribution([mu1; mu2], cat(3, Sigma1, Sigma2), truePi); X_truth = random(truthGM, 3000); % ===== 第2步:用fitgmdist拟合,看能不能还原 ===== gmEst = fitgmdist(X_truth, 2, ... 'RegularizationValue', 1e-5, ... 'Replicates', 5, ... 'Options', statset('MaxIter', 500)); % 打印估计出来的参数,与真值对比 disp('估计的均值:'); disp(gmEst.mu); disp('估计的协方差:'); disp(gmEst.Sigma); disp('估计的混合系数:'); disp(gmEst.ComponentProportion); % ===== 第3步:用拟合好的模型生成新数据 ===== X_new = random(gmEst, 5000); % ===== 第4步:可视化对比 ===== figure; subplot(1, 2, 1); scatter(X_truth(:, 1), X_truth(:, 2), 12, 'b', 'filled'); title('真实GMM采样'); axis equal; grid on; subplot(1, 2, 2); scatter(X_new(:, 1), X_new(:, 2), 12, 'r', 'filled'); title('拟合后GMM生成'); axis equal; grid on;

跑完这段脚本后,你会看到左右两张散点图在整体位置、椭圆方向和密度分布上基本一致,这就是“原理正确”的证据。我强烈建议你们养成这个习惯:先用已知模型验证流程,再套真实数据,而不是一上来就拿真实数据拟合,出了问题根本分不清是代码bug还是数据本身的问题。

对真实数据,只有一处要做适配。如果你的特征量纲差异很大,比如年龄是几十的量级、收入是几万到几十万的量级,虽然fitgmdist在原理上不需要归一化,但数值上大尺度特征的协方差会支配距离计算,影响初始化和EM迭代的稳定性。我会先把数据标准化到零均值单位方差,拟合生成,再把生成数据乘回去加回去恢复原始尺度。注意这个步骤只针对特征缩放,不要做非线性变换,否则会破坏相关结构。

% ===== 真实数据适配流程示例 ===== data = [height, weight, age]; % 替换成你自己的n行d列矩阵 data = rmmissing(data); % 先处理缺失值 mu_data = mean(data); std_data = std(data); data_norm = (data - mu_data) ./ std_data; gmReal = fitgmdist(data_norm, 3, ... 'RegularizationValue', 1e-4, ... 'Replicates', 10, ... 'Options', statset('MaxIter', 800)); X_syn_norm = random(gmReal, 10000); X_syn = X_syn_norm .* std_data + mu_data; % 还原到原始尺度

3.3 生成数据的质量评估

数据生成完了,不能光靠肉眼说“长得像”,要量化评估。我通常从三个层面去验证。

第一层是可视化。二维数据可以画散点图对比真实样本和生成样本,一维数据则用直方图叠加对比。特征维度如果超过三维,我会用gplotmatrix或者逐对画边际散点图矩阵,主要看两个东西:每个维度的分布范围是否一致、任意两个维度的相关方向是否一致。散点图矩阵虽然直观,但在维度多时输出图面积太大,所以我一般只看重点维度组合。

第二层是统计量对比。最基础的是对比均值向量和协方差矩阵。均值对不齐说明位置偏移了,协方差对不齐说明相关结构失真了。我自己会用一段小函数计算“矩距离”:

function d = momentDistance(X, Y) muX = mean(X); muY = mean(Y); covX = cov(X); covY = cov(Y); d = norm(muX - muY, 2) + norm(covX - covY, 'fro'); end

'fro'是Frobenius范数,相当于把矩阵当成向量算欧氏距离,一个数值就能概括协方差阵的整体差异。这个值越小,说明生成数据和真实数据的二阶统计特性越接近。对生成多个数据集做稳定性评估时,我会把这段函数放进循环,生成十批数据各算一次距离,看均值和波动范围。

第三层是下游任务验证。统计量再漂亮也不如实际任务说了算。如果这批数据是用来训练分类器的,我会把合成数据和真实数据分别训练同一个模型,在同一个测试集上对比准确率。如果两个模型的表现差异在可接受范围内,说明生成数据的质量足以支撑业务。如果差异明显偏大,大概率是GMM没有抓住某些分布细节,需要回头检查K或预处理方式。

3.4 从联合分布到条件分布:真实数据生成的进阶需求

实践里经常碰到一个更精细的需求:已知部分特征,想生成另一部分特征。比如我有一批完整的用户行为数据,现在想根据用户的年龄、地区,生成其消费金额和活跃度,也就是给定x求条件分布p(y|x)。

GMM有一个很好用的数学性质:如果联合分布是GMM,那它的条件分布依然是GMM。假设我们直接把x和y放在一起拟合了一个K分量的GMM,对于每个分量k,把均值、协方差按x部分和y部分分块:

μ_k = [μ_{x,k}; μ_{y,k}], Σ_k = [Σ_{xx,k}, Σ_{xy,k}; Σ_{yx,k}, Σ_{yy,k}]

给定x后,第k个分量在条件分布中的权重为:

ω_k(x) = π_k · N(x | μ_{x,k}, Σ_{xx,k}) / Σ_j π_j · N(x | μ_{x,j}, Σ_{xx,j})

条件分布的均值和协方差也都有解析表达式:

μ_{y|x,k} = μ_{y,k} + Σ_{yx,k} · Σ_{xx,k}^{-1} · (x - μ_{x,k})

Σ_{y|x,k} = Σ_{yy,k} - Σ_{yx,k} · Σ_{xx,k}^{-1} · Σ_{xy,k}

生成时先根据ω_k(x)随机选一个分量,再从N(μ_{y|x,k}, Σ_{y|x,k})采样一次,就得到给定x条件下的y样本。这套逻辑我封装成一个函数后,在多个项目里复用,特别好使。如果你们也有这种“补全缺失特征”的需求,建议把这一节的理论直接转成代码。

4. 实操中反复踩的坑与排查方法

4.1 每次收敛到不同模型怎么办

这是一个让很多人困惑的现象:同样的数据、同样的fitgmdist调用,改一下Replicates数或者rng种子,拟合出来的均值和BIC都不一样。原因在于EM算法对初始值敏感,不同的随机起点可能收敛到不同的局部最优解。

排查方法很简单:把两个不同随机种子下的拟合结果打印出来,对比gmEst.mu和gmEst.NegLogLikelihood。如果对数似然差距很大,说明数据里有多个相近的分量估计,模型掉进了不同的局部解。解决方法是增加Replicates,让Matlab从更多初始值开始尝试,并只保留对数似然最大的那个结果。Replicates并不是越大越好,它只涨时间不增加样本信息,通常10次足够。如果10次结果仍然跳变明显,我会检查K是不是选大了,或者数据里是否存在严重的离群点干扰。

4.2 协方差矩阵奇异报错

这是GMM拟合里最经典的问题。报错信息通常是“The covariance of each component must be positive definite”之类的提示。本质原因是某个拟合出的分量在某个方向上的方差趋近于零,协方差矩阵变成奇异矩阵,不能求逆。

最常发生的场景有三个:样本量过少、特征之间存在强共线性、存在离群点让某个分量被拉伸成一条线。我的处理顺序是:先看数据量,如果样本量只有分量参数数量的两三倍,那GMM本来就非常勉强,要减少K或改用对角协方差'CovarianceType', 'diagonal'。再看特征,如果两个特征高度线性相关,考虑去掉其中一个或用PCA降维。最后看离群点,用箱线图或近似分布方法标记出离群样本,剔除后再拟合。

还有一个立竿见影的手段:RegularizationValue。它会给协方差矩阵的对角线加上一个小的常数,保证矩阵可逆。我一般从1e-6开始,如果还报错就逐步加到1e-4、1e-2。需要注意这个值不能加太大,否则会把所有分量的方差人为撑大,导致生成数据偏离真实分布。最理想的状态是加一个刚刚好能让拟合稳定的临界值。

4.3 生成样本出现明显不合理的点

GMM的每个高斯分布都有长尾,拟合后生成数据时,低概率的极端点一定会有。物理量尤其明显,比如你生成的样本代表温度,理论最低就是零下几十度,GMM很可能给你吐出一个零下300度的离群点。

处理方式我根据场景分两类。如果下游任务能容忍少量离群点,直接做范围裁剪,把超出物理上下界的值截断到边界。但这样做会引入边界堆积效应,需要你去理解业务上是否接受。如果下游任务对边界敏感,我建议在拟合之前把数据转换到无界空间。拿限制在[0,1]区间内的特征举例,先用logit变换z = log(x / (1 - x))把数据映射到实数域,在实数域拟合GMM、生成样本,再用sigmoid函数变换回来。边界数据要提前做平滑截断,比如x小于0.001就替换为0.001,大于0.999就替换为0.999,因为直接在0或1上取对数会得到无穷大。这个技巧在处理百分比类特征时非常好用。

4.4 高维数据容易翻车

GMM的参数复杂度是随维度平方级增长的,一个d维完整协方差矩阵就有d·(d+1)/2个独立参数。当d到几十甚至上百时,参数数量会迅速超过样本量,EM算法非常容易过拟合。我在三维、五维里跑得很欢的GMM流程,换到二十维数据时常常就收敛得非常糟糕。

我的推荐路径是先降维再生成。用PCA把原始高维特征降到保留约95%方差的主成分空间,在低维空间里拟合GMM、生成样本,最后把生成样本映射回原始空间。降维本身让GMM看到的分布更干净,生成后的数据虽然会损失极小一部分信息,但整体结构保持得比我预想的好。如果降维到两三维仍然是多峰结构,GMM就非常适合了。这一步是我在做高维数据生成时的必备流程,你们可以直接照搬。

5. 几个典型的业务落地场景

5.1 类别不平衡时的数据增强

一个非常直接的落点是为少数类合成样本。假设你有一个二分类任务,正类样本8000条,负类样本只有120条。做法是取出全部负类样本的原始特征矩阵,剔除缺失值后用一个较小的K拟合GMM,然后生成你需要的数量。每个类别单独拟合、单独生成,这样就不会破坏类别间的边界信息。

实际踩过的一个问题:少数类内部如果有多个子模式,只用一个K等于强行把不同子模式揉成一个高斯,生成数据会丢细节。遇到这种情况,我会先用聚类或直接目视散点图判断子模式数量,再把这个数量作为K的候选值之一。处理好之后,生成的样本再配合真实样本一起放进训练集,分类器对少数类的召回率通常会有明显提升。

5.2 缺失值填补与数据补齐

GMM本身就是一种联合分布模型,天然适合做缺失值填补。操作流程分三步:先用完整个体(所有特征都完整的样本)拟合GMM;对每个缺失样本,把已知特征代进条件分布公式,生成缺失特征的候选值;重复生成多次,得到多份完整数据集。这种做法比单纯用均值填充好很多,因为它保留的是缺失值的不确定性,不会让所有填补值落在同一个点上。

我在这类任务上做成过一个小工具:输入一个含NaN的表格,输出一组填补后的完整表格。关键点是拟合GMM时只用完整样本,生成缺失值时才针对每个样本的条件分布单独采样。

5.3 多目标仿真场景生成

开头提到的能源仿真项目就属于这一类。历史数据是风速、温度、发电功率三个变量的联合观测,直接对三者联合建立GMM,一次random就生成出一大批三维场景,同时保留了变量间的相关结构。这类数据的维度通常不高,GMM表现非常稳定。

如果数据有明显的时间顺序,比如发电功率在相邻时刻强相关,单纯把每一时刻独立采样会丢掉时序结构。我的做法是用一个隐变量来串联时间:马尔可夫链控制当前时刻处于哪个GMM分量,每个分量内部再采样。严格的说这已经退化成GMM-HMM混合模型,但核心思想还是GMM那一套。Matlab里可以用隐马尔可夫模型工具箱配合GMM来搭,改动量并不大。

6. 我的选型建议与后续扩展

6.1 GMM当baseline的性价比

我每次接数据生成相关需求,都会先跑一轮GMM当baseline。原因很现实:GMM训练快、产出快、可解释性强,跑出来的结果会告诉你这个任务的分布复杂度大概是什么水平。如果GMM已经能完美复现观测数据的统计特性,那这个任务根本不需要上深度生成模型。只有当我明确看到GMM在不同K值下都复现不了某些分布细节,比如存在明显的非线性流形结构,才会考虑VAE或GAN。

这个决策顺序帮我挡掉了大量不必要的复杂度。毕竟GAN一上来就是一堆超参数,训练失败或者模式坍塌时,你很难判断是数据问题、网络结构问题还是训练策略问题。GMM的定位更像一个体检仪:先把数据健康状况查清楚,再决定要不要做手术。

6.2 更进一步的扩展路径

当GMM不能满足需求时,有一条循序渐进的升级路线。

第一个可选项是贝叶斯GMM。它用变分推断代替EM算法,能在训练过程中自动控制有效的分量个数,对K的选择依赖性小很多。缺点是速度比EM慢,数学理解和参数解释也更复杂,适合K有没有完全没把握的探索期。

第二个可选项是狄利克雷过程混合模型(DPGMM),它可以自动决定需要多少个分量,理论上避免了人为设定K的问题,是更“无监督”的方案。

第三个选项是GMM和深度学习结合。比如用GMM作为VAE的先验分布,把混合模型的聚类能力嵌入到隐空间里,用来解决连续隐变量和类别结构同时存在的数据场景。

如果是时间序列数据,GMM-HMM是最自然的扩展方向,前面已经提过,它用一个离散状态链贯穿时间,每个状态内用高斯分布描述观测值的随机性。

最后分享一点实操体会

我在多个项目里把GMM数据生成跑了一遍,最深的体会是:这一步很少是终点,更像一个探路工具。它能在几分钟之内告诉你,这批数据的分布到底长什么样、有哪些模式、哪些特征是强相关的、哪里存在离群点。这些信息在做任何数据生成任务之前都是最有价值的。整套流程里最容易被忽略的环节是验证,很多人拟合完就急着生成,生成完就急着丢给下游模型,结果模型表现不符合预期,又回头怀疑生成方法有问题。我的建议是先跑一遍已知模型验证,再拟合真实数据,多看诊断图和数据对比,最后才谈下游任务。这个顺序几乎能消灭一半的调试时间。

返回列表