支持向量机分类器(Support Vector Classifier)是根据训练样本的分布,搜索所有的线性分类器中最佳的那个,有使用过线性分类器的小伙伴们会发现决定直线位置的样本并不是所有训练数据,而是其中两个空间间隔最小的两个不同类别的数据点,我们把这种真正帮助决策最优线性分类模型的数据点叫做“支持向量”。
下面使用Scikit-learn内部集成的手写体数字图片数据集进行编程实现,使用的语言是python3.6版本,集成环境是Anaconda3。
1、手写体数据读取代码
#导入手写体数字加载器
from sklearn.datasets import load_digits
#从加载器中获得手写体数字的数码图像
digits=load_digits()
#检视数据规模和特征维度
digits.data.shape
2、手写体数据分割代码
#手写体数据分割代码
from sklearn.cross_validation 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
y_test.shape
3、使用支持向量机(分类)对手写体数字图像进行识别
#使用支持向量机(分类)对手写体数字图像进行识别
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
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)
4、对模型进行评估
#使用模型自带的评估函数进行准确性测评
print('The Accuracy of Linear SVC is',lsvc.score(X_test,y_test))
#依然使用sklearn.metrics里面的classification_report模块对测试结果做更好的详细分析
from sklearn.metrics import classification_report
print(classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)))
5、结果分析
The Accuracy of Linear SVC is 0.951111111111
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
avg / total 0.95 0.95 0.95 450
上面两个是对模型评估的结果,可以知道支持向量机(分类)模型能够提供比较高的手写体数字识别性能。这里需要进一步指出:召回率、准确率和F1指标最先适用于二分类任务,但是本案例中分类目标有10个类别,即0~9这10个数字,因此无法直接计算上面三个指标,通常的做法就是逐一评估某个类别的这三个性能指标,这样一来就相当于创造了10个二分类任务。
本博客内容有参考学习《python机器学习及实践——从零开始通往Kaggle竞赛之路》