机器学习代码的单元测试

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

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

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

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


回答:

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

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


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

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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