使用 Python 的 Scikit-Learn 实现其他 SVM 风格

使用 Python 的 Scikit-Learn 实现其他 SVM 风格

介绍

本指南是有关支持向量机 (SVM) 的三个指南的第三部分,也是最后一部分。 在本指南中,我们将继续处理伪造钞票的用例,快速回顾 SVM 背后的一般思想,了解什么是内核技巧,并使用 Scikit-Learn 实现不同类型的非线性内核。

在完整的 SVM 指南系列中,除了了解其他类型的 SVM 之外,您还将了解简单的 SVM、SVM 预定义参数、C 和 Gamma 超参数以及如何使用网格搜索和交叉验证调整它们。

如果你想阅读之前的指南,你可以看看前两个指南,或者看看你最感兴趣的主题。 下表是每份指南中涵盖的主题:

  1. 用Python的Scikit-Learn实现SVM和Kernel SVM
  • 用例:忘记钞票
  • SVM 的背景
  • 简单(线性)SVM 模型
    • 关于数据集
    • 导入数据集
    • 探索数据集
  • 使用 Scikit-Learn 实现 SVM
    • 将数据划分为训练/测试集
    • 训练模型
    • 做出预测
    • 评估模型
    • 解释结果
  1. 了解 SVM 超参数
  • C超参数
  • Gamma 超参数

3. 使用 Python 的 Scikit-Learn 实现其他 SVM 风格

  • SVM 的总体思路(回顾)
  • 内核(技巧)SVM
  • 使用 Scikit-Learn 实现非线性核 SVM
  • 导入库
    • 导入数据集
    • 将数据划分为特征 (X) 和目标 (y)
    • 将数据划分为训练/测试集
    • 训练算法
  • 多项式内核
    • 做出预测
    • 评估算法
  • 高斯核
    • 预测与评估
  • Sigmoid 内核
    • 预测与评估
  • 非线性内核性能比较

在看到一些有趣的 SVM 内核变体之前,让我们先记住 SVM 是什么。

SVM 的总体思路

在二维线性可分数据的情况下(如图 1 所示),典型的机器学习算法方法是尝试找到划分数据的边界,以使错误分类误差最小化。 如果仔细查看图 1,请注意可能有多个边界(无限)正确划分数据点。 两条虚线和实线都是数据的有效分类。

多重决策边界

图 1:多重决策边界

当 SVM 选择 决策边界,它选择一个边界,使它自己和最近的类数据点之间的距离最大化。 我们已经知道最近的数据点是支持向量,并且距离可以通过以下方式参数化 Cgamma 超参数。

在计算该决策边界时,该算法会选择要考虑的点数以及边距可以达到多远——这构成了边距最大化问题。 在解决边距最大化问题时,SVM 使用支持向量(如图 2 所示)并尝试找出使边距距离更大的最佳值,同时根据所使用的函数对更多点进行正确分类分离数据。

具有支持向量的决策边界

图 2:带有支持向量的决策边界

这就是 SVM 不同于其他分类算法的原因,一旦它不仅找到决策边界,而且最终找到最优决策边界。

找到支持向量、计算决策边界和支持向量之间的边距以及最大化该边距背后涉及的统计和计算方法涉及复杂的数学。 这一次,我们不会详细讨论数学是如何发挥作用的。

深入研究并确保机器学习算法不是某种神秘的咒语始终很重要,尽管此时不知道每个数学细节并不会也不会阻止您执行算法并获得结果。

建议: 现在我们已经回顾了算法过程,很明显数据点之间的距离会影响 SVM 选择的决策边界,因此, 缩放数据 使用 SVM 分类器时通常是必需的。 尝试使用 Scikit-learn 的 Standard Scaler 方法 准备数据,然后再次运行代码,看看结果是否有差异。

内核(技巧)SVM

在上一节中,我们记住并组织了 SVM 的一般概念——了解它如何用于为线性可分数据找到最佳决策边界。 然而,在非线性可分数据的情况下,如图 3 所示,我们已经知道直线不能用作决策边界。

非线性可分数据

图 3:非线性可分数据

相反,我们可以使用我们在开头讨论过的 SVM 的修改版本,称为 Kernel SVM。

