2.5调优(tuning)

2.5 调优(tuning)

2.5.1&2.5.2 模型选择(超参数调整)与调优

分类器模型通常在特定的数据上进行训练,由于所得模型可能存在过拟合的现象。因此,模型训练完成之后通常需要进行检验,以验证分类模型在未知数据集上的预测能力,即我们通常所说的“模型泛化”能力。

交叉检验(Cross Validation):

交叉验证是用来验证分类器的性能的一种统计分析方法,基本思想是把在某种意义下降原始数据(dataSet)进行分组,一部分作为训练集(trainSet),另一部分作为验证集(validationSet),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来作为评价分类器的性能指标。

简单交叉检验:

随机将S分为Strain(例如70%的样本)和SCV(剩下30%的样本):

  1. 在Strain上训练每个模型Mi,得到相应的假设函数hi;
  2. 将每个假设函数通过交叉验证集SCV进行验证,选择使得训练误差http://latex.codecogs.com/gif.latex?%5Chat%7B%5Cvarepsilon%7D_%7BS_%7Bcv%7D%7D%28h_i%29 最小的hi;
  3. 通过简单交叉验证,可以得到每个假设函数hi的真实的泛化误差,从而可以选择泛化误差最小的那个假设函数。

通常,预留1/4-1/3的样本作为交叉验证集,而剩下的作为训练集使用。

K折交叉检验(K-CV(K-fold Cross Validation)):

k-折交叉验证将样本集随机划分为k份,k-1份作为训练集,1份作为验证集,依次轮换训练集和验证集k次,验证误差最小的模型为所求模型。具体方法如下:

  1. 随机将样本集S划分成k个不相交的子集,每个子集中样本数量为m/k个,这些子集分别记作http://latex.codecogs.com/gif.latex?S_1,...,S_k
  2. 对于每个模型Mi,进行如下操作:

for j=1 to k将http://latex.codecogs.com/gif.latex?S_1%5Ccup...%5Ccup&space;S_%7Bj-1%7D%5Ccup&space;S_%7Bj+1%7D%5Ccup...%5Ccup&space;S_k 作为训练集,训练模型Mi,得到相应的假设函数hij。再将作为验证集,计算泛化误差;

  1. 计算每个模型的平均泛化误差,选择泛化误差最小的模型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进行拟合。

 

返回主目录(Spark MLlib算法思想总结)

 

2.5调优(tuning)_第1张图片

你可能感兴趣的:(Spark)