【问题标题】:ML technique for classification with probability estimates使用概率估计进行分类的 ML 技术
【发布时间】:2023-03-19 17:38:01
【问题描述】:

我想实现一个 OCR 系统。我需要我的程序在它选择识别的字母上不犯任何错误。如果它不能识别其中的很多也没关系(即即使召回率低也可以实现高精度)。

有人可以帮我为此选择合适的机器学习算法吗?我一直在环顾四周,发现一些令人困惑的事情。例如,我发现关于 SVM 的说法自相矛盾。在scikits learn docs 中,提到我们无法获得 SVM 的概率估计。然而,我发现另一个 post 说可以在 WEKA 中执行此操作。

无论如何,我正在寻找最适合此目的的机器学习算法。如果您也可以为该算法推荐一个库,那就太好了。我更喜欢基于 Python 的解决方案,但我也可以使用 Java。

【问题讨论】:

  • scikit-learn 和 Weka 实际上都使用相同的底层 SVM 库 libsvm。这不会得到 直接 概率估计(这是 scikit-learn 文档所说的),而是解决另一个学习问题并使用交叉验证来完成,这需要额外的时间。 this document 的第 8 节详细介绍了该算法。
  • @Dougal 那么,这些概率估计值是否可靠,或者我应该使用另一种机器学习技术来解决这类问题?
  • 另外,我们如何使用交叉验证获得未知样本的概率估计?
  • 不只是直接交叉验证;见我上面的链接。我的印象是它们是合理的,但并非完美无缺,虽然我没有详细研究过它们的行为,只是用过一两次。

标签: java python machine-learning weka scikit-learn


【解决方案1】:

可以通过在构造 SVC 对象时简单地设置 probability=True 从 scikit-learn 中的 SVM 获得概率估计。文档仅警告概率估计可能不是很好。

典型的概率分类器是logistic regression,所以您可以尝试一下。请注意,LR 是一个线性模型,不像 SVM 可以通过使用内核来学习复杂的非线性决策边界。

【讨论】:

    【解决方案2】:

    我看到人们使用neural networks 取得了不错的效果,但那已经是几年前的事了。我问了一位专家同事,他说现在人们使用nearest-neighbor分类器之类的东西。

    我不知道 scikit 或 WEKA,但任何半体面的分类包都应该至少实现 k-最近邻。或者您可以自己实现它,这非常容易。试一试:它的精度可能比您想要的要低,但是您可以稍作修改,而不是进行简单的多数投票(即邻居中最频繁的类别获胜),您需要邻居之间更大的共识才能分配一个类(例如,至少 50% 的邻居必须属于同一类)。您需要的共识越大,您的精确度就会越高,但会以召回为代价。

    【讨论】:

    • K-nearest-neighbor 分类器很大程度上依赖于图像之间的良好距离函数,并且不擅长泛化,尽管在 OCR 中这可能不是这样的问题。不过,您的共识想法听起来很合理。