一般来说哪种机器学习分类器可供select?
假设我正在处理一些分类问题。 (欺诈检测和评论垃圾邮件是我现在正在处理的两个问题,但我对任何分类任务都很好奇。)
我怎么知道我应该使用哪个分类器?
- 决策树
- SVM
- 贝叶斯
- neural network
- K-最近的邻居
- Q学习
- 遗传algorithm
- 马尔可夫决策过程
- 卷积neural network
- 线性回归或逻辑回归
- 提升,装袋,封锁
- 随机爬山或模拟退火
- …
在哪些情况下是其中一种“自然”的首选,select哪一种呢?
我正在寻找的答案types的示例(来自Manning等人的“信息检索简介”一书):
一个。 如果您的数据被标记,但只有有限的数量,您应该使用高偏见的分类器(例如,朴素贝叶斯) 。
我猜测这是因为偏向较高的分类器将具有较低的方差,这是因为less量的数据。
湾 如果你有大量的数据,那么分类器并不是那么重要,所以你应该select一个具有良好可扩展性的分类器。
-
什么是其他指导方针? 即使答案是“如果你必须向高层pipe理者解释你的模型,那么也许你应该使用决策树,因为决策规则是相当透明的”是好的。 不过,我并不关心实现/库问题。
-
此外,对于一个有点独立的问题,除了标准的贝叶斯分类器之外,是否有标准的最先进的评论垃圾邮件检测方法(而不是电子邮件垃圾邮件)呢?
首先,你需要确定你的问题。 这取决于你有什么样的数据和你想要的任务是什么。
如果你是
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时可能会考虑的内容包括:
-
你需要逐步培训 (而不是批量)吗?
如果你需要经常更新你的分类器(或者你有大量的数据),你可能会使用贝叶斯。 neural network和支持向量机需要一次性处理训练数据。
-
您的数据是仅由分类还是仅以数字组成,还是由两者组成 ?
我认为贝叶斯最适合于分类/二项数据。 决策树无法预测数值。
-
你或你的听众是否需要了解分类器是如何工作的?
使用贝叶斯或决策树,因为这些可以很容易地解释给大多数人。 neural network和支持向量机是“黑匣子”,因为你不能真正看到他们如何分类数据。
-
你需要多less分类速度 ?
SVM在分类方面速度很快,因为它们只需要确定数据所在的“行”的哪一侧。 决策树可能很慢,特别是当它们很复杂时(例如很多分支)。
-
复杂性 。
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。