我应该执行什么形式的测试



我想用C/C++或Java编写算法(一堆机器学习算法),可能是用Python。语言对我来说并不重要 - 我熟悉上述所有内容。

对我来说重要的是测试。我想使用训练数据训练我的模型。所以我有测试输入,我知道输出应该是什么,我将其与模型的输出进行比较。这是什么测试?是单元测试吗?我该如何处理这个问题?我可以看到我可以编写一些代码来检查我需要检查的内容,但我想将测试与主代码分开。测试是一个发达的领域,我以前见过这个,但我不知道这种特殊测试的名称和类型,这样我就可以阅读它而不会造成混乱。如果您能告诉我这种测试方法的名称,我将不胜感激。

你最好的选择是观看测试视频的心理学,这些视频来自tetsing God http://misko.hevery.com/

米斯科视频链接:

http://misko.hevery.com/presentations/

并阅读此Google测试指南 http://misko.hevery.com/code-reviewers-guide/

编辑:

任何人都可以编写测试,它们非常简单,编写测试没有魔力,您可以简单地执行以下操作:

var sut = new MyObject();
var res = sut.IsValid();
if(res != true)
{
  throw new ApplicationException("message");
}

当然,这就是理论,这些天我们有工具来简化测试,我们可以写这样的东西:

new MyObject().IsValid().Should().BeTrue();

但是你应该做的是专注于编写可测试的代码,这是神奇的关键。

只需遵循测试Misko视频的心理学即可入门

这听起来很像测试驱动开发(TDD),您可以在生产代码之前创建单元测试。关于这两个主题,这个网站有很多详细的答案。我已经链接到几个相关的问题来帮助您入门。

如果您的输入/输出位于完整程序的外部接口,那就是黑盒系统测试。 如果你要进入程序放大一个特定的函数,例如,一个搜索函数,直接向函数提供输入并观察行为,这就是单元测试。 这可以在功能级别和/或模块级别完成。

如果您正在编写机器学习项目,则测试和训练过程并不是真正的测试驱动开发。 你听说过共同进化吗? 你的学习系统有一套谜题,它们本身也在不断发展。 他们的健康程度取决于他们对您的案件的困惑程度。

例如,我想发展一个排序网络。 我的学习系统是产生网络的程序。 我的协同进化系统生成的输入难以排序。 分拣网络因产生正确的分拣而获得奖励,协同进化系统因在分拣网络中触发的故障次数而获得奖励。

我已经通过基因编程项目做到了这一点,效果很好。

可能是回溯测试,这意味着您有一些历史输入并在其上运行算法以评估算法的性能。 您自己使用的术语 - 训练数据 - 更通用,您可以搜索它以找到一些有用的链接。

它的单元测试。 对控制器进行测试,签入和签出代码,而不会真正弄乱您的开发代码。此过程也称为测试驱动开发 (TDD),在进入下一个软件迭代或阶段之前,您的每个开发周期都经过测试。

虽然这是一个很老的帖子,但我的 2 美分:)

一旦你决定了使用哪种算法方法(可以说是你的"评估协议")并在酉边缘情况下测试了你的算法,你可能会对在多个数据集上运行你的算法并断言结果高于某个阈值的方法感兴趣(单独或平均等)。

本教程解释了如何在 pytest 框架内执行此操作,这是 python 中最流行的测试框架。它基于一个示例(比较多个数据集上的多项式拟合算法)。

(我是作者,请随时在 github 页面上提供反馈!