如何更改加载逻辑回归模型的决策阈值

Posted

技术标签:

【中文标题】如何更改加载逻辑回归模型的决策阈值【英文标题】:How to change decision threshold on a loaded logistic regression model 【发布时间】:2021-09-07 06:50:14 【问题描述】:

我正在使用 Python 构建逻辑回归模型,并设法手动调整阈值。但是,当我使用 pickle 保存模型时,阈值似乎没有改变。对于不同的阈值,我得到完全相同的结果。代码如下:

filename = 'model202104.sav'
pickle.dump(logreg, open(filename, 'wb'))
loaded_model2 = pickle.load(open(filename, 'rb'))
result = loaded_model2.score(X_test, y_pred)
print(result)

这是我用来手动更改阈值的代码:

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=.2,random_state=7)
logreg = LogisticRegression(max_iter=10000)
logreg.fit(X_train,y_train)
#y_pred=logreg.predict(X_test)
THRESHOLD=0.5
y_pred=np.where(logreg.predict_proba(X_test)[:,1] > THRESHOLD, 1, 0)

提前致谢:)

【问题讨论】:

我不太明白您是否尝试将手动阈值保存到 .sav 文件中?你能展示你用来创建 .sav 文件的代码吗? 是的,这就是我想要做的。我用于创建 .sav 文件的代码已发布在问题中。 无法手动保存阈值 【参考方案1】:

score 的第二个参数应该是真实的观察值,而不是 y_pred

# Load model
loaded_model2 = pickle.load(open('model202104.sav', 'rb'))

# Score model with `y_test`
result = loaded_model2.score(X_test, y_test) # You had `y_pred` here
print(result)

此外,您始终必须在 sklearn 中手动设置阈值。否则,如果预测概率大于或等于0.5,则LogisticRegression 始终分类为1。因此,要使用自定义阈值对您的模型进行评分:

# Import accuracy score function
from sklearn.metrics import accuracy_score

# Classify with custom threshold (for example, 0.85)
thr = 0.85
y_pred = np.where(loaded_model2.predict_proba(X_test)[:, 1] >= thr, 1, 0)

# Score
print('Accuracy with threshold set to', str(thr) + ':', accuracy_score(y_test, y_pred))

【讨论】:

感谢您的回复,是否可以更改已加载模型的阈值。如果我希望我的模型在对其他数据进行测试时使用 .85 进行预测。 您必须使用第二个 sn-p 中的代码(或类似的东西)来手动计算score(默认情况下是平均精度)。您不能使用参数更改它。 As you can see here,sklearn 总是使用 0.5 作为阈值。

以上是关于如何更改加载逻辑回归模型的决策阈值的主要内容,如果未能解决你的问题,请参考以下文章

决策树与随机森林

Sklearn逻辑回归 - 调整截止点

确定R中glm逻辑回归模型的阈值

基于分类问题的逻辑回归模型

机器学习决策树与随机森林(转)

Python分类模型实战(KNN逻辑回归决策树SVM)调优调参,评估模型——综合项目