《Arduino家居安全系统构建实战》——1.4 那么,如何知道程序有效?-阿里云开发者社区

开发者社区> 异步社区> 正文

《Arduino家居安全系统构建实战》——1.4 那么,如何知道程序有效?

简介:
+关注继续查看

本节书摘来异步社区《机器学习项目开发实战》一书中的第1章,第1.4节,作者:【美】Mathias Brandewinder(马蒂亚斯·布兰德温德尔),更多章节内容可以访问云栖社区“异步社区”公众号查看

1.4 那么,如何知道程序有效?

我们拥有一个分类器——可以分类图像的出色代码,这很棒。

大功告成,可以交付程序了!等等,别忙!还有点小问题:我们对代码是否有效一无所知。作为软件工程师,知道“是否正常工作”是很简单的。拿起你的规格说明(每个人都有规格说明,不是吗?),编写测试(当然会这么做),运行测试,大功告成!如果出现问题,你就会知道。但是,我们关心的不是“程序正常工作”或者“程序出错”,而是“我们的模式是否擅长做出预测?”

1.4.1 交叉验证

交叉验证自然的出发点是计量模型执行任务的质量。在我们的例子中,这实际上很容易做到:为分类器提供图像,要求做出预测,与真正的答案比较,算出正确预测的数量。当然,为了做到这一点,我们必须知道正确答案。换言之,我们需要一个具有已知标签的图像数据集,用它测试模型的质量。这个数据集被称作验证集(有时候直接称作“测试数据”)。

你可能会问,为什么不使用训练集本身?我们可以训练分类器,然后在5000个例子上运行它。这不是一个很好的主意,原因如下:如果这么做,所计量的是模型学习训练集的质量。而你真正感兴趣的与此稍有不同:如果我们发布分类器,并开始向其提供之前从未遇见的新图像时,分类器的预期工作质量如何?提供训练中使用的图像可能做出乐观的估计。如果想要更实际的估计,就应该提供尚未使用的模型数据。

■ 注意:

让分类器使用训练集进行验证是可能大错特错的有趣示例。如果你尝试这么做,会发现每个单独的图像都可以正确识别,100%的正确率!对于这么简单的模型,结果似乎好得难以置信。真正发生的情况是:当算法在训练集中搜索最类似的图像时,每次都将找到完美的匹配,因为测试使用的图像本身就属于训练集。因此,当结果太好,不那么可信的时候,应该再次检查!
解决这种问题的通用方法称作交叉验证。将可用的数据拆分为训练集和验证集,留出部分数据。使用第一个数据集训练模型,第二个数据集用于评估模型的质量。

前面,你下载了两个文件trainingsample.csv和validationsample.csv,我已经为你准备了两部分数据,无须重新进行。训练集是原始数据集50000个图像中的5000个样本,验证集是来自相同来源的另外500个图像。正如后面几章中将要看到的,进行交叉验证还有更有趣、但也需要更注意潜在陷阱的方法,不过,简单地将可用数据分解为两个单独的样本(如80%/20%),是简单有效的入门手段。

1.4.2 评估模型质量

下面,我们编写一个类计算正确分类的比例,评估我们的模型(或者你希望尝试的其他模型)。

程序清单1-8 评估基本分类器的质量

public class Evaluator
{
    public static double Correct(
        IEnumerable<Observation> validationSet,
        IClassifier classifier)
    {
        return validationSet
            .Select(obs => Score(obs, classifier))
            .Average();
    }

    private static double Score(
        Observation obs,
        IClassifier classifier)
    {
        if (classifier.Predict(obs.Pixels) == obs.Label)
            return 1.0;
        else
            return 0.0;
    }
}```
在此,我们使用了一个小技巧:向Evaluator传递一个IClassifier和一个数据集,对每个图像比较分类器预测值和正确值,为预测“计分”。如果匹配,记录“1”,否则记录“0”。使用数字代替真/假值,就可以求出代表正确率的平均值。

组合上述算法,看看我们的极简分类器在提供的验证数据集(validationsample.csv)上表现如何。

程序清单1-9 训练和验证基本C#分类器

class Program
{

static void Main(string[] args)
{
    var distance = new ManhattanDistance();
    var classifier = new BasicClassifier(distance);

    var trainingPath = @"PATH-ON-YOUR-MACHINE\trainingsample.csv";
    var training = DataReader.ReadObservations(trainingPath);
    classifier.Train(training);

    var validationPath = @"PATH-ON-YOUR-MACHINE\validationsample.csv";
    var validation = DataReader.ReadObservations(validationPath);

    var correct = Evaluator.Correct(validation, classifier);
    Console.WriteLine("Correctly classified: {0:P2}", correct);

    Console.ReadLine();
}

}`
现在运行这个程序,应该获得93.4%的正确率,这可是在一个并不那么简单的问题上获得的成绩。我的意思是,我们能够以相当好的可靠性自动识别人类手写的数字!尤其是考虑到这是第一次尝试,我们有意地保持简洁性,这样的结果已经很不错了。

1.4.3 改进模型

那么,下一步是什么?我们的模型是不错,但是为什么要止步不前呢?毕竟,我们离100%正确的理想还很远——能不能想出一些巧妙的改进措施,更好地做出预测?

这是验证集的关键之处。正如单元测试为你提供安全措施,在代码偏离轨道时提出警告一样,验证集为模型建立一个基准,使你不会陷入“盲飞”的境地。现在,可以自由地试验建模思路,通过验证就可以得出思考方向是否有前景的清晰信号。

在这一阶段,通常可以采用两种途径中的一种。如果模型足够好,可以收工——程序已经完成。否则,应该开始思考改善预测的方法,创建新模型,根据验证集运行模型,比较分类正确率,评估新模型是否工作得更好,逐步微调模型直到满意。

但是在开始试验改进模型的方法之前,现在似乎是介绍F#的最佳时机。F#是一种绝妙的.NET语言,很适合于机器学习和数据科学,它将使我们的模型试验变得更加简便。现在我们已经有了可以正常工作的C#版本,下面让我们更深入一步,用F#语言重写程序,以便比较两者之间的不同,更好地理解F#的工作方式。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Mozilla 构建系统(转)
  英文来源:Mozilla’s Build System  中文出处:开放博客,由灰狐翻译小组制作   Mozilla 构建系统是一个非常酷的分布式系统,运行在BuildBot上。系统能在每次修改后自动重新构建和测试代码树。
695 0
《领域特定语言》一第1章 入 门 例 子1.1 哥特式建筑安全系统
本节书摘来自华章出版社《领域特定语言》一书中的第1章,第1.1节,作者 (英)Martin Fowler,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1085 0
Centos7下Docker搭建Cachet(基于 Laravel 框架构建的系统状态信息应用)(构建太慢.放弃)
Centos7下Docker搭建Cachet(基于 Laravel 框架构建的系统状态信息应用)(构建太慢.放弃)
194 0
贯彻10项原则,构建Linux系统安全体系
通过大量的实践经验,我们总结出10个最关键且有效的安全原则,分别是纵深防御、运用PDCA模型、最小权限法则、白名单机制、安全的失败、避免通过隐藏来实现安全、入侵检测、不要信任基础设施、不要信任服务、交付时保持默认是安全的。
1427 0
开放下载!《云上安全产品实战手册》
本书精解网络攻击原理,还有详细的问题排查步骤和最佳实战分享,帮你搞定多种云上安全问题。还等什么?即刻下载阅读吧~~
4201 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
11942
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载