机器学习 sklearn SVM

2024-06-23 09:48
文章标签 sklearn svm 机器 学习

本文主要是介绍机器学习 sklearn SVM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、简介

SVM:支持向量机(Support Vector Machines),通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

目的:SVM 是一个面向数据的分类算法,它的目标是为确定一个分类超平面,从而将不同的数据分隔开

大佬简易通俗理解SVM,强烈推荐看

SVM具体实现和推导

SVM基本概要与sklearn.svm.svc 参数说明

2、关键名词

  • 函数间隔(Functional margin):实际上是人为定义的一个间隔度量
  • 几何间隔(Geometrical margin):是直观上点到平面的距离
  • 最大间隔分类器(Maximum Margin Classifier):
  1. 对于数据点进行分类,当超平面离数据点的“间隔”越大,分类的确信度(confidence)也就越大
  2. 为了使分类的确信度尽量高,需要让所选择的超平面能够最大化这个“间隔”值
  3. 函数间隔不适合作用来最大化间隔值,因为在超平面固定以后,可以等比列地缩放w的长度和b的值
  4. 最大间隔分类超平面的“间隔”指的是几何间隔,因为缩放w和b的时候,它只是随着超平面的变动而变动,函数值是不变的
  • 线性可分
  1. 通过求解对偶问题得到最优解,线性可分条件下支持向量机的对偶算法;
  2. 采用对偶算法优点:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题”
  • 线性不可分
  1. 实际情况中大部分数据都不是线性可分的,这个时候满足最大间隔分类的超平面不存在
  2. 一则一个核函数(kernel)κ(⋅,⋅),通过将数据映射到高维空间,来解决原始空间中线性不可分的情况
  3. 具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开
  • 建立非线性学习器步骤
  1. 首先使用一个非线性映射将数据变换到一个特征空间F
  2. 然后在特征空间使用线性学习器分类
  • 核函数的本质
  1. 实际中,我们会经常遇到线性不可分的样例,此时,我们常用做法是把特征映射到高维空间中去
  2. 但进一步,若果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕
  3. 此时,核函数就隆重登场了,核函数的价值在于它虽然也是将特征进行从低维到高维的转化,但是核函数的绝就绝在它事先在低维进行计算,而将实质上的分类效果表现在了高维上,也就是如上文所说的避免了直接在高维空间中的复杂计算。
  4. 在SVM用的最普遍的两种把数据投射到高维空间的方法分别是多项式内核(Polynomial kernel)径向基内核(Radial basis function kernel, RBF),其中多项式内核它是通过把原始特征进行乘方投射到高维空间,比如特征1成2次方,特征2乘3次方等;RBF内核也称为高斯内核(Gaussian kernel)
  • 优势
  1. SVM可以说是机器学习领域非常强大的算法了,对各种不同的类型的数据集都有不错的表现。
  2. 它可以在数据特征很少的情况下生成非常复杂的决定边界,当然特征数据量很多的情况下表现也不错,换句话说,SVM对高维数据集和对低维数据集都还算得心应手,训练的前提条件书数据集的规模不是很大。
  3. 在图像识别领域,还有样本数和特征数比较接近的时候,SVM都会游刃有余。
  • 劣势
  1. 如果样本集中的数据在1万以内,SVM都能驾驭,但是如果样本数据量超过10万的话,SVM就会非常耗费时间和内存。
  2. SVM对于数据做预处理和参数调节要求非常高;所以很多场景下大家都会很乐意用随机森林算法或者梯度上升决策树(GBDT)算法,因为它们不需要对数据做预处理,也不用费尽心机去调参;而对于非专业人士来说,随机森林和梯度上升决策树要比SVM更容易理解,毕竟SVM算法的建模过程是比较难以呈现的。

3、实际使用

   机器学习数据预处理总结

  • SVM分类分析
"""@func: 支持向量机的gamma参数调节,SVC用于分类分析优缺点:gamma的值越小,模型越倾向于欠拟合,而gamma的值越大,则模型越倾向于出现过拟合的问题
"""
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import load_wine
import numpy as npdef make_meshgrid(x, y, h=.02):x_min, x_max = x.min() - 1, x.max() + 1y_min, y_max = y.min() - 1, y.max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))return xx, yydef 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)return outwine = load_wine()
X = wine.data[:, :2]
y = wine.target
C = 1.0# kernel为选择的核函数,gamma为选择的核函数传递的参数值,C为正则化参数
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 = ('gamms = 0.1','gamma = 1','gamma = 10')fig, sub = plt.subplots(1, 3, figsize=(10, 3))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增加到10,gamma值越小,则RBF的内核的直径越大,这样就会有更多的点被模型圈进决定边界中,所以决定边界也就越平滑,这时的模型也就越简单;而随着参数的增加,模型则更倾向于把每一个点都放到对应的决定边界中,这时模型的复杂度也相应提高了。所以gamma的值越小,模型越倾向于欠拟合,而gamma的值越大,则模型的越倾向于出现过拟合的问题。

  • SVM回归分析
"""@func: 实战波士顿放假回归分析,使用SVR"""from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
import matplotlib.pyplot as pltboston = load_boston()
X, y = boston.data, boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)# 由于数据中各特征量级差别比较大,所以要先进行对数据预处理
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)for kernel in ['linear', 'rbf']:svr = SVR(kernel=kernel, C=100, gamma=0.1) # C和gamma参数值对训练模型的影响较大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='train set min')
plt.plot(X_test_scaled.min(axis=0), '^', label='train set max')
plt.yscale('log')
plt.legend(loc='best')plt.xlabel('scaled features')
plt.ylabel('scaled feature magnitude')plt.show()

保存训练模型,有时训练一个模型十分耗费时间,所以将训练的模型保存起来,再使用的时候加载是十分有用的

from sklearn.externals import joblib
# 保存训练模型
joblib.dump(svr, 'train_model.m')
# 加载训练模型
svr = joblib.load('train_model.m')

 

这篇关于机器学习 sklearn SVM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1086811

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa