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

数据挖掘 机器学习 分类 支持向量机 准确性 随机森林
2021-10-13 23:53:04

我正在使用 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 的准确率非常低。最后我想用这些分类器来做一个多分类器系统。有什么建议吗?

2个回答

降维

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

如果你有兴趣,我在这里和我的 GitHub 存储库中写过关于 PCA、LDA 和其他一些技术的文章

交叉验证

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

我对随机树的期望更高

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

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

在 MNIST 上,kNN 提供了更好的准确度,有什么想法可以让它更高吗?

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