机器学习代码的单元测试

我在撰写我的计算机视觉论文时,编写了一个相当复杂的机器学习程序。程序运行得相当不错,但我需要不断尝试新方法并添加新功能。这是个问题,因为在扩展代码或尝试简化算法时,我有时会引入错误。

显然,正确的做法是添加单元测试,但如何做却不清楚。我的程序的许多组件产生的结果有些主观,我无法自动进行合理性检查。

例如,我曾有一段代码,用于用低分辨率曲线近似高分辨率曲线,以便在低分辨率曲线上进行计算密集型工作。我不小心在这段代码中引入了错误,直到整个程序的结果略有下降时,我才通过艰苦的搜索发现了这个错误。

但是,当我尝试为其编写单元测试时,我不清楚该怎么做。如果我制作一个简单曲线,其低分辨率版本显然是正确的,那么我并没有真正测试所有可能出错的情况。如果我制作一个简单曲线然后稍微扰动点位,我的代码开始产生不同的答案,尽管这段代码现在似乎运行得很好。


回答:

你可能没有意识到其中的讽刺意味,但你实际上拥有的就是遗留代码:一段没有单元测试的软件。你自然不知道从哪里开始。因此,你可能会发现阅读有关处理遗留代码的内容很有帮助。

关于这一点的权威观点是Michael Feather的《有效处理遗留代码》一书。曾经在ObjectMentor网站上有一个有用的总结,但遗憾的是该网站已经随着公司一起消失了。然而,《有效处理遗留代码》在评论和其他文章中留下了遗产。查看这些内容(或者直接购买这本书),尽管关键教训是S.Lott和tvanfosson在他们的回复中涵盖的那些内容。


2019年更新:我已经修复了《有效处理遗留代码》总结的链接,使用的是Wayback Machine网络档案中的版本(感谢@milia)。

另外——尽管知道主要包含指向其他网站链接的答案是低质量答案 🙂 ——这里有一个链接到一个新的(2019年新)Google教程,关于测试和调试机器学习代码。我希望这对未来偶然发现这个答案的探索者有所启发。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注