如何在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
相关产品推荐
相关产品推荐

