在8.3.1 反向传播算法一节中出现的一点有问题
在这节中,需要对创建好的神经网络进行训练、预测并评估。
得到预测值后,可以用scikit-learn计算F1值。
from sklearn.metrics import f1_score
print("F-score: {0:.2f}".format(f1_score(predictions,
y_test.argmax(axis=1) )))
F1值为0.97,对于相对较小的模型来说,这个结果很了不起。
然而在对进行评估时却发现出现了如下问题:
ValueError: Target is multiclass but average='binary'. Please choose another average setting.
经过查看scikit-learn官网文档后,才知道有两个问题没有弄明白。
一个是y_ture
和y_test
参数位置反了,
另一个是这里的预测值实际上有26个类别(字母),也就是说是Multiclass
分类
这大概是因为这本书比较老了,没有版本不兼容,实际上书上很多处都是如此,以后学完复习时,会来个总结篇。
而这里的参数average
是由多个选项的,如下:
None
,则返回每个班级的分数。否则,这将确定对数据执行的平均类型:
binary
:仅报告由指定的类的结果pos_label。仅当targets(y_{true,pred})是二进制时才适用。
micro
:通过计算总真阳性,假阴性和误报来全球计算指标。
macro
:计算每个标签的指标,找出它们的未加权平均值。这不会考虑标签不平衡。
weighted
:计算每个标签的指标,并找到它们的平均值,按支持加权(每个标签的真实实例数)。这会改变“宏观”以解决标签不平衡问题; 它可能导致F分数不在精确度和召回之间。
samples
:计算每个实例的指标,并找出它们的平均值(仅对于不同的多标记分类有意义 accuracy_score)。
这里结合官网的里说明一下
>>> from sklearn.metrics import f1_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> f1_score(y_true, y_pred, average='macro') # doctest: +ELLIPSIS
0.26...
>>> f1_score(y_true, y_pred, average='micro') # doctest: +ELLIPSIS
0.33...
>>> f1_score(y_true, y_pred, average='weighted') # doctest: +ELLIPSIS
0.26...
>>> f1_score(y_true, y_pred, average=None)
array([ 0.8, 0. , 0. ])
这里的None
和macro
其实有如下关系:
>>> f1_score(y_true, y_pred, average='macro') == >>> f1_score(y_true, y_pred, average=None).mean()
True
关于这些参数是如何计算的,可以参考模型评估
最后给个F1指标的深入文章链接机器学习-评价分类结果