机器学习 sklearn SVM

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

本文主要是介绍机器学习 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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件