支持向量机 及其分类案例详解(附Python 代码)

支持向量机分类器预测收入等级

我们将构建一个支持向量机(SVM)分类器,以预测一个人基于14个属性的收入等级。我们的目标是判断收入是否高于或低于每年$50,000。因此,这是一个二元分类问题。我们将使用在此处可用的人口普查收入数据集。需要注意的是,此数据集中的每个数据点都是单词和数字的混合。我们不能使用原始格式的数据,因为算法不知道如何处理单词。我们不能使用标签编码器转换所有数据,因为数值数据是有价值的。因此,我们需要结合使用标签编码器和原始数值数据来构建一个有效的分类器。

引言

支持向量机(SVM)是一种监督学习模型,用于解决分类和回归问题。对于分类任务,SVM 通过找到一个最优超平面来将不同类别的样本分开。SVM 的核心思想是通过最大化不同类别之间的间隔(margin)来找到一个最优的分割超平面。这个最优超平面由权重向量 w w w 和偏差 b b b 决定。
在这里插入图片描述

数学原理

SVM 的目标是找到一个超平面,使得所有正类样本和负类样本尽可能远离这个超平面。对于线性可分的情况,假设数据集中的样本为 ( x i , y i ) (x_i, y_i) (xi,yi),其中 x i x_i xi 是输入向量, y i ∈ { + 1 , − 1 } y_i \in \{+1, -1\} yi{+1,1} 是标签。我们希望找到一个超平面使得:
w ⋅ x i + b ≥ 1 if y i = + 1 w \cdot x_i + b \geq 1 \quad \text{if} \quad y_i = +1 wxi+b1ifyi=+1
w ⋅ x i + b ≤ − 1 if y i = − 1 w \cdot x_i + b \leq -1 \quad \text{if} \quad y_i = -1 wxi+b1ifyi=1
这可以合并为一个约束条件:
y i ( w ⋅ x i + b ) ≥ 1 ∀ i y_i (w \cdot x_i + b) \geq 1 \quad \forall i yi(wxi+b)1i

SVM 的优化目标是最大化间隔 2 / ∥ w ∥ 2 / \|w\| 2/∥w,这等价于最小化 ∥ w ∥ 2 / 2 \|w\|^2 / 2 w2/2。因此,SVM 的优化问题可以表示为:
min ⁡ 1 2 ∥ w ∥ 2 \min \frac{1}{2} \|w\|^2 min21w2
subject to y i ( w ⋅ x i + b ) ≥ 1 ∀ i \text{subject to} \quad y_i (w \cdot x_i + b) \geq 1 \quad \forall i subject toyi(wxi+b)1i

对偶问题

为了求解上述优化问题,通常会将其转换为对偶问题。引入拉格朗日乘子 α i \alpha_i αi,对偶问题可以表示为:
max ⁡ ∑ i = 1 n α i − 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j ( x i ⋅ x j ) \max \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i=1}^n \sum_{j=1}^n \alpha_i \alpha_j y_i y_j (x_i \cdot x_j) maxi=1nαi21i=1nj=1nαiαjyiyj(xixj)
subject to ∑ i = 1 n α i y i = 0 \text{subject to} \quad \sum_{i=1}^n \alpha_i y_i = 0 subject toi=1nαiyi=0
0 ≤ α i ≤ C ∀ i \quad \quad \quad \quad \quad 0 \leq \alpha_i \leq C \quad \forall i 0αiCi
其中, C C C 是惩罚参数,控制样本误差和间隔的权衡。

核函数

对于非线性可分的情况,可以将输入空间映射到高维特征空间,在高维特征空间中寻找线性可分的超平面。这通过核函数 K ( x i , x j ) = ϕ ( x i ) ⋅ ϕ ( x j ) K(x_i, x_j) = \phi(x_i) \cdot \phi(x_j) K(xi,xj)=ϕ(xi)ϕ(xj) 来实现。常用的核函数包括多项式核、高斯核(RBF核)等。

案例代码

预测一个人基于14个属性的收入等级。我们的目标是判断收入是否高于或低于每年$50,000。数据文件可以从这里下载.

