You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多标签场景召回率最大化咨询及单标签分类召回优化问题

嘿,我来帮你搞定这两个问题!先从你提到的那个三分类文本任务说起——你要优先保证-1类的召回率,精确率可以放低,但现在GridSearchCV在优化准确率,这确实没对准你的需求,得调整几个地方:

一、针对你的三分类文本任务(优先保证-1类召回率)

1. 把GridSearchCV的优化目标改成-1类的召回率

你的核心需求是让所有该标-1的样本都被抓到,所以得让GridSearch直接以这个指标为优化目标,而不是默认的准确率。sklearn里可以用make_scorer自定义评分函数,专门计算-1类的召回率:

from sklearn.metrics import recall_score, make_scorer
# 自定义评分器,指定要优化的目标类别为-1
recall_neg1_scorer = make_scorer(recall_score, pos_label=-1)

然后在GridSearchCV里把scoring参数设为这个自定义评分器就行,这样超参数调优就会朝着最大化-1类召回率的方向走。

2. 调整模型的决策阈值

逻辑回归默认是按概率最高的类别来预测,但如果你想提高-1类的召回率,可以降低-1类的判定阈值——比如原本只有概率>=0.5才判定为-1,现在改成>=0.3,这样更多样本会被归为-1,自然召回率就上去了(代价是精确率下降,刚好符合你的需求)。
代码示例:

# 拿到GridSearch选出的最优模型
best_model = grid_search.best_estimator_
# 找到-1类在模型类别列表中的索引
neg1_class_idx = list(best_model.named_steps['clf'].classes_).index(-1)
# 获取测试集上所有样本属于-1类的概率
y_proba_neg1 = best_model.predict_proba(X_test)[:, neg1_class_idx]
# 自定义阈值生成最终预测结果
y_pred = []
for idx, prob in enumerate(y_proba_neg1):
    if prob >= 0.3:  # 阈值可以根据实际效果调整
        y_pred.append(-1)
    else:
        # 否则沿用原模型对0/1类的预测结果
        y_pred.append(best_model.predict(X_test)[idx])

3. 处理样本不平衡(如果存在的话)

如果-1类的样本数量远少于0和1类,模型很容易忽略它,这时候可以给-1类加权重:

  • 在逻辑回归里设置class_weight='balanced',让模型自动根据样本数量调整权重;
  • 或者手动指定权重,比如class_weight={-1: 5, 0:1, 1:1},给-1类更高的权重,强迫模型重视它。
    修改Pipeline里的逻辑回归步骤:
('clf', LogisticRegression(class_weight='balanced', max_iter=1000))

二、多标签场景下最大化召回率

多标签任务里每个样本可以对应多个标签,要最大化召回率,得从这几个方向入手:

  • 选适配的多标签模型:可以用MultiOutputClassifier把单标签模型包装成多标签模型,或者用专门的多标签模型如MLkNN、ClassifierChain,这些模型更适配多标签的场景;
  • 优化正确的评分指标:多标签的召回率有两种常用计算方式:
    • recall_samples:从样本角度,计算每个样本的真实标签被预测到的比例;
    • recall_macro:从标签角度,计算每个标签的召回率然后取平均;
      你可以根据需求在GridSearchCV里指定scoring='recall_samples'或者recall_macro;
  • 降低标签判定阈值:多标签模型通常会输出每个标签的预测概率,默认阈值是0.5,降低这个阈值(比如到0.3),会让更多标签被预测出来,直接提升召回率;
  • 针对少数标签加权:如果某些标签的样本很少,同样可以给这些标签对应的分类器加权重,或者对少数标签的样本做过采样(比如SMOTE),让模型更关注这些标签。

完整修改后的代码示例

from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import recall_score, make_scorer

# 1. 自定义针对-1类的召回率评分器
recall_neg1_scorer = make_scorer(recall_score, pos_label=-1)

# 2. 构建Pipeline
steps = [
    ('vect', CountVectorizer()),
    ('clf', LogisticRegression(class_weight='balanced', max_iter=1000))
]
pipeline = Pipeline(steps)

# 3. 超参数网格
param_grid = {
    'vect__ngram_range': [(1,1), (1,2)],
    'clf__C': [0.1, 1, 10]
}

# 4. 用自定义评分器做GridSearch
grid_search = GridSearchCV(pipeline, param_grid, scoring=recall_neg1_scorer, cv=5)
grid_search.fit(X_train, y_train)

# 5. 调整决策阈值进一步提升召回率
best_model = grid_search.best_estimator_
neg1_class_idx = list(best_model.named_steps['clf'].classes_).index(-1)
y_proba_neg1 = best_model.predict_proba(X_test)[:, neg1_class_idx]

# 生成自定义阈值的预测结果
y_pred = []
for idx, prob in enumerate(y_proba_neg1):
    if prob >= 0.3:
        y_pred.append(-1)
    else:
        y_pred.append(best_model.predict(X_test)[idx])

# 评估最终效果
print(f"-1类召回率: {recall_score(y_test, y_pred, pos_label=-1)}")

内容的提问来源于stack exchange,提问作者Florestan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:40:42