一般来说哪种机器学习分类器可供select?

假设我正在处理一些分类问题。 (欺诈检测和评论垃圾邮件是我现在正在处理的两个问题,但我对任何分类任务都很好奇。)

我怎么知道我应该使用哪个分类器?

  1. 决策树
  2. SVM
  3. 贝叶斯
  4. neural network
  5. K-最近的邻居
  6. Q学习
  7. 遗传algorithm
  8. 马尔可夫决策过程
  9. 卷积neural network
  10. 线性回归或逻辑回归
  11. 提升,装袋,封锁
  12. 随机爬山或模拟退火

在哪些情况下是其中一种“自然”的首选,select哪一种呢?

我正在寻找的答案types的示例(来自Manning等人的“信息检索简介”一书):

一个。 如果您的数据被标记,但只有有限的数量,您应该使用高偏见的分类器(例如,朴素贝叶斯)

我猜测这是因为偏向较高的分类器将具有较低的方差,这是因为less量的数据。

如果你有大量的数据,那么分类器并不是那么重要,所以你应该select一个具有良好可扩展性的分类器。

  1. 什么是其他指导方针? 即使答案是“如果你必须向高层pipe理者解释你的模型,那么也许你应该使用决策树,因为决策规则是相当透明的”是好的。 不过,我并不关心实现/库问题。

  2. 此外,对于一个有点独立的问题,除了标准的贝叶斯分类器之外,是否有标准的最先进的评论垃圾邮件检测方法(而不是电子邮件垃圾邮件)呢?

在这里输入图像说明

首先,你需要确定你的问题。 这取决于你有什么样的数据和你想要的任务是什么。

如果你是Predicting Category

  • 你有Labeled Data
    • 您需要遵循Classification Approach及其algorithm
  • 你没有Labeled Data
    • 你需要去Clustering Approach

如果你是Predicting Quantity

  • 你需要去Regression Approach

除此以外

  • 你可以去Dimensionality Reduction Approach

上面提到的每种方法都有不同的algorithm。 特定algorithm的select取决于数据集的大小。

资料来源: http : //scikit-learn.org/stable/tutorial/machine_learning_map/

使用交叉validation的 模型select可能是您需要的。

交叉validation

你所做的只是简单地将你的数据集分成k个不重叠的子集(折叠),使用k-1个折叠来训练一个模型,并使用你忽略的折叠来预测它的性能。 这是你为每个可能的折叠组合(首先离开第一折出,然后第二,…,然后第k,并与其余褶皱训练)。 完成后,您可以估计所有褶皱的平均性能(也可能是性能的方差/标准偏差)。

如何select参数k取决于你的时间。 k的通常值是3,5,10甚至N,其中N是您的数据的大小(这与留一交叉validation相同 )。 我更喜欢5或10。

模型select

假设您有5种方法(ANN,SVM,KNN等)和10个参数组合(取决于方法)。 您只需对每个方法和参数组合(5 * 10 = 50)运行交叉validation并select最佳模型,方法和参数。 然后你用最好的方法和参数重新训练你所有的数据,你有最终的模型。

还有更多的事要说。 例如,如果你使用了很多的方法和参数组合 ,很可能你会过度使用。 在这样的情况下,你必须使用嵌套交叉validation

嵌套交叉validation

嵌套交叉validation中 ,您将对模型selectalgorithm执行交叉validation。

再次,您首先将您的数据分为k个折叠。 每一步之后,您selectk-1作为您的训练数据,其余的作为您的testing数据。 然后你运行模型select(我上面解释的过程)为这些k倍的每个可能的组合。 完成后,您将有k个模型,每个折叠组合一个。 之后,您将使用剩余的testing数据testing每个模型,并select最好的模型。 同样,在最后一个模型之后,使用相同的方法和参数对所有数据进行训练。 这是你最后的模式。

当然,这些方法和其他我没有提到的东西有很多的变化。 如果您需要更多关于这些主题的信息,

