Python支持向量机介绍及实例

239 阅读6分钟

当涉及到机器学习算法的实施时,清单从线性回归到决策树开始。它们有各种类型。主要是当它涉及到沿线性轴分离数据点时,专家们的建议是:

  1. K-means聚类。
  2. 支持向量机。

我们都知道,一个ML模型有两种类型:

  1. 监督学习。需要一个指南来选择程序员的输入数据。
  2. 无监督学习。不需要指导来选择输入数据。它是一个自我学习的模型。

一般理论

这篇文章的主要目的是让读者了解SVM技术的工作原理。在互联网上,数据是以原始形式提供的。因此,当我们对数据进行结构化和可视化时,其结果是离散或连续分布。根据这一点,SVM被用于两个目的:

  1. 分类。用于离散的数据参数。
  2. 回归。用于连续数据参数。

这是支持向量机被高度用于分类和回归目的的主要原因之一。定义是这样说的。支持向量机是一组学习算法,帮助我们对数据的性质进行分类和分析。

SVM的组成部分

  1. 支持向量。这些是主要的组成部分。它们是位于最大边际两边的简单数据点。
  2. 最大余量。直到数据分类发生的最大极限。
  3. 最大裕度超平面。位于正超平面和负超平面之间的最大中限值。
  4. 阳性超平面。边缘平面的右侧。
  5. 负超平面。边缘平面的左侧。

图解

简化的SVM图

在这个图中,我们可以清楚地看到,主要的边距是根据颜色来区分所有不同的数据点。我们用颜色来显示它们的差异性质。SVM的主要目的是显示区别,并以最佳的边际线对每个点进行分类。

例子和应用

假设我们有一个类别:车辆我们的任务是从该类中提取运动型多功能车(SUV)。 现在还有其他各种类型。现在,当我们试图手动排列它们的顺序时,那么可能会花费很多时间。这也会产生一些错误。因此,为了使分类更加稳定,我们可以创建一个支持向量机,将所有的汽车模型从父类车辆中分类。它应按以下步骤工作。

  1. 该模型将采取一个样本图像。
  2. 然后将其与已经提供的车辆类型的测试数据进行比较。
  3. 之后,它告诉我们该输入图像中存在哪种类型的汽车模型。
  4. 没有其他算法能比SVM更简单了。

实现支持向量机

在本节中,我们将实现支持向量机的所有必要实现。所以,让我们开始吧!

环境细节。

  1. Python 3.9.7
  2. IDE。Jupyter Notebooks
  3. 环境。Anaconda 3
  4. 数据集。癌症数据集(cell_samples.csv)。

为数据读取和预处理导入必要的库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from warnings import filterwarnings
filterwarnings("ignore")

读取数据集

cancer_data = pd.read_csv("Datasets/cell_samples.csv", sep = ",")
cancer_data.head()

输出

检查是否有空值

cancer_Data.isna().sum()

获取关于数据集的一般信息

print("The shape of the dataset is: ", cancer_data.shape)
print("The size of the dataset is: ", cancer_data.size, " bytes\n")
print("The count of each attribute of the dataset is: \n")
print(cancer_data.count())
print("\nThe datatype of each attribute is: \n")
print(cancer_data.dtypes)

输出

The shape of the dataset is:  (699, 11)
The size of the dataset is:  7689  bytes

The count of each attribute of the dataset is: 

ID             699
Clump          699
UnifSize       699
UnifShape      699
MargAdh        699
SingEpiSize    699
BareNuc        699
BlandChrom     699
NormNucl       699
Mit            699
Class          699
dtype: int64

The datatype of each attribute is: 

ID              int64
Clump           int64
UnifSize        int64
UnifShape       int64
MargAdh         int64
SingEpiSize     int64
BareNuc        object
BlandChrom      int64
NormNucl        int64
Mit             int64
Class           int64
dtype: object

将BareNuc列转换为整数类型

cancer_data = cancer_data[pd.to_numeric(cancer_data["BareNuc"], errors = "coerce").notnull()]
cancer_data["BareNuc"] = cancer_data["BareNuc"].astype("int")
cancer_data.dtypes

ID             int64
Clump          int64
UnifSize       int64
UnifShape      int64
MargAdh        int64
SingEpiSize    int64
BareNuc        int32
BlandChrom     int64
NormNucl       int64
Mit            int64
Class          int64
dtype: object

从数据框中分离出两个类别

对于癌细胞类型分类,我们有两种类型的细胞进行分类:

  1. 恶性的:在我们的数据集中数值=4
  2. 良性:在我们的数据集中,数值=2

