《机器学习实践:测试驱动的开发方法》试读:1.1  TDD的历史

伟大的科学家既是梦想家,也是怀疑论者。在现代历史中,科学家们取得了一系列重大突破,如发现地球引力、登上月球、发现相对论等。所有这些科学家都有一个共同点,那就是他们都有着远大的梦想。然而,在完成那些壮举之前,他们的工作无不经过了周密的检验和验证。 如今,爱因斯坦和牛顿已离我们而去,但所幸我们处在一个大数据时代。随着信息时代的到来,人们迫切需要找到将数据转化为有价值的信息的方法。这种需求的重要性已日益凸显,而这正是数据科学和机器学习的使命。 机器学习是一门充满魅力的学科,因为它能够利用信息来解决像人脸识别或笔迹检测这样的复杂问题。很多时候,为完成这样的任务,机器学习算法会采用大量的测试。典型的测试包括提出统计假设、确定阈值、随着时间的推移将均方误差最小化等。理论上,机器学习算法具备坚实的理论基础,可从过去的错误中学习,并随时间的推移将误差最小化。 然而,我们人类却无法做到这一点。机器学习算法虽能将误差最小化,但有时我们可能“指挥失误”,没能令其将“真正的误差”最小化,我们甚至可能在自己的代码中犯一些不易察觉的错误。因此,我们也需要通过一些测试来发现自己所犯的错误,并以某种方式来记录我们的进展。用于编写这类测试的最为流行的方法当属测试驱动开发(Test-Driven Development,TDD)。这种“测试先行”的方法已成为编程人员的一种最佳实践。然而, 这种最佳实践有时在开发环境中却并未得到运用。 采用驱动测试开发(为简便起见,下文中统称TDD)有两个充分的理由。首先,虽然在主动开发模式中,TDD 需要花费至少15%~35% 的时间,却能够排除多达90% 的程序缺陷(详情请参阅http://research.microsoft.com/en-us/news/features/nagappan-100609.aspx)。其次, 采用TDD 有利于将代码准备实现的功能记录下来。当代码的复杂性增加时,人们对规格说明的需求也愈发强烈,尤其是那些需要依据分析结果制定重大决策的人。 哈佛大学的两位学者Carmen Reinhart 和Kenneth Rogoff 曾撰写过一篇经济学论文,大意是说那些所承担的债务数额超过其国内生产总值90% 以上的国家的经济增长遭遇了严重滑坡。后来,Paul Ryan 在总统竞选中还多次引用了这个结论。2013 年,麻省大学的三位研究者发现该论文的计算有误,因为在其分析中有相当数量的国家未被考虑。 这样的例子还有很多,只是可能情况不像这个案例这样严重。这个案例说明,统计分析中的一处错误可能会对一位学者的学术声誉造成打击。一步出错可能会导致多处错误。上面两位哈佛学者本身都具有多年的研究经历,而且这篇论文的发表也经过了严格的同行评审,但仍然出现了这样令人遗憾的错误。这样的事情在任何人身上都有可能发生。使用TDD 将有助于降低犯类似错误的风险,而且可以帮助这些研究者避免陷入万分尴尬的境地。 1.1  TDD的历史 1999 年,Kent Beck 通过其极限编程(extreme programming)方面的工作推广了TDD。TDD 的强大源自其先定义目标再实现这些目标的能力。TDD 的实践步骤如下:首先编写一项无法通过的测试(由于此时尚无功能代码,因此测试会失败),再编写可使其通过的功能代码,最后重构初始代码。一些人依据众多测试库的颜色将其称为“红- 绿- 重构” (red-green-refactor)。红色表示编写一项最初无法通过的测试,而你需要记录自己的目标; 绿色表示通过编写功能代码使测试通过。最后,对初始代码进行重构,直到自己对其设计感到满意。 在传统开发实践中,测试始终是中流砥柱,但TDD 强调的是“测试先行”,而非在开发周期即将结束时才考虑测试。瀑布模型采用的是验收测试(acceptance test),涉及许多人员, 通常是大量最终用户(而非开发人员),且该测试发生在代码实际编写完毕之后。如果不将功能覆盖范围作为考虑因素,这种方法看起来的确很好。很多时候,质量保证专业人员仅对他们感兴趣的方面进行测试,而非进行全面测试。

>机器学习实践:测试驱动的开发方法

机器学习实践:测试驱动的开发方法
作者: [美] Matthew Kirk
isbn: 7115396183
书名: 机器学习实践:测试驱动的开发方法
页数: 204
译者: 段 菲
定价: 49.00元
出版社: 人民邮电出版社
装帧: 平装
出版年: 2015-8