1. 任务描述
在前面的关卡,我们已经学会了如果使用 sklearn 训练分类模型,那如何评估模型的分类效果?本关卡将学习使用 sklearn 的模型度量方法,来量化预测结果。
2. 相关知识
相关知识
sklearn 中有三种不同的 API 来评估模型的预测质量:
Estimator score method :在评估器(比如一个分类模型)中有score函数提供默认的评估标准,比如支持向量机sklearn.svm.SVC中的score函数,通过计算预测准确率来评估模型,如下图所示。
Scoring parameter:cross-validation的模型评估工具比如model_selection.GridSearchCV,可通过设置类的参数scoring来指定评估模型,如下图所示。
Metric functions: metrics模块实现了一些函数,用来评估预测误差,并且针对不同的目标(分类、回归或聚类问题等)有不同的评估类,具体如下图所示。
前两种评估方法可以在具体的评估器和交叉验证工具中设置,在这里不过多讨论。我们主要关注 metrics 模块,旨在让同学们学会如何使用常见的指标对分类结果分析评价。
sklearn.metrics 的详细使用可参考官方文档,以下将简单介绍几种常用的评价指标。
accu\fracy_score(y_true, y_pred, normalize=True, sample_weight=None)
计算分类精度,示例如下图所示:
其中normalize=True时返回正确分类的比例,设为 False 时返回正确分类的样本个数。
recall_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)
返回模型分类的召回率,示例如下图所示:
参数:
y_true:实际值;
y_pred:预测值;
pos_label: 仅当 average=’binary’ 时该参数才有效,即仅对二分类有效。参数的值为正类标签或负类标签,指定计算的是正类还是负类;
average:当涉及到二分类/多分类/多标签等不同的问题时,可以通过设置该参数指定计算方式,可取的值包括[None, ‘binary’ (default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]。
f1_score、precision_score的使用方式和recall_score类似。
confusion_matrix
计算混淆矩阵,示例如下图所示:
classification_report
该函数建立了一份文本报告展示主要的分类度量指标,比如准确率、召回率、f 值等。示例如下图所示:
precision_recall_fscore_support
为每个类别计算准确率、召回率、f 值、support 值,示例如下图所示:
3. 编程要求
编程要求
根据要求,补全右侧编辑器Begin-End区间的代码。本次任务希望对二分类和多分类模型进行评估,本关具体分成为两个子任务:
1.评估二分类模型:训练数据集为二类别数据,通过构建简单的 svm 模型(初始化模型在代码中已给出),对测试数据进行预测,并返回模型正确分类的样本个数、正类的预测准确率、正类的召回率、正类的 f 值。该样本数据中 y = {1,-1},1 表示正类,-1 表示负类;
要补充的代码块如下:
def bin_evaluation(X_train, y_train, X_test, y_test):
‘’’
评估二分类模型
:param X_train: 训练数据集
:param y_train: 训练集类别
:param X_test: 测试数据集
:param y_test: 测试集实际类别
:return:
correct_num - 正确分类的样本个数
prec - 正类的准确率
recall - 正类的召回率
f_score - 正类的f值
‘’’
classifier = LinearSVC()
correct_num, prec, recall, fscore = None, None, None, None
# 请在此添加实现代码 #
# ********** Begin *********#
# ********** End **********#
2.评估多分类模型:数据集为多类别数据,通过构建简单的 svm 模型(初始化模型在代码中已给出),对测试数据进行预测,并返回模型的精度、准确率和 f 值。其中准确率和 f 值的计算方式设定为’macro’。
要补充的代码块如下:
def multi_evaluation(X_train,y_train,X_test,y_test):
‘’’
评估多分类模型
:param X_train: 训练数据集
:param y_train: 训练集类别
:param X_test: 测试数据集
:param y_test: 测试集实际类别
:return:
acc - 模型的精度
prec - 准确率
f_score - f值
‘’’
#初始化
acc,prec,f_score = None,None,None
classifier = SVC(kernel=‘linear’)
# 请在此添加实现代码 #
# ********** Begin *********#
# ********** End **********#
测试说明
平台将运行您补全的代码文件,比对您所编写函数的返回值与正确的数值,只有所有数据全部计算正确才能进入下一关。
开始你的任务吧,祝你成功!
from sklearn.metrics import recall_score,accuracy_score,precision_score,f1_score,precision_recall_fscore_support
from sklearn.svm import LinearSVC,SVC
def bin_evaluation(X_train, y_train, X_test, y_test):
'''
评估二分类模型
:param X_train: 训练数据集
:param y_train: 训练集类别
:param X_test: 测试数据集
:param y_test: 测试集实际类别
:return:
correct_num - 正确分类的样本个数
prec - 正类的准确率
recall - 正类的召回率
f_score - 正类的f值
'''
classifier = LinearSVC()
correct_num, prec, recall, fscore = None, None, None, None
# 请在此添加实现代码 #
# ********** Begin *********#
#训练分类器
classifier.fit(X_train,y_train)
#使用分类器
y_predicted = classifier.predict(X_test)
#测试分类器
correct_num = accuracy_score(y_test,y_predicted,normalize=False)
prec = precision_score(y_test,y_predicted)
recall = recall_score(y_test,y_predicted,average ='binary')
fscore = f1_score(y_test,y_predicted)
return correct_num,prec,recall,fscore
# ********** End **********#
def multi_evaluation(X_train,y_train,X_test,y_test):
'''
评估多分类模型
:param X_train: 训练数据集
:param y_train: 训练集类别
:param X_test: 测试数据集
:param y_test: 测试集实际类别
:return:
acc - 模型的精度
prec - 准确率
f_score - f值
'''
#初始化
acc,prec,f_score = None,None,None
classifier = SVC(kernel='linear')
# 请在此添加实现代码 #
# ********** Begin *********#
#训练分类器
classifier.fit(X_train,y_train)
#使用分类器
y_predicted = classifier.predict(X_test)
#测试分类器
acc = accuracy_score(y_test,y_predicted)
prec = precision_score(y_test,y_predicted,average ='macro')
f_score = f1_score(y_test,y_predicted,average ='macro')
return acc,prec,f_score
# ********** End **********#