sklearn实例-用支持向量机分类器(SVC)识别手写字体

简介

支持向量机(Support Vector Machine)作为机器学习中最常用的算法之一,有着非常强大的性能。

SVM既可以用来分类,即SVC(Support Vector Classifier);也可以用来预测(回归),那就是SVR(Support Vector Regression)。sklearn中的svm模块中同时集成了SVC和SVR。

SVC,中文可称做支持向量机分类器,也被称做最大化类间间隔分类器(maximum margin classifier),这是一种较为直观的理解(如下图的L2),也是最为人们所熟悉的对于SVM的理解。
sklearn实例-用支持向量机分类器(SVC)识别手写字体_第1张图片
通俗的来说,SVM在拟合过程中,会根据训练样本的分布,搜索所有可能的线性分类器中最佳的那个,进一步观察我们可以发现,决定其直线位置的样本并不是所有的训练数据,而是其中两个空间间隔最小的两个不同类别的数据点,我们把这种可以用来真正帮助决策最优线性分类模型的数据点叫做** 支持向量 **。

OK,简介到此结束,下面我们进入实战环节!

代码实战

数据来源:Scikit-learn内部集成的手写数字图片数据集
目标:将数据集中的8x8像素的图片识别为0-9的数字

import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.metrics import classification_report

#获取数据并打印其大小
digits = datasets.load_digits()
print('原始数据矩阵大小:', digits.data.shape)
# OUTPUT:(1797,64),共有1797个样本,每个样本为8x8像素

#分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target,
												    test_size=0.25, random_state=33)

#查看训练集大小,测试集分布
print('训练集样本数量:', y_train.shape)
print('测试集数据类别分布:\n', pd.Series(y_test).value_counts())

#将数据标准化
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.fit_transform(X_test)

#拟合并根据模型预测数据
lsvc = LinearSVC()
lsvc.fit(X_train, y_train)
y_predict = lsvc.predict(X_test)

#输出分类结果
print('The Accuracy of LinearSVC is:', lsvc.score(X_test, y_test))
print(classification_report(y_test, y_predict, target_names=digits.target_names.astype(str)))



输出结果如下:
sklearn实例-用支持向量机分类器(SVC)识别手写字体_第2张图片
在这里插入图片描述
sklearn实例-用支持向量机分类器(SVC)识别手写字体_第3张图片

小结

通过上述输出结果可以发现,SVC模型的确能够提供比较高的手写体数字识别性能,平均而言,各项指标都在95%上下。

  • 通过结果的P,R,F1可以发现,SVC使用的是1 vs all算法
  • SVC由于其精妙的模型假设,可帮助我们在海量甚至高维度的数据中,筛选对预测任务最有效的少数训练样本,既节约了内存,也提高了模型性能。
  • 然而代价就是付出更大的计算代价(CPU和计算时间),因此在实际使用时应当权衡其利弊再选择适合的模型。

你可能感兴趣的:(机器学习)