关于不平衡问题:
当需要关注特定的某一类或特定的样本时,可以使用class_weight和sample_weight参数进行设置:
实际使用中的一些建议:
1.避免数据复制
对于SVC、SVR、NuSVC、NuSVR,如果传递给模型的参数不是C-ordered contiguous(见附录链接)的,并且是双精度型的数,在调用底层的C程序实现模型之前,将需要对数据进行复制。可以通过numpy array变量的flags属性来查看数据是否为C-contiguous的。
对于LinearSVC以及LogisticRegression,任何以numpy array形式传入的参数都将被复制并转换为线性内部稀疏数据形式(liblinear internalsparse data,双精度浮点数,且包含int32型的非零索引)。如果想避免对密集(dense)numpy C-contiguous双精度矩阵输入进行复制的情况下,拟合较大规模的线性分类器,建议使用SGDClassifier代替,该方法的目标函数可以配置的和LinearSVC模型几乎一致。
2. 内核缓存大小
对于SVC、SVR、nuSVC以及NuSVR,内核缓存的大小对运行时间的影响较大。如果RAM足够大,强烈建议将catch_size设置的比默认的200M大一些,比如500M或1000M。
3. C的设置
默认情况下,C的值为1。如果观测数据中噪声较多的话,应该适当的减小C值,相应的来规范化跟多的估计值
4. 规范化数据
支持向量机算法不能对变量进行尺度缩放,所以建议在进行建模前,对所使用的数据进行缩放,例如,将输入向量X中的每个特征都缩放到[0,1]或[-1,+1],或标准化为均值为0、方差为1。需要注意的是,必须对测试集进行同样的处理,以保证得到有意义的结果。更多关于数据预处理的内容参见附录3。
5. 参数nu
NuSVC、OneClassSVM、NuSVR中的nu参数是近似训练误差和支持向量间的比例的(fraction),即训练误差部分的上限和支持向量部分的下限,取值范围为(0, 1]。
6. 数据平衡
在SVC中,如果两类样本不平衡,可以设置class_weight='balanced',或者尝试不同的惩罚系数C。
7. 关于LinearSVC
LinearSVC的底层实现拟合模型的过程中,使用了随机数生成器来选择特征因此,对于相同的输入数据,得到的结果也可能会存在细微的差别,如果出现这种情况,可以适当的减小tol参数
8. 使用L1惩罚
参考资料:
1.http://scikit-learn.org/stable/modules/svm.html#svm
3.http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing