多标签情感分析中GridSearchCV的score与Jaccard分数结果不一致求助
多标签任务中GridSearchCV返回score与手动计算Jaccard系数不一致的原因解析
核心原因
- 未传入自定义评分规则:你代码中虽然定义了
scoring={'jaccard':'jaccard_micro','F1_score': 'f1_micro'},但初始化GridSearchCV时没有把该参数传入,GridSearchCV默认会调用基模型(也就是KerasClassifier)自带的score方法,该方法返回的是你模型编译时设置的metrics=['accuracy']的结果,和你手动计算的average="micro"Jaccard系数完全是两种评估指标,数值自然存在差异。 - Keras内置accuracy与多标签Jaccard计算逻辑不同:Keras针对多标签任务的默认accuracy是样本级完全匹配准确率,即只有一个样本的所有标签预测完全正确才会被计为1,否则为0;而micro Jaccard系数是统计所有样本所有标签的交集/并集比例,二者计算逻辑完全不同。
- 最后一层激活函数设置错误:你将激活函数作为超参数传入,包括隐藏层和最后一层输出层,多标签分类任务的输出层必须固定用
sigmoid激活才能保证每个标签的输出范围在0-1之间,如果选了relu作为输出层激活,会出现输出大于1或小于0的情况,后续round操作完全失效,进一步拉大数值差异。 - refit参数格式错误:你设置
refit={'jaccard'}传入了集合类型,在未传入scoring参数的情况下,该配置无效,模型还是会基于默认的accuracy指标进行最优参数选择。
修正方案
- 初始化
GridSearchCV时补充scoring=scoring参数,同时将refit={'jaccard'}改为refit='jaccard',确保GridSearchCV用你指定的Jaccard指标进行评估和最优模型重训练。 - 调整模型结构,输出层激活函数固定为
sigmoid,仅将隐藏层的激活函数作为超参数调整。 - 若要完全对齐手动计算逻辑,可以自定义scikit-learn评分器,明确指定调用
predict_proba后取0.5阈值再计算Jaccard系数,避免默认predict方法的阈值逻辑差异。
内容的提问来源于stack exchange,提问作者enas khalil
相关产品推荐
相关产品推荐

