转:https://www.zhihu.com/question/267666488/answer/347728105
以下的实验和观点是基于sklearn.svm.SVC,kernel是rbf,数据集用的是iris其中两个class的前两个维度。对于其它类型的svm算法或者不同的kernel,如果结论和这个有差别,以后会补充。
先放结论:对于使用rbf kernel的支持向量机(svm/svc)
- 参数C和gamma都会影响支持向量的数量。参数C越大,支持向量的数量越少。
- 仅凭支持向量的数量,不能很好地说明模型是否存在过拟合(或者欠拟合)的问题。
- 更少的支持向量占用的存储空间更小,预测速度更快。
当 C 逐渐增大的时候,判定边界也越来越复杂,过拟合的风险越来越大,同时支持向量(白色边框的点)的数量越来越少。
分析如下:
首先,保持gamma=0.7(rbf kernel coefficient)不变,设定不同的变量 C(penalty parameter on error term), 结果如下图所示。当 C 逐渐增大的时候,判定边界也越来越复杂,过拟合的风险越来越大,同时,我们也发现支持向量(白色边框的点)的数量越来越少。这是因为当 C 增大时,对于误差的惩罚增大,判定边界趋向于将每一个点都正确地分类,导致支持向量机的margin越来越窄,从而使得能成为支持向量的点的数量越来越少。当然,据此我们并不能得出“支持向量越少,支持向量机就越容易过拟合”的结论,因为支持向量的数量还受gamma的影响。
当 gamma 越来越大时,判定边界也越来越复杂,过拟合的风险越来越大,同时,支持向量(白色边框的点)的数量先减少后增多。
接下来, 我们保持 C=1 不变,设定不同的 gamma,结果如下图所示。我们发现,当 gamma 越来越大时,判定边界也越来越复杂,过拟合的风险越来越大,同时,我们也发现支持向量(白色边框的点)的数量先减少后增多。Scikit learn 对于 gamma 的作用有很好的解释 ,这里我就简单地转述一下:当 gamma 很小时,每一个支持向量的影响范围很大,甚至可以包含整个训练集,从而使得模型受限于每一个数据点,并不能很好的反应数据的复杂性。这样结果就是模型会接近线性(正如前两幅图所示)。当 gamma 很大时,每一个支持向量的影响范围很小,导致 C 并不能很好地实现 regularization 从而无法避免过拟合。
接下来,我们可以从下图更直观的观察 C 和 gamma 对于支持向量数量的影响。结果和前面分析的基本一致:保持 gamma 不变,当 C 增大时,支持向量的数量变小;保持 C 不变,当 gamma 增大时,支持向量的数量先变小再变大。
保持 gamma 不变,当 C 增大时,支持向量的数量变小;保持 C 不变,当 gamma 增大时,支持向量的数量先变小再变大。
那么,支持向量的数量对于支持向量机的表现有什么影响呢?对于上图同样的 C 和 gamma 的gird,我们可以画出下图 validation accuracy。Scikit learn给出的结论是:对于一些适当大小的gamma,当 C 很大时,我们也可以得到相似的支持向量机的表现。所以,通常没有必要限制支持向量的数量,gamma 参数自己就是一个很好的 regularizer。在实际情况里,更少的支持向量占用的存储空间更小,预测速度更快。
对于一些适当大小的gamma,当 C 很大时,我们也可以得到相似的支持向量机的表现。
综上所述,对于使用 rbf kernel 的 svm(svc),我们可以得出的结论是:
- 参数 C 和 gamma 都会影响支持向量的数量。参数 C 越大,支持向量的数量越少。
- 仅凭支持向量的数量,不能很好地说明模型是否存在过拟合(或者欠拟合)的问题。
- 更少的支持向量占用的存储空间更小,预测速度更快。