本关必读
在scikit-learn中,对于分类问题的估计器是一个实现了fit(X, y) 和predict(T)方法的Python对象。估计器的实例很多,例如实现了支持向量分类的类sklearn.svm.svc。估计器的结构可以通过初始化模型时设置的参数决定,但目前,我们将估计器看做一个黑盒子,先不关心具体的参数设置。
digits数据集中包含大量的数字图片,如下图所示,我们希望给定其中的一张图片,能识别图中代表的数字,这是一个分类问题,数字0…9代表十个分类,目标是希望能正确估计图中样本属于哪一个数字类别。
Digits数据集可以通过以下命令导入:
from sklearn import datasets
digits = datasets.load_digits()
digits的原始图像采用一个(8,8)的二维数组表示,如下图所示:
可以通过digits.data查看图片数据表示,行表示样本数量,列表示样本特征(将(8,8)的矩阵压缩成一行,可以从digits.data.shape的列数为64维看出,);digits.target给出digits数据集的真实值,即我们要学习的每个数字图像对应的数字。
本关任务
本关要求采用scikit-learn中的svm模型训练一个对digits数据集进行分类的模型。训练集是digits数据集的前半部分数据,测试集是digits数据集的后半部分数据。
# 使用前一半的数据集作为训练数据,后一半数据集作为测试数据
train_data,train_target = data[:n_samples // 2],digits.target[:n_samples // 2]
test_data,test_target = data[n_samples // 2:],digits.target[n_samples // 2:]
希望通过训练集训练出分类模型,对于测试集数据能正确预测出图片对应的数字(0…9)。
本关需编程实现step2/digitsClassification.py 的createModelandPredict()函数创建分类模型并预测:
def createModelandPredict():
'''
创建分类模型并对测试数据预测
返回值:
predicted - 测试数据预测分类值
'''
predicted = None
# 请在此添加实现代码 #
#********** Begin *********#
#********** End **********#
return predicted
predicted 是模型对测试数据的预测值,该函数会返回预测值并在测试文件中检测是否正确。
另外,step2/digitsClassification.py代码中包含两个显示样本图像的函数分别是show4TrainImage()和show4TestImage(),分别用来显示训练集的前4张图像,和模型预测值的前4张图像,大家可以通过在本机python环境调用这两个函数直观查看原始样本集,并且验证预测是否正确,如下图所示:
拓展(本次不需要实现):
从预测集的图像可以看出,并不是完全预测正确,这一点是很正常的,说明使用默认的svc训练模型的无法完全将测试集正确分类,可以通过调整模型的参数使分类更准确,大家可以尝试下设置参数gamma=0.001重新训练模型并预测看是否准确。
测试说明
本关的测试文件是step2/testDigitsClassification.py该代码负责对你的实现代码进行测试,注意step2/testDigitsClassification.py 不能被修改,该测试代码具体如下:
import digitsClassification
pred = digitsClassification.createModelandPredict()
print(pred[:10])
测试函数将直接调用step2/createModelandPredict.py 的createModelandPredict()得到实际输出,即分类模型的预测值,平台通过比较预期输出与实际输出的前10个值来判断createModelandPredict函数是否实现正确。
import matplotlib.pyplot as plt
# 导入数据集,分类器相关包
from sklearn import datasets, svm, metrics
# 导入digits数据集
digits = datasets.load_digits()
n_samples = len(digits.data)
data = digits.data
# 使用前一半的数据集作为训练数据,后一半数据集作为测试数据
train_data,train_target = data[:n_samples // 2],digits.target[:n_samples // 2]
test_data,test_target = data[n_samples // 2:],digits.target[n_samples // 2:]
def createModelandPredict():
'''
创建分类模型并对测试数据预测
返回值:
predicted - 测试数据预测分类值
'''
predicted = None
# 请在此添加实现代码 #
#********** Begin *********#
classifier = svm.SVC()
classifier.fit(train_data,train_target)
predicted = classifier.predict(test_data)
#********** End **********#
return predicted