Python SVM(支持向量机)实现方法完整示例

  

Python SVM(支持向量机)实现方法完整示例

本文介绍如何使用Python实现SVM(支持向量机)分类器。将会涵盖以下内容:

  • SVM的基本概念
  • SVM的实现方法
  • SVM的参数调整
  • 实现一个SVM分类器的完整示例

SVM的基本概念

SVM是一种强有力的、灵活的、可用于分类、回归和异常检测的机器学习算法。SVM基于找到一个最优的超平面来区分两个或多个类别。超平面是将数据分成两部分的一个n-1维度的平面,其中n是特征的数量。SVM的目标是找到一个距离超平面最远的点,被称为“支持向量”,它们赋予超平面分离数据的能力。

SVM分类器可以使用不同类型的核函数来处理不同类型的数据。常见的核函数有线性核、多项式核、径向基核和sigmoid核。这些核函数允许SVM处理线性可分和线性不可分的数据。

SVM的实现方法

我们可以使用Python中的scikit-learn库来实现SVM分类器。scikit-learn提供了多个SVM实现,包括SVC,NuSVC和LinearSVC。其中最常用的是SVC。我们主要使用SVC来实现SVM分类器。

以下是使用SVC来实现SVM分类器的一般步骤:

  1. 加载数据
  2. 准备数据
  3. 拟合SVM模型
  4. 计算准确性
  5. 调整参数

SVM的参数调整

SVM模型有多个参数,包括C、kernel和gamma。这些参数对于模型的性能至关重要,因此需要进行调整。

  • C:正则化参数。C越大,表示对分类错误的惩罚越严重,模型趋于复杂(可能会导致过拟合);C越小,表示对分类错误的惩罚越轻,模型趋于简单(可能会导致欠拟合)。
  • kernel:核函数。可以使用不同类型的核函数来处理不同类型的数据。常用的核函数有"linear"(线性核),"rbf"(径向基函数)、"poly"(多项式)和"sigmoid"(sigmoid函数)等。
  • gamma:核函数参数。影响核函数的宽度。如果gamma值较大,则高斯核函数在近邻样本中的权重下降得较快,决策边界会更加不规则,模型趋于复杂(可能会导致过拟合);如果gamma值较小,则高斯核函数在近邻样本中的权重下降得较慢,决策边界会更加平滑,模型趋于简单(可能会导致欠拟合)。

实现一个SVM分类器的完整示例

以下是实现SVM分类器的完整示例。假设有一个二分类问题,我们想使用SVM分类器将数据分成两部分。

加载数据

我们使用鸢尾花数据集作为示例数据,该数据集包括150组数据,每组包括4个特征。我们将数据集分成训练集和测试集。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X = iris.data
y = iris.target

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

准备数据

我们使用数据进行训练和测试之前,需要将特征进行标准化处理,确保每个特征都在相同的范围内。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

拟合SVM模型

我们将使用SVC模型。在这个例子中,我们将使用径向基核函数,并将正则化参数C设置为1和gamma设置为0.1。

from sklearn.svm import SVC

svm = SVC(kernel='rbf', C=1, gamma=0.1)
svm.fit(X_train, y_train)

计算准确性

我们将创建一个函数来计算分类器的准确性。

from sklearn.metrics import accuracy_score

def get_accuracy(y_true, y_pred):
    accuracy = accuracy_score(y_true, y_pred)
    print("Accuracy: {:.2f}%".format(accuracy*100))
    return accuracy

然后将训练集数据输入模型,获取训练集上的预测标签,并计算准确性。

y_train_pred = svm.predict(X_train)
get_accuracy(y_train, y_train_pred)

最后,在测试集数据上计算准确性。

y_test_pred = svm.predict(X_test)
get_accuracy(y_test, y_test_pred)

调整参数

根据预测准确性的结果,我们可以尝试调整参数,以查找最佳性能。我们可以使用GridSearchCV来实现自动化参数调整。

from sklearn.model_selection import GridSearchCV

param_grid = {'C': [0.1, 1, 10], 'gamma': [0.1, 1, 10], 'kernel': ['rbf']}
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=3)
grid.fit(X_train, y_train)
print(grid.best_params_)

这将返回最佳参数选项,我们可以将其输入模型,并重新计算其在训练集和测试集上的准确性。

相关文章