支持向量机
- 说明
- 支持向量机
- 示例
- python代码
说明
,随后求出权重和截距,最终求得决策边界。
支持向量机
在scikit-learn中SVC实现了支持向量机模型,可以用于二分类也可以用于多分类,支持线性和非线性,是比较常用到,对于大数据量的样本并不实用,并其原型为:
class sklearn.svm.SVC(*, C=1.0, kernel='rbf', degree=3,
gamma='scale', coef0=0.0, shrinking=True, probability=False,
tol=0.001, cache_size=200, class_weight=None, verbose=False,
max_iter=- 1, decision_function_shape='ovr', break_ties=False,
random_state=None)
参数
❐ C:浮点型,容错值,如果C越大,意味着对分类要求越严格。
❐ kernel:默认值为rbf,选择核函数
- ‘linear’:线性核。
- ‘poly’:多项式核
- ‘rbf’:高斯核函数
- ‘sigmoid’:
- ‘precomputed’:提供一个可调用对象,它被用来从数据矩阵中预先计算核矩阵(n_samples, n_samples)
- 注:为gamma参数,为coef0参数
❐ degree:一个整数,当kernel=‘rbf’时可以被使用,表示多项式的次数。
❐ gamma:默认为‘scale’,核函数系数,当kernel为‘poly’、‘rbf’、‘sigmoid’时。
- ‘scale’:其值为
- ‘auto’:其值为
❐ coef0:浮点型,默认为0.0,核函数的自由项,只有在kernel为‘poly’、‘sigmoid’时才有意义。
❐ shrinking:布尔值,默认为True,如果为True,则使用启发式收缩,这样在迭代次数比较大的情况下,可以缩短迭代时间。
❐ probability:布尔值,默认为True,如果为True,则启动概率估计功能,必须在模型训练之前设置,因为训练时会使用5折交叉验证,会延长训练时长。
❐ tol:浮点数,默认为1e-3,指定迭代的阈值。
❐ cache_size:浮点数,默认为200,单位MB,指定核函数cache大小。
❐ class_weight:字典或者字符串 ‘balanced’,默认为None,指定权重。
- ‘None’:如果未给出,则权重为1
- ‘字典’:如果是字典,则指定每个类的权重
- ‘balanced’:如果是字符串balanced,每个类的权重是它类频率的反比,
❐ verbose:布尔值,默认为False,如果为True,启动verbose输出,不能在多线程环境中运行。
❐ max_iter:整数,默认为-1,指定最大迭代次数。
❐ decision_function_shape:字符串,默认’ovr’,指定决策函数的形状。
- ‘ovo’:使用one-vs-one (‘ovo’)准则,决策函数形状 ,每个分类定义了一个二分类SVM,由n_classes个二分类SVM组成一个多分类SVM
- ‘ovr’:使用one-vs-rest(‘ovr’)准则,决策函数形状 ,每个分类定义了一个二分类SVM,由n_classes个二分类SVM组成一个多分类SVM
❐ break_ties:布尔值,默认为False,如果为True,决策准则为’ovr’且类别数量大于2,则决策函数的置信度将被打破。
❐ random_state:一个帧数或者一个RandomState实例或者为None,默认为None。
- 如果是整数:它指定了随机数生成器的种子。
- 如果是RandomState:指定了一个随机数生成器。
- 如果是None:使用默认的随机数生成器。
属性
❐ class_weight:一个数组,形状为[n_classes],类别权重。
❐ classes_:一个数组,形状为[n_classes],分类的标签值。
❐ coef_:一个数组,形状为[n_classes*(n_classes-1)/2,n_classes],每个特征的系数,只有在线性核中有效。
❐ dual_coef_:形状为[n_classes-1,n_SV],对偶问题中,在分类决策函数中每个支持向量机的系数。
❐ fit_status_:一个整数,0表示正确拟合,否则为1。
❐ intercept_:一个数组,形状为[n_classes*(n_classes-1)/2,],决策函数中的常数项。
❐ support_:一个数组[n_SV],支持向量的下标。
❐ support_vectors_:一个数组[n_SV,n_features],支持向量。
❐ n_support_:一个数组[n_classes],每个分类的支持向量机的个数。
❐ probA_:一个数组,形状为[n_classes*(n_classes-1)/2]
❐ probB_:一个数组,形状为[n_classes*(n_classes-1)/2]
- 如果参数probability为False,则probA_和probB_的值为空,如果probability为True,进行概率估计。
❐ shape_fit_:一个维度元组,显示训练数据的维度。
实例方法
❐ decision_function(X):预测样本的置信分数。
❐ fit(X,y):训练模型。
❐ get_params([deep]):获取模型参数信息。
❐ predict(X):用模型进行预测,返回预测值。
❐ score(X, y[, sample_weight]):返回模型的预测性能得分。
❐ set_params(**params):设置模型参数。
示例
import matplotlib
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
from sklearn import datasets
from sklearn.svm import SVC
import pandas as pd
import numpy as np
读取数据
data = datasets.load_iris().data
target = datasets.load_iris().target
# 这里只取两个特征,两个类别便于画图
X = data[:,(2,3)]
X0 = np.insert(X,2,values=target,axis=1)
dataset = pd.DataFrame(X0,columns=['x0','x1','y'])
dataset = dataset[dataset['y']!=2]
# 训练预测
clf = SVC(kernel='linear',C=float('inf'),probability=True)
clf.fit(dataset[['x0','x1']],dataset['y'])
clf_pred = clf.predict(dataset[['x0','x1']])
# 输出参数
x0 = np.linspace(0, 5.5, 200)
w = clf.coef_[0]
b = clf.intercept_[0]
boundry_line = -b/w[1] -w[0]/w[1]*x0
support = clf.support_vectors_
# 边界
margine = 1/w[1]
margine_high = boundry_line + margine
margine_low = boundry_line - margine
# 画图
plt.figure(figsize=(8,5))
plt.xlim(0,5)
plt.ylim(0,2)
plt.plot(dataset['x0'][dataset['y']==0],dataset['x1'][dataset['y']==0],'ro')
plt.plot(dataset['x0'][dataset['y']==1],dataset['x1'][dataset['y']==1],'bo')
plt.plot(x0,boundry_line,'b',linewidth=2)
plt.plot(x0,margine_high,'b--',linewidth=2)
plt.plot(x0,margine_low,'b--',linewidth=2)
plt.scatter(support[:,0],support[:,1],s=180,facecolors='#7f7f7f')
plt.show()
python代码
git地址:https://github.com/lingxiaaisuixin/MarchineLearning/tree/master/SVM