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

sklearn.model_selection.GridSearchCV是否支持自定义阈值?

解决GridSearchCV中结合阈值调优的问题

首先明确:GridSearchCV本身没有直接设置预测阈值的参数,因为阈值是模型预测阶段的判断标准,不属于模型训练的可学习参数。但可以通过自定义评分器+扩展搜索网格的方式,实现参数调优时同步优化阈值,满足你先(同步)调阈值的需求。

核心思路

把阈值作为一个待优化的"超参数"加入搜索网格,自定义评分函数——让模型输出样本属于类别1的概率,用指定阈值划分类别,再计算适合不平衡数据集的评估指标(比如召回率、F1-score),最后让GridSearchCV在搜索模型参数的同时,找到最优阈值。

具体实现代码

以逻辑回归为例,针对类别1为少数类的不平衡数据集:

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import make_scorer, recall_score
import numpy as np

# 自定义评分函数:输入模型、特征、标签,用指定阈值计算少数类召回率
def threshold_scorer(model, X, y):
    # 获取模型输出的类别1概率
    y_proba = model.predict_proba(X)[:, 1]
    # 取出当前搜索的阈值参数
    threshold = model.get_params()['threshold']
    # 根据阈值生成预测标签
    y_pred = (y_proba >= threshold).astype(int)
    # 计算类别1的召回率,可按需替换为F1-score等指标
    return recall_score(y, y_pred, pos_label=1)

# 初始化模型,绑定阈值参数(初始值不影响后续搜索)
model = LogisticRegression(class_weight='balanced')
model.set_params(threshold=0.5)

# 设置搜索网格:包含模型参数和阈值候选值
param_grid = {
    'C': [0.01, 0.1, 1, 10],
    'threshold': np.arange(0.1, 0.5, 0.05)
}

# 初始化GridSearchCV,使用自定义评分器
grid_search = GridSearchCV(
    estimator=model,
    param_grid=param_grid,
    scoring=make_scorer(threshold_scorer),
    cv=5,
    refit=True
)

# 拟合训练数据
grid_search.fit(X_train, y_train)

# 输出最优参数组合
print(f"最优参数与阈值: {grid_search.best_params_}")

关键说明

  • 自定义评分函数可按需替换评估指标:如果更看重精准率,换成precision_score;要平衡精准率和召回率,用f1_score即可。
  • class_weight='balanced'是针对不平衡数据集的模型参数优化,和阈值调优配合使用效果更好,可根据实际场景选择是否保留。
  • 这种同步优化的方式比分开调参+调阈值更合理,因为模型参数会影响概率输出分布,同步搜索能找到更适配的参数-阈值组合。

内容的提问来源于stack exchange,提问作者Jason Rich Darmawan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:15:32