在小型数据集上执行机器学习

数据挖掘 机器学习 分类 算法
2022-03-06 04:28:55

作为机器学习的初学者,我想从事一个小型项目,其中数据集只有 80 行和 5 列。我正在使用的数据集与医疗状况有关,有 4 列作为生物标志物,第 5 列表示该行(患者)是否有这种状况。到目前为止,我已经拟合了以下 5 个模型(具有准确度和 MCC 分数):

  • KNN(准确度:43.5%,MCC:-0.164)
  • 逻辑回归(准确度:65.2%,MCC:0.312)
  • SVM(准确度:60.9%,MCC:0.214
  • 随机森林(准确率:86.95%,MCC:0.769)
  • 决策树(准确度:65.2%,MCC:0.312)

我使用了 5 折交叉验证来防止过度拟合,但我的大多数模型都表现不佳。我也在考虑集成和引导,但由于这些缺乏结果,我不确定它们会有多有效。您是否有任何提示:

  1. 小数据集的更好算法

  2. 到目前为止,我可以对算法进行改进

  3. 另一种方法(例如正则化)

1个回答

通过 5 折交叉验证,在每一折中,您将训练数据集减少到 64 个观察值并针对 16 个观察值进行评估。假设您的数据是平衡的并且您正在对折叠进行分层,那么您只需为您的模型提供每个类别的 32 个观察值以供学习,并且单个测试集观察值的错误分类会导致该折叠的准确度发生 6.25% 的点变化。即使它在其他折叠中被正确分类,单个错误分类仍然会在跨折叠平均值上产生 1.25% 的点变化。哎呀。你的模型表现不佳应该不足为奇:它们不仅没有太多数据可以训练,而且你的评估方法也非常无情。

所以,是的,您的数据非常小。在我的脑海中,我可以想到一些可以用来解决这个问题的一般策略:

  1. 使用更多数据进行训练尝试使用留一法或引导法,而不是 5 倍 CV。
  2. 生成假数据这可能不会让你走得太远,但它至少是一个选择。查看 SMOTE 算法。
  3. 迁移学习根据您正在做的事情,可以利用预先训练的模型,然后稍微调整它以满足您的需求。如果这是一个选项,它可能非常强大,但很可能这不是你可以合理追求的东西。无论如何,这里有一篇文章在另一个小数据医学示例中展示了这一点:一个预训练的通用图像分类器被训练为仅从 600 张图像中检测癌症!https://arxiv.org/abs/1711.10752
  4. 去贝叶斯. 贝叶斯方法允许您将外部信息合并为“先验信念”。如果您具有主题专业知识(或者更好的是引用),您可以使用这些专业知识来设置您对模型参数或超参数值的期望,贝叶斯方法将允许您明确地合并该信息,这反过来可以帮助您的模型找到好的参数更快,因为它不需要直接从可用的小数据中了解有关您问题的所有信息。如果您不小心,这可能会导致您为自己提供想要的模型,在这种情况下,您的评估指标可能不像您认为的那样提供信息。这里有龙:这种方法很强大,但很难正确地做到,
  5. 获取更多数据我猜这不是一个选择,或者你已经这样做了。但如果有机会它就在那里:去找它。尝试浏览与这种情况相关的文献,也许你会很幸运并找到一个公共数据集。如果你觉得大胆,你可以尝试给其他研究人员发电子邮件,并礼貌地询问他们是否可以使用他们的数据。