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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:48:23