Python 期末3 识别数字(支持向量机)
你正在开发一个分类器用于识别数字图像。数据集包含7,000个图像,每个图像都是大小为(28x28) 的灰度图像。每个样本有784(=28*28)个特征和一个标签,对应于0到9的10个数字类别中的一个。你需要构建一个分类器来预测未知图像的类别,并利用k-fold交叉验证评估该分类器在整个数据集上的性能。
考虑使用Scikit-learn库中的支持向量机分类算法,具体要求如下:
1、从文件中加载数据集。
2、将数据集分成训练集和测试集,其中80%用于训练,20%用于测试。
3、使用默认配置初始化SVM分类器对象。
4、使用交叉验证找到最佳的参数C和kernel。
5、在测试集上计算分类器的准确率、精确率、召回率和F1分数。
提示:可使用Scikit-learn提供的函数完成以上操作。
digits = datasets.load_digits()
import numpy as np
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
#加载数据集
digits = datasets.load_digits()
#数据预处理
X=digits.data
y=digits.target
#拆分训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)
#初始化SVM对象
svc=SVC()
#定义参数范围
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf', 'poly','sigmoid']}
#使用交叉验证找到最佳的参数
grid_search = GridSearchCV(svc, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)
#打印最佳参数
print("Best parameters: ", grid_search.best_params_)
#使用最佳参数重新训练模型
svc_best = SVC(C=grid_search.best_params_['C'], kernel=grid_search.best_params_['kernel'])
svc_best.fit(X_train,y_train)
#使用测试集评估模型性能
y_pred = svc_best.predict(X_test)
accuracy=accuracy_score(y_test,y_pred)
precision = precision_score(y_test,y_pred,average='macro')
recall=recall_score(y_test,y_pred,average='macro')
f1 = f1_score(y_test, y_pred, average='weighted')
print("Accuracy: ",accuracy )
print("Precision:",precision )
print("Recall: ",recall)
print("F1 Score: ",f1 )