1. 背景
1.1 研究方法
随着深度学习如火如荼的发展,对大数据的训练和学习已经非常成熟,广泛应用在学术界和工业界。但在不少打工人中往往会遇到样本个数在100到1000之间的超小规模数据集。例如,孕妇在整个妊娠期间的详细指标以及随后的新生儿情况。目前业界还不清楚这种情况下的最佳实践是什么,为了对此进行研究,制定了以下的研究方法:
- 获取大量用于分类的小型基准数据集,总共108个数据集(这些数据集也可以用来测试基准回归算法)。
- 选择一些具有代表性的ML分类器:线性支持向量机、逻辑回归、随机森林、LightGBM(梯度提升决策树)、Augogloon(AutoML工具包)。
- 选取合适的超参数。
- 使用交叉验证,分别在每个数据集上测试每个分类器。
- 绘制结果图。
1.2 数据集和代码链接
数据集和代码链接为:https://github.com/sergeyf/SmallDataBenchmarks
2. 测试结果
下图展示了各个分类器测试结果,选取的指标是One-vs-All情况下的AUROC交叉验证平均值(AUROC值指的是ROC曲线下的面积)。
除此之外,还有一些额外的发现:
- AutoGluon 总体上是最好的,但它有时候会存在问题,即AUC<0.5,逻辑回归分类器上不存在该问题,LightGBM也很少出现该问题。
- AutoGluon 耗时较长,AutoGluon 有一个预算参数,用来定义需要花多少时间来提升效果。为了保证效果,交叉验证时,在每折数据上最少使用5分钟。整个基准测试,需要耗费的时间是:108个数据集4折300s=1.5天,也就是总共需要耗时一天半。
- 线性SVC的表现整体上优于逻辑回归。SVC在其中两个数据集上的表现要优于其它所有模型,在这两个数据集上的auroc值分别是0.3和0.1,所以在实践中,线性SVC还是值得一试。
- 逻辑回归需要进行正则化,以确保它不会像AutoGluon和随机森林一样出现泛化失败的问题。
- LightGBM次之。我用hyperopt 来调参,也尝试了scikit-optimize和Optuna来调参,二者效果都不太好,可能是人为错误导致的。
- 随机森林相当不错,随机森林的优化过程比LightGBM和AutoGluon的优化过程更简单也更快。我只交叉验证测试了随机森林的深度参数。
对最好的分类器或者处于最高AUROC 0.5%范围内的进行次数统计,优质分类器排名如下:
- AutoGluon (sec=300):71
- LightGBM(n_hyperparams=50):43
- LightGBM(n_hyperparams=25):41
- 随机森林:32
- 逻辑回归:28
- SVC:23
所有数据集的平均AUROC,优质分类器排名如下:
- AutoGluon (sec=300):0.885
- LightGBM(n_hyperparams=50):0.885
- LightGBM(n_hyperparams=25):0.873
- 随机森林:0.870
- SVC:0.841
- 逻辑回归:0.835
对最差的分类器或者处于最差AUROC 0.5%范围内的进行次数统计,差分类器排名如下:
- 逻辑回归:54
- SVC:48
- 随机森林:25
- LightGBM(n_hyperparams=25):19
- LightGBM(n_hyperparams=50):18
- AutoGluon (sec=300):14
这表明即使分类器大多数情况下效果较优,也有10%的情况下会效果不佳,机器学习领域中没有银弹。下图展示了每个分类器的(交叉验证)平均AUROC值与样本数量的关系图:
当我第一次看到上述结果时感觉到一丝惊讶,因为之前自己一直认为:无需在小型数据集上使用复杂的模型,但这似乎与在这108个数据集上的测试结果相悖。从图中可见,即使数据量很小的时候,AutoGluon 也效果不错,LightGBM和随机森林远远领先于两个线性模型。图中线性模型的曲线上有个奇怪的峰值,线性模型的结果突然提升,但却并不清楚原因是什么。
最后一个图展示了每个分类器的(交叉验证得到的)AUROC均值的标准差:
从图中可以看出,无论数据集大小如何,线性模型不仅泛化能力较差,而且泛化方差也较高。
3. 关于数据独立同分布的思考
这些实验的适用性如何呢?训练数据和测试数据是独立的,分布也相同。测试数据、训练数据、验证数据都很相像。这虽然非常不现实,但是这正是学术论文在评估机器学习算法时候所使用的数据集的模式。对于IID数据,不管数据集大小如何,LightGBM都可能比线性模型效果更好。
但如果测试集来自于与训练集相关但不同的分布,即测试集是协变量移位的(covariate-shifted),该文中的实验结论未必成立。很难对这种情况进行测试,因为IID数据是现成的,直接用基准数据集即可,但实际中很少有现成的与训练集相对应的协变量移位测试集。
4. 结论
- 如果您关心的是数据独立同分布的场景,那么即使您只有50个样本,非线性模型也可能表现不错,可以优先考虑。
- AutoGluon是获得分类性能上限的一种很好的方法,但是要理解最终得到的复杂的集成结果是非常困难的。
- 在调参方法中,hyperopt虽然存在一些问题,但是效果依然比我尝试过的其它算法要好。
- SVC的表现很少优于其它所有算法。
另外,还有一些注意事项:
- LightGBM有许多强大的功能,本实验中还未涉及这些功能,例如,缺失值处理(我们用到的数据集没有缺失值),分类变量的智能编码(本文使用独热编码)以及对每个特征进行单调约束(需要先验知识)等。
- AutoGluon包含了一个表格神经网络(tabular neural network),但我还没有单独对其运行基准测试。研究表格神经网络结构是否能适用于小型数据集应该会很有趣。
- 本文只针对分类,针对回归算法的结论可能有所不同。
5. 代码和数据集链接
https://github.com/sergeyf/SmallDataBenchmarks
文章最后给自己打个广告。先做个自我介绍:我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池安全恶意程序检测第一名,科大讯飞阿尔茨海默综合症预测挑战赛第四名,科大讯飞事件抽取挑战赛第七名,Datacon大数据安全分析比赛第五名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法行业就业。希望和大家一起成长进步。以下几个专栏欢迎大家订阅学习:
AI比赛经验分享
https://blog.csdn.net/herosunly/category_9393702.html
机器学习入门之工具篇
https://blog.csdn.net/herosunly/category_10457626.html
爬虫实战
https://blog.csdn.net/herosunly/category_10748674.html
转载:https://blog.csdn.net/herosunly/article/details/115655817