Python利用SVM构建非线性分类器

1.用SVM构建非线性分类器
SVM为建立非线性分类器提供了许多选项,需要用不同的核函数建立非线性分类器。为了简单,考虑两种情况,当想要表示两种类型数据的曲线边界时,既可以用多项式函数,也可以用径向基函数。

2.步骤如下:
(1)对于第一种情况,可以用一个多项式核函数建立非线性分类器,在同样的Python文件中将params = {‘kernel’:’linear’}替换为params = {‘kernel’:’poly’,‘degree:3’’}。
这就表示我们用了一个三次多项式方程,如果增加方程的次数,就表示可以让曲线更加玩去。但是,曲线越玩去,以为训练要花费的时间越长,因为计算强度越大。
运行之后得到以下结果:
Python利用SVM构建非线性分类器_第1张图片
此外还可以用径向基函数构建非线性分类器:将params部分替换为:
params = {‘kernel’: ‘rbf’}
得出结果如下:
Python利用SVM构建非线性分类器_第2张图片

3.解决数量不平衡问题
已有的数据类型都是在数据点数量比较近的情况下,但是真实世界所给出的数据集较为复杂,比如某类型数据点数量可能会比其他类型多很多,边界线不能反映数据的真实特性,因此需要考虑不同类型数据之间的差异性,并想办法调和,才能保证分类器是不偏不倚的。
(1)加载数据:
加载部分代码参照线性分类器:
Python利用SVM构建非线性分类器_第3张图片
(2)下面用线性核函数建立一个SVm分类器,代码参照之前。
Python利用SVM构建非线性分类器_第4张图片
从上图可以看出没有边界线,其实是因为分类器不能区分两种类型,导致class_0的准确性是0%,分类报告如下:
Python利用SVM构建非线性分类器_第5张图片
(3)解决问题
将params部分替换,添加class_weight 参数,并统计不同类型数据点的数量,调整权重,让类型不平衡问题不影响分类效果。
即:

params = {
    'kernel': 'linear'}

替换为:params = {'kernel': 'poly','degree':5}
即使用多项式核函数建立分类器,这样之后的结果明显能够看到分类的效果得到了提升。
Python利用SVM构建非线性分类器_第6张图片

你可能感兴趣的:(Python利用SVM构建非线性分类器)