《Arduino家居安全系统构建实战》——2.7 理解分类错误

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

2.7 理解分类错误

记得在正确看待、与简单基准比较之前,我们还认为87.7%的分类正确率很不错吗?我们可以将这个数字提升到98.3%,明显比基准要好得多。但是,每当将整个数据集归纳为单一数字时,从定义上说肯定要遗漏某些信息。人们喜欢用单一数字总结,因为这样容易比较。我的建议是:每当得到一个统计数字时,应该仔细思考该数字可能遗漏或者隐藏的细节。

在我们的例子中,所知道的是在1000条消息中,平均会错误分类17条。我们所不知道的是模型的哪一部分造成了错误。同样的数字(98.3%)可能是不同情况造成的:这17条消息可能主要是垃圾短信、主要是非垃圾短信或者介于两者之间。根据语境的不同,可能会造成关键的差别。例如,我怀疑大部分人更喜欢忽略一两条垃圾短信、将其保留在收件箱中的分类器,而不喜欢过于激进、因为不正确地标记垃圾短信而将完全正常的消息自动放到垃圾短信文件夹中的分类器。

那么,我们的分类器表现如何?让我们来发现和计量其识别垃圾短信和非垃圾短信的优劣。这只需分离验证集中的垃圾短信和非垃圾短信,然后计算每组正确分类的百分比,很容易完成——只需要在脚本中添加几行,在F# Interactive中运行:

程序清单2-13 按照类别区分的分类错误

let bestClassifier = train training smartTokenizer smartTokens
validation
|> Seq.filter (fun (docType,_) -> docType = Ham)
|> Seq.averageBy (fun (docType,sms) ->
    if docType = bestClassifier sms
    then 1.0
    else 0.0)
|> printfn "Properly classified Ham: %.5f"
validation
|> Seq.filter (fun (docType,_) -> docType = Spam)
|> Seq.averageBy (fun (docType,sms) ->
    if docType = bestClassifier sms
    then 1.0
    else 0.0)
|> printfn "Properly classified Spam: %.5f"```
产生的输出如下:

Properly classified Ham: 0.98821
Properly classified Spam: 0.95395`
很不错,我们的分类器在两个类别上都工作得很好,在非垃圾短信组上表现最好 ——只有1.2%的消息分类错误。这一数字被称作“假阳性率”——检测出实际上不存在的情况的比率。类似地,“假阴性率”是忽略某个问题的比例。在我们的例子中,大约4.6%的垃圾短信未能检出。

那么,为什么说这些信息有用?原因有以下两点。

首先,深入了解分类错误,理解它们是假阳性还是假阴性,在评估分类器商业价值时极其重要。这种价值完全取决于环境,实质上取决于哪一类错误代价更高。因为一条消息被错误地分类为垃圾短信而错过与老板的会面,远比从收件箱中人工删除一条垃圾短信严重得多。在这种情况下,假阳性比假阴性代价大得多,不应该使用相同的权重。

深入了解错误还有助于我们将精力集中在正确的方向,避免在无意义的工作上浪费时间。如果我们的分类器已经达到100%的非垃圾短信识别率,剩下的唯一改进方向就在另一个类别。出发点可能是检查当前模型没有识别为垃圾短信的消息,看看是否出现某种模式?

理想状态下,我们所希望的是即使付出遗漏某些垃圾短信的代价,也要尽可能可靠地识别非垃圾短信。例如,实现这一点的途径之一是“调低”垃圾短信的灵敏度,而在非垃圾短信上更努力尝试。应急的方法是,我们可以减少来自垃圾短信方向的标记,增大来自非垃圾短信方向的标记。换言之,只保持较为特殊的垃圾短信标记——强烈的指标,而张大捕捉非垃圾短信标记的网。当前最佳模型中为每一类保留10%的最常见标记,作为替代,如果我们在非垃圾短信上保留20%,在垃圾短信上保留5%,将会得到什么样的结果?让我们来尝试一下,使用完全相同的代码,但是将topHam和topSpam修改为:

let topHam = ham |> top (hamCount / 5) casedTokenizer
let topSpam = spam |> top (spamCount / 20) casedTokenizer```
上一篇:实战:使用IPSec保护服务器安全


下一篇:MySQL入门书籍和方法分享