我们创建两个相同名称的独立数据框。然后,尝试用数据可视化技术对它们进行分类。只取核心数据集中的前五十个值。这使得绘图更容易。

malignant = cancer_data[cancer_data["Class"] == 4][0:50]
benign = cancer_data[cancer_data["Class"] == 2][0:50]

plt.figure(figsize = (10, 5))
ax = plt.axes()
ax.set_facecolor("white")
plt.title("Separating the data points - Clump and UniformShape")
plt.scatter(malignant["Clump"], malignant["UnifShape"] , color = "red", marker = "*")
plt.scatter(benign["Clump"], benign["UnifShape"], color = "green", marker = "+")
plt.legend(["Malignant cell class", "Benign cell class"])
plt.show()

用它们的numpy数组创建独立和依赖数据列列表。

dependent_data = cancer_data[["ID", "Class"]]
independent_data = cancer_data[['Clump', 'UnifSize', 'UnifShape', 'MargAdh', 'SingEpiSize',
       'BareNuc', 'BlandChrom', 'NormNucl', 'Mit']]

X_data = np.array(independent_data)
X_data[0:5]

Y_data = np.array(dependent_data["Class"])
Y_data[0:5]

输出

array([[ 5,  1,  1,  1,  2,  1,  3,  1,  1],
       [ 5,  4,  4,  5,  7, 10,  3,  2,  1],
       [ 3,  1,  1,  1,  2,  2,  3,  1,  1],
       [ 6,  8,  8,  1,  3,  4,  3,  7,  1],
       [ 4,  1,  1,  3,  2,  1,  3,  1,  1]], dtype=int64)

array([2, 2, 2, 2, 2], dtype=int64)

将数据分割成训练变量和测试变量

从sklearn.model_selection导入train_test_split函数。这就把数据分成了四个数组:

  1. X_train
  2. X_test
  3. y_train
  4. y_test

在这些数组中,训练数组是一维的,测试数组是一维的。请记住test_size = 0.2,因为我们只需要总数据集的20%来测试我们的模型准确性。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_data, Y_data, test_size = 0.2, random_state = 4)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

输出

(546, 9)
(546,)
(137, 9)
(137,)

从sklearn导入SVM并创建一个分类器实例

首先我们导入模型,然后我们导入SVC。它是用于分离支持向量的分类器类。创建一个实例 "Classify"。给出内核值为 "线性",它将线性地分离支持向量。然后我们用fit()函数将X_train数据和Y_train数据装入模型。之后,创建一个 "y_predict "实例,它在一个一维数组中保存所有的预测结果。

from sklearn import svm
classify = svm.SVC(kernel = "linear")
Classify.fit(X_train, y_train)
y_predict = Classify.predict(X_test)
print(y_predict)

输出

array([2, 4, 2, 4, 2, 2, 2, 2, 4, 2, 2, 4, 4, 4, 4, 2, 2, 2, 2, 2, 4, 2,
       4, 4, 4, 4, 2, 2, 4, 4, 4, 2, 4, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4,
       4, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 4, 4, 2, 4, 4,
       4, 2, 2, 2, 4, 4, 2, 2, 2, 4, 2, 2, 4, 4, 2, 2, 2, 2, 4, 4, 2, 4,
       2, 2, 4, 4, 2, 2, 2, 4, 2, 2, 2, 4, 2, 4, 2, 2, 4, 2, 4, 2, 2, 4,
       2, 2, 4, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, 4, 2, 2, 4, 2, 4, 2,
       2, 2, 2, 2, 4], dtype=int64)

因此,我们已经成功地将所有癌症患者和非癌症患者分开。有4个值的细胞是癌细胞,有2个是非癌细胞。现在,我们已经得到了预测结果,我们可以对照Y_test数组运行它们,以检查模型的准确性。为此,我们可以准备一份分类报告。

准备分类报告

为此,我们需要从sklearn.metrics模块导入 classification_report 函数。然后在print()函数中调用它。我们用我们的Y_test数组测试它,结果如下。

from sklearn.metrics import classification_report
print(classification_report(y_test, y_predict))

输出

                   precision    recall  f1-score   support

           2       1.00           0.94      0.97        90
           4       0.90           1.00      0.95        47

accuracy                           0.96       137
macro avg       0.95      0.97      0.96       137
weighted avg       0.97      0.96      0.96       137


正如结果所说,该模型的精度非常好。对于恶性肿瘤类(值=4)。精度得分是:100%。对于良性类(值=2),精度得分是:90%。

结论

这样,我们已经成功地使用Python实现了支持向量机,并根据给定的输入数据建立了一个预测模型。