1. 算法能力测评的完整方法论:从指标体系搭建到实操落地
“算法能力测评”这个词,听起来像是实验室里研究者的专属工作,但我在实际工作中发现,但凡你写过排序、调过PID、跑过KNN,甚至只是用轮子跑了个深度学习模型,你其实都需要一套方法来证明“这个算法到底行不行”。没有测评的算法是危险的,因为你不知道它什么时候会失效,也不知道换一组数据它会不会直接崩掉。
这篇文章想聊的,就是我自己在多年实践里总结下来的算法能力测评方法论。它不是教科书里那种理论定义,而是更接近真实开发场景里我踩过的坑、试过的方法、以及最终沉淀下来的套路。从设计思路、环境搭建,到具体算法的实操评测、然后到常见问题的排查,我把这套流程完整记录下来。不管是做工程选型、算法验收,还是想验证一个自己新写的算法,这篇文章都可以直接当作操作手册来用。
要说明的是,我不会针对某一个特定算法泛泛而谈“如何测试”,而是把“能力测评”拆成几个非常具体的维度:正确性、性能、鲁棒性、可解释性,然后逐个说明怎么设计、怎么执行、怎么避免自欺欺人。这几个维度基本覆盖了绝大多数应用场景,从传统数据结构算法到机器学习模型都能套用。
1.1 为什么我们要测评算法能力,而不只是看它“能跑”
很多人对算法能力测评的最大误解,就是把“能跑通”当成“能力达标”。这在工程场景里是最要命的误区。我记得之前有一个项目,要用一个聚类算法处理用户分群,开发同事把算法跑通了,主流程看着一切正常,结果换了一批新数据之后,聚类结果发生了严重的分布漂移,上线后效果一塌糊涂。这就是典型的只测了“能不能跑”没有测“跑得稳不稳”的后果。
真正的算法能力测评,核心是回答三个问题:第一,算法在预期场景里是否输出正确结果;第二,在压力和边界条件下,算法是否还能保持可用;第三,在环境变化或数据扰动时,算法是否具有足够的稳定性。这三点的答案加起来,才构成一个算法真实的“能力画像”。
所以,我倾向于把算法能力测评理解成一种“压力面试”,而不是“入职签到”。算法能跑只是它有资格参加面试,而测评则是要看它在各种刁钻追问下是不是还能对答如流。带着这个心态去设计测评方案,你会自然发现,测试用例的构造比跑脚本本身更有价值,因为真正有区分度的信息,都藏在那些容易翻车的边界里。
1.2 测评维度全景图:正确性、性能、鲁棒性与可解释性
先说正确性。这个维度指的是算法输出结果是否和预期一致,是所有测评的地基。正确性的测评看起来简单,实际上最容易被低估,因为很多算法的“正确”并没有一个绝对标准,而是一组约束条件。比如KMP算法的匹配结果,正确的定义包括匹配位置准确、多个匹配返回全部位置、无匹配时返回空,这些规则要一条条覆盖。
性能维度的测的是什么?是时间复杂度和空间复杂度是否达到设计预期,以及在数据规模放大时,算法会不会出现无法接受的退化。这一层要用大数据集和耗时、内存测量来验证。注意,性能不只是看算法跑得快不快,更要关注复杂度增长趋势,这才是算法可扩展性的真正指标。
鲁棒性维度,是考察算法在异常输入、边界条件、数据噪声中的表现。这是一个很考验设计功力的维度,比如排序算法遇上全是相同值的输入,PID控制器遇到阶跃突变,KNN遇到特征缺失,这些场景都要覆盖。鲁棒性测评的困难在于,它没有固定模板,完全依赖你对算法原理的理解和对业务场景的把握。
可解释性维度,我把它理解为“算法的行为是否符合直觉”。这个维度经常被忽略,但它恰恰是算法能否被业务信任的关键。一个算法即使准确率再高,如果它的错误模式完全无从预测,那在严肃场景里就很难被采用。可解释性测评的方式,通常是把错误案例挑出来做分析,看看错误分布是否集中在某类输入上,判断算法学到了什么、忽略了什么。
1.3 为什么这四个维度缺一不可,以及如何取舍
在实际测评中,这四个维度的权重并不是平分的。有些场景正确性比什么都重要,比如医疗诊断、金融风控,错一个就是大事故;有些场景性能和鲁棒性更关键,比如推荐系统的实时召回,晚几十毫秒和频繁抖动都影响体验;而可解释性在监管严格的行业几乎是一票否决项。
所以,做算法能力测评的第一步,不是打开电脑写测试脚本,而是和业务方对齐:这个算法用在什么场景,如果出问题,最不能接受的是哪种问题?把这个优先级排清楚,后续所有测试设计和资源投入才有意义。我的习惯是把测评需求先以表格形式列出来,明确各维度的优先级和通过标准,然后才开始动手搭环境。这个步骤看着额外耽误时间,但能省掉后面大量返工。
补充一句经验之谈:对于复杂项目,测评维度设计完以后,最好让团队成员先自己投一遍“有没有遗漏的极端场景”,一轮评审下来往往能补出很多盲区。因为算法能力测评最怕的不是测出问题,而是根本没测到那个可能出问题的角落。
2. 搭建可复用的算法测评环境:数据、基准与重复性策略
测评方案设计的再好,如果执行环境不扎实,结果一样不可信。这一部分我想重点聊实操层面的三个事情:测试数据的构造、基准算法的选择,以及如何保证实验的可重复性。这三件事是我测评所有算法的必做功课,少一件都不行。
2.1 测试数据的构造方法:合成数据与真实数据的取舍
测试数据是测评的“考卷”,考卷出得好不好,直接决定了测评的区分度。我常用的做法是合成数据与真实数据双轨并行。合成数据的优势在于可控——你可以精确制造边界条件、控制噪声强度、设置数据分布,从而让算法在指定维度接受极限挑战。真实数据则能保证测评结论的生态效度,避免算法在人工数据上表现优异、一到真实场景就失灵。
以排序算法为例,合成数据可以构造三类关键输入:完全随机数组、有序数组、大量重复元素数组。这三种输入,会让不同排序算法的表现产生戏剧性差异。以我自己的经验,快速排序在完全随机数组上表现极佳,但在近乎有序的数组上可能退化成O(n²),而“大量重复元素”的数据则能暴露三路快排和普通快排在分区策略上的本质区别。
真实数据方面,我一般会从线上日志中采样一段时间的数据,尽量覆盖高峰、低谷、异常流量等不同时段。构造完成后做一遍数据审查,确认字段分布、缺失值比例、不均衡程度,这些信息本身就是测评结论的一部分。因为如果你发现测试数据集严重偏斜,那不管算法测出来多好,都不能说明它在目标场景里真的可靠。
2.2 基准算法的选择和对照实验的必要性
测评里的“基准”是什么?我把它定义为:一组和被测算法面向同一任务、算法原理上不同的参照对象。比如你要测评一个新的聚类算法,就应该拿K-means、DBSCAN这些成熟的算法做对比;你要测一个改进版的PID控制策略,就应该拿传统位置式PID做基准。没有基准的测评,只能说明算法“跑起来了”,不能说明算法“更好了”。
基准算法的选择有个容易犯的错误,就是选择过弱的基线。有人为了突出新算法的优势,故意选择一个完全不调参的退化版旧算法作对照,这种对比毫无意义。我的原则是:基准算法要选当前业界在该场景下默认可靠的方案,并且要对基准算法做基本的参数调优,保证对照是“成熟方案 vs 新方案”,而不是“认真准备的新方案 vs 随手写的旧方案”。
对照实验的设计上,要注意变量控制。影响算法结果的因素往往不止一个,比如数据规模、特征维度、超参数、初始化种子。每个对比实验只有一两个变量放养,其余全部固定,这是测评可信的基本前提。我就是因为以前做实验图省事,同时改了两个变量,最后出了不伦不类的结果,整整浪费了两周时间。
2.3 硬件隔离、随机种子与其他重复性陷阱
可重复性这个事情,说出来平平无奇,但做起来有非常多细节。算法测评里最常见的污染源就是随机性。很多算法本身有随机性(比如K-means的初始化、神经网络的权重初始化、模拟退火的随机扰动),如果不固定随机种子,同一份代码跑两次结果都不一样,后面的对比分析无从谈起。
因此,我要求所有涉及随机过程的算法,在测评前必须设置全局随机种子。这个种子不仅要固定Python的random,也要固定numpy、pytorch或tensorflow各自内部的随机生成器,缺一个都会在某个环节引入不可控的因素。如果是GPU训练,还要配置cuDNN的确定性模式,这个细节经常有人漏掉。
硬件隔离也是个大坑。我曾经在同一台机器上串行跑多个算法的性能测试,前面的算法占用大量缓存,导致后一个算法的计时结果严重失真。后来我养成了一个习惯:性能测试时,单轮只跑一个任务,关掉后台无关进程,CPU调成性能模式,并且多次重复计时取中位数。实验结果要想可复现,这些看似琐碎的控制步骤必不可少。
关于运行环境的标准化,我强烈建议把整个测评环境做成Docker镜像,里面固定好所有依赖库的版本,并在测评报告中记录镜像版本号。这种做法的价值,不仅在事后追溯时有据可查,在几个月后想复测、或者在新的机器上复现他人结果时,也能一次成功。
3. 核心算法测评的实操案例拆解
方法论讲了一堆,但没有案例支撑总觉得虚。这一节我挑几个不同类型、用得也多的算法——排序算法、KMP字符串匹配、PID控制、KNN分类,分别走一遍完整测评过程。每个案例我会给出测试用例设计、关键参数选择思路以及结果解读方法,方便你直接套用到自己的场景里。
3.1 排序算法测评:从正确性边界到复杂度验证
排序算法是算法测评的入门必修课,麻雀虽小五脏俱全。先说正确性测试设计。对排序算法来说,“正确”的定义有两个层次:一是序列的长度和元素集合不变;二是最终序列是非递减有序的。但仅仅这么测远远不够,我一般还会单独验证稳定性要求——如果算法自称稳定排序,测试用例里就要加入带序号的对象,然后检查相同值的元素排序前后相对顺序是否保持一致。
边界测试我会覆盖这些输入:空数组、单元素数组、两个元素、大量重复元素、完全逆序数组、超大数组(比如千万级)。这些边界数据里,重复元素和逆序数组是最容易暴露算法退化问题的。以快速排序的经典实现为例,在逆序数组上会出现严重的递归深度和性能恶化,如果你的测评只测随机数组,这个致命问题就会被完全掩盖。
性能维度,我不仅统计总耗时,还会记录不同数据规模下的耗时变化趋势,去验证时间复杂度是否和理论一致。做法很简单:构造规模分别为1万、10万、100万、1000万的数据,记录耗时,然后计算相邻规模耗时比值。对O(n log n)的算法而言,规模增长10倍,耗时大约增长10到12倍;对O(n²)的算法,规模增长10倍,耗时大约增长100倍。这个比值能直观暴露出算法实际复杂度是否和预期一致。
实际测评中我发现,C++标准库sort在重复元素很多的场景下表现异常出色,因为它内嵌了三路快排的优化;但同样的数据丢给一个“教科书版”快排,性能会掉一个量级。这就是为什么我强调测试数据的多样性,只有多套数据组合起来,才能真正看出一个排序算法在不同场景下的能力边界。
3.2 KMP字符串匹配:next数组细节与边界案例设计
KMP算法作为经典的字符串匹配算法,在文本处理、内容过滤等场景里仍然有大量应用。测评KMP,最核心的验证目标集中在其next数组的构建是否正确。我在面试新人时,经常看到对next数组理解不到位导致的死循环或者漏匹配,所以这个算法做能力测评非常有价值。
正确性用例的设计要注意覆盖几种典型模式串模式:全部相同字符(如"aaaaab")、内部有真前后缀重叠(如"abacaba")、全无重复(如"abcdef")。尤其推荐用热词里出现的"abacaba"这个模式串,它的前缀函数和next数组构造非常经典,能验证next数组对重叠前后缀的处理是否正确。测试时,对每个模式串,我会准备多个目标主串,覆盖匹配成功、匹配失败、多个匹配位置相邻、匹配串出现在主串开头或结尾等位置变体。
在KMP测评中还有一个常见测试盲区:模式串长度超过主串。这种情况在正常业务里是考虑不到的,但一旦被外部输入触发,如果算法没有保护就会越界。边界测试里我固定加一条“模式串长度大于主串长度”,验证算法返回失败且不崩溃,这属于鲁棒性维度的基础要求。
性能测评方面,KMP的核心优势是O(n+m)的线性复杂度。我会构造一个长主串加长模式串的用例,比如主串100万字符、模式串1万字符,验证匹配耗时是否近似线性增长。同时对比朴素匹配算法,记录耗时差距,直观量化KMP的算法优势。这里有个小技巧:如果模式串和主串都是随机生成的字符,KMP和朴素匹配的差距可能并不大,因为朴素匹配本身在随机文本上的平均性能就不差;只有构造大量“假匹配前缀”的文本,KMP的跳跃优势才能充分体现。比如主串由大量重复的"aaaaa...ab"组成,模式串是"aaaaab",这种用例下朴素匹配会频繁进行不必要的前缀比较,而KMP则干净利落。
3.3 PID控制算法:动态响应和鲁棒性测评的落地方式
PID控制算法在工业控制、无人机、电机驱动等领域是绝对主力。它的能力测评和前面两类算法有较大不同,因为PID是闭环控制算法,测评重点不是“输出结果是否正确”,而是“控制过程是否满足动态指标”。所以测评起来要跑道系统的角度去看。
我会先搭建一个仿真环境,用一个一阶或二阶被控对象模型来模拟系统响应,然后用PID控制器去闭环控制。测试指标包括上升时间、超调量、调节时间、稳态误差,这四个指标连起来,基本能刻画一个PID控制器的动态品质。比如设定目标值从0阶跃到100,记录系统输出曲线,超调量要求在10%以内,调节时间在200ms以内,稳态误差在1%以内,这就是一个可量化的能力标准。
PID参数整定是测评里的难点。我做测评时会给同一被控对象设计三组不同风格的PID参数:一组偏保守(小Kp、小Ki)、一组激进(大Kp)、一组经过整定的推荐值,然后对比这三组参数下的控制曲线。这样既把参数对动态性能的影响直观展示了出来,也能检验被评算法能否在合适参数下达到最优控制效果。
鲁棒性维度,我会给被控对象增加参数摄动(比如对象时间常数在±20%内变化)、加测量噪声、加外部扰动,观察PID是否还能保持稳定。这一块极易翻车的地方在于:一个在理想仿真模型上调到完美的PID,在面对参数摄动时经常出现剧烈震荡甚至发散。这说明算法能力测评不能只在“完美环境”里做,必须放进“恶劣环境”里做压力测试。
3.4 KNN分类算法:超参数影响和能力边界分析
KNN算法是机器学习里最直观的算法之一,它的能力测评非常适合用来演示“从算法原理推导测试方向”的思路。KNN的核心行为完全受两个因素支配:K值(邻居数量)和距离度量方式。因此,测评KNN的第一炮就应该打在这两个超参数上。
正确性测评方面,我会构造一个二维平面上的可解释数据集。比如三个类别分别分布在三个不同的圆形区域,让分类结果可以直观可视化。然后用K=1, 3, 5, 9分别训练和预测,画出分类边界,直接观察K值对分类边界平滑度的影响。测试数据我会特别关注类别重叠区域和样本稀疏区域,因为这两处是KNN最容易翻车的地方。
性能测评对KNN格外有意思。因为KNN是懒惰学习,训练阶段几乎不耗时,但预测阶段要计算所有训练样本的距离。我会固定训练集大小为1万、5万、10万、20万,测量单条样本的预测延迟,验证延迟是否随数据规模线性增长。这个过程能让人直观理解KNN在超大训练集上的扩展性瓶颈,也是后续决定是否引入KD树或近似最近邻搜索的重要依据。
鲁棒性维度的测试我是这样设计的:对测试样本加入不同强度的随机噪声,从0%加到20%,观察分类准确率下降的曲线。在噪声比例升高时,KNN的准确率下降速度远快于基于模型的方法,因为它不具备对局部噪声的平滑能力。另外,我还固定加入一类“异常点”测试——离所有训练样本都非常远的孤立点,观察KNN会给出什么预测。这类点往往是数据清洗要重点关注的对象。
这里说一个实操经验:KNN在测评里很容易因为特征尺度不一致而被搞崩。比如一个特征取值范围是0到1,另一个特征取值范围是0到10000,那欧氏距离会被后一个特征完全支配。所以做KNN测评时,特征标准化不是可选步骤,而是必须步骤。如果忘了这个,你会得到一份完全失真甚至误导的分析结果。
4. 常见问题与排查技巧实录
测评跑起来之后,真正让人头疼的不是算法本身,而是那些“看起来不对但不知道哪里不对”的中间状况。有些问题非常隐性,不仔细排查,很容易得到一份漂亮但错误的测评报告。这里我把这些年踩过的坑梳理成几个典型场景,逐个说说排查思路。
4.1 正确性验证不充分导致的“假通过”
“假通过”是我见过最隐蔽的测评事故。表现是:测试用例全过,代码也没报错,但算法在真实场景中就是表现不对。问题往往出在测试用例设计得太友好,没有覆盖真正有区分度的输入。举一个我踩过的真实例子:有一次测评一个JSON解析器,测试用例里各种合法JSON都通过了,结果线上收到一个键名重复的JSON文档,解析器直接忽略了后面的重复键——而规则明确要求“保留最后一个”。因为测试用例里压根没写重复键的用例,所以这个错误就一直潜伏在代码里。
排查这类问题,核心方法就是“反向构造”——从算法可能出错的原理出发,反推需要什么样的用例才能触发错误。策略包括:把数据规模压到极小(0、1)、压到极大、构造极值、制造重复、插入异常字符、打乱顺序。每一项都不是拍脑袋乱加,而是基于对算法实现细节的理解做推理。如果你能清晰地解释“为什么这个用例能捕捉到那类错误”,那这个用例就是高质量的。
4.2 性能评测里的计时陷阱与数据干扰
性能测评的坑,可以说是排第一的。最常见的坑是计时范围不准确。有同事把数据生成、模型加载的时间也算进算法耗时里,测出来的结果虚高一倍;还有的是在暖机(warm-up)都没做的情况下直接计时,导致第一次运行因为缓存和JIT编译的影响,结果忽高忽低。
我的标准做法是:正式计时前先跑三轮“预热”,让缓存热起来、让JIT完成编译;正式计时时循环多次(至少10次),记录每次耗时,舍去最高和最低值后取平均或中位数。为什么取中位数而不用平均值?因为平均值容易被突发的系统调度、网络抖动污染,而中位数能更稳定地反映典型运行耗时。
另一个大家不太注意的是GC(垃圾回收)干扰。在使用Java、Go这类带GC的语言跑算法测评时,GC的暂停会让单次耗时出现明显毛刺,如果数据里混入了这种异常点,性能结论基本不可信。我处理这个问题的方法是:计时循环里每跑一次就调用一次GC,让GC的干扰均匀分布到每次运行中,这样中位数统计就更可靠。
4.3 数据泄漏导致的测评结果虚高
数据泄漏是机器学习算法测评里的一等事故。它指的是训练和测试数据之间存在信息串扰,让模型在测试集上的表现虚高,但真实场景里根本达不到这个效果。最简单的例子:对全量数据做标准化后再划分训练集和测试集——这是非常典型的泄漏,因为测试集的均值和方差已经被模型“偷看”了。
我在测评KNN和聚类算法时,遇到过几次这种状况。尤其用真实数据集做交叉验证的时候,特征标准化、缺失值填充这些预处理步骤,必须在每一折训练集内部单独计算,然后把参数映射到验证集上。如果图省事在两个环节使用同一个scaler对象,整份测评结果就废了。
排查数据泄漏的思路其实不复杂:仔细检查数据管道中每一个“全局计算”的步骤,凡是涉及测试集信息的操作,都要警惕。另一种直觉式的排查方法是看训练指标和测试指标差距。如果训练集上表现还行、测试集上表现奇好,或者交叉验证得分异常稳定且高得离谱,数据泄漏基本就是头号嫌疑。
4.4 多算法对比时的统计显著性问题
很多人在做算法对比时,只看一次运行结果就下结论。比如新算法准确率91.2%,旧算法90.5%,就觉得新算法赢了。但这两者的差异可能是随机波动造成的,并不能代表真实能力差异。要确认差异是否可信,必须做统计显著性检验。
实操层面,对不同算法使用多个随机种子的数据进行多次重复实验,记录每一轮的指标,然后对两组指标序列做配对t检验或Wilcoxon符号秩检验。如果得到的p值大于0.05,那说明在当前实验条件下,无法证明新算法显著优于旧算法——哪怕平均值确实高了一点。这类结论虽然不如“我的算法比旧算法高1%”那么爽快,但它才是扎实可信的结论。
另一个和显著性密切相关的坑是多次对比导致的累积错误率。如果你用同一份数据同时对比了10个算法,每个算法都单独做了假设检验,那在0.05的显著性水平下,出现假阳性的概率会明显升高。做个简单的控制方法是使用Bonferroni校正,即把显著性水平除以对比次数。虽然做法简单粗暴,但对防止“从十次对比里挑出一个看起来最好看的结论”非常有效。
5. 测评结果的解读与能力画像输出
测评执行完成后,最后一个同样关键的环节是结果解读。很多测评报告写得太“数据堆砌”,几十页PPT翻下来,核心结论却讲不清楚。我认为了解测评的一个有效输出,应当是一个清晰的“算法能力画像”,以及基于画像的选型建议。
5.1 怎么从原始数据提炼出决策级的测评结论
我的习惯是先给每个维度打分,形成四宫格或雷达图式的画像,而不是直接丢出一堆图表。比如排序算法在正确性上全过、性能上O(n log n)趋势符合预期、鲁棒性在重复元素场景有明显退化、可解释性良好,那画像就是“基础扎实,峰值性能优秀,但对特定输入敏感”,选型建议是“适合通用场景,不建议用于重复数据占比高的业务”。
评分的方式,我倾向于用简单的1到5分制,每个分数要有明确的判定依据。5分代表“超过预期,没有发现短板”;3分代表“满足基本要求,但在测试中暴露一些不影响主流程的弱点”;1分代表“存在严重问题,不建议在当前场景使用”。这个评分过程最好由两三个人分别独立打分,然后开会拉齐分歧,避免测评人个人的偏好影响结论。
打完结以后,再补一段“风险提示”。这部分我会把测评中发现的弱点、遗漏的测试范围、以及结论成立的限定条件说清楚。比如“本结论基于合成数据,真实业务数据覆盖不足”“性能测试仅在无负载环境下进行,高并发表现未验证”。这些限定条件不是为了给自己开脱,而是让读者知道结论的适用范围,避免拿一份测评报告去到处套用。
5.2 从测评画像反推业务选型的决策路径
测评的最终目标,是给业务选型提供依据。拿KNN举例,如果测评画像显示预测延迟随训练集规模线性增长严重、噪声鲁棒性较差,那么业务方在面对百万级样本实时分类需求时,就应该果断放弃KNN,转投基于树的模型或向量检索方案。这个决策路径不是靠猜,而是靠量化指标推导出来的。
反过来,如果业务场景对“可解释性”要求极高,而测评画像显示某个深度学习模型虽然准确率高,但错误模式的规律性极差,那选型就会倾向于在准确率上略微妥协但行为更可预测的算法模型。对我来说,能力测评最有价值的地方不在于“证明算法好”,而在于“帮团队避免选一个表面优秀、实际在关键维度上不达标的技术方案”。
这里分享一个更落地的做法:把每个候选算法的测评画像和业务需求矩阵做一个加权匹配。业务需求矩阵列出核心维度及权重,算法画像给每个维度打分,然后计算加权得分来辅助决策。这个流程做下来,选型会议的讨论就从“我喜欢这个算法”变成了“咱们看一下它在关键维度上的量化表现”,决策效率高了很多。
5.3 一个可复用的测评报告模板
最后,我提供一个自己常用的测评报告模板,你直接拿去改就能用。模板包括六个区块:测评概要(算法、版本、日期、环境)、测评数据说明(数据来源、规模、构造方式)、各维度测评结果(打分和证据)、基准对比结论、风险与限制说明、最终结论与建议。这个模板的好处是,它逼着你把测评的每个环节都写清楚,不会出现“当时没记录,现在说不清”的情况。
报告里的数据展示,我建议用“原始数据+图表+结论”三段式。先把关键数据摆出来,然后配一张能直观反映趋势或者分布的图,最后用一两句话提炼结论。不要只是贴数据,也不要只写结论不给数据支撑,这两种极端都会让报告的可信度打折扣。写到这里你会发现,算法能力测评本身,也像是一个算法:输入是数据和场景,输出是决策建议,而中间经过的每一步,都遵循清晰、可追溯的原则。
我自己这几年的体会是,算法能力测评这门“手艺”,真正难的不是跑通流程,而是对每个细节都保持一种“较真”的态度。测试用例怎么构造、随机种子怎么固定、计时怎么排除干扰、结论怎么限定范围,每一环都决定了测评结论是不是真的能拿去支撑决策。与其追求测出一个好看的分数,不如踏踏实实把薄弱环节暴露出来。
最后再分享一个经验:做算法测评,永远不要只用一份数据、一个随机种子、一次运行就下结论。把维度放宽、把样本增多、把环境控制住,测评结论的置信度自然就上来了。第一次测出来的结果,大概率是不完整的,多跑几轮、多换几个角度去观察,你会看到算法更真实的一面。