svm的分类
根据数据可分的情况,svm分为3种:
- 线性可分支持向量机(没有噪音和异常数据,分隔超平面可以在训练数据集做到100%准确)
- 线性支持向量机(有噪音和异常数据,分隔超平面无法在训练数据集做到100%准确)
- 非线性支持向量机(数据集不是线性可分的,必须借助升维)
上面三种svm由简到繁,其实所有的svm都可以可以统一写为带核函数的推理形式。前两种情况下可以选择不用核函数(也叫线性核函数),最后一种情况下可以选择高斯核、多项式核等核函数
常用的核函数
最终,所有的数据分布情况都可以使用带核函数的形式来做前向预测:
- 线性核:没有核函数,也就相当于线性核函数。
- 多项式核函数
- 高斯核函数
在sklearn里面,这三个核函数需要不同的超参。
共同需要的超参是C,惩罚系数
clf_linear = svm.SVC(C=1.0, kernel='linear')
clf_poly = svm.SVC(C=1.0, kernel='poly', degree=3)
clf_rbf = svm.SVC(C=1.0, kernel='rbf', gamma=0.5)
degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
coef0 :核函数的常数项,默认为0。对于‘poly’和 ‘sigmoid’有用。
怎么选择核函数
以下内容整理自吴恩达的视频课程。
当特征很多,样例很少的时候(n很大,m很小),使用核函数容易过拟合,此时经常选择线性核函数。
在使用核函数之前,最好将特征缩放到相同的范围内。否则训练的效果会很差。
n代表特征数量,m代表样本数量
如果n相对m大很多,建议使用逻辑回归或者svm线性核。否则容易过拟合
如果n很小,m比它大,但是大的不是特别多(1000比10000这种),建议使用高斯核
如果m相对n大很多,建议创造一些新特征,然后使用逻辑回归或者使用线性核svm。因为此时高斯核运算会很慢。
另外,神经网络可以在大部分场景下都工作的很好,但是训练起来会很慢