支持向量分类器

上回我们用线性分类器找到的是某一种可能的分类方式,这一回的支持向量机则是用来在这些可能的线性分类器寻找一个最优的分类方式,而寻找最优的依据就是“支持向量”,对这个模型的思想我们可以简单的理解为:以二分类为例找一条直线(一个超平面)使得两边的数据点到它的距离之和最短。
当然我上面的阐述并不准确,关于支持向量机严格的理解与介绍可以见这位博主的文章:
https://blog.csdn.net/sinat_20177327/article/details/79729551

数据读取与分析

这次采用的数据是来自scikit-learn内部集成的手写体数字图片数据集,我们的任务是识别这些手写的数字并进行分类。
我们用下面的代码把这些数据载入这些数据:

from sklearn.datasets import load_digits

digits=load_digits()
print(digits.data.shape)

输出为
在这里插入图片描述
输出说明共有1797个数字的图片,每个数字图片的用8×8=64的像素矩阵表示。

分割数据集

与上一篇的方法一致,随机75%用于训练,剩下25%用来测试,不再赘述。

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)
print(y_train.shape)
print(y_test.shape)

输出结果为:
在这里插入图片描述
训练集规模为1347,测试集规模为450,符合比例,分割正确。

标准化数据

上一篇已讲过,方法一致,不再赘述。

from sklearn.preprocessing import StandardScaler

ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)

利用线性支持向量分类器训练模型

这里用的是LinearSVC模块,初始化后fit()用于训练,predict()用于预测,这个过程非常的无脑,有了scikitlearn库,我们完全不需要知道其内部实现逻辑就能很轻松的实现机器学习。

from sklearn.svm import LinearSVC

lsvc=LinearSVC()
lsvc.fit(X_train,y_train)
y_predict=lsvc.predict(X_test)

这就完成了模型的训练与预测。

性能评估

首先用自带的打分函数评估准确性,然后再用上篇所讲方法进行系统的评估。

from sklearn.metrics import classification_report

print('Accuracy of Linear SVC:',lsvc.score(X_test,y_test))
print(classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)))

结果为:
在这里插入图片描述
由结果可知,线性支持向量分类器对手写数字识别有着比较好的性能,平均来说各指标都在95%上下。

完整代码

from sklearn.datasets import load_digits
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=load_digits()

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

### 标准化数据
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('Accuracy of Linear SVC:',lsvc.score(X_test,y_test))
print(classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)))
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