# 导入所需的包
import numpy as np
import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.svm import LinearSVC
from sklearn.multiclass import OneVsOneClassifier
from sklearn import cross_validation# 输入包含数据的文件
input_file = 'income_data.txt'# 读取数据
X = []
y = []
count_class1 = 0
count_class2 = 0
max_datapoints = 25000# 打开文件并开始读取每行数据
with open(input_file, 'r') as f:for line in f.readlines():if count_class1 >= max_datapoints and count_class2 >= max_datapoints:breakif '?' in line:continue# 每行数据是以逗号分隔的,需要相应地进行拆分data = line[:-1].split(', ')# 最后一个元素是标签,根据标签将其分配到不同的类if data[-1] == '<=50K' and count_class1 < max_datapoints:X.append(data)count_class1 += 1if data[-1] == '>50K' and count_class2 < max_datapoints:X.append(data)count_class2 += 1# 将列表转换为numpy数组,以便用作sklearn函数的输入
X = np.array(X)# 将字符串数据转换为数值数据
label_encoder = []
X_encoded = np.empty(X.shape)
for i, item in enumerate(X[0]):if item.isdigit():X_encoded[:, i] = X[:, i]else:label_encoder.append(preprocessing.LabelEncoder())X_encoded[:, i] = label_encoder[-1].fit_transform(X[:, i])
X = X_encoded[:, :-1].astype(int)
y = X_encoded[:, -1].astype(int)# 创建SVM分类器并使用线性核
classifier = OneVsOneClassifier(LinearSVC(random_state=0))# 训练分类器
classifier.fit(X, y)# 使用80/20拆分进行交叉验证以进行训练和测试,然后预测训练数据的输出
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2, random_state=5)
classifier = OneVsOneClassifier(LinearSVC(random_state=0))
classifier.fit(X_train, y_train)
y_test_pred = classifier.predict(X_test)# 计算分类器的F1得分
f1 = cross_validation.cross_val_score(classifier, X, y, scoring='f1_weighted', cv=3)
print("F1得分: " + str(round(100*f1.mean(), 2)) + "%")# 对测试数据点进行预测
input_data = ['37', 'Private', '215646', 'HS-grad', '9', 'Never-married', 'Handlers-cleaners', 'Not-in-family', 'White', 'Male', '0', '0', '40', 'United-States']# 使用之前创建的标签编码器对测试数据点进行编码
input_data_encoded = [-1] * len(input_data)
count = 0
for i, item in enumerate(input_data):if item.isdigit():input_data_encoded[i] = int(input_data[i])else:input_data_encoded[i] = int(label_encoder[count].transform([input_data[i]])[0])count += 1
input_data_encoded = np.array(input_data_encoded)# 使用分类器对编码的数据点进行预测并打印输出
predicted_class = classifier.predict([input_data_encoded])
print(label_encoder[-1].inverse_transform(predicted_class)[0])

运行结果:

F1 score: 76.01%
[[    37      2 215646     11      9      4      5      1      4      10      0     40     38]]
<=50K

本专栏将系统学习机器学习核心技术,同时注重代码实践,欢迎关注!

作者 :计算小屋
个人主页 : 计算小屋的主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDBC基础

目录 一、JDBC概述 二、JDBC搭建 1.注册JDBC驱动程序 2.建立与数据库连接 3.获得Satement执行sql语句 4.关闭与数据库的链接通道 三、PreparedStatement和Statement 1、代码的可读性和可维护性 2、最重要的一点是极大地提高了安全性 四、结果集处理 一、JDBC概述 JD…

c语言指针2

文章目录 一、void * 指针二、const关键字1.const修饰变量2.const修饰指针变量2. 1 const放在*的右边2. 2 const放在*的左边2. 3 总结 三、指针的运算3. 1指针的加减运算3. 2 指针 - 指针3. 3 指针的关系运算 四、野指针4. 1 什么叫野指针&#xff1f;4. 1 野指针的成因4.1.1 指…

Poetry入门教程

以前使用模块管理和虚拟环境为pip和Virtualenv组合&#xff0c;随着Rasa、Dify等开源项目逐步使用Poetry模块管理&#xff0c;也开始尝试使用Poetry。本文简要介绍Poetry入门操作。 1.Poetry安装 可参考Poetry官网[1]推荐的安装方式&#xff1a; 通过Windows的Powershell如下…

C++编程: 使用 Nanomsg 进行 PUB-SUB 模式基准测试

文章目录 0. 引言1. Nanomsg简介1.1 可扩展性协议类型1.2 支持的传输机制1.3 NanoMsg 架构与实现 2. PUB-SUB 模式基准测试 0. 引言 Nanomsg 作为一款高性能的通信库&#xff0c;支持多种消息传递模式&#xff0c;其中包括 PUB-SUB&#xff08;发布-订阅&#xff09;。 本篇文…

yolov8环境安装

一、Miniconda Conda 是一个开源的包管理和环境管理系统&#xff0c;它能运行、安装和更新各种包和依赖&#xff0c;同时还能创建隔离的环境。 1.1 下载安装 Miniconda https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Windows-x86_64.exe1.2 打开 Anaconda …

向量数据库(一)

写在前面 最近在学习一些 AI 相关的开发&#xff0c;了解了一些未接触过的东西&#xff0c;其中有一部分是向量数据库&#xff0c;想开一个专题&#xff0c;对相关的内容做一下整理。 内容 什么是向量数据库 一般在我们的日常开发中&#xff0c;使用的数据库存储主要有两种…

Matlab进阶绘图第65期—带分组折线段的柱状图

带分组折线段的柱状图是在原始柱状图的基础上&#xff0c;在每组柱状图位置处分别添加折线段&#xff0c;以进行对比或添加额外信息。 由于Matlab中未收录带分组折线段的柱状图的绘制函数&#xff0c;因此需要大家自行设法解决。 本文使用自制的BarwithGroupedLine小工具进行…

