我有一个包含140000个示例和30个功能的数据集,我正在为其训练几个分类器以进行二进制分类(SVM,逻辑回归,随机森林等)
在许多情况下,使用网格搜索或随机搜索对整个数据集进行超参数调整在时间上过于昂贵。
我开始使用以下技术
- 子样本我的数据集
- 使用获得的分数来调整超参数
- 使用获得的参数来使用整个数据集训练模型
为了评估在第二步骤I使用每组参数sklearn
的GridSearchCV
与CV = 10。为了评估在第三步中创建的最终模型,我使用sklearn
的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测量。
我担心的是:
我会限制分类的准确性吗?我是否仅通过对子集进行调整来避免使用数据集可以提供的所有预测能力?如果发生这种性能损害,是否会受到某种因素的限制?