基本上,内核支持向量机要做的是将低维的非线性可分数据投影到高维的相应形式。 这是一个技巧,因为当在更高维度上投影非线性可分离数据时,数据形状会发生变化,使其变得可分离。 例如,当考虑 3 个维度时,每个类的数据点最终可能会分配到不同的维度,使其可分离。 增加数据维度的一种方法是对其求幂。 同样,这涉及复杂的数学,但您不必为了使用 SVM 而担心它。 相反,我们可以使用 Python 的 Scikit-Learn 库来实现和使用非线性内核,就像我们使用线性内核一样。

使用 Scikit-Learn 实现非线性核 SVM

在本节中,我们将使用相同的数据集根据我们已知的四个特征来预测一张钞票是真实的还是伪造的。

您会看到其余步骤是典型的机器学习步骤,在我们到达训练非线性核 SVM 的部分之前不需要解释。

导入库

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split

导入数据集

data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()mes)

将数据划分为特征 (X) 和目标 (y)

X = bankdata.drop('class', axis=1)
y = bankdata['class']

将数据划分为训练/测试集

SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

训练算法

为了训练内核 SVM,我们将使用相同的 SVC Scikit-Learn 的类 svm 图书馆。 区别在于内核参数的值 SVC 类。

在简单 SVM 的情况下,我们使用“线性”作为内核参数的值。 然而,正如我们之前提到的,对于内核 SVM,我们可以使用高斯、多项式、S 型或可计算内核。 我们将实现多项式、高斯和 S 型核,并查看其最终指标,看看哪个指标似乎更适合我们的类。

1.多项式核

在代数中,多项式是以下形式的表达式:

$$
2a*b^3 + 4a – 9
$$

这有变量,例如 ab,常量,在我们的例子中, 9 和系数(常量伴随变量),例如 24。 该 3 被认为是多项式的次数。

当使用多项式函数时,可以最好地描述某些类型的数据,在这里,内核所做的是将我们的数据映射到我们将选择次数的多项式。 度数越高,函数越会尝试靠近数据,因此决策边界越灵活(也越容易过拟合)——度数越低,越不灵活。

查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!

因此,为了实施 多项式内核, 除了选择 poly 内核,我们还将传递一个值 degree 的参数 SVC 班级。 下面是代码:

from sklearn.svm import SVC
svc_poly = SVC(kernel='poly', degree=8)
svc_poly.fit(X_train, y_train)

做出预测

现在,一旦我们训练了算法,下一步就是对测试数据进行预测。

正如我们之前所做的那样,我们可以执行以下脚本来做到这一点:

y_pred_poly = svclassifier.predict(X_test)

评估算法

像往常一样,最后一步是对多项式内核进行评估。 由于我们已经将分类报告和混淆矩阵的代码重复了几次,所以让我们将其转换为一个函数 display_results 收到相关资料后 y_test, y_pred 以及 Seaborn 混淆矩阵的标题 cm_title:

def display_results(y_test, y_pred, cm_title): cm = confusion_matrix(y_test,y_pred) sns.heatmap(cm, annot=True, fmt='d').set_title(cm_title) print(classification_report(y_test,y_pred))

现在,我们可以调用该函数并查看使用多项式内核获得的结果:

cm_title_poly = "Confusion matrix with polynomial kernel"
display_results(y_test, y_pred_poly, cm_title_poly)

输出如下所示:

 precision recall f1-score support 0 0.69 1.00 0.81 148 1 1.00 0.46 0.63 127 accuracy 0.75 275 macro avg 0.84 0.73 0.72 275
weighted avg 0.83 0.75 0.73 275

使用 Python 的 Scikit-Learn PlatoBlockchain 数据智能实现其他 SVM 风格。垂直搜索。人工智能。

现在我们可以对高斯核和 sigmoid 核重复相同的步骤。

2.高斯核

要使用高斯内核,我们只需要将“rbf”指定为 kernel SVC类的参数:

svc_gaussian = SVC(kernel='rbf', degree=8)
svc_gaussian.fit(X_train, y_train)

在进一步探索这个内核时,你还可以使用网格搜索将它与不同的 Cgamma 值。

