《Python数据挖掘入门与实践》学习笔记1

第八章-用神经网络破解验证码

在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_turey_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. ])

这里的Nonemacro其实有如下关系:

>>> f1_score(y_true, y_pred, average='macro')  == >>> f1_score(y_true, y_pred, average=None).mean()
True

关于这些参数是如何计算的,可以参考模型评估
最后给个F1指标的深入文章链接机器学习-评价分类结果

你可能感兴趣的:(数据挖掘,机器学习,神经网络,F1模型评估)