一、实验目的
- 掌握高斯核支持向量机(SVM)在手写字符识别中的应用。
- 对比调用函数和非调用两种方式实现SVM的效果。
- 探究高斯核(RBF)参数和正则化参数C对SVM性能的影响。
- 分析手写字符的训练和测试误差,评估模型性能。
二、实验原理
支持向量机是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,通过引入核函数,SVM可以处理非线性分类问题。高斯核(RBF核)是一种常用的核函数,能够将数据映射到高维空间,使得原本线性不可分的数据变得线性可分。
三、实验过程
- 加载数据集,划分为训练集和测试集。
- 对图像数据进行标准化处理。
- 使用scikit-learn库的SVC类,指定kernel为'rbf'(高斯核)。
- 通过网格搜索和交叉验证挑选最佳的高斯核参数gamma和正则化参数C。
- 分析不同参数组合对训练和测试误差的影响。
- 在测试集上进行预测,计算训练和测试误差。
四、实验代码
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.svm import SVC
from sklearn.metrics import classification_report
from sklearn.model_selection import GridSearchCV
from sklearn import svm
# 导入数据
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)
print("X_train original shape", X_train.shape)
# 标准化数据
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)
# 定义SVM模型,使用高斯核(RBF)
svm_model = svm.SVC(kernel='rbf')
# 定义gamma值的搜索范围
param_grid = {'gamma': [0.001, 0.01, 0.1, 1, 10, 100, 1000]}
# 使用网格搜索和交叉验证来找到最佳gamma值
grid_search = GridSearchCV(estimator=svm_model, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳gamma值和对应的模型性能
best_gamma = grid_search.best_params_['gamma']
best_score = grid_search.best_score_
print(f"Best gamma: {best_gamma}, Best score: {best_score}")
# 定义参数网格
param_grid = {'C': [1, 10, 100, 1000]}
# 创建SVM模型实例
svm = SVC(kernel='rbf', gamma=best_gamma)
# 使用网格搜索和交叉验证找到最佳C值,使用准确率作为评分指标
grid_search = GridSearchCV(svm, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 输出最佳参数和得分
best_params = grid_search.best_params_['C']
best_score = grid_search.best_score_
print(f"Best parameters: {best_params}")
print(f"Best cross-validation score: {best_score}")
# 2.2高斯核的影响:分别取gamma=0.001,0.01,0.1,1,10,100,1000
lsvc2=SVC(C=best_params,kernel='rbf',gamma=best_gamma)
lsvc2.fit(X_train,y_train)
y_predict=lsvc2.predict(X_test)
### 性能评估
print('Accuracy of SVC of rbf kernel:',lsvc2.score(X_test,y_test))
print(classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)))
五、实验结果
X_train original shape (1347, 64)
Best gamma: 0.01, Best score: 0.9747680022029466
Best parameters: 1
Best cross-validation score: 0.9747680022029466
Accuracy of SVC of rbf kernel: 0.9844444444444445
precision recall f1-score support
0 1.00 1.00 1.00 35
1 0.98 1.00 0.99 54
2 1.00 0.98 0.99 44
3 1.00 0.98 0.99 46
4 1.00 0.94 0.97 35
5 0.96 0.98 0.97 48
6 0.98 1.00 0.99 51
7 1.00 1.00 1.00 35
8 0.95 0.98 0.97 58
9 1.00 0.98 0.99 44
accuracy 0.98 450
macro avg 0.99 0.98 0.99 450
weighted avg 0.98 0.98 0.98 450
根据经验多次调整高斯核参数,发现参数为0.045 能够得到更好的结果。
X_train original shape (1347, 64)
Best gamma: 0.01, Best score: 0.9747680022029466
Best parameters: 1
Best cross-validation score: 0.9747680022029466
Accuracy of SVC of rbf kernel: 0.9933333333333333
precision recall f1-score support
0 1.00 1.00 1.00 35
1 1.00 1.00 1.00 54
2 1.00 0.98 0.99 44
3 1.00 1.00 1.00 46
4 0.97 1.00 0.99 35
5 0.98 0.98 0.98 48
6 0.98 1.00 0.99 51
7 1.00 1.00 1.00 35
8 1.00 1.00 1.00 58
9 1.00 0.98 0.99 44
accuracy 0.99 450
macro avg 0.99 0.99 0.99 450
weighted avg 0.99 0.99 0.99 450
六、结论
通过本次实验,我们成功地使用高斯核SVM实现了手写字符识别,调用函数实现SVM。同时,我们也探究了高斯核参数和正则化参数对SVM性能的影响,并通过交叉验证挑选了最佳参数组合。本次实验加深了我们对SVM原理和应用的理解,为后续的研究和应用提供了基础,也提升了我对于模式识别的学习兴趣。