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

news2024/9/17 4:33:47

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

我们将构建一个支持向量机(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:
            break
        if '?' in line:
            continue
        # 每行数据是以逗号分隔的,需要相应地进行拆分
        data = line[:-1].split(', ')
        
        # 最后一个元素是标签,根据标签将其分配到不同的类
        if data[-1] == '<=50K' and count_class1 < max_datapoints:
            X.append(data)
            count_class1 += 1
        
        if 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      1
       0      0     40     38]]
<=50K

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

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

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

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

相关文章

MySQL数据库(基础篇)

&#x1f30f;个人博客主页&#xff1a;心.c 前言&#xff1a;今天讲解的是MySQL的详细知识点的&#xff0c;希望大家可以收货满满&#xff0c;话不多说&#xff0c;直接开始搞&#xff01; &#x1f525;&#x1f525;&#x1f525;文章专题&#xff1a;MySQL &#x1f63d;感…

语言转文字

因为工作原因需要将语音转化为文字&#xff0c;经常搜索终于找到一个免费的好用工具&#xff0c;记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…

Arduino IDE界面和设置(基础知识)

Arduino IDE界面和设置&#xff08;基础知识&#xff09; 1-2 Arduino IDE界面和设置如何来正确选择Arduino开发板型号如何正确选择Arduino这个端口如何来保存一个Arduino程序Arduino ide 的界面功能按钮验证编译上传新建打开保存工作状态 1-2 Arduino IDE界面和设置 大家好这…

软设之数据库概念结构设计

集成的方法&#xff1a; 多个局部E-R图一次集成 逐步集成&#xff0c;用累加的方式一次集成两个局部E-R 集成产生的冲突及解决办法&#xff1a; 属性冲突&#xff1a;包括属性冲突和属性取值冲突 命名冲突&#xff1a;包括同名异义和异名同义 结构冲突&#xff1a;包括同…

react.16+

1、函数式组件 在vite脚手架中执行&#xff1a; app.jsx: import { useState } from react import reactLogo from ./assets/react.svg import viteLogo from /vite.svg import ./App.cssfunction App() {console.log(this)return <h2>我是函数式组件</h2> }exp…

如何通过注解注入一个自定义的FactoryBean

一、引入依赖二、定义一个注解三、创建一个FactoryBean四、创建一个BeanPostProcessor4.1 其他关联类AnnotationUtilsServiceBeanNameBuilder 五、注入InstantiationAwareBeanPostProcessor到IoC中5.1 实现ImportBeanDefinitionRegistrar接口5.2 通过Import注入 六、使用6.1 打…

【proteus经典项目实战】51单片机用计数器中断实现100以内的按键计数并播放音乐

一、简介 一个基于8051微控制器的计数器系统&#xff0c;该系统能够通过按键输入递增计数&#xff0c;并且能够在达到100时归零。该系统将使用计数器中断和外部中断来实现其功能。 51单片机因其简单易用和成本效益高&#xff0c;成为电子爱好者和学生的首选平台。通过编程单片…

猫头虎分享 || 最全Python的Scapy库基础知识点汇总

&#x1f431;‍&#x1f464; 猫头虎分享 || Python的Scapy库基础知识点汇总 摘要 Scapy 是一个强大的Python库&#xff0c;用于网络数据包的生成、解析和操作。通过Scapy&#xff0c;开发者可以轻松地创建自定义数据包&#xff0c;捕获网络流量&#xff0c;并执行网络扫描。…

算法日记day 22

一、二叉搜索树中的插入操作 题目&#xff1a; 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。…

Python学习笔记46:游戏篇之外星人入侵(七)

前言 到目前为止&#xff0c;我们已经完成了游戏窗口的创建&#xff0c;飞船的加载&#xff0c;飞船的移动&#xff0c;发射子弹等功能。很高兴的说一声&#xff0c;基础的游戏功能已经完成一半了&#xff0c;再过几天我们就可以尝试驾驶 飞船击毁外星人了。当然&#xff0c;计…

【优秀python web系统毕设】基于python的全国招聘数据分析可视化系统,包括随机森林算法

