我正在使用opencv letter_recog.cpp示例在随机树和其他分类器上进行实验。此示例具有六个分类器的实现 - 随机树,增强,MLP,KNN,Naive Bayes和SVM。 UCI字母识别数据集具有20000个实例和16个功能,我将其分成两半进行培训和测试。我有SVM的经验,因此我迅速将其识别错误设置为3.3%。经过一些实验,我得到的是:

UCI字母识别:

  • RTREES -5.3%
  • 提升-13%
  • MLP- 7.9%
  • KNN(K = 3)-6.5%
  • 贝叶斯-11.5%
  • SVM -3.3%

使用的参数:

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

  • boost -boost_type = real,feek_count = 200,weight_trim_rate = 0.95,max_depth = 7

  • MLP-方法= backprop,param = 0.001,max_iter = 300(默认值 - 实验太慢)

  • knn(k = 3) - k = 3

  • 贝叶斯 - 没有

  • SVM -RBF内核,C = 10,伽马= 0.01

之后,我使用了相同的参数,并通过提取梯度特征(向量尺寸200个元素)来对数字和MNIST数据集进行了测试:

数字:

  • RTREES -5.1%
  • 提升-23.4%
  • MLP- 4.3%
  • KNN(K = 3)-7.3%
  • 贝叶斯-17.7%
  • SVM -4.2%

mnist:

  • RTREES -1.4%
  • 提升 - 不记忆力
  • MLP -1.0%
  • KNN(K = 3)-1.2%
  • 贝叶斯-34.33%
  • SVM -0.6%

除SVM和KNN外,我都是所有分类器的新手,因为这两个我可以说结果看起来不错。那别人呢?我期望从随机树中获得更多,在MNIST KNN上提供了更好的准确性,任何想法如何使其更高?增压和贝叶斯的精度非常低。最后,我想使用这些分类器来制作多个分类器系统。有建议吗?

有帮助吗?

解决方案

减少维度

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

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

交叉验证

另外,您可能需要看一下交叉验证技术,以便以更客观的方式评估分类器的性能

其他提示

我期望从随机树中获得更多:

  • 使用随机森林(通常用于N特征),SQRT(N)特征用于每个决策树的构造。因为您的情况 n= 20,您可以尝试设置 max_depth (构造每个决策树的子功能的数量)至5。

  • 与决策树相比,已经提出并评估了线性模型,并作为随机森林中的基础估计量,特别是多项式逻辑回归和天真的贝叶斯。这可能会提高您的准确性。

在MNIST KNN上提供了更好的准确性,任何想法如何使其更高?

  • 尝试更高的价值 k (例如5或7)。 k的价值更高,可以为您提供有关一个点标签的更多支持证据。
  • 在运行K-Nearest邻居之前,您可以运行PCA或Fisher的线性判别分析。通过这种情况,您可能会在计算点之间的距离时摆脱相关的功能,因此您的K邻居将更加强大。
  • 根据K邻居之间距离的差异,尝试不同点的不同k值。
许可以下: CC-BY-SA归因
scroll top