大模型算法面试题(十四)

本系列收纳各种大模型面试题及答案。 1、微调后的模型出现能力劣化&#xff0c;灾难性遗忘是怎么回事 微调后的模型出现能力劣化&#xff0c;灾难性遗忘&#xff08;Catastrophic Forgetting&#xff09;是一个在机器学习领域&#xff0c;尤其是在深度学习和大模型应用中频繁出…

数据库(MySQL)-DQL数据查询语言

DQL(Data Query Language 数据查询语言)的用途是查询数据库数据&#xff0c;如select语句。其中&#xff0c;可以根据表的结构和关系分为单表查询和多表联查。 单表查询 单表查询&#xff1a;针对数据库中的一张数据表进行查询 全字段查询 语法&#xff1a;select 字段名 fro…

报警系统与机房动力环境监控系统的集成及报警功能实施

在当今的运维行业中&#xff0c;确保关键基础设施的安全与稳定运行面临着诸多挑战&#xff0c;如设备故障、环境异常、非法入侵等。为了有效应对这些挑战&#xff0c;报警系统与机房动力环境监控系统的集成变得至关重要。本文旨在为运维团队提供关于报警系统与机房动力环境监控…

使用frrouting、gns3、pim实现ipv6组播(三)

翻遍整个网络都没有找到用ipv6进行组播推流的实例。 朋友说&#xff1a;A true strong person never complains about the environment 那么&#xff0c;就由我来创造一个吧~ 此文涉及到的所有软件均为开源软件&#xff0c;进行深入学习与其他平台移植时十分便利。 记得点赞额…

如何在GPU服务器上安装Stable Diffusion webUI

一、前提条件 1、硬件条件 GPU&#xff1a;12G&#xff0c;建议16G以上&#xff0c;还是尽量勾搭&#xff0c;好像现在最大32G&#xff0c;目前个人性价比24G有时长出售。 内存&#xff1a;16G以上&#xff0c;建议32G&#xff0c;也是越大越好。 硬盘&#xff1a;最好使用…

2024年【金属非金属矿山(地下矿山)安全管理人员】考试报名及金属非金属矿山(地下矿山)安全管理人员模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试报名为正在备考金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员操作证的学员准备的理论考试专题&#xff0c;每个月更新的金属非…

抖音矩阵管理系统功能说明:一站式掌握

在当下这个信息爆炸的时代&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;其用户规模持续扩大&#xff0c;影响力日益增强。对于内容创作者和营销人员来说&#xff0c;如何高效管理抖音账号&#xff0c;实现内容的多平台分发和精准触达&#xff0c;成为了亟待解决的问题。…

Redis常用指令(不定期更新)

Redis常用指令&#xff08;不定期更新&#xff09; 查询指定前缀key的数量查看键空间事件开启键空间通知 查询指定前缀key的数量 查询【TEST前缀】的key数量 EVAL "return #redis.call(keys,TEST:*)" 0返回信息 查看键空间事件 config get notify-keyspace-even…

Navicat Charts Creator for Mac:数据可视化利器

Navicat Charts Creator for Mac是一款专为Mac用户设计的数据可视化工具&#xff0c;它将复杂的数据转化为直观、易懂的图表&#xff0c;帮助用户更好地理解和分析数据。 该软件支持连接到多种数据库&#xff0c;如MySQL、MariaDB、PostgreSQL等&#xff0c;轻松获取实时数据&…

【QGroundControl二次开发】七.QGC自定义MAVLink消息MavLink通信协议 C++应用

1. 接收解析源码分析 通过接收串口或UDP发来的的字节流buffer&#xff0c;长度lengthbuffer.size()&#xff0c;通过下列脚本解析&#xff0c;每解析出一个mavlink数据包就执行onMavLinkMessage函数 for(int i 0 ; i < length ; i){msgReceived mavlink_parse_char(MAVL…

VS2022下安装和配置OpenCV环境参数+QT开发环境搭建

1.工具准备 VS2022,OpenCV4.5.5版本&#xff0c;QT5.12.12 VisualStudio最新版直接官网下载&#xff0c;根据需要进行下载&#xff0c;我下载的免费社区版本。日常开发完全够用。 qt官网下载5.12版本。 OpenCVReleases - OpenCV 选择Windows版本下载并解压到本地磁盘&#xff0…

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 在数字时代&#xff0c;信息安全的重要性不言而喻&#xff0c;尤其当涉及到个人隐私和账户安全时。每天&#xff0c;无数的用户登录各种在线服务&#xff0c;从社交媒体到银行账户&#xff0c;再到电子邮件和云存储服务。这些服务的背后&#xff0c;是复杂的系统架构&am…

【BUG】已解决:No Python at ‘C:Users…Python Python39python. exe’

No Python at ‘C:Users…Python Python39python. exe’ 目录 No Python at ‘C:Users…Python Python39python. exe’ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班…