- 机器学习基础
- ML - 首页
- ML - 简介
- ML - 入门
- ML - 基本概念
- ML - 生态系统
- ML - Python 库
- ML - 应用
- ML - 生命周期
- ML - 必备技能
- ML - 实现
- ML - 挑战与常见问题
- ML - 限制
- ML - 现实生活中的例子
- ML - 数据结构
- ML - 数学
- ML - 人工智能
- ML - 神经网络
- ML - 深度学习
- ML - 获取数据集
- ML - 分类数据
- ML - 数据加载
- ML - 数据理解
- ML - 数据准备
- ML - 模型
- ML - 监督学习
- ML - 无监督学习
- ML - 半监督学习
- ML - 强化学习
- ML - 监督学习与无监督学习
- 机器学习数据可视化
- ML - 数据可视化
- ML - 直方图
- ML - 密度图
- ML - 箱线图
- ML - 相关矩阵图
- ML - 散点矩阵图
- 机器学习统计学
- ML - 统计学
- ML - 平均值、中位数、众数
- ML - 标准差
- ML - 百分位数
- ML - 数据分布
- ML - 偏度和峰度
- ML - 偏差和方差
- ML - 假设
- ML中的回归分析
- ML - 回归分析
- ML - 线性回归
- ML - 简单线性回归
- ML - 多元线性回归
- ML - 多项式回归
- ML中的分类算法
- ML - 分类算法
- ML - 逻辑回归
- ML - K近邻算法 (KNN)
- ML - 朴素贝叶斯算法
- ML - 决策树算法
- ML - 支持向量机
- ML - 随机森林
- ML - 混淆矩阵
- ML - 随机梯度下降
- ML中的聚类算法
- ML - 聚类算法
- ML - 基于质心的聚类
- ML - K均值聚类
- ML - K中心点聚类
- ML - 均值漂移聚类
- ML - 层次聚类
- ML - 基于密度的聚类
- ML - DBSCAN聚类
- ML - OPTICS聚类
- ML - HDBSCAN聚类
- ML - BIRCH聚类
- ML - 亲和传播
- ML - 基于分布的聚类
- ML - 凝聚层次聚类
- ML中的降维
- ML - 降维
- ML - 特征选择
- ML - 特征提取
- ML - 后退消除法
- ML - 前向特征构建
- ML - 高相关性过滤器
- ML - 低方差过滤器
- ML - 缺失值比率
- ML - 主成分分析
- 强化学习
- ML - 强化学习算法
- ML - 利用与探索
- ML - Q学习
- ML - REINFORCE算法
- ML - SARSA强化学习
- ML - 演员-评论家方法
- 深度强化学习
- ML - 深度强化学习
- 量子机器学习
- ML - 量子机器学习
- ML - 使用Python的量子机器学习
- 机器学习杂项
- ML - 性能指标
- ML - 自动工作流
- ML - 提升模型性能
- ML - 梯度提升
- ML - 自举汇聚 (Bagging)
- ML - 交叉验证
- ML - AUC-ROC曲线
- ML - 网格搜索
- ML - 数据缩放
- ML - 训练和测试
- ML - 关联规则
- ML - Apriori算法
- ML - 高斯判别分析
- ML - 成本函数
- ML - 贝叶斯定理
- ML - 精确率和召回率
- ML - 对抗性
- ML - 堆叠
- ML - 轮次
- ML - 感知器
- ML - 正则化
- ML - 过拟合
- ML - P值
- ML - 熵
- ML - MLOps
- ML - 数据泄露
- ML - 机器学习的盈利化
- ML - 数据类型
- 机器学习 - 资源
- ML - 快速指南
- ML - 速查表
- ML - 面试问题
- ML - 有用资源
- ML - 讨论
机器学习 - 支持向量机
支持向量机 (SVM) 是一种强大而灵活的监督式机器学习算法,可用于分类和回归。但通常,它们用于分类问题。SVM 最初在 1960 年代被提出,并在 1990 年代得到了改进。与其他机器学习算法相比,SVM 具有独特的实现方式。如今,由于其能够处理多个连续和分类变量,因此它们非常受欢迎。
SVM 的工作原理
SVM 的目标是找到一个超平面,将数据点分成不同的类别。超平面在 2D 空间中是一条线,在 3D 空间中是一个平面,在 n 维空间中是一个更高维度的表面。超平面的选择方式是最大化间隔,即超平面与每个类别最近数据点之间的距离。最近的数据点称为支持向量。
可以使用以下公式计算超平面与数据点“x”之间的距离:
distance = (w . x + b) / ||w||
其中“w”是权重向量,“b”是偏置项,“||w||”是权重向量的欧几里得范数。权重向量“w”垂直于超平面并决定其方向,而偏置项“b”决定其位置。
最优超平面是通过解决一个优化问题找到的,该问题是在所有数据点都被正确分类的约束下最大化间隔。换句话说,我们希望找到最大化两类之间间隔的超平面,同时确保没有数据点被错误分类。这是一个凸优化问题,可以使用二次规划来解决。
如果数据点不是线性可分的,我们可以使用一种称为核技巧的技术将数据点映射到更高维的空间,在该空间中它们变得可分。核函数计算映射数据点之间的内积,而无需计算映射本身。这使我们能够在更高维的空间中处理数据点,而不会产生映射它们的计算成本。
让我们借助下图详细了解一下:
以下是 SVM 中的重要概念:
支持向量 - 最接近超平面的数据点称为支持向量。分离线将借助这些数据点定义。
超平面 - 正如我们在上图中看到的,它是一个决策平面或空间,它被分成一组具有不同类别的对象。
间隔 - 可以定义为不同类别最近数据点之间两条线之间的间隙。它可以计算为从线到支持向量的垂直距离。大间隔被认为是好的间隔,小间隔被认为是坏的间隔。
Python 实现
我们将使用 scikit-learn 库在 Python 中实现 SVM。Scikit-learn 是一个流行的机器学习库,它提供了广泛的算法用于分类、回归、聚类和降维任务。
我们将使用著名的 Iris 数据集,其中包含三种鸢尾花(山鸢尾、杂色鸢尾和弗吉尼亚鸢尾)的花萼长度、花萼宽度、花瓣长度和花瓣宽度。目标是根据这四个特征将花卉分类到各自的种类中。
示例
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import accuracy_score # load the iris dataset iris = load_iris() # split the data into training and testing sets X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42) # create an SVM classifier with a linear kernel svm = SVC(kernel='linear') # train the SVM classifier on the training set svm.fit(X_train, y_train) # make predictions on the testing set y_pred = svm.predict(X_test) # calculate the accuracy of the classifier accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy)
我们首先从 scikit-learn 导入必要的模块:load_iris 用于加载 iris 数据集,train_test_split 用于将数据分成训练集和测试集,SVC 用于创建具有线性核的 SVM 分类器,以及accuracy_score 用于计算分类器的准确率。
我们使用load_iris加载 iris 数据集,并使用train_test_split将数据分成训练集和测试集。我们使用 0.2 的测试大小,这意味着 20% 的数据将用于测试,80% 用于训练。我们将随机状态设置为 42 以确保结果的可重复性。
我们使用SVC(kernel='linear')创建一个具有线性核的 SVM 分类器。然后我们使用svm.fit(X_train, y_train)在训练集上训练 SVM 分类器。
训练完分类器后,我们使用svm.predict(X_test)对测试集进行预测。然后我们使用accuracy_score(y_test, y_pred)计算分类器的准确率,并将其打印到控制台。
输出
代码的输出应该类似于以下内容:
Accuracy: 1.0
调整 SVM 参数
在实践中,SVM 通常需要调整其参数以获得最佳性能。需要调整的最重要的参数是核函数、正则化参数 C 和特定于核函数的参数。
核函数参数决定了要使用的核函数类型。最常见的核函数类型是线性、多项式、径向基函数 (RBF) 和 sigmoid。线性核用于线性可分数据,而其他核用于非线性可分数据。
正则化参数 C 控制最大化间隔和最小化分类误差之间的权衡。较高的 C 值意味着分类器将尝试以较小间隔为代价最小化分类误差,而较低的 C 值意味着分类器将尝试最大化间隔,即使这意味着更多的错误分类。
特定于核函数的参数取决于所使用的核函数类型。例如,多项式核具有多项式次数和多项式系数的参数,而 RBF 核具有高斯函数宽度的参数。
我们可以使用交叉验证来调整 SVM 的参数。交叉验证包括将数据分成几个子集,并在每个子集上训练分类器,同时使用其余子集进行测试。这使我们能够评估分类器在数据不同子集上的性能,并选择最佳参数集。
示例
from sklearn.model_selection import GridSearchCV # define the parameter grid param_grid = { 'C': [0.1, 1, 10, 100], 'kernel': ['linear', 'poly', 'rbf', 'sigmoid'], 'degree': [2, 3, 4], 'coef0': [0.0, 0.1, 0.5], 'gamma': ['scale', 'auto'] } # create an SVM classifier svm = SVC() # perform grid search to find the best set of parameters grid_search = GridSearchCV(svm, param_grid, cv=5) grid_search.fit(X_train, y_train) # print the best set of parameters and their accuracy print("Best parameters:", grid_search.best_params_) print("Best accuracy:", grid_search.best_score_)
我们首先从 scikit-learn 导入GridSearchCV模块,它是一个用于对一组参数执行网格搜索的工具。我们定义一个参数网格,其中包含我们要调整的每个参数的可能值。
我们使用SVC()创建一个 SVM 分类器,然后将其与参数网格和交叉验证折叠次数 (cv=5) 一起传递给GridSearchCV。然后我们调用grid_search.fit(X_train, y_train)执行网格搜索。
网格搜索完成后,我们分别使用grid_search.best_params_和grid_search.best_score_打印最佳参数集及其准确率。
输出
执行此程序后,您将获得以下输出:
Best parameters: {'C': 0.1, 'coef0': 0.5, 'degree': 3, 'gamma': 'scale', 'kernel': 'poly'} Best accuracy: 0.975
这意味着网格搜索找到的最佳参数集为:C=0.1,coef0=0.5,degree=3,gamma=scale,以及kernel=poly。这组参数在训练集上达到的准确率为97.5%。
您现在可以使用这些参数创建一个新的SVM分类器,并在测试集上测试其性能。