我有一个由260个数据点组成的小型异构数据集。有9个混合特征(4个分类特征,5个连续特征(,我试图预测材料的连续值(以吨为单位(,这是我唯一的标签。
我在scikit learn中使用RandomForestregressor,经过调整的模型呈现出R2=0.4和MAE为8.4(标签的标准偏差为19.2(的不令人印象深刻但相当一致的结果,具有10倍的CV。
整个任务为我提供了硕士论文的概念证明,我自己收集并清理了数据集,这是一个真实世界的数据,我知道它可能有很多错误(但好吧,这是我们最好的,我没有办法衡量它的不可靠程度(。所以我想检查一下我是否可以信任这些结果,或者模型只是在一个完整的噪声中找到了一些模式,而整个数据集完全是垃圾。
因此,我所做的是创建一个形状相同的新数据集,但每个特征的值都被打乱(在每个特征的预期范围内调用一个随机数(。然后,当我在这个新的"垃圾"数据集上运行我的模型时,结果是R2=-0.2,MAE=20.6。我想这是好的,因为这意味着在我的原始模型中有一些相关性,而且它实际上是有效的。
我所做的是一个合法的实验来验证这个模型是有用的吗?像这样的方法有名字吗?还是有问题?如果是,我可以做一些不同的事情来验证模型吗?
您的方法类似于基于排列的特征重要性计算(即sklearn.inspection.permutation_importance
(,其中您单独打乱每个特征,并测量模型度量的减少(除了您实际上打乱了顺序而不是生成新值(。正如您所看到的,至少您的一些模型功能似乎是有用的。删除无用或冗余的功能(使用相互信息、VIF等(可能会进一步改进您的模型,除非您已经这样做了
sklearn还提供了具有不同策略的虚拟模型(请参阅sklearn.dummy.DummyRegressor
(,您可以对照这些策略检查您的模型。你正在检查不同的指标,这也很重要:我看到模型输给了恒定均值预测器,尽管R2有明显的差异。
R2得分为0.4意味着你的模型解释了40%的目标方差,你的绝对误差比你的伪模型好得多。这是在10个交叉验证折叠之间的平均值,所以它看起来相当可靠。对于极小的数据集,您可以进行Leave One Out交叉验证,但在您的情况下,这看起来有点过头了。