机器学习——支持向量机

这篇具有很好参考价值的文章主要介绍了机器学习——支持向量机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【说明】文章内容来自《机器学习——基于sklearn》,用于学习记录。若有争议联系删除。

1、简介

        支持向量机(support vector machine,SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面(maximum-marginhyperplane)。与逻辑回归和神经网络相比,支持向量机在学习复杂的非线性方程时提供了一种更清晰、更强大的方式。

1.1 算法思想

        支持向量机(Support Vector Machine,SVM)的基本思想是在N维数据找到N-1维的超平面(hyperplane)作为分类的决策边界。确定超平面的规则是:找到离超平面最近的那些点,使它们与超平面的距离尽可能远。在图中,离超平面最近的实心点和空心点称为支持向量,超平面两侧的支持向量与超平面的距离之和称为间隔距离,即图中的2/Ilwll。间隔距离越大,分类的准确率越高。在图中,两条虚线称为决策边界。

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python
        超平面可以用如下的线性方程来描述:

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python
其中,w是超平面的法向量,定义了垂直于超平面的方向,b用于平移超平面。
        支持向量机之所以成为目前最常用、效果最好的分类器之一,在小样本训练集上能够得到比其他算法更好的结果,原因就在于其优秀的泛化能力。但是,如果数据量很大(如垃圾邮件的分类检测),支持向量机的训练时间就会比较长。

1.2 支持向量机算法库

        Sklearn 中支持向量机的算法库分为两类:一类是分类算法库,包括SVC、NuSVC和LinearSVC;另一类是回归算法库,包括svm、LinearSVR、svm.NuSVR、svm.SVR
        在 SVC.NuSVC和 LinearSVC这3个分类算法库中,SVC和 NuSVC 差不多,区别仅在于两者对损失的度量方式不同;而LinearSVC 只用于线性分类,不支持各种从低维到高维的核函数,仅支持线性核函数,对线性不可分的数据不能使用。

2、核函数

        核函数用于将非线性问题转化为线性问题。通过特征变换增加新的特征,使得低维空间中的线性不可分问题变为高维空间中的线性可分问题,进行升维变换。
SVC的语法如下:

SVC(kernel)

        参数 kernel的取值有rbf、linear、 poly,代表不同的核函数。默认的rbf 代表径向基核函数(高斯核函数),linear 代表线性核函数,poly 代表多项式核函数。

2.1 径向基核函数

        径向基核函数通过高斯分布函数衡量样本之间的相似度,进而使样本线性可分。径向基核函数的kernel参数取值为rbf,格式如下:

SVC(kernel='rbf', C)

 示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
#先创建50个数据点,将它们分为两类
x, y = make_blobs(n_samples = 50, centers = 2, random_state = 6)
#创建径向基核的支持向量机模型
clf_rbf = svm.SVC(kernel = 'rbf', C = 1000)
clf_rbf.fit(x, y)
#画数据点
plt.scatter(x[:,0], x[:,1], c= y, s = 30, cmap = plt.cm.Paired)
#建立图像坐标
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], ylim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf_rbf.decision_function(xy).reshape(XX.shape)
#把分类的决定边界画出来
ax.contour(XX, YY, Z, colors = 'k', levels = [-1, 0, 1], alpha = 0.5, linestyles = ['--', '-', '--'])
ax.scatter(clf_rbf.support_vectors_[:, 0], clf_rbf.support_vectors_[:, 1], s = 100, linewidth = 1, facecolors = 'none')
plt.show()

【运行结果】

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python

2.2 线性核函数

        线性核函数(linear kernel)不通过核函数进行维度提升,仅在原始维度空间中寻求线性分类边界。线性核函数的kernel参数取值为linear,格式如下:

SVC(kernel='linear', C)

        参数C为惩罚系数,用来控制损失函数的惩罚系数,类似于线性回归中的正则化系数。
C值越大,对误分类的惩罚越重,这样会使训练集在测试时准确率很高,但泛化能力弱,容易导致过拟合;C值越小,对误分类的惩罚越轻,容错能力和泛化能力强,但容易导致欠拟合。

