如何提高分类器的准确性?


17

我正在使用OpenCV letter_recog.cpp示例来对随机树和其他分类器进行实验。此示例具有六个分类器的实现-随机树,boosting,MLP,kNN,朴素贝叶斯和SVM。使用具有20000个实例和16个功能的UCI字母识别数据集,我将其分为两半进行训练和测试。我具有SVM的经验,因此我迅速将其识别错误设置为3.3%。经过一些试验,我得到的是:

UCI字母识别:

  • RTrees-5.3%
  • 提升-13%
  • MLP-7.9%
  • kNN(k = 3)-6.5%
  • 贝叶斯-11.5%
  • 支持向量机-3.3%

使用的参数:

  • RTrees-max_num_of_trees_in_the_forrest = 200,max_depth = 20,min_sample_count = 1

  • 提升-boost_type = REAL,weak_count = 200,weight_trim_rate = 0.95,max_depth = 7

  • MLP-method = BACKPROP,param = 0.001,max_iter = 300(默认值-太慢无法进行实验)

  • kNN(k = 3)-k = 3

  • 贝叶斯-无

  • SVM-RBF内核,C = 10,gamma = 0.01

之后,我使用相同的参数并通过首先提取梯度特征(向量大小为200个元素)对Digits和MNIST数据集进行了测试:

位数:

  • RTrees-5.1%
  • 提升-23.4%
  • MLP-4.3%
  • kNN(k = 3)-7.3%
  • 贝叶斯-17.7%
  • 支持向量机-4.2%

MNIST:

  • RTrees-1.4%
  • 加速-内存不足
  • MLP-1.0%
  • kNN(k = 3)-1.2%
  • 贝叶斯-34.33%
  • 支持向量机-0.6%

对于SVM和kNN以外的所有分类器,我都是陌生的,对于这两个分类器,我可以说结果似乎不错。那别人呢 我期望从随机树中获得更多,在MNIST kNN上可以提供更好的准确性,有什么想法如何使其更高?Boost和Bayes的准确性非常低。最后,我想使用这些分类器构建一个多分类器系统。有什么建议吗?

Answers:


9

降维

另一个重要过程是比较训练和测试数据集的错误率,以查看您是否过度拟合(由于“维数的诅咒”)。例如,如果您在测试数据集上的错误率比训练数据集上的错误率大得多,那么这将是一个指标。
在这种情况下,您可以尝试降维技术,例如PCA或LDA。

如果您有兴趣,我在这里写了有关PCA,LDA和其他一些技术的文章:http : //sebastianraschka.com/index.html#machine_learning,在我的GitHub存储库中,这里是:https : //github.com/rasbt/pattern_classification

交叉验证

另外,您可能想看看交叉验证技术,以便更客观地评估分类器的性能


是的,确实训练数据集的错误率约为0。在我的案例中,更改参数以减少过度拟合并不会导致测试数据集具有更高的准确性。我将尽快调查您提及的技术并发表评论,谢谢。
米卡2014年

训练和测试数据集的相对比例是多少?是70:30、60:40还是50:50?

第一个数据集-UCI字母识别设置为50:50(10000:10000),数字约为51:49(1893:1796),而MNIST约为86:14(60000:10000)。
米卡

我在PCA上进行了实验,但在随机阿甘条件下仍然无法获得良好的结果,但是boost和Bayes给出的结果与其他分类器相似。我在这里找到了有关随机阿甘的讨论: stats.stackexchange.com/questions/66543/…可能我实际上并没有过拟合,但找不到那里提到的“ out-of-bag(OOB)”预测错误。现在使用大量树木进行实验,以查看准确性是否会提高。
米卡

好的,听起来您正在取得一些进步:)一个琐碎的问题,但是您是否对特征(z得分)进行了标准化,以使它们以均值为中心且标准差为1?

5

我对随机树有更多的期望

  • 对于通常用于N个要素的随机森林,对于每个决策树构造都使用sqrt(N)要素。由于在您的情况下N = 20,因此您可以尝试将max_depth(构造每个决策树的子功能数)设置为5。

  • 代替决策树,线性模型已经被提出并作为随机森林中的基本估计量进行评估,特别是多项式逻辑回归和朴素贝叶斯。这可能会提高您的准确性。

在MNIST上,kNN可以提供更好的准确性,是否有任何想法如何使其更高?

  • 尝试使用较高的K(例如5或7)。较高的K值将为您提供有关点的类别标签的更多支持证据。
  • 您可以在运行k最近邻之前运行PCA或Fisher线性判别分析。这样,在计算点之间的距离时,您可能会摆脱相关特征,因此,您的k个邻居会更健壮。
  • 根据K个邻居之间距离的差异,对不同的点尝试不同的K值。

我相信你指的是OpenCV nactive_vars参数(不是max_depth),我将其设置为默认sqrt(N)值,即第一个数据集的nactive_vars = sqrt(16)和其他两个数据集的sqrt(200)。max_depth确定树木是否生长到最大深度(最大值为25)以及平衡不足和过度拟合之间的平衡,此处更多信息: stats.stackexchange.com/questions/66209/…不确定min_sample_count,但我尝试了各种值并进行设置到1效果最好。
米卡

OpenCV文档对参数进行了简要说明:docs.opencv.org/modules/ml/doc/…目前,我想使随机树工作得相当好并使事情简单,因为我想专注于使用多分类器系统。
米卡

关于kNN-这些都是非常好的建议,但是我的意思是说kNN的表现要优于随机树分类器,我认为随机树有很多改进的空间。
米卡

是的,我不确定为什么随机森林的性能不如简单的k-NN方法好(或更好)...可能是基于内核的方法直接尝试估计P(y | D)(输出给定数据),例如在k-NN中,而不估计参数模型中的P(the | D)(潜模型给定数据)。
Debasis 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.