过拟合是特征工程的问题还是参数设置的问题?

数据挖掘 随机森林 过拟合 表现
2022-02-21 19:45:10

我正在使用sklearn包来制作模型。

我尝试随机将一些参数设置为 a sklearn.ensemble.RandomForestClassifier,以便了解有关参数的想法以搜索未来的网格搜索。

好吧,这里是这次尝试的结果:

准确度:
培训:0.9209427371993345,测试:0.7035561005518087

显然,我知道这意味着模型过度拟合,因为它无法泛化到新数据。我知道交叉验证会更准确,因为不幸的是,测试集可能与训练集随机地相差太大,但这不是我在当前主题问题中所寻找的。此外,我尝试定位的两个类是不平衡的。Class 1Class 0更多。

0 类:34% 的测试集/训练集,1 类:66% 的测试集/训练集。

所以因为它不平衡,我检查了精度和召回指标:

在测试集上:

+---------+-----------+--------+----------+----------+
| classes | precision | recall | F1-score | support  |
+---------+-----------+--------+----------+----------+
|       0 |      0.60 |   0.38 |     0.47 |     3326 |
|       1 |      0.73 |   0.87 |     0.80 |    6460  |
+---------+-----------+--------+----------+----------+

在训练集上:

+---------+-----------+--------+----------+----------+
| classes | precision | recall | F1-score | support  |
+---------+-----------+--------+----------+----------+
|       0 |      0.98 |   0.81 |     0.89 |   31265  |
|       1 |      0.91 |   0.99 |     0.95 |  59492   |
+---------+-----------+--------+----------+----------+

然后,在训练集上,我看到这两个类都得到了很好的预测。直觉上我认为:如果它在训练集上被很好地预测,这意味着特征足以分裂这两个类。所以,这只是参数设置的问题。但是直觉并不像好的经验那么有价值。因此,如果我的直觉是错误的,我要求这个社区更有经验的人,如果是,为什么会这样?

更新:

检查变量后,通过直方图显示训练集和测试集之间的分布相同。

3个回答

1/3 - 2/3 的重新分区并不是那么不平衡。你的问题不应该需要平衡。

训练/测试集分区似乎正确完成,因为它似乎通过检查数据直方图暗示。随机进行通常是可以的,如果不是这样,它会因数据泄漏而夸大您的测试性能,这似乎不是这里的情况。

我的问题来自你的学习过程,或者更准确地说:它什么时候停止?

如果您要手动探索参数空间,我建议您查看学习器的参数:https ://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html和对于他们每个人,问问自己增加/减少它们对算法学习能力的影响是什么。

这可能有点违反直觉,但实际上你必须限制学习者的能力,以免它学得太多。

然后你可以对驱动学习/性能的主要参数进行一些网格搜索。

你是对的,训练和测试之间的这种差异意味着模型过度拟合。

以下是一些改进流程的最佳实践: 1. 准确度不是衡量不平衡类的重要指标,我建议改用 f1-score。2. 通过过采样少数类或欠采样多数类来平衡训练集。3. 重新训练模型并检查新指标。

功能可能足够好,但显然你有协变量偏移,或者一些类似的 distrubancd。换句话说,你的训练和测试特征的分布是不同的,这会让你的模型感到困惑,换句话说,它没有学会区分训练数据集。