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

如何在Scikit-learn中实现逻辑回归及二分类时设置特定阈值(如0.75)?

如何在Scikit-learn的逻辑回归中调整分类阈值?

嘿,这个问题问到点子上了!在Scikit-learn里用逻辑回归做二分类时,默认的0.5阈值可不是万能的——尤其是遇到类别不平衡,或者你更看重精确率/召回率这类指标的时候。下面我给你一步步讲清楚怎么调整阈值,包括设置0.75这种特定值的具体操作:

先搞懂默认逻辑

Scikit-learn的LogisticRegression默认用predict()方法输出分类结果,背后的逻辑是:调用predict_proba()得到每个样本属于两类的概率(输出是一个二维数组,每一行对应[负类概率, 正类概率]),然后把正类概率≥0.5的样本判定为正类,反之是负类。

为什么要调整阈值?

比如在欺诈检测场景,我们更希望尽可能抓到所有欺诈样本(高召回率),这时候可以把阈值调低到0.3左右,哪怕会误判一些正常样本;反过来,如果我们想减少误判(高精确率),比如在癌症筛查中不想让健康人被误诊,就可以把阈值调高到0.7甚至0.8。

调整阈值的核心方法:手动基于概率判断

要自定义阈值,核心就是不用predict(),而是用predict_proba()获取概率后自己做判断。以下是具体步骤,以设置阈值0.75为例:

1. 训练模型并获取正类概率

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 生成示例二分类数据,拆分训练/测试集
X, y = make_classification(n_samples=1000, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练逻辑回归模型(max_iter按需调整,避免收敛警告)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)

# 获取测试集样本的正类概率(取predict_proba返回的第二列)
y_pos_proba = model.predict_proba(X_test)[:, 1]

2. 应用自定义阈值生成预测结果

# 设置目标阈值
custom_threshold = 0.75

# 基于阈值判断类别:概率≥阈值则为正类(1),否则为负类(0)
y_pred_custom = (y_pos_proba >= custom_threshold).astype(int)

这样就得到了基于0.75阈值的分类结果,你可以用sklearn.metrics里的指标(比如精确率、召回率、F1分数)来评估这个阈值的效果。

怎么找到最优阈值?

如果不想凭经验设值,可以借助ROC曲线或Precision-Recall曲线来找到符合你需求的最优阈值。比如我们可以遍历所有可能的阈值,找到F1分数最高的那个:

from sklearn.metrics import roc_curve, f1_score

# 计算ROC曲线的假正率、真正率和对应的所有阈值
fpr, tpr, thresholds = roc_curve(y_test, y_pos_proba)

# 遍历阈值,找到F1分数最高的那个
best_threshold = 0.5
best_f1 = 0.0

for thresh in thresholds:
    temp_pred = (y_pos_proba >= thresh).astype(int)
    current_f1 = f1_score(y_test, temp_pred)
    if current_f1 > best_f1:
        best_f1 = current_f1
        best_threshold = thresh

print(f"基于F1分数的最优阈值: {best_threshold:.4f},对应的F1分数: {best_f1:.4f}")

你也可以根据业务需求替换成精确率或召回率来筛选阈值,比如优先保证召回率≥0.9,再找对应的阈值。

小提醒

  • 如果你想把这个自定义阈值的逻辑封装起来,可以写一个简单的辅助函数,或者继承LogisticRegression重写predict方法,但大多数情况下直接用概率判断就足够灵活。
  • predict_log_proba()输出的是对数概率,和predict_proba()本质一样,转换为概率后再用阈值判断即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:01:34