哪种机器学习分类器可供选择,一般情况下?

时间:2010-04-07 19:10:25

标签: machine-learning

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

我如何知道应该使用哪种分类器?

  1. 决策树
  2. SVM
  3. 贝叶斯
  4. 神经网络
  5. K-最近邻居
  6. Q学习
  7. 遗传算法
  8. 马尔可夫决策过程
  9. 卷积神经网络
  10. 线性回归或逻辑回归
  11. 提升,装袋,装配
  12. 随机爬山或模拟退火
  13. ...
  14. 在哪些情况下,其中一种是“自然的”首选,选择那一种的原则是什么?

    我正在寻找的答案类型的例子(来自Manning等人的Introduction to Information Retrieval书):

    一个。 如果您的数据已标记,但数量有限,则应使用具有高偏差的分类器(例如,Naive Bayes)

    我猜这是因为较高偏差的分类器会有较低的方差,这很好,因为数据量很少。

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

    1. 其他指南是什么?甚至像“如果你必须向一些上层管理人员解释你的模型,那么也许你应该使用决策树,因为决策规则相当透明”的答案都是好的。不过,我对实施/图书馆问题的关注较少。

    2. 此外,对于一个有点单独的问题,除了标准的贝叶斯分类器之外,还有“标准的最先进”方法来检测垃圾邮件(而不是垃圾邮件)?

10 个答案:

答案 0 :(得分:84)

enter image description here

首先,您需要确定您的问题。这取决于您拥有的数据类型以及您希望的任务。

  

如果您是Predicting Category

     
      
  • 你有Labeled Data      
        
    • 您需要关注Classification Approach及其算法
    •   
  •   
  • 你没有Labeled Data      
        
    • 您需要选择Clustering Approach
    •   
  •   
     

如果您是Predicting Quantity

     
      
  • 您需要选择Regression Approach
  •   
     

否则

     
      
  • 您可以选择Dimensionality Reduction Approach
  •   

上述每种方法都有不同的算法。特定算法的选择取决于数据集的大小。

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

答案 1 :(得分:55)

Model selection使用cross validation可能就是您所需要的。

交叉验证

您所做的只是将数据集拆分为k个非重叠子集(折叠),使用k-1折叠训练模型并使用您遗漏的折叠预测其性能。这是你为每个可能的折叠组合做的(首先离开第一个折叠,然后是第二个,......,然后是第k个,然后用剩余的折叠进行训练)。完成后,您可以估算所有折叠的平均性能(也可能是性能的方差/标准偏差)。

如何选择参数k取决于你拥有的时间。 k的常用值为3,5,10或甚至N,其中N是数据的大小(与一次性交叉验证相同)。我更喜欢5或10。

型号选择

假设您有5种方法(ANN,SVM,KNN等)和每种方法的10个参数组合(取决于方法)。您只需为每个方法和参数组合运行交叉验证(5 * 10 = 50)并选择最佳模型,方法和参数。然后,您将使用所有数据的最佳方法和参数重新训练,并获得最终模型。

还有一些事情要说。例如,如果您为每个使用许多方法和参数组合,那么您很可能会过度拟合。在这种情况下,您必须使用嵌套交叉验证

嵌套交叉验证

嵌套交叉验证中,您可以对模型选择算法执行交叉验证。

同样,您首先将数据拆分为k个折叠。每个步骤后,您选择k-1作为训练数据,剩下的一个作为测试数据。然后为这些k折叠的每个可能组合运行模型选择(我上面解释的过程)。完成此操作后,您将拥有k个型号,每个折叠组合一个。之后,使用剩余的测试数据测试每个模型并选择最佳模型。再次,在拥有最后一个模型之后,您将使用与您拥有的所有数据相同的方法和参数训练一个新模型。那是你的最终模特。

当然,这些方法有很多变化,还有其他一些我没有提到的。如果您需要有关这些主题的更多信息,请查找有关这些主题的一些出版物。

答案 2 :(得分:40)

OpenCV ”一书在第462-463页上有两页。在亚马逊预览中搜索“discriminiminative”(也可能是谷歌书籍)这个词,可以让你看到有问题的页面。这两页是我在本书中找到的最伟大的宝石。

