这是我今天遇到的一个问题,也是机器学习中一个比较典型的问题,问题是这样的,我拿到了一堆数据,数据一共有3020条,包含了10个类别,要求训练一个分类器能够准确识别各个分类。对于小数据规模的机器学习而言,与我们入门时,练手的鸢尾花数据集相比,至少在数据量上还是比较充足的。其实不然,如下表,是整个数据中,各个类别所占的条数:
class 1 | class 2 | class 3 | class 4 | class 5 | class 6 | class 7 | class 8 | class 9 | class 10 |
1114 | 392 | 259 | 214 | 173 | 135 | 87 | 80 | 83 | 483 |
当看到数据分布后,心里开始时,或许还会嘀咕一下。如果你像我一样,开始时并没有重视这个“数据分布不均衡””(不知道学术上对于这类问题的准确叫法是什么,先姑且这么叫吧)的问题的话,训练出的模型的各个考量指标达不到预期的效果将是必然。
问题回顾:
开始拿到问题时,我大脑不经思索的想到了训练一个核函数为“rbf"的svm来解决问题。其实,什么分类器并不重要,重要的是一定要关注数据集中“数据分布不均衡””的问题。
问题分析:
如何忽略这个“数据分布不均衡”的问题,像我一样,不管怎么调参,怎么多折交叉验证,最终训练得到的模型Accuracy很低,并且始终提升不了。如下图,就是我最终训练得到的结果:
可能调参调了好长一段时间,还是没提升的缘故,脑子稀里糊涂的,开始心里自己分析问题。想着,会不会是因为类别之间数量差距较大,而且是个10-分类的问题。假设对一组输入特征随机猜一个分类结果,那么也应该有十分之一猜对的概率。
其实,还是想的太美好啦!如果将问题夸张一点,一个数据集中有1000条数据,他们包含两个分类,其中,类别1有999条,类别2只有1条,如果在预测过程中,我把所有输入特征对应的样本标签都预测成类别1,那么,所以的预测结果中,我只预测错了1条数据。对于类别1而言,模型预测的准确率为99.9%,那么,我们可以说这个模型是一个好的模型吗?显然是不可以的!
如何去解决这个问题呢?在增加数据无望的前提下,我最终采取的方法是将数据量占比小的数据相对数据占比最大的数据复制相应的倍数并加入到数据中。
结果还是比较不错的,如下图所示,模型的Accuracy由最初的42.8%提升到了95.3%。
但是从confusion matrix图中可以分析出,可能模型也存在着过拟合的问题,因此,要想模型分类效果更加,还要进行下一步的调优,这里就不做介绍了。
如果对于此类问题,你有更好的解决方法,请留言在下方一起学习,谢谢!