逻辑回归:如何将预测值与阈值比较以完成分类及实现咨询
嘿,看起来你已经在逻辑回归的路上走了一半啦!我来帮你补全代码,并且详细讲讲怎么用阈值来完成分类——这可是逻辑回归里很实用的技巧哦。
首先先把你未完成的代码补全,明确目标变量的定义,再完成模型的基础训练:
from sklearn.cross_validation import train_test_split from sklearn import metrics from sklearn.linear_model import LogisticRegression # 别忘导入逻辑回归模型 # 假设你的数据集已经加载到cred_def变量中 X = cred_def[['balance']] Y = cred_def['default_Yes'] # 目标变量就是default_Yes列 # 拆分训练集和测试集 X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42) # 初始化并训练逻辑回归模型 logreg = LogisticRegression() logreg.fit(X_train, Y_train)
接下来,关于预测值与阈值比较完成分类,逻辑回归有两种常用的实现方式,我们一一拆解:
1. 使用默认阈值(0.5)自动分类
LogisticRegression的predict()方法会自动以0.5作为判断阈值:当模型预测的正类(也就是default_Yes=1)概率≥0.5时,就将样本分类为1,否则为0。用法非常直接:
# 直接生成默认阈值下的分类结果 y_pred = logreg.predict(X_test)
你可以用metrics.accuracy_score(Y_test, y_pred)来快速评估这个默认阈值下的分类准确率。
2. 自定义阈值进行分类
如果你的数据集存在不平衡(比如违约样本极少),或者有特定业务需求(比如想尽可能捕捉所有违约样本),就需要自定义阈值。这时候要先获取模型输出的概率,再手动和阈值比较:
步骤1:获取正类的预测概率
用predict_proba()方法可以拿到每个样本的负类(0)和正类(1)概率,返回的是二维数组,我们只需要提取正类概率:
# 提取正类(default_Yes=1)的预测概率 y_pred_proba = logreg.predict_proba(X_test)[:, 1]
步骤2:基于自定义阈值生成分类结果
比如你想把阈值设为0.3(只要模型判断违约概率≥30%就标记为可能违约),可以这样做:
custom_threshold = 0.3 # 把布尔值转成整数(True→1,False→0) y_pred_custom = (y_pred_proba >= custom_threshold).astype(int)
之后你可以用精确率、召回率这类更贴合业务的指标,来评估自定义阈值下的分类效果,比如metrics.recall_score(Y_test, y_pred_custom)。
3. 怎么选合适的阈值?
如果不确定该用什么阈值,可以画ROC曲线来辅助决策:
import matplotlib.pyplot as plt # 计算ROC曲线的关键参数 fpr, tpr, thresholds = metrics.roc_curve(Y_test, y_pred_proba) roc_auc = metrics.auc(fpr, tpr) # 绘制ROC曲线 plt.figure() plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc) plt.plot([0, 1], [0, 1], 'k--') # 随机猜测的基准线 plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic') plt.legend(loc="lower right") plt.show()
ROC曲线上的每个点都对应一个阈值,你可以根据自己的需求(比如希望假阳性率尽可能低,或者真阳性率尽可能高)来挑选最合适的那个。
内容的提问来源于stack exchange,提问作者Rashmi Singh