线性核函数示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
#先创建50个数据点,让它们分为两类
X, y = make_blobs(n_samples = 50, centers = 2, random_state = 6)
#创建一个线性核的支持向量机面模型
clf = svm.SVC(kernel= 'linear', C = 1000)
clf.fit(X,y)
#把数据点画出来
plt.scatter(X[:, 0], X[:, 1], c = y, s = 30, cmap = plt.cm.Paired)
#建立图像坐标
ax = plt.gca()#获取坐标轴信息
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)# meshgrid在二维平面将每一个x和每一个y分别对应起来,编织成栅格
xy = np.vstack([XX.ravel(), YY.ravel()]).T#ravel()将数组维度拉成一维数组,np.vstack在竖直方向上堆叠
z = clf.decision_function(xy).reshape(XX.shape)
#把分类的决策边界画出来contour绘制等高线函数
ax.contour(XX, YY, z, colors = 'k', levels = [-1,0,1], alpha = 0.5, linestyles = ['--','-','--'])
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s = 100, linewidth = 1, facecolors = 'none')
plt.show()

【运行结果】

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python

2.3 多项式核函数

        多项式核函数通过多项式函数增加原始样本特征的高次幂,把样本特征投射到高位空间。多项式核函数的kernel参数取值为ploy。格式如下:

SVC(kernel = 'ploy', degree = 3)

参数degree表示选择的多项式的最高幂次,默认为三次多项式。

from sklearn.svm import SVC
import numpy as np
X = np.array([[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[3,1],[4,1],[5,1],[5,2],[6,1],[6,2],[6,3],[6,4],[3,3],[3,4]
             ,[3,5],[4,3],[4,4],[4,5]])
Y = np.array([1] * 14 + [-1] * 6)
T = np.array([[0.5, 0.5], [1.5, 1.5], [3.5, 3.5], [4, 5.5]])
#X 为训练样本, Y为训练样本标签(1 和-1), T为测试样本
svc = SVC(kernel = 'poly', degree = 2, gamma = 1, coef0 = 0)
svc.fit(X, Y)
pre = svc.predict(T)
print('预测结果\n', pre)
print('正类和负类支持向量总个数:\n',svc.n_support_)
print("正类和负类支持向量索引:\n", svc.support_)
print("正类和负类支持向量:\n", svc.support_vectors_)

【运行结果】

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python

3、参数调优

3.1 gamma参数

        gamma用于控制核函数的影响范围,主要适用于使用径向基函数(RBF)或多项式核函数(Poly)。

        对于RBF核函数,gamma参数定义了单个训练样本对模型的影响范围。较小的gamma值表示影响范围较大,样本之间的距离相对较远的特征也可能被考虑进来,从而使决策边界更加平滑。较大的gamma值表示影响范围较小,模型将更加关注每个训练样本的局部区域,可能会导致决策边界更加复杂和详细。

        对于Poly核函数,gamma参数定义了特征空间中特征的相似度。较小的gamma值表示特征之间的相似度较高,从而产生更平滑的决策边界。较大的gamma值表示特征之间的相似度较低,可能导致更复杂的决策边界。

import sklearn.svm as svm
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
import numpy as np
def make_meshgrid(x, y, h = .02):
    x_min, x_max = x.min() - 1, x.max() + 1
    y_min, y_max = y.min() - 1, y.max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    return xx, yy
def plot_contours(ax, clf, xx, yy, **params):
    z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    z = z.reshape(xx.shape)
    out = ax.contourf(xx, yy, z, **params)
#使用酒的数据集
wine = load_wine()
#选取数据集的前两个特征
X = wine.data[:,:2]
y = wine.target
C = 1.0
models = (svm.SVC(kernel = 'rbf', gamma = 0.1, C = C),
         svm.SVC(kernel = 'rbf', gamma = 1,  C = C),
         svm.SVC(kernel = 'rbf', gamma = 10,  C = C))
models = (clf.fit(X, y) for clf in models)
titles = ('gamma = 0.1','gamma = 1', 'gamma = 10')
fig, sub = plt.subplots(1, 3, figsize = (10, 3))
#plt.subplots_adjust(wspace = 0.8, hspace = 0.2)
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)
for clf, title, ax in zip(models, titles, sub.flatten()):
    plot_contours(ax, clf, xx, yy, cmap = plt.cm.plasma, alpha = 0.8)
    ax.scatter(X0, X1, c = y, cmap = plt.cm.plasma, s = 20, edgecolors = 'k')
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xlabel("Feature 0")
    ax.set_ylabel('Feature 1')
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_title(title)
plt.show()
# 参数gamma分别取值为0.1.1和10。
# gamma值越小,径向基核直径越大,进入支持向量机的决策边界中的数据越多,决策边界越平滑,模型越简单;
# gamma值越大,支持向量机越倾向于把尽可能多的数据放到决策边界中,模型的复杂度越高。
# 所以,gamma值越小,模型越倾向于欠拟合;gamma值越大,模型倾向于过拟合。

