我有一个包含 140000 个示例和 30 个特征的数据集,我正在为此训练几个分类器以进行二元分类(SVM、Logistic 回归、随机森林等)
在许多情况下,使用网格或随机搜索对整个数据集进行超参数调整的时间成本太高。
我开始使用以下技术
- 子样本我的数据集
- 使用获得的分数来调整超参数
- 使用获得的参数使用整个数据集训练模型
为了评估第二步中的每组参数,我使用sklearn
'sGridSearchCV
和 cv=10。为了评估我在第三步中创建的最终模型,我使用sklearn
's cross_val_predict
。从这个意义上说,我评估我的模型,留下 10% 的数据,我对其余的数据进行训练并测量 10% 的预测准确性,迭代 10 次,然后取分数的平均值。
让我担心的是,我从整个数据集的训练中获得的预测准确度非常接近我在为最佳参数集调整参数时得到的评估(每个测试的参数集输出从平均 10- 获得的分数)折叠交叉验证结果)。
大多数情况下,cross_val_predict
使用所有训练示例(整个数据集)测量的准确度略高于对最佳参数的评估返回的准确度。
为了说明这一点,这里是对一组参数的评估(在比我上面描述的更小的数据集上,但效果是一样的)
Best parameters set found on development set:
{'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
Scores for all sets of parameters
0.851 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.5}
0.852 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.1}
0.829 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.001}
0.853 (+/-0.006) for {'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
...
这是cross_val_predict
我使用最佳参数对整个数据集进行训练时得到的平均分数(来自 )
precision recall f1-score support
0 0.86 0.85 0.86 15417
1 0.86 0.87 0.87 16561
avg / total 0.86 0.86 0.86 31978
acc score: 0.863750078179
roc au score: 0.863370490059
[[13147 2270]
[ 2087 14474]]
如您所见,对整个数据集的训练可以改善结果。我还验证了调整不当的模型(例如,使用 和 的默认值或随机值C
)gamma
会导致更差的预测准确性。
总的来说,我认为在子集上调整超参数并不理想,但可能会导致相对较好的结果,而不必等待太久。例如,在使用该方法之前,我使用optunity
包来调整整个数据集的超参数。这个过程需要 3-5 天才能完成,并且会产生具有非常好的精确度或非常好的召回率但不是两者兼而有之的结果,因此尽管对于每个班级,准确率或召回率都非常高(高于我的任何其他班级)分类器已经达到)f1 测量值非常低。相反,使用后一种方法会导致几个小时的训练和更好的 f1 测量。
我的担忧是:
我会限制我的分类准确性吗?我是否可以通过仅调整子集来避免使用我的数据集可以提供的所有预测能力?如果发生这样的性能损害,它是否受到某种因素的限制?