支持向量机 及其分类案例详解(附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://xiahunao.cn/news/3270208.html

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

相关文章

Python高维度大型气象矩阵存储策略分享

零、前情提要 最近需要分析全球范围多变量的数值预报数据&#xff0c;将grb格式的数据下载下来经过一通处理后需要将预处理数据先保存一遍&#xff0c;方便后续操作&#xff0c;处理完发现此时的数据维度很多&#xff0c;数据量巨大&#xff0c;使用不同的保存策略的解析难度和…

nowcoder bc49判断两个数的大小关系

描述 KiKi想知道从键盘输入的两个数的大小关系&#xff0c;请编程实现。 输入描述&#xff1a; 题目有多组输入数据&#xff0c;每一行输入两个整数&#xff08;范围-231~231-1&#xff09;&#xff0c;用空格分隔。 输出描述&#xff1a; 针对每行输入&#xff0c;输出两…

zotfile基础配置详解

zotfile可以将自动移动pdf到指定文件夹中&#xff0c;那么应该如何配置呢&#xff1f; 遵循极简原则&#xff0c;只需配置两个地方即可。 一、路径配置 第一处是pdf附件存放的位置&#xff0c;可以指定自己想要的地方&#xff0c;我放在了C盘的文档文件夹下。 第二处是分类法…

由恶劣事件: CrowdStrike发布案例更新导致微软全球蓝屏事件的启示

前言 网络安全公司 CrowdStrike 周四发布软件更新后&#xff0c;机场、银行、证券交易所、911 服务、交通系统、酒店、新闻媒体、医院、紧急服务等开始出现臭名昭著的蓝屏死机 (BSOD)。在看似多年来最严重的 IT 中断中&#xff0c;大规模的网络安全软件问题正在全球范围内造成…

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…

C/C++大雪纷飞代码

目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C实现的大雪纷飞代码&#xff0c;一起来看看吧&#xff01; 系列推荐 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳…

Linux笔记 --- 程序入门

‘\n’换行符 通常来讲我们都是使用这个符号来进行换行的操作&#xff0c;但是这个符号不仅仅是用于换行 当标准输出文件中默认使用缓冲 &#xff0c;也就是当遇到 \n 的时候会进行刷新缓冲区&#xff08;把数据输 出&#xff09; 当打印语句后面没有换行符时 &#xff0c; 需要…

强烈推荐这 3 款让你用一次就爱上,永不想删除的软件

IcecreamPDFEditor IcecreamPDFEditor是一款功能强大的PDF编辑工具&#xff0c;具备多种编辑和查看PDF文件的功能。这款软件不仅可以方便地阅读和查看各种PDF文件&#xff0c;还可以进行编辑操作。它拥有编辑文本、注释添加、页面管理以及PDF文件保护等功能。 用户可以通过下载…

JS逆向高级爬虫

JS逆向高级爬虫 JS逆向的目的是通过运行本地JS的文件或者代码,以实现脱离他的网站和浏览器,并且还能拿到和浏览器加密一样的效果。 10.1、编码算法 【1】摘要算法&#xff1a;一切从MD5开始 MD5是一个非常常见的摘要(hash)逻辑. 其特点就是小巧. 速度快. 极难被破解. 所以,…

ELK安装(Elasticsearch+Logstash+Kibana+Filebeat)

一、简介 1.1、软件简介 ELK其实是Elasticsearch&#xff0c;Logstash 和 Kibana三个产品的首字母缩写&#xff0c;这三款都是开源产品。 1.1.1、Elasticsearch简介 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析…

研究生选择学习Android开发的利与弊?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Android的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;产品经理可以学学Axure快…

简单的CSS样式

样式分为三种 内部样式&#xff1a;写在html文件里的样式叫内部样式 内联样式&#xff1a;写在需要的标签中 外部样式&#xff1a;写在外部css文件里 可以通过不同的选择器来选择设置指定组件的样式&#xff1a; <style>/* 写在html文件里的样式叫内部样式 *//* 选择器 *…

6.3 面向对象技术-设计模式

设计模式 创建型模式 结构型模式

C++ unordered_map

1. unordered系列关联式容器 在C98 中&#xff0c; STL 提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 &#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c…

我在百科荣创企业实践——简易函数信号发生器(6)

对于高职教师来说,必不可少的一个任务就是参加企业实践。这个暑假,本人也没闲着,报名参加了上海市电子信息类教师企业实践。7月8日到13日,有幸来到美丽的泉城济南,远离了上海的酷暑,走进了百科荣创科技发展有限公司。在这短短的一周时间里,我结合自己的教学经验和企业的…

Leetcode 剑指 Offer II 088.使用最小花费爬楼梯

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 数组的每个下标作为一个阶梯&#xff0c;第 i 个阶梯对应着一个非…

5 Java的基本程序设计结构(基本语法4)- 集合之ArryList 和什么是包装类?

文章目录 前言一、集合二、基本数据类型的包装类三、ArryList1 ArryList对象的创建2 ArryList常见成员方法(1)boolean add(E e) : 添加元素,返回值表示是否添加成功(2)void add(int index, E e) :在指定索引位置插入元素。(3)boolean remove(E e) : 删除第一个指定元素…

从json到protobuf,接口效率的提升

在express开发的前后端调用中&#xff0c;express作为接收方是不二之选&#xff0c;它有一些很好用的body解析器来解析传入数据&#xff1b;而作为请求发起方&#xff0c;axios是非常方便的&#xff0c;这是一个很好的选择&#xff0c;它可以传输多种类型的数据给接收方。 通常…

Tekion 选择 ClickHouse Cloud 提升应用性能和指标监控

本文字数&#xff1a;4187&#xff1b;估计阅读时间&#xff1a;11 分钟 作者&#xff1a;ClickHouse team 本文在公众号【ClickHouseInc】首发 Tekion 由前 Tesla CIO Jay Vijayan 于 2016 年创立&#xff0c;利用大数据、人工智能和物联网等技术&#xff0c;为其汽车客户解决…

Week 3 DAY 6

Product C - Product (atcoder.jp) 一共N层&#xff0c;对于每一层的每个数&#xff0c;都遍历上一层更新过后的结果&#xff0c;更新为新的结果&#xff0c; 比如样例&#xff1a; 2 40 3 1 8 4 2 10 5动态数组a表示储存上一层除后留下来的数&#xff0c; 第一次a数组中只…