我正在使用一个极小的不平衡且异构的多类{K = 16}
数据库进行研究,并使用小型N ~= 250
。对于某些标签,数据库具有足够数量的用于监督机器学习的示例,但是对于其他标签,我几乎没有。由于多种原因,我也无法扩展数据库。
作为第一种方法,我以分层的方式将数据库分为训练集(80%)和测试集(20%)。最重要的是,我应用了几种分类算法,它们提供了一些结果。我在 500个分层训练/测试集(as each stratified sampling takes individuals randomly within each stratum)上应用了此过程,希望选择一种可以接受的算法(模型)。
由于我的数据库的不同,取决于训练集中的特定示例,测试集中的性能差异很大。我所处理的运行(对于我的应用程序)的准确度高达82%,而运行的准确度则低至40%。所有运行的平均准确率约为67%。
面对这种情况,我不确定选择最佳性能模型时的标准步骤(如果有)。我的理由是90%的模型可以更好地推广,因为在训练集中选择的特定示例更丰富,因此测试集可以更好地分类。但是,我完全意识到测试集可能由易于分类的“简单” 案例构成,也可能由包含所有难以分类的案例的训练集构成。
考虑到我的训练/测试集中的示例分布会导致结果差异很大,是否有任何标准程序来选择最佳表现模型?我在某处犯了概念错误吗?从业者是否通常会选择表现最佳的模型而没有进行任何进一步的探索?
我不喜欢使用均值/中位数准确性的想法,因为显然某些模型的概括性优于其他模型,但我绝不是该领域的专家。
最佳情况之一的测试集上的预测标签的混淆矩阵:
最坏情况之一的测试集上的预测标签的混淆矩阵:
它们都使用相同的算法和参数。
答案 0 :(得分:0)
我想首先指出,您的测试集的良好准确性通常不需要等于良好的模型! (在您的情况下)主要与样本的极度偏斜分布有关。
尤其是在进行分层拆分并以一类为代表的类别时,只需简单地一遍又一遍地预测这一类,就可能会获得良好的结果。
查看这种情况是否发生的一种好方法是查看预测的confusion matrix(更好的图片here)。
如果有一个类别似乎也使其他类别感到困惑,则表明存在不良模型。我认为,就您而言,要找到一个好的模型通常很难,除非您在培训期间确实积极地尝试平衡课程。
另一个想法的确是在多个模型上使用集合(在您的情况下是由于不同的分割而产生的),因为假定是generalize better。
即使您可能会在纸上牺牲很多精度,但我敢打赌,集成的混淆矩阵看起来可能比单个“高精度”模型中的矩阵好得多。尤其是如果您忽略性能极差的模型(再次确保“差”的性能来自实际的不良性能,而不仅仅是不幸的分裂),那么我可以看到很好的概括。
另一种常用技术是k倍交叉验证。实际上,您不必将数据分为单个80/20分割,而是将数据分为k个相等的大集合,然后始终对k-1个集合进行训练,而对另一个集合进行评估。然后,您不仅会感觉到拆分是否合理(通常会在k倍CV实现中获得不同拆分的所有结果,例如sklearn中的拆分结果),而且还会获得总分告诉您所有折叠的平均值。
请注意,五折CV等于将分成5组20%的集合,所以基本上就是您现在正在做的事情,加上“混洗部分”。
在班级不平衡或通常要确保模型性能良好的环境中,CV也是处理少量训练数据的好方法。