如何在sklearn cross_val_score中为Lasso调整预测分类阈值
代码报错核心原因
你的代码有几个关键逻辑错误,直接导致评分失败:
- 错误调用了Lasso不存在的
predict_proba方法:Lasso本身是回归模型,没有分类概率输出的接口,照搬LGBM分类器的概率调用逻辑完全不适用。 - 预测结果维度处理错误:Lasso的
predict返回的是一维连续值数组,不是分类器输出的二维概率矩阵,不存在[:,0]的切片维度。 - 阈值参数放置位置错误:你把threshold写在了predict方法的入参里,但
cross_val_score做预测时只会调用无参的predict(),无法传入自定义阈值。 - 缺失必要的导入:代码里没有导入
cross_val_score,也会触发运行错误。
可直接运行的修正代码
import numpy as np from sklearn.datasets import make_classification from sklearn.linear_model import Lasso from sklearn.model_selection import cross_val_score X, y = make_classification(n_features=10, random_state=0, n_classes=2, n_samples=1000, n_informative=8) class ThresholdLasso(Lasso): def __init__(self, alpha=1.0, threshold=0.5, **kwargs): super().__init__(alpha=alpha, **kwargs) self.threshold = threshold def predict(self, X): # 调用父类Lasso的回归预测接口拿到连续输出 reg_output = super().predict(X) # 连续值大于阈值判定为正类1,否则为负类0,输出格式对齐分类任务标签要求 return (reg_output > self.threshold).astype(int) # 初始化模型,指定正则系数和分类阈值 clf = ThresholdLasso(alpha=0.05, threshold=0.5) clf.fit(X, y) # 交叉验证计算precision指标 precision = cross_val_score(ThresholdLasso(alpha=0.05, threshold=0.5), X, y, cv=5, scoring='precision') print("5折交叉验证各折precision:", precision) print("平均precision:", np.mean(precision))
关键说明
- Lasso做二分类的本质是把0/1标签当连续值拟合,输出值范围不局限在[0,1]区间,所以阈值不需要固定为0.5,可以根据验证集的指标表现灵活调整,甚至可以选小于0或者大于1的阈值。
- 如果需要可调阈值的同时做交叉验证,把阈值作为类初始化参数是最稳妥的实现方式,既符合sklearn的API规范,也方便后续结合网格搜索做阈值和正则系数的联合调参。
- 如果追求更稳定的分类效果,更推荐使用带L1正则的Logistic回归,本身是专为分类任务设计的模型,输出的概率值有明确的统计意义,比直接用Lasso做分类的合理性更高。
内容的提问来源于stack exchange,提问作者Stephy Riega
相关产品推荐
相关产品推荐

