机器学习之模型选择(交叉验证)

来源:互联网 发布:mysql死锁解决方法 编辑:程序博客网 时间:2024/04/29 11:00

问题

  • 模型选择问题:对于一个学习问题,可以有多种模型选择。比如要拟合一组样本点,可以使用线性回归,也可以用多项式回归。那么使用哪种模型好呢(能够在偏差和方差之间达到平衡最优)?
  • 还有一类参数选择问题:如果我们想使用带权值的回归模型,那么怎么选择权重w 公式里的参数τ?
  • 形式化定义:假设可选的模型集合是Μ = {M1, M2, … , Md },比如我们想分类,那么SVM、logistic回归、神经网络等模型都包含在M 中。

交叉验证(Cross validation)

  • 我们的第一个任务就是要从M 中选择最好的模型。
  • 假设训练集使用S 来表示
  • 如果我们想使用经验风险最小化来度量模型的好坏,那么我们可以这样来选择模型:
1、 使用S 来训练每一个Mi,训练出参数后,也就可以得到假设函数hi。(比如,线性模型中得到w后,也就得到了假设函数ℎ(w).2、 选择错误率最小的假设函数。
  • 遗憾的是这个算法不可行,比如我们需要拟合一些样本点,使用高阶的多项式回归肯定比线性回归错误率要小,偏差小,但是方差却很大,会过度拟合。因此,我们改进算法如下:
 1、 从全部的训练数据S 中随机选择70%的样例作为训练集strain,剩余的30%作为测试集scv。2、 在strain上训练每一个Mi,得到假设函数hi。3、 在scv上测试每一个hi,得到相应的经验错误E^scv(hi).4、 选择具有最小经验错误E^scv(hi)的hi作为最佳模型。
  • 这种方法称为hold-out cross validation 或者称为简单交叉验证。
  • 由于测试集是和训练集中是两个世界的,因此我们可以认为这里的经验错误E^scv(hi)接近于泛化错误(generalization error)。这里测试集的比例一般占全部数据1/4-1/3。30%是典型值。
  • 还可以对模型作改进,当选出最佳的模型Mi后,再在全部数据S上做一次训练,显然
    训练数据越多,模型参数越准确。
  • 简单交叉验证方法的弱点在于得到的最佳模型是在70%的训练数据上选出来的,不代表在全部训练数据上是最佳的。还有当训练数据本来就很少时,再分出测试集后,训练数据就太少了。
  • 我们对简单交叉验证方法再做一次改进,如下:
1、 将全部训练集S分成k个不相交的子集,假设S中的训练样例个数为m,那么每一个子集有m/k个训练样例,相应的子集称作{S1, S2, … , Sk}2、 每次从模型集合M中拿出来一个Mi,然后在训练子集中选择出k-1{S1, S2, Sj-1, Sj+1, … , Sk}(也就是每次只留下一个Sj),使用这k-1 个子集训练Mi后,得到假设函数hij。最后使用剩下的一份Sj作测试,得到经验错误E^Sj(hij).3、由于我们每次留下一个Sj(j 从1 到k),因此会得到k 个经验错误,那么对于一个Mi,它的经验错误是这k 个经验错误的平均。4、 选出平均经验错误率最小的Mi,然后使用全部的S 再做一次训练,得到最后的hi。
  • 这个方法称为k-fold cross validation(k-折叠交叉验证)。说白了,这个方法就是将简单交叉验证的测试集改为1/k,每个模型训练k 次,测试k次,错误率为k 次的平均。一般讲k 取值为10。这样数据稀疏时基本上也能进行。显然,缺点就是训练和测试次数过多。
  • 极端情况下,k 可以取值为m,意味着每次留一个样例做测试,这个称为leave-one-out cross validation。
  • 如果我们发明了一种新的学习模型或者算法,那么可以使用交叉验证来对模型进行评价。
0 0