1.1 研究背景 自1997年互联网开始在国内的招聘行业发展至今已有二十几年的历史&#xff0c;互联网招聘进入了蓬勃发展的“黄金时代”。根据智研咨询发布的《2023年中国互联网招聘行业发展现状》报告显示&#xff0c;截至2023年5月&#xff0c;中国互联网招聘平台中&#xff0c…

数据结构(Java):反射枚举Lambda表达式

目录 1、反射 1.1 反射的定义 1.2 反射机制的原理 1.3 反射相关类 1.4 Class类 1.4.1 相关方法 1.4.1.1 常用获得类相关的方法 ​编辑 1.4.1.2 常用获得类中属性相关的方法 1.4.1.3 获得类中构造器相关的方法 1.4.1.4 获得类中方法相关的方法 1.4.2 获取Class对象 1.…

DeFi革命:揭秘去中心化金融的核心技术与实操指南

目录 DeFi&#xff08;去中心化金融&#xff09;综述 基本特点 第一&#xff0c;DeFi 是无许可的金融 第二&#xff0c;DeFi 是无门槛的金融 第三&#xff0c;DeFi 是无人驾驶的金融 典型商业模式 闪电贷 MakerDAO 面临的挑战 DeFi技术要点 椭圆曲线签名 EIP-712:…

IS-LM模型的公式与应用解析

IS-LM模型的公式与应用解析 IS-LM模型的核心作用 IS-LM模型是宏观经济学中的一个重要工具&#xff0c;用于分析财政政策和货币政策对经济的影响。IS曲线代表商品市场均衡&#xff0c;LM曲线代表货币市场均衡。两条曲线的交点表示商品市场和货币市场同时达到均衡时的利率和收入…

MySQL笔记3——高级数据查询语句DQL

多表联查 多表联查可以通过连接运算实现&#xff0c;即将多张表通过主外键关系关联在一起进行查询。下图提供了多表联查 时用到的数据库表之间的关系。 等值查询和非等值查询 非等值查询&#xff1a;SELECT * FROM 表1&#xff0c;表2 等值查询&#xff1a;SELECT * FROM 表…

DDR3布线时候的经验总结

摆放BGA下面的滤波电容的时候注意不要让两个电容的电源和地对着头放&#xff0c;手工焊接时候容易短路 阻抗层必须是实心铜皮覆盖&#xff1a; &#xff08;3&#xff09;阻抗线一定要有阻抗参考层&#xff0c;一般以相邻的接地或电源层做参考层&#xff08;如顶层阻抗线&…

人工智能技术的分析与探讨

《人工智能技术的分析与探讨》 摘要&#xff1a; 本文深入探讨了人工智能技术在多个领域的应用&#xff0c;包括智能感知、智能语音、智能问答、智能机器人、智能制造、智能医疗等。详细阐述了这些技术在当前的应用现状和主要场景&#xff0c;展示了一些典型的应用案例&#…

放大电路总结

补充: 只有直流移动时才有Rbe动态等效电阻 从RsUs看进去,实际上不管接了什么东西都能够看成是一个Ri(输入电阻) Ri Ui/Ii Rb//Rbe Ui/Us Ri/(RiRs) Aus (Uo/Ui)*(Ui/Us) Au *Ri/(RiRs) 当前面是一个电压源的信号 我们就需要输入电阻更大 Ro--->输出电阻--->将…

学习C语言第十四天(指针练习)

1.第一题C 2.第二题C 3.第三题 00345 short类型解引用一次访问两个字节 4.第四题 6&#xff0c;12 5.第五题C 6.第六题 下面代码结果是0x11223300 7.第七题 int main() {int a 0;int n 0;scanf("%d %d",&a,&n);int i 0;int k 0;int sum 0;for (i 0;…

创维汽车滁州永通体验中心开业仪式暨超充车型区域上市会圆满成功

2024年7月20日&#xff0c;创维汽车滁州永通体验中心盛大开业&#xff0c;当日&#xff0c;创维汽车市场部经理周世鹏、安徽大区总监王大明等领导参加本次开业盛典&#xff0c;共同见证创维汽车滁州永通体验中心成功落地。 2021年&#xff0c;新能源乘用车高速发展&#xff0c;…