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

如何在Python中为Lasso回归模型绘制ROC曲线?解决predict_proba报错

解决Lasso回归绘制ROC曲线的问题

核心原因

Lasso是回归模型,仅输出连续预测值,没有predict_proba方法。但ROC曲线的计算不需要严格的概率值——它只需要能反映样本属于正类的相对得分,Lasso的预测值完全可以满足这个要求。

修正步骤及代码

1. 修正数据处理的冗余问题

你当前的代码中对训练集做了两次缩放:先用MinMaxScaler处理,之后Pipeline里又加了StandardScaler,这会导致数据分布异常,需要移除其中一套缩放逻辑。推荐保留Pipeline内的标准化,避免手动处理的冗余:

X = data.drop(['Response'], axis = 1)
Y = data.Response

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Lasso
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
import numpy as np

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.25, random_state = 42)

# 移除手动的MinMaxScaler,保留Pipeline内的StandardScaler
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('model', Lasso(normalize=False))  # 已用StandardScaler标准化,无需重复normalize
])

lasso_model = GridSearchCV(pipeline,
                           {'model__alpha': np.arange(0.05, 3, 0.05)},  # 避免alpha=0(退化为普通线性回归)
                           cv = 10,
                           scoring = 'roc_auc',
                           verbose = 3,
                           n_jobs = -1,
                           error_score = 'raise')

lasso_model.fit(X_train, Y_train)

2. 用Lasso的预测值绘制ROC曲线

直接使用predict方法得到的连续值作为正类得分,代入roc_curve和roc_auc_score计算:

from sklearn.metrics import roc_auc_score, roc_curve
import matplotlib.pyplot as plt

# 随机预测基准线
r_probs = [0 for _ in range(len(Y_test))]
r_auc = roc_auc_score(Y_test, r_probs)
r_fpr, r_tpr , _ = roc_curve(Y_test, r_probs)

# 训练集ROC计算
y_train_score = lasso_model.predict(X_train)
train_fpr, train_tpr, _ = roc_curve(Y_train, y_train_score)
train_auc = roc_auc_score(Y_train, y_train_score)

# 测试集ROC计算
y_test_score = lasso_model.predict(X_test)
test_fpr, test_tpr, _ = roc_curve(Y_test, y_test_score)
test_auc = roc_auc_score(Y_test, y_test_score)

# 绘制ROC曲线
plt.figure(figsize=(8,6))
plt.plot(r_fpr, r_tpr, linestyle = '--', label = 'Random Prediction (AUROC = %0.3f)' % r_auc)
plt.plot(train_fpr, train_tpr, label=f"Train Set (AUROC = {train_auc:.3f})")
plt.plot(test_fpr, test_tpr, label=f"Test Set (AUROC = {test_auc:.3f})")
plt.title('ROC Curve for Lasso-based Classification')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.legend(loc=4)
plt.show()

3. 可选:校准得到概率输出(如果需要)

如果确实需要类似概率的输出,可以用CalibratedClassifierCV将Lasso回归器包装为分类器,通过校准得到概率:

from sklearn.calibration import CalibratedClassifierCV

# 先定义基础回归器Pipeline
base_pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('model', Lasso(normalize=False))
])

# 包装为分类器并校准
calibrated_lasso = CalibratedClassifierCV(base_estimator=base_pipeline, cv=5, method='sigmoid')
calibrated_lasso.fit(X_train, Y_train)

# 现在可以使用predict_proba获取概率
y_test_proba = calibrated_lasso.predict_proba(X_test)[:, 1]
test_auc = roc_auc_score(Y_test, y_test_proba)

关键说明

  • ROC曲线的本质是排序能力:只要模型输出的得分能正确区分正类和负类,不管是概率还是回归值,都能用来计算ROC。
  • 避免alpha=0:alpha=0时Lasso退化为普通线性回归,失去正则化效果,建议从0.05开始搜索。

内容的提问来源于stack exchange,提问作者Programming Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:48:35