支持向量机分类器,便是根据训练样本的分布,搜索所有可能的线性分类器中最佳的那个。我们会发现决定其直线位置的样本并不是所有训练数据,而是其中的两个空间间隔最小的两个不同类别的数据点,而我们把这种可以用来真正帮助决策最优线性分类模型的数据点叫做“支持向量”。
逻辑斯蒂回归模型在训练过程中由于考虑了所有训练样本对参数的影响,因此不一定获得最佳的分类器。
#----手写体数据读取代码样例
#从sklearn.datasets里导入手写体数字加载器
from sklearn.datasets import load_digits
#从通过数据加载器获得手写体数字的数码图像数据并储存在digits变量中。
digits=load_digits()
#检视数据规模和特征维度
digits.data.shape
#----手写体数据分割代码样例
#对于没有直接提供测试样本的数据,我们都要通过数据分割获取75%的训练样本和25%的测试样本:
from sklearn.model_selection import train_test_split
#随机选取75%的数据作为训练样本,其余25%的数据作为测试样本
x_train,x_test,y_train,y_test=train_test_split(digits.data,digits.target,test_size=0.25,random_state=33)
#----使用支持向量机(分类)对手写体数字图像进行识别
#从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()
#进行模型训练
lsvc.fit(x_train,y_train)
#利用训练好的模型对测试样本的数字类别进行预测,预测结果储存在变量y_predict中。
y_predict=lsvc.predict(x_test)
#---支持向量机(分类)模型对手写体数码图像识别能力的评估
#使用模型自带的评估函数进行准确性测评
print('The Accuracy of Linear SVC is',lsvc.score(x_test,y_test)) #out:The Accuracy of Linear SVC is 0.9533333
#依然使用sklearn.metrics里面的classification_report模块对预测结果做更加详细的分析
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.96 0.98 0.97 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.84 0.91 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个类别,即0-9的10个数字。因此无法直接计算上述三个指标。通常的做法是,逐一评估某个类别的这三个性能指标:我们把所有其它的类别看作阴性(负)样本,这样一来,就创造了10个二分类任务。事实上,不仅学习模型在对待多类分类任务时是这样做的,而且代码的输出也证明了此观点。
特点分析:
支持向量机模型曾经在机器学习研究领域繁荣发展了很长一段时间。主要原因在于其精妙的模型假设,可以帮助我们在海量甚至高维度的数据中,筛选对预测任务最为有效的少数训练样本。这样做不仅节省了模型学习所需要的数据内存,同时也提高了模型的预测性能。然而,要获得如此的优势就必然要付出更多的计算代价(CPU资源和计算时间)。因此,在实际使用该模型的时候,权衡其中的利弊,进而达成各自的任务目标。
'''