在机器学习领域,分类是一个常见的任务,它涉及到预测给定输入数据的多类分类变量。例如,垃圾邮件检测、情感分析、动物品种分类等都是分类问题的例子。本文将重点介绍支持向量机(SVM)算法,这是一种流行的分类算法。
支持向量机(SVM),也称为支持向量网络,是一种用于分类和回归问题的监督学习算法。SVM通过在高维空间中寻找一个超平面(决策边界)来区分不同类别的数据点。这个超平面被称为最大边界超平面,因为它最大化了两个类别之间的距离,这个距离被称为边界宽度或边界。
超平面:在n维欧几里得空间中,超平面是一个将数据点明显分隔开的决策边界。如果特征集是p维的,那么超平面的维度将是p-1。
支持向量:靠近超平面的个别数据点被称为支持向量。
边界:边界的宽度是指在不触及数据点的情况下可以增加的宽度。简单来说,超平面与支持向量之间的距离被称为边界。
如果至少存在一条线可以清晰地区分类别,则称数据集是线性可分的。如果不存在一条线可以清晰地区分类别,则称数据集是非线性可分的。
在SVM中,有限维空间中的数据被映射到更高维度的空间,并寻找一个p-1维的超平面,称为线性分类器。如果数据是线性可分的,SVM不仅找到p-1维的超平面,还创建两个平行的超平面,它们通过最近的数据线(支持向量)。这两个超平面之间的区域被称为边界。
可以画出许多这样的超平面来对数据进行分类。最稳定的超平面是具有最大边界的超平面。边界是两个类别之间的距离。具有最大边界的超平面被称为最大边界超平面,它定义的分类器被称为最大边界分类器。
如果数据是非线性可分的,不能使用线性超平面来分离两个类别。在这种情况下,SVM如何解决这个问题呢?如果数据是非线性可分的,需要应用变换,将原始数据映射到更高维度的空间。变换后,数据将变为线性可分的,可以轻松地找到超平面/决策边界来分类。
如果特征数量可控,可以尝试一些变换技术,将非线性数据转换为线性可分的。但如果有成千上万的特征呢?计算时间会大大增加,手动处理所有这些特征在人力上是不可能的。因此,可以通过一个关键特性——核技巧来实现。
!pip install pandas sklearn
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
dataset_url = "https://raw.githubusercontent.com/harika-bonthu/SupportVectorClassifier/main/datasets_229906_491820_Fish.csv"
fish = pd.read_csv(dataset_url)
X = fish.drop(['Species'], axis='columns')
y = fish.Species
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = SVC(kernel='linear', C=1)
model.fit(X_train, y_train)
svm_pred = model.predict(X_test)
accuracy = model.score(X_test, y_test)