【运行结果】

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python

3.2 惩罚系数C

        C是惩罚系数,即对误差的宽容度,用于调节优化方向中的两个指标(间隔大小和分类准确度)的权重,表示对分错数据的惩罚力度。
        当C较大时,分错的数据就会较少,但是过拟合的情况会比较严重;
        当C较小时,容易出现欠拟合的情况。
        C越大,训练的迭代次数越大,训练时间越长。

from sklearn import datasets
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
x = iris.data[:,:2]
y = iris.target
param_grid = {'gamma': [0.001, 0.01, 0.1, 1, 10, 100], 'C': [0.001, 0.01, 0.1, 1, 10, 100]}
print("Parameters:{}".format(param_grid))
grid_search = GridSearchCV(SVC(), param_grid, cv = 5)
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state = 10)
grid_search.fit(x_train, y_train)
print("test set score:{:.2f}".format(grid_search.score(x_test, y_test)))
print('Best parameters:{}'.format(grid_search.best_params_))
print('Best score om train set:{:.2f}'.format(grid_search.best_score_))
print('Best estimator:',grid_search.best_estimator_)
print('Best score:',grid_search.best_score_)

【运行结果】

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python

4、回归问题

        支持向量机分类方法能推广到回归问题,称为支持向量回归。支持向量回归有3个版本:SVR、NuSVR和LinearSVR。

import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
#产生样本数据
x = np.sort(5*np.random.rand(40, 1), axis = 0)
y = np.sin(x).ravel()
#在目标值中增加噪声数据
y[::5] += 3*(0.5 -np.random.rand(8))
#估计器
svr_rbf = SVR(kernel = 'rbf', C = 1e3, gamma = 0.1)#径向基核函数
svr_lin = SVR(kernel = 'linear', C = 1e3)#线性核函数
svr_poly = SVR(kernel = 'poly', C = 1e3, degree = 2)#多项式核函数
y_rbf = svr_rbf.fit(x, y).predict(x)
y_lin = svr_lin.fit(x, y).predict(x)
y_poly = svr_poly.fit(x, y).predict(x)
lw = 2
plt.scatter(x, y, color = 'darkorange', label = 'data')
plt.plot(x, y_rbf, color = 'navy', lw = lw, label = 'RBF model')
plt.plot(x, y_lin, color = 'c', lw = lw, label = 'Linear model')
plt.plot(x, y_poly, color = 'cornflowerblue', lw = lw, label = 'Polynomial model')
plt.xlabel('data')
plt.ylabel('Support Vector Regression')
plt.legend()
plt.show()

【运行结果】

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python

5、案例

5.1 鸢尾花