预测与评估

y_pred_gaussian = svc_gaussian.predict(X_test)
cm_title_gaussian = "Confusion matrix with Gaussian kernel"
display_results(y_test, y_pred_gaussian, cm_title_gaussian)

高斯核 SVM 的输出如下所示:

 precision recall f1-score support 0 1.00 1.00 1.00 148 1 1.00 1.00 1.00 127 accuracy 1.00 275 macro avg 1.00 1.00 1.00 275
weighted avg 1.00 1.00 1.00 275

使用 Python 的 Scikit-Learn PlatoBlockchain 数据智能实现其他 SVM 风格。垂直搜索。人工智能。

3.乙状结肠核

最后,让我们使用 sigmoid 内核来实现 Kernel SVM。 看看下面的脚本:

svc_sigmoid = SVC(kernel='sigmoid')
svc_sigmoid.fit(X_train, y_train)

要使用 sigmoid 内核,您必须将“sigmoid”指定为 kernel 的参数 SVC 类。

预测与评估

y_pred_sigmoid = svc_sigmoid.predict(X_test)
cm_title_sigmoid = "Confusion matrix with Sigmoid kernel"
display_results(y_test, y_pred_sigmoid, cm_title_sigmoid)

具有 Sigmoid 内核的内核 SVM 的输出如下所示:

 precision recall f1-score support 0 0.67 0.71 0.69 148 1 0.64 0.59 0.61 127 accuracy 0.65 275 macro avg 0.65 0.65 0.65 275
weighted avg 0.65 0.65 0.65 275

使用 Python 的 Scikit-Learn PlatoBlockchain 数据智能实现其他 SVM 风格。垂直搜索。人工智能。

非线性内核性能比较

如果我们简要比较不同类型非线性内核的性能,似乎 sigmoid 内核的指标最低,因此性能最差。

在高斯核和多项式核中,我们可以看到高斯核达到了完美的 100% 预测率——这通常是可疑的,可能表示过度拟合,而多项式核错误分类了 68 个 1 类实例。

因此,如果不进一步搜索超参数、了解每个函数形状、探索数据以及比较训练和测试结果以查看算法是否正确,则没有关于哪个内核在每个场景或我们当前场景中表现最好的硬性规定。正在概括。

这一切都是关于测试所有内核,并根据您的项目上下文选择具有参数和数据准备组合的内核,以提供预期结果。

走得更远——手持式端到端项目

你好奇的天性让你想走得更远? 我们建议查看我们的 指导项目: “动手房价预测 - Python 中的机器学习”.

使用 Python 的 Scikit-Learn PlatoBlockchain 数据智能实现其他 SVM 风格。垂直搜索。人工智能。

在这个指导项目中,您将学习如何构建强大的传统机器学习模型和深度学习模型,利用集成学习和训练元学习器从一包 Scikit-Learn 和 Keras 模型中预测房价。

使用基于 Tensorflow 构建的深度学习 API Keras,我们将试验架构,构建堆叠模型的集合并训练 元学习者 神经网络(一级模型)来计算房子的价格。

深度学习是惊人的——但在使用它之前,建议也尝试使用更简单的技术来解决问题,例如 浅层学习 算法。 我们的基准性能将基于 随机森林回归 算法。 此外——我们将探索通过 Scikit-Learn 通过以下技术创建模型集合 装袋表决.

这是一个端到端的项目,和所有机器学习项目一样,我们将从—— 探索性数据分析,其次是 数据预处理 最后 浅层建筑深度学习模型 以适应我们之前探索和清理过的数据。

结论

在本文中,我们快速回顾了 SVM,研究了内核技巧并实现了不同风格的非线性 SVM。

我建议您实现每个内核并继续前进。 您可以探索用于创建每个不同内核的数学、创建它们的原因以及它们的超参数差异。 通过这种方式,您将了解这些技术以及根据上下文和可用数据最适合应用哪种类型的内核。

清楚地了解每个内核的工作原理以及何时使用它们肯定会对您的旅程有所帮助。 让我们知道进展如何,编码愉快!

时间戳记:

更多来自 堆栈滥用