简而言之:

    大量培训数据可用时,
  • 提升 - 经常有效

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

  • K-最近邻 - 最简单你可以做的事情,经常有效和需要大量内存

  • 神经网络 - 慢速训练但非常快速运行,仍然是字母识别的最佳表现

  • SVM - 数据有限的最佳,但输掉 >只有当大数据集可用时,随机树

答案 3 :(得分:36)

您在选择使用哪种算法时可能会考虑的事项包括:

  1. 您是否需要逐步训练(而不是批量训练)?

    如果您需要经常使用新数据更新分类器(或者您有大量数据),您可能希望使用贝叶斯。神经网络和SVM需要一次性处理训练数据。

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

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

  3. 您或您的受众是否需要了解分类器的工作原理?

    使用贝叶斯或决策树,因为这些可以很容易地解释给大多数人。从某种意义上说,神经网络和SVM是“黑匣子”,你无法真正看到他们如何对数据进行分类。

  4. 您需要多少分类速度

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

  5. 复杂性

    神经网络和SVM可以处理复杂的非线性分类。

答案 4 :(得分:28)

正如Andrew Ng教授经常指出的那样:总是先实施一个粗糙,脏的算法,然后迭代地改进它

对于分类,朴素贝叶斯是一个很好的入门者,因为它具有良好的性能,高度可扩展性,可以适应几乎任何类型的分类任务。此外 1NN (K-Nearest Neighbors只有1个邻居)是一个无麻烦的最佳拟合算法(因为数据将是模型,因此您不必关心维度的拟合)你的决策边界),唯一的问题是计算成本(二次因为你需要计算距离矩阵,所以它可能不适合高维数据)。

另一个好的入门算法是随机森林(由决策树组成),这可以高度扩展到任意数量的维度,并且通常具有完全可接受的性能。最后,有遗传算法,它可以很好地扩展到任何维度和数据本身知识最少的任何数据,最简单和最简单的实现是microbial genetic algorithm(只有一个) C代码系列由Inman Harvey于1996年创作,其中最复杂的是CMA-ES和MOGA / e-MOEA。

请记住,在尝试使用真实算法之前,通常情况下,您无法真正了解哪些内容最适合您的数据。

作为旁注,如果你想要一个理论框架来测试你的假设和算法理论性能对于给定的问题,你可以使用PAC (Probably approximately correct) learning framework(注意:它非常抽象和复杂!),但是总结一下,PAC学习的要点是你应该使用不那么复杂,但足够复杂(复杂性是算法可以容纳的最大维度)算法,它可以适合你的数据。换句话说,使用奥卡姆剃刀。

答案 5 :(得分:8)

Sam Roweis used to say你应该先尝试朴素的贝叶斯,逻辑回归,k-最近邻和Fisher的线性判别式。

答案 6 :(得分:5)

我对此的看法是,您始终首先运行基本分类器以了解您的数据。通常情况下(至少根据我的经验),他们已经足够好了。

因此,如果您有监督数据,请训练朴素贝叶斯分类器。如果您有无监督数据,可以尝试k-means聚类。

另一个资源是视频系列Stanford Machine Learning的讲座视频之一,我在一段时间后看过。在视频4或5中,我认为,讲师在培训分类器,优势/权衡等时讨论了一些普遍接受的惯例。

答案 7 :(得分:4)

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

如果您想了解数据中发生的复杂关系,那么您应该使用丰富的推理算法(例如线性回归或套索)。另一方面,如果您只对结果感兴趣,可以选择高维度和更复杂(但解释性较差)的算法,如神经网络。

答案 8 :(得分:0)

算法的选择取决于场景以及数据集的类型和大小。 还有很多其他因素。

这是基本机器学习的简短备忘单。

Here you can validate your scenario with a simple cheat sheet

答案 9 :(得分:0)

首先,这取决于您要处理的问题类型是分类还是回归。然后明智地选择模型。它取决于一个特定的模型,一个特定的模型优于其他模型。假设您正在sklearn库中的wine_dataset上工作,首先尝试使用线性的内核svm训练数据,并且获得某种精度,然后您认为它不令人满意,因此您尝试使用DecisionTreeClassifier()训练数据然后您尝试使用RandomForestClassifier()。之后,无论哪种精度都会更好,或者您可以说适合您的数据,就可以得出结论。在继续更改模型进行测试时,您会发现语法上的差异很小。因此一切顺利,并很好地理解了问题。