AI开发:支持向量机(SVM)鸢尾花模型入门教程- Python 机器学习
最近接触了一些数据分析的任务,越来越多地听到支持向量机(SVM), 之前我们也一起学习过 AI开发:支持向量机(SVM)入门教程- Python 机器学习
今天我们再由浅入深的地来重温和学习这个AI算法,以便我们进一步掌握如何熟悉和使用这一AI大杀器。
SVM用在哪里
--文本分类
- 垃圾邮件过滤:通过分析电子邮件的内容和特征,SVM可以将邮件分类为垃圾邮件和非垃圾邮件。
- 情感分析:根据社交媒体评论、产品评论等文本数据,SVM可以识别出文本的情感倾向(如正面、负面或中立)。
--图像识别
- 手写数字识别:SVM常用于手写数字识别,如MNIST数据集,用来分类不同的数字。
- 面部识别:通过提取面部特征,SVM可以识别不同人的面部信息,广泛应用于安全监控和身份验证。
--生物信息学
- 癌症诊断:SVM用于基因表达数据分类,可以帮助诊断不同类型的癌症。
- 蛋白质结构预测:SVM被用来预测蛋白质的折叠结构,帮助生物医药研究。
--金融预测
- 信用评分:SVM可以根据客户的财务历史和信用数据,对其信用进行分类,预测是否有违约风险。
- 股票市场预测:通过分析历史市场数据,SVM可以预测股票价格的走势,进行买卖决策。
--医学诊断
- 疾病分类:SVM被广泛应用于诊断疾病,例如通过分析医学影像或患者的生理数据,帮助医生判断病人是否患有某种疾病。
- 心电图分析:SVM用于心电图数据的分类,帮助识别异常心脏节律。
--语音识别
- SVM可以将语音信号进行分类,应用于语音识别系统、语音命令控制等领域。
--图像分类和目标检测
- 遥感图像分类:SVM可以用于分析卫星或无人机拍摄的图像,进行地面物体的分类(如城市、森林、农田等)。
- 自动驾驶:SVM被用来分类路面上的物体,如行人、汽车、交通标志等,帮助自动驾驶系统做出决策。
--欺诈检测
- 信用卡欺诈:通过分析历史交易数据,SVM可以识别出可能是欺诈行为的交易。
--推荐系统
- SVM被用来在基于用户的行为(如浏览、点击等)来预测用户可能感兴趣的物品或服务,从而进行个性化推荐。
现在!让我们通过一个简单又有趣的例子来学习支持向量机(SVM)吧!
SVM是什么?
支持向量机(SVM)是一种强大的机器学习算法,特别适用于分类问题。想象一下,你在画一张二维平面图,有两种不同的水果,苹果和橙子,你的任务就是画出一条线,把这两类水果分开。这条线就叫做 决策边界。SVM就是用来找出这条最好的“分割线”的。
这里有人可能要问,假设苹果和橙子是混合的,如何划线?
当苹果和橙子混在一起时,SVM可以通过核函数将数据映射到高维空间,找到一个最优的分隔超平面来进行分类。这使得SVM不仅能够处理线性可分的情况,也能够处理非线性可分的复杂问题。
举个例子:
假设我们有两个特征:水果的重量和直径。通过这两个特征,我们可以把苹果和橙子分开。SVM会通过以下方式帮助我们:
- 找到一条决策边界线,这条线尽量让苹果和橙子不重叠。
- 找到离决策边界最近的“支持向量”(就是那些离线最近的点),这些点对决策边界的确定至关重要。
代码示例
我们用Python来实现这个过程。首先,我们需要安装scikit-learn
库,这是一个非常常用的机器学习库。
如果你还没有安装,可以通过以下命令安装:
pip install scikit-learn
接下来,我们用一个简单的例子来演示如何使用SVM进行分类。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
# 创建一个简单的数据集
# 这里我们使用sklearn自带的鸢尾花数据集(Iris),用于分类。
iris = datasets.load_iris()
X = iris.data[:, :2] # 我们只取前两个特征:花萼长度和花萼宽度
y = iris.target
# 只取两类数据(为了简单起见,我们只取类别0和1)
X = X[y != 2]
y = y[y != 2]
# 划分数据集,70%的数据用来训练,30%的数据用来测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建一个SVM分类器
clf = SVC(kernel='linear') # 选择线性核函数(Linear Kernel)
# 训练模型
clf.fit(X_train, y_train)
# 可视化数据点和决策边界
plt.figure(figsize=(8, 6))
# 绘制训练数据点
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='coolwarm', s=50, edgecolors='k')
# 绘制决策边界
ax = plt.gca()
x_min, x_max = ax.get_xlim()
y_min, y_max = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='black')
# 显示图形
plt.title('SVM Linear Kernel Decision Boundary')
plt.xlabel('Feature 1 (Sepal Length)')
plt.ylabel('Feature 2 (Sepal Width)')
plt.show()
# 预测并评估模型
y_pred = clf.predict(X_test)
accuracy = np.mean(y_pred == y_test)
print(f"模型在测试集上的准确率: {accuracy:.2f}")
一下子看不懂没关系,我们一步步来讲解和学习理解
代码分解与讲解
我们一步一步地来分析并详细解释这段代码。这个代码演示了如何使用 支持向量机(SVM) 在 Iris 数据集上进行分类。我们用 线性核函数 来构建模型并绘制决策边界。
1. 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
numpy
:用于数值计算,提供了数组、矩阵等功能。matplotlib.pyplot
:用于绘图和可视化。sklearn.datasets
:提供了多种内置数据集,这里我们用的是load_iris()
函数加载鸢尾花(Iris)数据集。sklearn.svm.SVC
:SVM分类器(支持向量机分类器),我们将用它来训练分类模型。sklearn.model_selection.train_test_split
:用于划分训练集和测试集。
2. 加载Iris数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 我们只取前两个特征:花萼长度和花萼宽度
y = iris.target
datasets.load_iris()
:加载鸢尾花数据集,它包含150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),分成三类(Iris-setosa, Iris-versicolor, Iris-virginica)。X = iris.data[:, :2]
:我们只使用前两个特征(花萼长度和花萼宽度),这样数据就变成了二维数据,方便在平面上进行可视化。
所以在二维平面上,我们就可以通过一条线来区分两类数据了!y = iris.target
:获取目标变量(标签),即样本的类别标签,0代表Iris-setosa,1代表Iris-versicolor,2代表Iris-virginica。
3. 选择两个类别并筛选数据
X = X[y != 2] # 只取类别0和1
y = y[y != 2]
X = X[y != 2]
:我们只取类别0和类别1的数据(即鸢尾花的前两类),剔除类别2(Iris-virginica)。y = y[y != 2]
:相应地,更新目标变量,去掉类别2。
4. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
train_test_split
:用于将数据集分为训练集和测试集。训练集用于训练模型,测试集用于评估模型。test_size=0.3
:设置测试集占数据的30%,剩余的70%用于训练。random_state=42
:设置随机种子,确保每次运行时数据集的划分都是一致的,便于调试。
5. 创建SVM分类器
clf = SVC(kernel='linear') # 选择线性核函数(Linear Kernel)
SVC(kernel='linear')
:创建一个线性核的支持向量机分类器。kernel='linear'
表示我们使用线性核函数来拟合数据。对于线性可分的数据,线性核会找到一个平面将数据分开。
6. 训练模型
clf.fit(X_train, y_train)
fit(X_train, y_train)
:使用训练集数据训练SVM模型。X_train
是特征数据,y_train
是目标标签。
7. 可视化数据点和决策边界
plt.figure(figsize=(8, 6))
# 绘制训练数据点
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='coolwarm', s=50, edgecolors='k')
plt.figure(figsize=(8, 6))
:创建一个大小为8x6英寸的图形窗口。plt.scatter
:绘制散点图。X_train[:, 0]
和X_train[:, 1]
分别表示数据集中的两个特征(花萼长度和花萼宽度)。c=y_train
根据目标变量的值(0或1)给数据点上色,cmap='coolwarm'
指定颜色的渐变,s=50
表示数据点的大小,edgecolors='k'
为数据点添加黑色边框。
# 绘制决策边界
ax = plt.gca()
x_min, x_max = ax.get_xlim()
y_min, y_max = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='black')
plt.gca()
:获取当前坐标轴对象(ax
),以便绘制决策边界。ax.get_xlim()
和ax.get_ylim()
:获取当前坐标轴的最小和最大x、y值,以确定绘制网格的范围。np.meshgrid()
:创建一个二维网格,xx
和yy
分别是网格的x坐标和y坐标。clf.decision_function()
:计算决策函数的值,即分类模型对于每个网格点的输出。np.c_[xx.ravel(), yy.ravel()]
将网格点的x和y坐标合并成一个二维数组。plt.contour()
:绘制等高线图,levels=[0]
表示绘制决策边界(决策函数值为0的地方),linewidths=2
指定线宽,colors='black'
指定决策边界的颜色。
# 显示图形
plt.title('SVM Linear Kernel Decision Boundary')
plt.xlabel('Feature 1 (Sepal Length)')
plt.ylabel('Feature 2 (Sepal Width)')
plt.show()
plt.title()
、plt.xlabel()
、plt.ylabel()
:为图形添加标题和轴标签。plt.show()
:显示图形。
8. 预测并评估模型
y_pred = clf.predict(X_test)
accuracy = np.mean(y_pred == y_test)
print(f"模型在测试集上的准确率: {accuracy:.2f}")
clf.predict(X_test)
:使用训练好的SVM模型对测试集进行预测。np.mean(y_pred == y_test)
:计算预测结果与真实结果(y_test
)之间的准确率。y_pred == y_test
是一个布尔数组,表示每个预测是否正确,np.mean()
计算布尔数组的平均值,即正确预测的比例。print()
:输出模型在测试集上的准确率。
调试建议
-
检查数据:确保输入数据(
X_train
、y_train
、X_test
、y_test
)的形状和类型是否正确。- 可以使用
print(X_train.shape)
和print(y_train.shape)
查看数据的维度。
- 可以使用
-
查看SVM模型参数:可以尝试调整SVM模型的参数,比如
C
(正则化参数)和gamma
(核函数的参数),看看如何影响模型表现。- 例如:
clf = SVC(kernel='linear', C=1, gamma='scale')
。
- 例如:
-
可视化调试:通过
plt.scatter()
和plt.contour()
可以查看数据分布和决策边界是否符合预期。 -
查看支持向量:可以通过
clf.support_
查看哪些数据点是支持向量,进一步分析模型是如何构建决策边界的。
如果有任何进一步的问题或调试困难,请告诉我!
输出结果
- 模型会输出测试集的准确率,这表示SVM模型对新数据的分类效果。
- 图形展示了不同颜色的数据点,分别代表不同的类别(苹果和橙子),以及SVM计算出的决策边界。
结果分析
- 你会看到,SVM通过训练数据学习出了一条线,这条线尽量让不同类别的数据点分开,离线最近的点(也就是支持向量)对决策边界的确定起了决定性作用。
通过这种方式,SVM可以帮助我们解决分类问题,找到最优的分类边界。如果你对核函数(比如线性核、多项式核、RBF核)感兴趣,可以进一步去学习如何使用不同的核函数来处理更复杂的非线性问题。