一、学习SVC()类的主要参数和属性
1、svm.SVC类的主要参数含义
参数 | 含义 |
C | 浮点数,默认为1.0,表示误差项惩罚参数。C越小对误分类的惩罚越小,决策平面越光滑;C越大对误分类的惩罚越大,越倾向于精确地分类。 |
kernel | 字符串,默认rbf,是‘linear’,‘poly’,‘rbf’,‘sigmoid’中的一个,表示核函数的类型。 |
degree | 整数,默认为3,表示多项式核函数(‘poly’)的次数。 |
gamma | 浮点数,默认为auto,表示'rbf','poly','sigmoid'核函数的系数,auto表示1/n_features。 |
2、svm.SVC类的属性
参数 | 含义 |
support_ | 返回形状为[n_SV]的数组,表示支持向量的索引 |
support_vectors_ | 返回形状为[n_SV,n_features]的数组,表示支持向量 |
n_support_ | 返回形状为[n_class]的数组,表示每个类的支持向量数量 |
dual_coef_ | 返回形状为[n_class-1,n_SV]的数组,表示决策函数中支持向量的系数 |
coef_ | 返回形状为[n_class*(n_class-1)/2,n_features]的数组,表示特征(原始问题的系数)权重,仅在使用线性核时有效 |
intercept_ | 返回形状为[n_class*(n_class-1)/2]的数组,表示决策函数中的常数 |
3、实例——支持向量机二元分类
二维平面上的两个点:(-1,0)作为类别0,(1,0)作为类别1,将这两个点作为训练集来训练支持向量机,使用训练的模型对新的样本进行预测,观察模型参数和训练过的模型参数,此处是选择核函数linear来训练模型的。
(1)观察模型参数
import numpy as np
from sklearn import svm
x_train=[[-1,0],[1,0]]
y_train=[0,1]
clf=svm.SVC(kernel='linear',gamma=2)
clf.fit(x_train,y_train)
print('支持向量机模型训练参数为:\n',clf)
(2)使用predict()对新值进行预测
print('[-0.5,0]的类别为:',clf.predict([[-0.5,0]]))
print('[0.5,0]的类别为:',clf.predict([[0.5,0]]))
(3)查看SVC()类的属性
print('支持向量机在训练中的索引为:',clf.support_)
print('支持向量为:\n',clf.support_vectors_)
print('每个类的支持向量的数量为:',clf.n_support_)
print('支持向量机决策函数中支持向量的系数为:',clf.dual_coef_)
print('支持向量机的特征权重[线性核时的]为:',clf.coef_)
print('决策函数中的常数为:',clf.intercept_)
二、使用SVC()训练二元类别数据集的支持向量机
使用样本生成器make_blobs()生成二元分类样本,选择核函数linear训练SVM模型,对两类样本进行分类,设置为100个样本的二元分类问题、指定类别中心位置为(-2,0),(2,0),使用fit()方法对数据集拟合支持向量机分类模型,观察支持向量的属性并预测新的样本类别,可视化原始数据、拟合的分类超平面支持向量、分类超平面及等高线,其中decision_function()的方法可用来计算样本到分类超平面的距离。
(1)训练支持向量机并观察其属性
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import svm
from sklearn.datasets.samples_generator import make_blobs
centers=([(-2,0),(2,2)]) # 设置的中心位置
x,y=make_blobs(n_samples=100,centers=centers,n_features=2,random_state=0) # 生成100个样本数,二元
clf=svm.SVC(kernel='linear',gamma=2) # 使用核函数linear
clf.fit(x,y)
print('支持向量在训练集中的索引为:',clf.support_)
print('支持向量为:\n',clf.support_vectors_)
print('每个类的支持向量的数量为:',clf.n_support_)
我们可以看到,支持向量只有5个,两个类中支持向量的数量分别为3和2。
(2)可视化
plt.figure(figsize=(6,4))
plt.rc('font',size=14)
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
plt.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=80,
facecolors='none',zorder=10,edgecolors='k')
plt.scatter(x[:,0],x[:,1],c=y,marker='*',zorder=10,cmap=plt.cm.Paired,edgecolors='k')
plt.legend(['支持向量','原始数据'])
x_min,x_max=np.min(x[:,0])-1,np.max(x[:,0])+1
y_min,y_max=np.min(x[:,1])-1,np.max(x[:,1])+1
XX,YY=np.mgrid[x_min:x_max:200j,y_min:y_max:200j] # 返回两个形状同为(200,200)的数组
Z=clf.decision_function(np.c_[XX.ravel(),YY.ravel()])
Z=Z.reshape(XX.shape)
plt.pcolormesh(XX,YY,Z>0,cmap=plt.cm.Paired)
plt.contour(XX,YY,Z,colors=['k','r','k'],linestyles=['--','-','--'],levels=[-.5,0,.5])
plt.xlim(x_min,x_max)
plt.ylim(y_min,y_max)
plt.title('支持向量机分类结果')
plt.show()
由图可知,拟合的最优分类超平面有5个支持向量,其中一个类别有3个支持向量,另一类别有2个支持向量;其中x_min:x_max:200j表示在[x_min,x_max]区间(包含x_min,x_max)的200个间隔相等的点。
(3)新值的预测
print('(2,2)属于的类别为:',clf.predict([[2,2]]))
print('(-2,2)属于的类别为:',clf.predict([[-2,2]]))