您在select使用哪种algorithm时可能会考虑的内容包括:

  1. 你需要逐步培训 (而不是批量)吗?

    如果你需要经常更新你的分类器(或者你有大量的数据),你可能会使用贝叶斯。 neural network和支持向量机需要一次性处理训练数据。

  2. 您的数据是仅由分类还是仅以数字组成,还是由两者组成

    我认为贝叶斯最适合于分类/二项数据。 决策树无法预测数值。

  3. 你或你的听众是否需要了解分类器是如何工作的?

    使用贝叶斯或决策树,因为这些可以很容易地解释给大多数人。 neural network和支持向量机是“黑匣子”,因为你不能真正看到他们如何分类数据。

  4. 你需要多less分类速度

    SVM在分类方面速度很快,因为它们只需要确定数据所在的“行”的哪一侧。 决策树可能很慢,特别是当它们很复杂时(例如很多分支)。

  5. 复杂性

    neural network和支持向量机可以处理复杂的非线性分类。

OpenCV ”这本书的第462-463页有两页。 search亚马逊预览中的“歧视”(也可能是Google书籍)这个词可以让你看到有问题的页面。 这两页是我在这本书中find的最伟大的gem。

简而言之:

  • 提升 – 在大量的训练数据可用时通常有效

  • 随机树 – 通常非常有效 ,也可以执行回归

  • K最近的邻居 – 你可以做的最简单的事情, 往往有效,速度慢 ,需要大量的内存

  • neural network训练 速度 运行速度非常 ,仍然是字母识别的最佳performance者。

  • 支持向量机(SVM) 数据有限的情况下 是最好的 ,但是只有当大数据集可用时才会失去增强随机树

正如Andrew Ng教授经常说的那样:总是从一个粗糙的,脏的algorithm开始,然后迭代地细化它

对于分类, 朴素贝叶斯是一个好的开端,因为它具有良好的性能,高度可扩展性,可以适应几乎任何types的分类任务。 另外1NN (仅有1个邻居的K-最近邻居)是一个没有麻烦的最佳拟合algorithm(因为数据将是模型,因此您不必关心决策边界的维数拟合),唯一的问题是计算成本(二次方,因为你需要计算距离matrix,所以它可能不适合高维数据)。

另一个好的起始algorithm是随机森林 (由决策树组成),这对于任何维度都是高度可扩展的,并且通常具有相当可接受的性能。 最后,有遗传algorithm ,它可以非常好地扩展到任何维度和任何数据,而对数据本身知之甚less,其中最简单和最微妙的实现就是微生物遗传algorithm (Inman Harvey的C语言中只有一行1996),最复杂的是CMA-ES和MOGA / e-MOEA。

请记住,在实际使用algorithm之前,您经常无法真正了解哪些数据最适合您的数据。

作为一个侧面说明,如果你想要一个理论框架来testing你的假设和algorithm的理论性能的一个给定的问题,你可以使用PAC(可能近似正确)的学习框架 (要小心:这是非常抽象和复杂!),但总结,PAC学习的要点是,你应该使用适合你的数据的较不复杂但复杂的algorithm(复杂度是algorithm可以拟合的最大维数)。 换句话说,使用奥卡姆剃刀。

Sam Roweis 曾经说过 ,应该尝试朴素贝叶斯,逻辑回归,k-最近邻和Fisher线性判别。

我承担的是,你总是先运行基本的分类器来了解你的数据。 往往不是(至less在我的经验),他们已经足够好了。

所以,如果你有监督的数据,训练一个朴素贝叶斯分类器。 如果你有无监督的数据,你可以尝试k-均值聚类。

另一个资源是我观看了一段时间的斯坦福机器学习系列video的演讲video之一。 在video4或5中,我认为讲师在训练分类器,优势/折衷等方面讨论了一些公认的惯例。

您应该始终考虑推断与预测的权衡。

如果您想了解数据中出现的复杂关系,那么您应该使用丰富的推理algorithm(例如线性回归或套索)。 另一方面,如果您只对结果感兴趣,则可以使用高维和更复杂(但不易解释)的algorithm,如neural network。