支持向量机(Support Vector Classifier)
根据训练样本的分布,搜索所有可能的线性分类器中最佳的那个。观察我们之间的分类图,我们会发现决定其直线位置的样本并不是所有数据,而是其中的两个空间间隔最小的的两个不同类别的数据点,我们把这种可以用来真正帮助决策最优线性分类模型的数据点叫做“支持向量”。
Logistic回归模型在训练过程中考虑了所有样本对数据对参数的影响,不一定获得最佳的分类器。
数据描述
手写数字图片分类任务
# 从sklearn.datasets里导入手写体数字加载器。
from sklearn.datasets import load_digits
# 从通过数据加载器获得手写体数字的数码图像数据并储存在digits变量中。
digits = load_digits()
# 检视数据规模和特征维度。
digits.data.shape
(1797, 64)
数据集中一共有1797张图片,每幅图由8*8=64像素矩阵表示。
在模型使用这些像素矩阵的时候,习惯将2D图像逐行首位拼接为1D的像素特征向量,也许会损失一些数据本身的结构信息,但是经典模型中都没有对结构性信息进行学习的能力。
# 从sklearn.model_selection导入train_test_split用于数据分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state = 33)
y_train.shape
(1347,)
y_test.shape
(450,)
# 从sklearn.preprocessing里导入数据标准化模块。
from sklearn.preprocessing import StandardScaler
# 从sklearn.svm里导入基于线性假设的支持向量机分类器LinearSVC。
from sklearn.svm import LinearSVC
# 从仍然需要对训练和测试的特征数据进行标准化。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
# 初始化线性假设的支持向量机分类器LinearSVC。
lsvc = LinearSVC(max_iter=10000)
#进行模型训练
lsvc.fit(X_train, y_train)
# 利用训练好的模型对测试样本的数字类别进行预测,预测结果储存在变量y_predict中。
y_predict = lsvc.predict(X_test)
性能评测
我们依然使用准确性、召回率、精确率、和F1指标这4个测度对模型性能进行评估。
print ('The Accuracy of Linear SVC is', lsvc.score(X_test, y_test))
The Accuracy of Linear SVC is 0.9511111111111111
from sklearn.metrics import classification_report
print (classification_report(y_test, y_predict, target_names=digits.target_names.astype(str)))
precision recall f1-score support
0 0.92 1.00 0.96 35
1 0.95 0.98 0.96 54
2 0.98 1.00 0.99 44
3 0.93 0.93 0.93 46
4 0.97 1.00 0.99 35
5 0.94 0.94 0.94 48
6 0.96 0.98 0.97 51
7 0.92 1.00 0.96 35
8 0.98 0.83 0.90 58
9 0.95 0.91 0.93 44
accuracy 0.95 450
macro avg 0.95 0.96 0.95 450
weighted avg 0.95 0.95 0.95 450
需要指出的是,召回率、准确率和F1指标最先适用于二分类任务,但是我们现在是一个多类分类任务,我们的分类目标有10个,无法直接计算以上3个指标。通常的做法是逐一评估某个类别的三个性能指标:把所有其他的类别看作是负样本,这样一来,就创造了10个二分类任务。
特点分析
支持向量机可以帮助我们在海量甚至高维度的数据中,筛选出对预测任务最有效的少量训练样本。不仅节省了模型学习所需要的数据内存,同时也提高了模型的预测性能。然而,付出的代价是更多的计算代价。
网友评论