获取召回率时遇ValueError及FutureWarning问题求助
解决召回率计算时的ValueError与FutureWarning问题
嘿,我一眼就看出问题所在了——你用的标签是字符串'pos'和'neg',但sklearn的recall_score函数默认把1当成正标签(pos_label=1),这俩完全不匹配,自然触发了ValueError;那个FutureWarning也是因为字符串标签和默认预期的数值类型不兼容,导致内部元素比较失败才冒出来的。
下面给你两种靠谱的解决办法:
办法1:直接指定正标签参数
既然你的正类是'pos',调用recall_score时直接把pos_label设成这个字符串就行,代码改完长这样:
from sklearn.metrics import recall_score # 你的原有代码保持不变 X_test = test_pos_vec + test_neg_vec Y_test = ["pos"] * len(test_pos_vec) + ["neg"] * len(test_neg_vec) # 关键修改:明确指定pos_label为'pos' recall_average = recall_score(Y_test, y_predict, average="binary", pos_label="pos") print(recall_average)
这样函数就能正确识别正标签,同时那个烦人的FutureWarning也会消失。
办法2:把标签转换成数值类型
要是你更习惯用0/1这种数值标签(毕竟很多机器学习工具默认都吃数值),可以提前把字符串标签映射成数值:
from sklearn.metrics import recall_score # 原有代码 X_test = test_pos_vec + test_neg_vec Y_test = ["pos"] * len(test_pos_vec) + ["neg"] * len(test_neg_vec) # 把真实标签转成数值:pos→1,neg→0 Y_test_num = [1 if label == 'pos' else 0 for label in Y_test] # 预测标签也要同步转换(假设y_predict也是字符串类型) y_predict_num = [1 if label == 'pos' else 0 for label in y_predict] # 现在调用recall_score用默认的pos_label=1就没问题了 recall_average = recall_score(Y_test_num, y_predict_num, average="binary") print(recall_average)
小提醒
当你用average="binary"的时候,必须明确告诉函数哪个是正类——不管用字符串还是数值,只要保证真实标签和预测标签里都有这个值就行。要是以后碰多分类任务想单独算某一类的召回率,这个参数同样重要。
内容的提问来源于stack exchange,提问作者Mr. Wizard
相关产品推荐
相关产品推荐

