如何修改sklearn中LogisticRegression的预测阈值为0.7
实现方法
sklearn的LogisticRegression默认predict()方法的0.5判定阈值没有提供直接修改的参数,不用硬改源码,两种常用实现方式如下:
方式1:手动获取概率后按自定义阈值判定(简单场景最常用)
不要直接调用默认的predict(),先通过predict_proba()拿到样本属于类别1的预测概率,再自己做阈值判断即可:model = LogisticRegression().fit(X_train,y_train) # 取出所有测试样本属于类别1的预测概率 pos_proba = model.predict_proba(X_test)[:, 1] # 阈值设为0.7,大于阈值判为1,否则判为0 predictions = (pos_proba > 0.7).astype(int)提示:
predict_proba()返回的数组列顺序和model.classes_属性一一对应,二分类场景下类别1的概率默认在索引为1的列,如果你的类别编码不是0/1,可以先打印model.classes_确认类别1对应的索引再取值。方式2:自定义子类重写predict方法(适合需要复用、要接入sklearn生态做交叉验证/网格搜索的场景)
自己写一个继承原生LogisticRegression的类,把阈值作为初始化参数,重写预测逻辑即可,后续用法和原生模型完全兼容:from sklearn.linear_model import LogisticRegression class CustomThresholdLogisticRegression(LogisticRegression): def __init__(self, threshold=0.5, **kwargs): self.threshold = threshold super().__init__(**kwargs) def predict(self, X): pos_proba = self.predict_proba(X)[:, 1] return (pos_proba > self.threshold).astype(int)调用时直接传入目标阈值即可:
# 初始化时直接指定0.7的判定阈值 model = CustomThresholdLogisticRegression(threshold=0.7).fit(X_train, y_train) # 直接调用predict就会按0.7阈值输出结果 predictions = model.predict(X_test)
注意:判定阈值的调整会直接影响模型在类别1上的精确率、召回率表现:阈值越高,判为类别1的条件越严格,类别1的精确率通常会升高、召回率会降低,建议结合验证集的业务指标要求选择最优阈值,不要随意设定。
内容的提问来源于stack exchange,提问作者rafine
相关产品推荐
相关产品推荐

