Deciding What to Try Next
当我们已经完成了模型的选择与训练,最后发现对于新的数据集,我们的模型误差很大,我们该怎么办。我们有接下来的一些方法去解决这个问题:
- 获取更多的训练集
- 减少特征数量
- 选择更多的特征
- 增加高次项的特征(x12,x12,x1x2,etc.x_1^{2},x_1^{2},x_1x_2,etc.x12,x12,x1x2,etc.)
- 减少λ\lambdaλ(正则系数)
- 增加λ\lambdaλ(正则系数)
但是这么多选择,我们应该从哪个入手呢,显然随便选择一个方向去尝试是不太明智的,对于实际的机器学习问题,一般调试都是需要很久的,如果方向错误,几个月的时间就浪费了。所以我们需要进行机器学习诊断,需要对我们的机器学习算法进行测试去找到一个最有可能提高我们模型性能的方向。虽然诊断是需要一定时间的,但是确实很好的利用了时间,而且比盲目尝试要来的划算得多。
首先第一步如何评判我们的假设的模型。
Evaluating a Hypothesis
在之前讲到过拟合的时候,我们提到过可能对于训练集来说我们模型的error很低,但是对于新的数据集可能我们error会变高(因为过拟合)。所以我们一般会把我们的数据集在一开始进行划分,70%的数据作为训练集,剩下的30%作为测试集,训练集用来训练模型,测试集用来模拟新数据拟合我们模型的情况。值得提的一点是,如果数据具有某种顺序或者某种规律,最好随机进行数据划分,个人觉得可能原因应该是减少数据之间的相关性。
使用两个数据集的步骤:
- 用训练集,学习Θ\ThetaΘ,降低Jtrain(Θ)J_{train}(\Theta)Jtrain(Θ)
- 计算测试集error Jtest(Θ)J_{test}(\Theta)Jtest(Θ)
test set error
对于线性回归:
Jtest(Θ)=12mtest∑i=1mtest(hΘ(xtest(i))−ytest(i))2J_{test}(\Theta)=\frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\Theta(x_{test}^{(i)})-y_{test}^{(i)})^2Jtest(Θ)=2mtest1i=1∑mtest(hΘ(xtest(i))−ytest(i))2
对于分类来说有两种方法:
- 代价函数
Jtest(Θ)=−1mtest∑i=1mtestytest(i)loghΘ(xtest(i))+(1−ytest(i))(1−loghΘ(xtest(i)))J_{test}(\Theta)=-\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}y_{test}^{(i)}\log h_\Theta(x_{test}^{(i)}) + (1-y_{test}^{(i)})(1-\log h_\Theta(x_{test}^{(i)}))Jtest(Θ)=−mtest1i=1∑mtestytest(i)loghΘ(xtest(i))+(1−ytest(i))(1−loghΘ(xtest(i))) - Misclassification error (0/1 misclassification error)(分类错误率)
err(hΘ(x),y)={1if (hΘ(x)≥0.5 and y=0) or (hΘ(x)<0.5 and y=1)0otherwise err(h_\Theta(x),y)= \begin{cases} 1 & \text{if ($h_\Theta(x)\ge 0.5$ and $y=0$) or ($h_\Theta(x) < 0.5$ and $y=1$)} \\[2ex] 0 & \text{otherwise} \end{cases}err(hΘ(x),y)=⎩⎨⎧10if (hΘ(x)≥0.5 and y=0) or (hΘ(x)<0.5 and y=1)otherwise
Test Error=1mtest∑i=1mtesterr(hΘ(xtest(i)),ytest(i))\text{Test Error} = \frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_\Theta(x_{test}^{(i)}),y_{test}^{(i)})Test Error=mtest1i=1∑mtesterr(hΘ(xtest(i)),ytest(i))
Model Selection
明白怎么评判模型之后,第一步我们就是要验证我们选择的模型是否是最佳的。
假设现在我们要去拟合一个多次方程,那么我们到底应该选择几次方程进行拟合呢,这显然是一个头疼的问题,于是我们使用上面说到的训练集去训练了1到10次方这10个方程。
然后通过测试集给出的error,我们选择使用5次方的模型,那么现在我们要给出模型的泛化能力的指标,但是我们不能直接使用Jtest(Θ(5))J_{test}(\Theta^{(5)})Jtest(Θ(5)),因为我们的测试集已经用来拟合我们的一个隐藏的参数(最高次方项d),所以模型对于这个测试集不再陌生,就相当于我们拿训练集的error去判定了模型的泛化能力,显然这是不对的。为了规避这个问题,我们进一步的对数据集进行划分,添加一个Cross validation set(交叉)验证集,我们将数据集比例,调整为训练集占60%,验证集占20%,测试集占20%。
那么现在我们有了三个数据集,首先使用训练集,训练每个模型参数,然后使用验证集进行测试,选出error最小的模型(模型最高次项为几次方),最后使用测试集给出泛化误差(generalization error)。