一、什么是SVM分类器?
在讲解SVM分类器之前,我们先来回顾一下最基本的分类问题。分类是机器学习中最常见的问题之一,而二分类问题则是其中最为经典的。我们的目的是将一组数据划分为两个不同的类别,并且保证分类的准确率尽量高。现实生活中,有很多分类问题不能够被解决,因为数据的特征非常复杂,或者数据本身就非常杂乱。在这种情况下,SVM(support vector machine,支持向量机)分类器可以帮助我们。
对于一般的二分类问题,SVM分类器的基本思路就是在不同类别的数据点之间划出一个超平面,让数据点与超平面的距离尽量大,从而实现分类。在SVM分类器中,我们将离这个超平面最近的一些点叫做“支持向量”,它们是分割超平面的重要组成部分。SVM分类器的主要优点是:当你有大量特征时,它可以通过使用核函数来处理高维数据,从而在分类问题上表现良好。
下面,我们来看一下如何使用sklearn中的SVM分类器。
二、如何使用SVM分类器?
使用SVM分类器的第一步是导入必要的工具包,以及准备好我们需要使用的数据集和相关的模块。以下是一些基础的导入代码:
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import numpy as np
其中,我们需要用到的数据集是威斯康辛州乳腺癌诊断数据集,它包含了569个样本,每个样本有30个特征。数据的标签是M(恶性)和B(良性),我们需要对这些样本进行分类。使用sklearn提供的datasets中的load_breast_cancer可以很快地导入这个数据集:
cancer = datasets.load_breast_cancer()
X = cancer.data
y = cancer.target
接下来,我们需要将数据集划分为训练集和测试集,用于模型的训练和预测。在这里,我们采用test_size=0.3,即将70%的数据作为训练集,30%的数据作为测试集。同时,我们使用了数据标准化,这是为了保证SVM分类器的支持向量在这些数据上比较均匀的分散,避免某些特征和样本对分类结果产生过大的影响。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="rbf", C=0.1, probability=True))
])
clf.fit(X_train, y_train)
其中,SVC这个类就是我们将要使用的SVM分类器。在这里,我们使用的参数是rbf(径向基函数,可以处理非线性问题)和C=0.1(正则化参数),即在分割超平面的准确率和支持向量之间进行平衡。
三、评估SVM分类器的准确率
当我们完成了SVM分类器的训练之后,最后一个重要的步骤是评估模型的准确率。在这里,我们使用了准确率,AUC和ROC曲线等指标来评价模型。对于某个二分类问题而言,AUC描述的是模型正确地区分正负样本的能力,而ROC曲线则描述了改变分类阈值对分类器的分类能力造成的影响。
from sklearn.metrics import accuracy_score, roc_auc_score, roc_curve
y_pred = clf.predict(X_test)
y_proba = clf.predict_proba(X_test)[:, 1]
acc = accuracy_score(y_test, y_pred)
auc = roc_auc_score(y_test, y_proba)
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
以上代码展示了如何使用sklearn来计算SVM分类器的准确率和ROC曲线。y_pred是预测的测试集标签,y_proba是预测标签为1的置信度,即概率。其中,accuracy_score计算的是精度,roc_auc_score计算的是AUC值。
四、优化SVM分类器
最后,我们来看一下如何优化SVM分类器。优化方法有很多,但是针对SVM分类器而言,有以下几种。
1、改变核函数类型
通常情况下,径向基函数是最为常见的核函数类型。但是,有时候考虑使用多项式核函数或者sigmoid核函数等也是有一定收益的。
clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="sigmoid", C=0.1, gamma=1.0, coef0=0.0))
])
2、改变正则化参数C、核函数宽度gamma等参数
通过改变正则化参数C或者核函数宽度gamma等参数,可以让SVM分类器更加适应性强或者更加专业化。
clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="rbf", C=10, gamma=0.1, probability=True))
])
3、使用GridSearchCV进行模型调优
GridSearchCV是sklearn中的一个模型调优工具,可以帮助我们尽快地找到最佳的模型参数,从而达到快速优化SVM分类器的效果。
from sklearn.model_selection import GridSearchCV
parameters = {'kernel': ['rbf'], 'C': [0.1, 1, 10], 'gamma': [0.1, 1, 10]}
svc = svm.SVC(probability=True)
clf = GridSearchCV(svc, parameters, n_jobs=-1, cv=5)
clf.fit(X_train, y_train)
以上就是SVM分类器的基础知识和使用方法。SVM分类器能够在许多不同的二分类问题上表现良好,但是在处理一些高维、非线性或者数据分布不平衡的问题时,可能需要使用其他的分类器或者优化策略。通过持续地学习,相信大家一定能够在实际应用中灵活地使用SVM分类器或者其他分类器,从而更好地解决各种分类问题。