import numpy as np
from sklearn import datasets
import sklearn.model_selection as ms
import sklearn.svm as svm
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
iris = datasets.load_iris()
x = iris.data[:,:2]
y = iris.target
#数据划分
x_train, x_test, y_train, y_test = ms.train_test_split(x, y, test_size = 0.25, random_state = 5)
#基于线性核函数
model = svm.SVC(kernel = 'linear')
model.fit(x_train, y_train)
#基于多项式核函数,三阶多项式核函数
#model = svm.SVC(kernel = 'poly', degree = 3)
#model.fit(x_train,, y_train)
#预测
y_test_pred = model.predict(x_test)
#计算模型精度
bg = classification_report(y_test, y_test_pred)
print('基于线性核函数的分类报告:', bg, sep ='\n')
#绘制分类边界线
l, r = x[:,0].min() - 1, x[:,0].max() + 1
b, t = x[:,1].min() - 1, x[:,1].max() + 1
n = 500
grid_x,grid_y = np.meshgrid(np.linspace(l,r,n), np.linspace(b,t,n))
bg_x = np.column_stack((grid_x.ravel(), grid_y.ravel()))
bg_y = model.predict(bg_x)
grid_z = bg_y.reshape(grid_x.shape)
#画图显示样本数据
plt.title('kernel = linear', fontsize = 16)
plt.xlabel('x',fontsize = 14)
plt.ylabel('y',fontsize = 14)
plt.tick_params(labelsize = 10)
plt.pcolormesh(grid_x, grid_y, grid_z, cmap = 'gray')
plt.scatter(x_test[:,0], x_test[:,1], s = 80, c = y_test, cmap = 'jet', label = 'Samples')
plt.legend()
plt.show()

【运行结果】

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python

5.1.1 在选择核函数时,一般遵循如下原则:
  • 如果特征非常多或者样本数远少于特征数,数据更偏向线性可分,选择线性核函数效果会更好。
  • 线性和函数的参数少,速度快;径向基核函数的参数多,分类结果非常依赖参数,需要交叉验证或网格搜索最佳参数。
  • 径向基核函数应用最广,对于小样本还是大样本、高纬度还是低纬度等情况都适用。

5.2 波士顿房价

#导人画图工具
import matplotlib.pyplot as plt
#导人波士顿房价数据集
#from sklearn.datasets import load_boston
import pandas as pd
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
#打印数据集中的键
print(raw_df.keys())
#导人数据集拆分工具
from sklearn.model_selection import train_test_split
#建立训练集和测试集
X,y=data, target
X_train, X_test, y_train, y_test=train_test_split(X,y,random_state=8)
#导人数据预处理工具
from sklearn.preprocessing import StandardScaler
#对训练集和测试集进行数据预处理
scaler=StandardScaler()
scaler.fit(X_train)
X_train_scaled=scaler.transform(X_train)
X_test_scaled=scaler.transform(X_test)
#将预处理后的数据特征最大值和最小值用散点图表示n
#导人支持向量机回归模型
from sklearn.svm import SVR
#用预处理后的数据重新训练模型
for kernel in ['linear', 'rbf']:
    svr=SVR(kernel=kernel)
    svr.fit(X_train_scaled, y_train)
    print('数据预处理后',kernel,'核函数模型在训练集上的得分:{:.3f}'.format(svr.score(X_train_scaled,y_train)))
    print('数据预处理后',kernel,'核函数模型在测试集上的得分:{:.3f}'. format(svr.score(X_test_scaled,y_test)))
plt.plot(X_train_scaled.min(axis=0),'v',label='train set min')
plt.plot(X_train_scaled.max(axis=0),'^', label='train set max')
plt.plot(X_test_scaled.min(axis=0), 'v', label='test set min')
plt.plot(X_test_scaled.max(axis=0), '^', label='test set max')
#设置图注位置为最佳位置
plt.legend(loc='best')
#设置横纵轴标题
plt.xlabel('scaled features')
plt.ylabel('scaled feature magnitude')
plt.show()
#设置径向基核模型的C参数和 gamma参数
svr=SVR(C=100, gamma=0.1)
svr.fit(X_train_scaled, y_train)
print('调节参数后径向基核函数模型在训练集上的得分:{:.3f}'.format(svr.score(X_train_scaled, y_train)))
print('调节参数后径向基核函数模型在测试集上的得分:{:.3f}'.format(svr.score(X_test_scaled, y_test)))

【运行结果】

