据我所知,TDD的典型工作流程基于黑盒测试 . 首先我们定义接口然后编写一个或一组测试,然后我们实现通过所有测试的代码 . 那么看下面的例子:
from abc import ABCMeta
class InterfaceCalculator:
__metaclass__ = ABCMeta
@abstractmethod
def calculate_mean(self):
pass
示例性测试案例
from unittest import TestCase
class TestInterfaceCalculator(TestCase):
def test_should_correctly_calcluate_mean(self):
X=[1,1]
expected_mean = 1
calcluator =Calculator()
self.assertAlmostEqual(calculator.calculate_mean(X), expected_mean)
我跳过类Calculator(InterfaceCalculator)的实现,因为它是微不足道的 .
以下想法很容易理解 . 机器学习怎么样?让我们考虑以下示例 . 我们想实现猫狗照片分类器 . 从界面开始 .
from abc import ABCMeta
class InterfaceClassifier:
__metaclass__ = ABCMeta
@abstractmethod
def train_model(self, data):
pass
@abstractmethod
def predict(self, data):
pass
我准备了很多单元测试
from unittest import TestCase
class TestInterfaceCalculator(TestCase):
def __init__(self):
self.model = CatDogClassifier()
def test_should_correctly_train_model(self, data):
"""
How can be implemented?
"""
self.model.train_model(data)
def test_should_correctly_calcluate_mean(self):
input ="cat.jpg"
expected_result = "cat"
calcluator =.assertAlmostEqual(self.model.preditct(input), expected_result)
是使用TDD帮助处理机器学习模型的方法吗?或者在这种情况下TDD是无用的 . 它只能帮助我们验证输入数据的正确性并为训练模型添加非常高水平的测试?如何创建良好的自动测试?
2 回答
使用TDD,您可以以测试的形式描述预期的行为,然后创建满足测试的代码 . 虽然这对于机器学习模型的某些组件非常有效,但它通常不适用于机器学习模型的高级行为,因为预期的行为并不是事先准确知道的 . 开发机器学习模型的过程通常涉及尝试不同的方法来查看哪一个最有效 . 这种行为很可能用百分比来衡量,例如,识别率是95%准确,而不是绝对值 .
我想你可能在谈论两个截然不同的目标:
如何提高算法的性能?例如,这将需要为分类问题标记的正确性 . 但这也可能意味着许多其他因素,例如它需要多少超参数,运行时是什么等等 . 例如,此类别中的一个特殊问题是调整模型(比如逻辑回归模型),并且可以完成将数据拆分为训练,验证和测试集的标准机制 .
如何捕获算法中的错误?这侧重于寻找功能问题 . 换句话说,存在的问题是因为代码不是根据设计编写的 . 即使设计可能是一个糟糕的设计(在上面的第1点),代码应该正确实现它 . 这是TDD最有 Value 的地方 . 是的,为了使这个有用,测试人员代码应该有特定的参数来验证和断言 .