我使用在python sklearn包中实现的RandomForestClassifier来构建二进制分类模型。以下是交叉验证的结果:
Fold 1 : Train: 164 Test: 40
Train Accuracy: 0.914634146341
Test Accuracy: 0.55
Fold 2 : Train: 163 Test: 41
Train Accuracy: 0.871165644172
Test Accuracy: 0.707317073171
Fold 3 : Train: 163 Test: 41
Train Accuracy: 0.889570552147
Test Accuracy: 0.585365853659
Fold 4 : Train: 163 Test: 41
Train Accuracy: 0.871165644172
Test Accuracy: 0.756097560976
Fold 5 : Train: 163 Test: 41
Train Accuracy: 0.883435582822
Test Accuracy: 0.512195121951
我使用"价格"特征来预测"质量",这是一个序数值。在每个交叉验证中,有163个训练示例和41个测试示例。
显然,这里会出现过度拟合。那么,sklearn提供的任何参数都可以用来克服这个问题吗?我在这里找到了一些参数,例如min_samples_split和min_sample_leaf,但我不太了解如何调整它们。
提前感谢!
我同意@Falcon w.r.t.的数据集大小。主要问题可能是数据集的大小太小。如果可能的话,你能做的最好的事情就是获得更多的数据,数据越多(通常),过度拟合的可能性就越小,因为随着数据集大小的增加,看起来具有预测性的随机模式开始被淹没。
也就是说,我会查看以下参数:
- n_estimults:@Falcon是错误的,通常树越多,越不可能算法过拟合。因此,请尝试增加该值。这个数字越低,模型就越接近具有受限特征集的决策树
- max_features:尝试减少此数量(尝试功能数量的30-50%)。这决定了每棵树随机分配的特征数量。越小,越不可能过度拟合,但太小会开始引入拟合不足
- max_depth:对此进行实验。这将降低学习模型的复杂性,降低过度拟合的风险。试着从小处入手,比如说5-10,然后不断增加,你会得到最好的结果
- min_samples_leaf:尝试将其设置为大于1的值。这与max_depth参数有类似的效果,这意味着一旦叶子每个都有那么多样本,分支就会停止分裂
做这项工作时要注意科学性。使用3个数据集:一个训练集、一个单独的"开发"数据集来调整参数,以及一个用最佳参数测试最终模型的测试集。一次只更改一个参数并评估结果。或者使用sklearn网格搜索算法来同时搜索这些参数。
添加此后期注释,以防对其他人有所帮助。
除上述参数(n_estimators
、max_features
、max_depth
和min_samples_leaf
)外,还应考虑设置"min_impurity_drease"。
手动操作很麻烦。因此,使用sklearn.model_selection.GridSearchCV
来测试一系列参数(参数网格),并找到最佳参数。
你可以使用"gini"或"entropy"作为标准,但是,我建议你坚持使用"gini'"作为默认值。在大多数情况下,它们产生相同的结果,但"熵"的计算成本更高。
最大深度效果很好,是阻止树生长的直观方法,然而,节点小于最大深度并不总是意味着它应该分裂。如果从分割中获得的信息仅针对单个/几个错误分类,则分割该节点可能支持过拟合。根据数据集的大小和/或特征空间的大小和复杂性,您可能会觉得这个参数有用,也可能不有用,但在调整参数时值得考虑。