想象你是一位怀揣秘方的厨师。为了研发一道招牌菜,你反复调整火候、调料比例和烹饪时间。第一天你觉得“盐好像多了点”,第二天觉得“火候有点过”,全靠舌头和感觉。直到有一天,一位老主顾问你:“上次那道菜到底怎么做的?我想在家复刻。”你愣住了——你没有记笔记。 AI 工程师做实验,和厨师做菜几乎一模一样。调一个学习率、换一层网络、清洗一遍数据,每次改动都是一次“实验”。如果不把训练损失、验证准确率、用户点击率这些指标像菜谱笔记一样记录在案,你永远无法回答“哪个改动真正有效”“这个结果能不能复现”。指标记录,就是给每次实验建立一份可量化的“厨师笔记”。 这套笔记体系有七个环节:先定评价标准(指标体系设计),再装测量工具(指标采集),接着归档整理(指标存储),然后翻阅找规律(查询分析),把数字画成图(可视化),用盲测对比好坏(实验评估),最后统一度量衡(治理规范)。这七个环节构成了 MLOps 中实验追踪的完整地基,也是今天这篇文章的主角。
掌握指标记录,等于给每个实验装上仪表盘和账本,让模型迭代从“凭感觉”升级为“靠数据”——这是 AI 从业者最基础也最值钱的能力。
可视化演示
可视化指标分层体系、训练验证Loss趋势分析与离线在线指标关联,滑块调节训练进度观察过拟合拐点变化。
本节配有交互动效(进入视口后自动加载,约 3KB)。
指标体系:训练→验证→测试→业务四层评估 训练:模型在训练集上的loss 验证:调参依据,检测过拟合 测试:最终泛化性能评估 Metrics = {train, val, test, biz} 四层指标全面评估实验效果
指标体系设计
厨师评价一道新菜,不会只问“好不好吃”这一个问题。他会关心颜色是否诱人、香气是否浓郁、口感是嫩是脆、咸淡是否合适,还会问客人愿不愿意下次再点。每一个角度都是一条评价标准,合起来就是一份“评分表”。这张评分表,就是做菜的指标体系。
机器学习实验也一样。评价一次实验,不能只看一个数。你需要一套分层指标体系:训练指标回答“模型学进去了没有”,比如训练损失(训练集上的误差);验证指标回答“模型是不是只会背答案”,比如验证集准确率、F1 分数、AUC;业务指标回答“这个模型有没有创造价值”,比如推荐系统的点击率、内容平台的留存率、电商的转化率。三层指标各司其职,就像色香味与回头客分别代表一道菜的不同侧面。
设计指标体系时,有一个常见的做法:把多个指标加权汇总成一个综合评分,方便快速排序多个实验。假如你有 $n$ 个指标,每个指标的归一化分数是 $\hat{x}_i$,对应的权重是 $w_i$(所有权重之和为 1),综合评分就是:
回到厨师的世界:一份好的评分表不能只写“好吃”,还得写明“色、香、味、口感、回头客”各占多大权重。这样,两位厨师做的菜才能放在同一套标准下公平比较。指标体系,就是这场公平比较的起点。
- 认识 $\hat{x}_i$这是第 $i$ 个指标经过归一化后的分数,范围通常在 0 到 1 之间,代表“这个指标好到什么程度”。
- 理解权重 $w_i$$w_i$ 表示第 $i$ 个指标的相对重要程度,业务指标可能比训练指标权重更高,所有权重加起来等于 1。
- 执行加权求和把每个归一化分数与它的权重相乘,再全部相加,就得到了综合评分 $S$ 越高代表实验整体效果越好。
指标采集方法
厨师确定了评价标准之后,接下来要解决的是“怎么把数据记下来”。是目测?凭手感?还是用一个温度计插进肉里测中心温度?显然,温度计比手感可靠得多。在厨房里,“温度计”就是一套指标采集工具。
机器学习的指标采集,通常有三种“温度计”。第一种是框架钩子:像 PyTorch、TensorFlow 这类框架都提供了回调机制,你可以在每个训练轮次结束时自动触发一个函数,把当前的损失和准确率记录下来,全程不需要手动插代码。第二种是手动埋点:有些指标框架不知道,比如自定义的业务指标、中间层的输出分布,需要你亲手在代码里写上一行记录语句,就像厨师在出锅前亲自夹一筷子尝味道。第三种是定时采样:如果每个 step 都记录,日志会非常庞大,你可以每 50 步、每 100 步记录一次,就像温度计每隔五分钟看一眼,而不是每秒钟都盯着。
采样率是一个需要权衡的参数。假设总共有 $N_{\text{total}}$ 个训练步骤,你实际记录了 $N_{\text{sampled}}$ 个步骤的指标,那么采样率可以表示为:
厨师不会把每一秒的火苗大小都记下来,那样笔记本会厚到翻不动。他会在起锅、下料、转小火这些关键节点各记一笔,再配合温度计的定时读数,就足够复盘了。指标采集的精髓,就是用尽可能小的成本捕捉最重要的变化。
- 确定分母 $N_{\text{total}}$这是实验总共会执行的训练步数,是整个采样范围的“全集”。
- 确定分子 $N_{\text{sampled}}$这是你真正记录下指标的步数,因为跳过了间隔,它通常小于总步数。
- 计算比值 $r$采样率 $r$ 反映了记录密度,$r = 1$ 表示全量记录,$r = 0.1$ 表示每十步记一次。
指标存储方案
试吃员每天送来一批评分卡片,如果随手扔在灶台角落,三天后就被油污糊住了。聪明的厨师会把卡片按日期分类,夹进活页笔记本,再在封面写上菜名和版本号。这样,三个月后想查“上次那道糖醋排骨的火候记录”,翻一翻就找到了。指标存储,就是给实验数据找一个靠谱的“活页夹”。
在工程上,指标通常存在三类地方。时序数据库(如 InfluxDB、Prometheus)专门存“随时间变化的数值”,查询趋势图特别快,适合训练损失、验证准确率这类序列数据。元数据表存“和指标绑定的描述信息”——超参数、数据集版本、代码 commit 号,就像菜谱上写的“用的什么牌子的醋、什么品种的排骨”。版本快照则把指标和模型权重一起归档,每次实验产出一个完整快照,保证未来能复现这个实验结果。最后,老旧实验的数据可以定期归档到廉价存储,像把陈年菜谱移到仓库书架。
在规划存储方案时,容量估算很重要。假设每个指标用 $B$ 字节存储(通常 8 字节的浮点数),有 $N$ 个指标项、每秒采集 $F$ 次、持续运行 $T$ 秒,总存储量就是:
厨师的活页夹如果每页都记满,再大的本子也会爆。聪明的做法是:重要的菜(核心实验)记详细,试做的边角料菜式只记一个结论。存储方案的本质,是在“将来找得回来”和“现在存得下”之间找到平衡。
- 理解单点开销 $B \times N$每个指标一个数字,一个浮点数占 8 字节。如果记录了 1000 个指标,单次快照就是 8000 字节。
- 乘上时间密度 $F$每秒采样 $F$ 次,那么每秒新增的数据量就是 $B \times N \times F$。
- 乘上总时长 $T$训练一共跑了 $T$ 秒,整个生命周期产生的数据总量就是四者的乘积 $C$。
指标查询分析
笔记记了厚厚一本,接下来要发挥它的价值——翻笔记本找规律。厨师会发现:凡是火候调到 180 度的那几次,肉都偏老;凡是提前腌制两小时的那几次,咸淡都刚刚好。这些规律不在笔记的哪一页上,而藏在页与页之间的对比之中。查询分析,就是把这些藏起来的规律“读”出来。
第一层是趋势分析:把某个指标按时间顺序排开,看它是逐步下降、震荡还是发散,一眼判断训练是否正常。第二层是对比分析:把两次实验的同一指标放在一起比,看哪个改动的效果更好。第三层是筛选聚合:按数据集、超参数等维度筛选,再把一组实验的指标求平均、求方差,得到“这一类配置的典型表现”。更深一层是异常检测:当指标曲线突然出现尖刺或阶梯式跳变,说明可能发生了梯度爆炸、数据泄漏或学习率设置异常。
由于训练曲线往往噪声很大,直接看原始数值很难判断趋势。常用的手段是移动平均——把最近 $k$ 个点的平均值作为当前值,像用一块抹布把曲线的毛刺抹平。移动平均的公式是在时刻 $t$ 处取最近 $k$ 个观测值的平均:
厨师的笔记本里,单看某一天的记录说明不了问题,但把连续五次的记录放在一起看,“火候大了肉老”这个规律就浮现出来。查询分析的真正价值,不是读单个数字,而是从数字的排列组合里读出决策依据。
- 确定窗口 $k$分子部分要累加最近 $k$ 个观测值。$k$ 越大,曲线越平滑、反应越迟钝。
- 写出求和式$\sum_{i=0}^{k-1} x_{t-i}$ 表示从当前值 $x_t$ 开始,往前数 $k$ 个观测值全部累加。
- 除以窗口长度 $k$累加结果除以 $k$,得到这 $k$ 个点的平均值,也就是平滑后的曲线值 $MA_t$。
指标可视化
如果你拿一张写满密密麻麻数字的纸给厨师看,他会皱眉头;但如果你把“咸淡合适程度”画成一条随时间变化的曲线,他一眼就能看出哪几次偏咸、哪几次刚好。人类是视觉动物,数字要变成图形,才真正飞进脑子里。可视化,就是把指标数据翻译成直觉。
在实验追踪工具中,最常见的可视化包括四类。训练曲线把每一步的指标按时间画成折线图,x 轴是训练步数、y 轴是指标值,用来观察训练过程的动态。损失曲线是最关键的一条,训练损失下降说明模型在学习,验证损失同时下降才是真学到东西;二者背离(训练降、验证升)就是过拟合的警报。混淆矩阵用格子展示分类模型在每一类上的预测对错,比单一准确率信息量丰富得多。仪表盘则把一组核心指标汇总到一个视图里,像汽车仪表盘一样一屏看清所有关键状态。
不同指标的数值范围差异很大:损失可能在 0.01 到 2 之间,准确率在 0 到 1 之间,AUC 也是 0 到 1。要把它们画在同一张图里对比,需要先归一化。最常用的是最小值—最大值归一化:
把笔记本上的数字画成图,就像把菜谱变成一张“火候—咸淡”关系图。厨师不用再逐个数字去回忆,看图就能复现那道成功的菜。可视化的意义,是让数据自己开口说话。
- 减去最小值 $x_{\min}$分子中的 $x - x_{\min}$ 让最小值变成 0,相当于把所有数值整体平移。
- 除以区间长度$x_{\max} - x_{\min}$ 是原始数据的跨度,用跨度去除,把整个区间缩放到 0 到 1。
- 组合成归一化分数最终 $\hat{x}$ 在 0 到 1 之间,0 代表最差、1 代表最好,不同指标间可以直接比较。
实验对比评估
菜谱研发到关键节点,厨师会请几位老食客做一次盲测:同一道菜,做法 A 和做法 B 各做一份,不告诉食客哪份是哪份,让他们打分。为什么要盲测?因为“我知道这是新配方”的想法会 bias 你自己的判断。实验评估,就是这一场严肃的盲测。
对比评估的第一步是基线对比:每次实验都先跑一个基线模型(比如当前线上的模型),再用新模型和它比,这是评估的“参照物”。第二步是多组对照:不要只改一个变量就下结论,最好同时跑多个配置,并让它们共享随机种子、数据划分,避免其他因素干扰。第三步是显著性检验:新模型的准确率高 0.5 个百分点,是真实提升还是随机波动?简单的做法是重复跑多次实验,看均值差异是否稳定超过方差。
相对提升率是实验报告中最常用的数字。假设基线模型的某个指标是 $B$,实验组的同一指标是 $A$,那么相对提升率就是:
盲测结束后,老食客的评分表摆在桌上,哪道菜赢了、赢了多少、值不值得写进菜单,一目了然。实验评估的本质,是让结论建立在一组可比较的数字之上,而不是某一次“感觉不错”的玄学体验。
- 计算差值 $A - B$先用实验组指标减去基线指标,得到一个“增量”。这个增量可正可负。
- 除以基线值 $B$增量除以基线值,把绝对差值标准化为“每一份基线对应的增量”,消除了基线的量纲影响。
- 乘以 100 转成百分比小数变成百分数,方便在报告里沟通。
指标治理规范
一段时间后,后厨来了三位新厨师,人人都开始记笔记。问题来了:A 师傅写“盐少许”,B 师傅写“加盐 1 捏”,C 师傅写“5 克盐”——三个人说的明明是同一件事,笔记却完全没法横向比较。更糟的是,A 师傅记的“时间”是以“从点火开始算”为基准,B 师傅是“从下锅开始算”。不同度量衡,让整本笔记沦为废纸。这就是指标治理要解决的混乱。
治理规范的第一条是命名规范:所有指标必须在团队的指标字典里登记,比如训练损失统一叫 train/loss_step,验证准确率统一叫 valid/accuracy,谁也不能自创一个 my_loss。第二条是单位标准:时间统一用秒、时长统一用毫秒、学习率统一用科学计数法,任何人在任何环境下记录的数据都可以直接比较。第三条是版本对齐:每条指标必须绑定当前的代码版本、数据版本和超参数版本,就像菜谱必须写清“采用第 3 版酱汁配方”。第四条是权限管理:指标数据是团队的重要资产,谁可以写入、谁只能读取、谁可以删除归档,都需要明确约束。
衡量治理好不好,用一个“指标完整率”来体检:假设一个实验预期要记录 $N_{\text{expected}}$ 条指标,实际成功记录了 $N_{\text{valid}}$ 条(且命名、单位都合规),那么完整率就是:
当所有厨师都改用同一个度量衡、同一本术语字典,后厨的笔记才真正变成团队资产——任何一个人翻开,都能看懂任何另一个人记的东西。指标治理,就是让“记录”本身成为一种可靠的集体习惯。
- 确定预期记录数 $N_{\text{expected}}$根据实验设计,应该记录的指标条数总和,是“满分答卷”的长度。
- 统计有效记录数 $N_{\text{valid}}$实际记录成功、且命名与单位都符合规范的指标条数,剔除掉缺项和乱写的。
- 计算完整率 $C_{\text{complete}}$有效数除以预期数再乘 100%,100% 意味着治理满分,低于 90% 就该查查是采集断了还是命名乱了。
AI 应用场景
场景一:训练平台自带“实验账本”
阶段:实验追踪与结果沉淀
解决的问题:算法团队每周跑几十次实验,以前靠工程师手动在 Excel 里填结果,漏填、误填、格式混乱屡见不鲜。AI 平台接入指标记录体系后,训练框架自动通过钩子采集损失、准确率等指标,结果自动写入平台,形成每次实验的“账本”。
具体案例:某互联网公司的算法团队在模型训练平台中接入 MLflow,每次训练自动记录指标、参数和代码版本。三个月后,团队要复盘“为什么 10 月之后的点击率模型普遍提升”,翻出平台里的历史记录,发现是数据清洗策略的版本变更带来的提升。
场景二:推荐系统的 A/B 实验评审
阶段:模型上线前的多组对照评估
解决的问题:推荐算法改版后,单看离线 AUC 提升 0.3 个点,无法判断是否值得上线。通过指标记录体系,把线上 A/B 实验的业务指标(点击率、人均时长、留存率)与离线指标统一存储、对比,并用相对提升率量化收益。
具体案例:某短视频推荐团队对新排序模型做了七天 A/B 实验,指标看板显示:人均观看时长相对提升 3.2%,点击率提升 0.8%,但次日留存率下降 0.4%。业务方综合三个指标后决定暂时不上线,避免饮鸩止渴。
场景三:线上模型漂移的实时监控
阶段:模型上线后的持续监控
解决的问题:模型上线后,输入数据分布会随着时间悄悄变化,导致预测质量下降。指标记录体系把线上推理的实时指标(预测置信度、特征分布距离)接入时序数据库,设置异常检测阈值,指标一旦偏离历史基线立即告警。
具体案例:某银行风控模型的实时监控发现,“平均授权概率”在过去两周内从 40% 缓慢爬升到 55%,触发了告警。排查后发现是外部数据源的某个字段缺值率升高,经过修复后指标回归正常范围。
Python 演示
import mathimport random class ExperimentTracker: """Tracker for recording and analyzing ML experiment metrics.""" def __init__(self): self.run_history = {} def log_metrics(self, run_name, step, metrics): if run_name not in self.run_history: self.run_history[run_name] = [] record = {"step": step} record.update(metrics) self.run_history[run_name].append(record) def get_metric_series(self, run_name, metric_name): history = self.run_history.get(run_name, []) return [record[metric_name] for record in history if metric_name in record] def moving_average(self, values, window=5): if not values: return [] result = [] for i in range(len(values)): segment = values[max(0, i - window + 1):i + 1] result.append(sum(segment) / len(segment)) return result def relative_improvement(self, run_a, run_b, metric_name): series_a = self.get_metric_series(run_a, metric_name) series_b = self.get_metric_series(run_b, metric_name) if not series_a or not series_b: return None return (series_a[-1] - series_b[-1]) / series_b[-1] * 100 def summary_report(self, run_name): history = self.run_history.get(run_name, []) if not history: return "No records for run: %s" % run_name latest = history[-1] lines = ["Run=%s step=%d" % (run_name, latest["step"])] for key, value in latest.items(): if key != "step": lines.append("%s=%.4f" % (key, value)) return " | ".join(lines) def simulate_training(tracker, run_name, steps=60, seed=0): random.seed(seed) for step in range(steps): loss = 1.2 * math.exp(-step / 25) + 0.05 * random.random() acc = min(1 - math.exp(-step / 40) + 0.01 * random.random(), 1.0) tracker.log_metrics(run_name, step, {"loss": loss, "acc": acc}) if __name__ == "__main__": tracker = ExperimentTracker() simulate_training(tracker, "baseline", 60, seed=1) simulate_training(tracker, "new_model", 60, seed=2) print(tracker.summary_report("new_model")) smooth_acc = tracker.moving_average( tracker.get_metric_series("new_model", "acc"), window=10) print("smoothed acc tail: %.4f" % smooth_acc[-1]) lift = tracker.relative_improvement("new_model", "baseline", "acc") print("relative acc lift: %.2f%%" % lift)
self.run_history = {}用字典按实验名存放所有指标记录,类似厨师给每道菜单独开一页笔记。record = {"step": step}; record.update(metrics)把步数和其他指标合并成一条完整记录,就像笔记上写清“第几步、当时什么状态”。self.run_history[run_name].append(record)每次记录都追加到该实验的历史列表中,保持时间有序。get_metric_series从原始记录中抽取出某个指标的一维时间序列,供后续分析使用。values[max(0, i - window + 1):i + 1]截取当前点往前 window 个点,这是移动平均的“滑动窗口”。sum(segment) / len(segment)窗口内取平均值,正是正文中的 $MA_t$ 公式落地。return (series_a[-1] - series_b[-1]) / series_b[-1] * 100只取最后一个点的值计算相对提升率,是实验评审中最常看的“最终成绩”。simulate_training用指数衰减加随机噪声模拟真实的训练过程,生成 loss 下降、acc 上升的曲线。smooth_acc = tracker.moving_average(...)对原始准确率做移动平均平滑,抹掉噪声才能看清趋势。print(tracker.summary_report("new_model"))输出该实验最新一条记录的完整摘要,等同于实验看板上的“当前状态”。
常见误区
误区训练模型嘛,把 loss 记下来就完成了指标记录,loss 是最重要的指标,其他都不用管。
正解loss 只反映模型在训练集上的拟合程度,它回答不了“模型在新数据上表现如何”和“模型是否创造了业务价值”。就像厨师只记录“咸淡”,却不记录色泽、口感和顾客满意度,这道菜到底成不成功,根本没有答案。一套完整的指标记录,至少要覆盖训练、验证、业务三个层面,每层选关键指标,才能拼出全貌。
为何常见:训练过程中最常见的反馈就是 loss 数值,框架默认也显示它,初学者很容易把“最容易看到的”当成“最重要的”。
误区把指标数值记下来保存好就够了,至于这个指标是在哪个代码版本、哪个数据集上跑出来的,不用管。
正解脱离了版本的指标就像没有标明日期的菜谱。同样是准确率 90%,出自旧数据版本或新数据版本,含金量完全不同。指标必须和代码版本、数据版本、超参数绑定在一起,否则三个月后回看这个数字,你根本不知道它代表哪个实验,也无法复现。
为何常见:记录当下运行时环境的元数据需要额外代码和工具支持,初学者往往嫌麻烦,觉得“先把数字记下再说”。
误区指标记录应该每一步都记,一个 step 都不放过,这样信息最全,反正磁盘空间很便宜。
正解每一步都记录会产生海量数据,存储成本上升、查询变慢,而相邻步长的损失数值高度相似,信息冗余极大。采用间隔采样加移动平均,就能在保留趋势的同时大幅压缩数据量。厨师的温度计不会每秒钟都读数,五分钟一记、关键节点手动补记,才是聪明的记录方式。
为何常见:“信息全=更好”的直觉很强,加上对存储成本、查询性能缺乏估算经验,就容易过度采集。
误区验证集准确率 95%,比基线高了 5 个点,模型很优秀,直接上线吧,不用再看别的指标了。
正解验证集准确率高,只说明模型在静态数据切片上表现好。它可能过拟合了验证集,也可能在业务侧带来副作用(如推荐系统点击率升了但留存率降了)。一个科学的决策需要结合业务指标做线上验证,看的是“是否解决了真问题”,而不是单一离线数字的高低。
为何常见:离线指标容易获取、结果清晰,业务指标需要跑线上实验、等待时间长,人天然偏好“快而简单”的答案。
误区指标是自己的实验笔记,我想怎么命名就怎么命名,反正我自己看得懂就行。
正解一个人看得懂,团队其他人看不懂;今天看得懂,三个月后的自己可能也看不懂。不同人对"loss"可能分别理解为训练损失、验证损失或正则项损失,单位也五花八门。没有统一命名和单位标准,跨实验、跨团队的比较就无从谈起,指标记录的价值会大打折扣。
为何常见:团队初期规模小、沟通靠口头对齐,等规模变大才尝到“度量衡混乱”的苦果,但那时改造成本已经很高了。
面试题
Q1. 指标记录在实验追踪中最核心的价值是什么?
- A.让代码看起来更规范
- B.沉淀可复现的实验结果← 正确答案
- C.自动修复模型缺陷
- D.提升 GPU 计算效率
答案:B。指标记录的核心价值是把每次实验的结果量化并沉淀下来,让“哪个改动有效、结果能否复现”有据可查。它不负责修 bug 或加速训练,与代码规范、GPU 效率也无直接关系。
Q2. 下列哪一项属于业务指标?
- A.训练损失数值
- B.梯度范数大小
- C.用户点击率数值← 正确答案
- D.验证集准确率
答案:C。业务指标是与业务价值直接挂钩的指标,如点击率、留存率、转化率。训练损失、梯度范数属于训练过程指标,验证集准确率属于验证指标,它们与用户侧的实际体验价值不同。
Q3. 移动平均在指标分析中的主要作用是?
- A.放大指标的波动
- B.抹平噪声露出趋势← 正确答案
- C.压缩数据存储空间
- D.替代原始指标数据
答案:B。移动平均通过取最近 k 个点的平均值,把随机噪声平滑掉,让真实趋势显现出来。它不会放大波动,也不能压缩存储或取代原始数据,后者需要采样与存储策略配合。
Q4. 设计机器学习实验指标体系时,应遵循哪些原则?
- A.分层覆盖训练验证业务← 正确答案
- B.记录的指标越多越好
- C.与最终决策目标对齐← 正确答案
- D.保证命名与口径统一← 正确答案
答案:ACD。指标体系设计要分层(训练、验证、业务三层),要和团队真正关心的决策问题对齐,并且命名、单位要统一才能跨实验比较。指标不是越多越好,冗余指标反而增加存储和噪音,违背聚焦原则。
Q5. 计算实验相对提升率时,分母通常取什么?
- A.新实验组的指标值
- B.基线实验的指标值← 正确答案
- C.训练总的步数
- D.模型的参数量
答案:B。相对提升率 $\eta = (A-B)/B$,其中分母是基线指标 B,表示“比基线好/差百分之多少”。如果分母取实验组自己,等于跟自己比,没有参照意义;训练步数和参数量与提升率计算无关。
Q6. 常见的机器学习指标采集方式包括哪些?
- A.框架训练回调钩子← 正确答案
- B.手动埋点记录← 正确答案
- C.按间隔定时采样← 正确答案
- D.靠个人经验猜测
答案:ABC。框架钩子(如 PyTorch Callback)自动采集、手动埋点抓取自定义指标、定时采样控制数据量,这三种都是规范采集方式。靠经验猜测不属于采集,指标记录必须来自真实运行数据。
Q7. 训练结束时,最适宜长时间序列指标分析的数据库选型是?
- A.普通日志文本文件
- B.时序数据库← 正确答案
- C.内存缓存数据库
- D.共享网盘文件夹
答案:B。时序数据库专门针对“随时间变化的数值”设计,写入高效、按时间范围查询和聚合能力强,适合训练曲线这种时间序列。日志文本文件查询效率低,内存缓存数据易失,共享网盘则完全不具备查询能力。
Q8. 对指标做最小值—最大值归一化的根本目的是?
- A.改变指标的物理语义
- B.消除量纲便于比较← 正确答案
- C.降低数据存储成本
- D.保证指标一律为正数
答案:B。归一化把不同范围、不同单位的指标压缩到 0 到 1 的统一刻度上,让它们可以跨指标比较或加权求和。它不改变物理语义,也不压缩存储或保证正数(虽然结果恒为非负)。
Q9. 基线准确率 80%,实验组准确率 84%,相对提升是多少?
- A.绝对提升四个百分点
- B.相对提升五个百分点← 正确答案
- C.绝对提升五个百分点
- D.相对提升三个百分点
答案:B。绝对提升是 84% - 80% = 4 个百分点,相对提升是 (84% - 80%) / 80% = 5%。四个选项中,B 正确描述了相对提升 5%;A 描述的是绝对提升,与“相对”问法不符。
Q10. 指标治理规范通常包含哪些内容?
- A.统一指标命名规则← 正确答案
- B.约定指标单位进制← 正确答案
- C.与代码版本进行绑定← 正确答案
- D.删除全部历史实验数据
答案:ABC。治理规范的核心是让指标可比较、可复现:统一命名(关键词如何组织)、统一单位(秒/毫秒/步等)、与代码和数据版本对齐。删除历史数据恰恰是治理要避免的行为,历史数据是复现和审计的根基。