如何在非常小的数据集上改进我的模型?

数据挖掘 机器学习 回归 数据增强 集成学习
2022-02-11 16:19:41

我刚开始读博士,我们想从电荷等基本化学性质中找到合适的材料(具有某些品质)。类似的工作中有很多模型和数据集,但由于我们的工作非常新颖,我们有自己制作和测试每个数据样本。这使得数据采集非常非常缓慢并且非常昂贵。我们估计的样本将在一段时间内为 10-15 个样本,直到我们可以扩展它。

现在我想使用这些样本来制作一个基本的预测模型,但要尽可能多地进行“良好的泛化”。我将使用此模型从大量属性中筛选其他可能的候选材料,以找到最可能的材料,然后继续制作它们以进行测试。

现在我显然不希望性能接近 95% 左右,但我想要一个具有预测能力的工作模型,它实际上将帮助我找到一些最可能的材料候选者,这样我们就可以扩展我们的工作。我不确定我是否可以(或者应该)使用一些常规的 ML 方法,例如数据集拆分和交叉验证。所以我很感激你的想法。

由于我们的数据量很小,我一直在寻找提高其稳健性的方法。这些是我们的想法:

1- 使用集成模型来避免过度拟合并避免偏斜(使用弹性网络、SVM、随机森林等算法)。

2- 设置重正则化以避免小数据可能产生的某些偏差。

3- 使用更快到达最小外围的算法。

对于如何尽可能改进此模型以达到最佳泛化性能的任何建议,我将不胜感激。

我也考虑过很多合成数据的生成。你对我该如何去做有什么建议吗?

1个回答

根据您的说法,我认为您应该从检查三个选项开始:

I)普通最小二乘法(OLS):只需运行“正常”线性回归。这不会产生很好的预测,但是如果您可以假设两者之间存在线性关系,您可以将模型视为因果模型yx. 当你有 5 个预测变量和 35 个观测值时,你总共有 29 个自由度,这是“好的”。当您在“级别”中估计模型时,只要值原样,您就可以直接将估计的系数解释为边际效应。例如模型y=β0+β1x+u, 告诉你当x增加一个单位,y改变β1单位,就像一个线性函数。

II)您可以使用 Lasso/Ridge/Elastic Net:它们都是线性模型,带有“收缩”的惩罚项x变量,如果它们“无用”。如果您愿意,这就像自动功能选择一样。Hastie 等人有一个很棒的软件包。对于 R。你可以在这里找到它。它也可用于 Python。

III)也许(!)提升也可能是一种选择:您(可能)需要自己进行一些功能选择/工程。但是 Boosting 能够处理少量的观察,具有高度相关的特征,并且通常可以很好地处理高度非线性的问题。有 LightGBM 或 Catboost 作为可能的 Python 包。在这里找到一些最小的例子

使用 II) 和 III),您会发现您实际上无法“搁置”一些观察结果来检查您的模型是否有效(因为您没有太多数据)。您可以使用交叉验证(ISL 中的第 5 章,下面的链接),但您需要了解它是如何工作的。与其选择预测模型,我倾向于说从“类因果”OLS 模型开始可能会更好。使用 OLS,您实际上并不需要“测试集”。OLS 非常健壮。

由于您似乎是统计建模的新手,因此您可能会从查看“统计学习简介”(特别是第 3 章和第 6 章)中受益。PDF 是在线,并且有 Python 和 R 中的实验室代码。高级书籍将是“统计学习要素”。

祝你的项目好运!