2.5 调优(tuning)
2.5.1&2.5.2 模型选择(超参数调整)与调优
分类器模型通常在特定的数据上进行训练,由于所得模型可能存在过拟合的现象。因此,模型训练完成之后通常需要进行检验,以验证分类模型在未知数据集上的预测能力,即我们通常所说的“模型泛化”能力。
交叉检验(Cross Validation):
交叉验证是用来验证分类器的性能的一种统计分析方法,基本思想是把在某种意义下降原始数据(dataSet)进行分组,一部分作为训练集(trainSet),另一部分作为验证集(validationSet),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来作为评价分类器的性能指标。
简单交叉检验:
随机将S分为Strain(例如70%的样本)和SCV(剩下30%的样本):
- 在Strain上训练每个模型Mi,得到相应的假设函数hi;
- 将每个假设函数通过交叉验证集SCV进行验证,选择使得训练误差
最小的hi;
- 通过简单交叉验证,可以得到每个假设函数hi的真实的泛化误差,从而可以选择泛化误差最小的那个假设函数。
通常,预留1/4-1/3的样本作为交叉验证集,而剩下的作为训练集使用。
K折交叉检验(K-CV(K-fold Cross Validation)):
k-折交叉验证将样本集随机划分为k份,k-1份作为训练集,1份作为验证集,依次轮换训练集和验证集k次,验证误差最小的模型为所求模型。具体方法如下:
- 随机将样本集S划分成k个不相交的子集,每个子集中样本数量为m/k个,这些子集分别记作
;
- 对于每个模型Mi,进行如下操作:
for j=1 to k将 作为训练集,训练模型Mi,得到相应的假设函数hij。再将作为验证集,计算泛化误差;
- 计算每个模型的平均泛化误差,选择泛化误差最小的模型Mi。
MLlib实现方式:
CrossValidator开始的时候会将数据分割成很多测试集和训练集对儿。例如,k=3folds,crossValidator将会产生三组(training,test)数据集对儿,没对都是2/3用来训练,1/3用来测试。为了评估出一个组特殊的paramMap,crossValidator 会计算通过Estimator在三组不同数据集上调用fit产生的3个模型的平均评估指标。
确定最佳ParamMap后,CrossValidator最后使用最佳ParamMap和整个数据集重新拟合Estimator。
训练验证分解(Train Validation Split):
MLlib实现方式:
除了CrossValidator,spark还提供了TrainValidationSplit用于超参数的调整。TrainValidationSplit只对一次参数的每个组合进行一次评估,与CrossValidator的k词调整相对。真就意味着代价相对少了一些,当训练集不是很大的时候,将不会产生一个可靠的结果。
不像CrossValidator,TrainValidationSplit产生一个(training,test)数据集对。通过使用trainRatio参数将数据集分割成两个部分。例如,trainRatio=0.75, TrainValidationSplit将会产生一个训练集和一个测试集,其中75%数据用来训练,25%数据用来验证。
和CrossValidator一样, TrainValidationSplit在最后会使用最佳的参数和整个数据集对Estimator进行拟合。