机器学习——支持向量机,机器学习-基于sklearn,机器学习,支持向量机,人工智能,python文章来源地址https://www.toymoban.com/news/detail-768144.html

到了这里,关于机器学习——支持向量机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 支持向量机svm分类、回归、网格搜索 基于sklearn(python)实现

    由于水平有限 支持向量机(support vector machine)的数学原理和证明就不讲了 想知道可以去看李航的机器学习或者西瓜书 1、读入数据,将数据调成该库能够识别的格式 2、 将数据标准化 ,防止样本中不同特征的数值差别较大,对分类结果产生较大影响 3、利用网格搜索和k折交

    2023年04月11日
    浏览(46)
  • 一文详解人工智能:线性回归、逻辑回归和支持向量机(SVM)

    在人工智能领域,线性回归、逻辑回归和支持向量机是常见的机器学习算法。本文将详细介绍这三种算法的原理和应用,并提供相应的代码示例。 线性回归是一种用于建立变量之间线性关系的回归分析方法。它通过拟合一个线性模型来预测连续变量的值。线性回归的目标是找

    2024年02月03日
    浏览(49)
  • 【Sklearn】基于支持向量机算法的数据分类预测(Excel可直接替换数据)

    支持向量机(Support Vector Machine,SVM)是一种用于分类和回归的监督学习算法,其基本思想是在特征空间中找到一个能够最大化分类间隔(Margin)的超平面,从而将不同类别的样本正确分类。以下是SVM的数学模型和模型原理的解释: 假设我们有一个训练数据集,包含

    2024年02月13日
    浏览(46)
  • 人工智能课程设计毕业设计——基于机器学习的贷款违约预测

    摘  要 随着人们对于贷款的需求量不断增加以及我国债券市场和信贷市场违约事件频发,商业银行不良资产率与用户个人贷款违约风险成为了政府和银行业关心的核心问题,而对信用贷款违约风险进行有效评估和测度也成为了商业银行提高其经营管理水平的核心要务。 本小

    2024年04月16日
    浏览(71)
  • 人工智能课程设计毕业设计——基于机器学习的手写汉字识别系统

    《机器学习》课程设计实验 报告 题目:基于深度学习的手写汉字识别系统 目录 基于深度学习的手写汉字识别系统实验报告 1. 绪论 ............................................................................................................................................................ 1 1.1 研究背景及意义..

    2024年02月20日
    浏览(70)
  • 毕业设计选题-基于深度学习的吸烟检测识别系统 人工智能 机器学习 YOLO

    目录 前言 课题背景和意义 实现技术思路 一、 吸烟检测方法 1.1 网络总体结构 1.2 CotNet Transformer 模块 二、 数据集 三、实验及结果分析 3.1 实验环境搭建 3.2 结果分析 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就

    2024年01月20日
    浏览(101)
  • 机器学习实战:Python基于支持向量机SVM-RFE进行分类预测(三)

    1.1 支持向量机的介绍 支持向量机( Support Vector Machine,SVM )是一种监督学习的分类算法。它的基本思想是找到一个能够最好地将不同类别的数据分开的超平面,同时最大化分类器的边际(margin)。SVM的训练目标是最大化间隔(margin),即支持向量到超平面的距离。 具体地,

    2024年02月05日
    浏览(64)
  • 【赠书第4期】机器学习与人工智能实战:基于业务场景的工程应用

    文章目录 前言 1 机器学习基础知识 2 人工智能基础知识 3 机器学习和人工智能的实战案例 4 总结 5 推荐图书 6 粉丝福利 机器学习 与 人工智能 是当前最热门的领域之一,也是未来发展的方向。随着科技的不断进步,越来越多的企业开始关注和投入机器学习和人工智能领域。

    2024年02月05日
    浏览(66)
  • 毕业设计选题:基于机器学习的虚假新闻识别系统 人工智能 python

      目录  前言 设计思路 一、课题背景与意义 二、算法理论原理 2.1 机器学习 2.2 深度学习  三、检测的实现 3.1 数据集 3.3 实验及结果分析 最后        📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精

    2024年01月19日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包