enet_path 关闭输入检查后拒绝默认 precompute,恢复预计算解析
enet_path 关闭输入校验后可能跳过默认预计算选项的解析,应采用修复版本或显式关闭预计算并核对输入布局。
enet_path(X, y, check_input=False) 原本用于减少重复校验,却因为默认 precompute="auto" 报 ValueError。在 scikit-learn 1.7.2 的具体故障中,传入合法数组仍会碰到这项组合问题:跳过输入检查,也跳过了解析 auto 的步骤。
默认检查路径会进入 _pre_fit,按输入形状把预计算选项转成求解器可以使用的形式。旧代码在 check_input=False 时完全绕过这一步,后面的求解器分派却没有处理仍为字符串的 auto。这与正系数约束生成错误 alpha 网格是两个独立问题。
保留明确的内存布局与参数
关闭校验意味着调用方承担更多输入责任,先准备浮点、Fortran 连续的特征矩阵,再用明确 alpha 数组测试:
import numpy as np
import sklearn
from sklearn.linear_model import enet_path
rng = np.random.RandomState(0)
X = np.asfortranarray(rng.randn(30, 5), dtype=np.float64)
y = np.ascontiguousarray(X @ np.array([1., 0., -2., 0., 0.]))
grid = np.array([1., 0.1, 0.01])
alphas, coefficients, gaps = enet_path(
X, y, alphas=grid, check_input=False, precompute="auto",
)
print(sklearn.__version__, alphas, coefficients.shape, gaps)
assert coefficients.shape == (X.shape[1], len(grid))
scikit-learn 1.9.0 包含对应修复:当 precompute 不是 False 时仍执行必要的预计算处理,同时将 Gram 校验与 check_input 区分。更新后分别检查 "auto"、True 和 False,确认原来需要的求解路径都能运行。
这里使用未中心化的合成数据,只检验选项组合。真实调用 enet_path 时,截距、中心化、样本权重和输入布局仍需按调用契约处理;不能把关闭检查当作跳过这些要求的授权。
暂不能升级时显式关闭预计算
旧版本可明确设置 precompute=False,避开尚未解析的 auto 字符串:
_, direct_coefficients, _ = enet_path(
X, y, alphas=grid, check_input=False, precompute=False,
)
_, checked_coefficients, _ = enet_path(
X, y, alphas=grid, check_input=True, precompute=False,
)
np.testing.assert_allclose(direct_coefficients, checked_coefficients)
这会改变是否使用 Gram 预计算,可能影响性能。另一种选择是保留 check_input=True,使用有完整处理的默认入口;先确认额外校验是否真的构成瓶颈,再决定有没有必要关闭。
不要直接传任意矩阵充当 precompute 来消除异常。若手工提供 Gram 矩阵,它必须对应相同、已经按要求处理的 X,必要的校验和一致性责任并不会因绕法消失。
验收不仅看返回成功,还应比较同一 alpha 路径的系数形状、数值和收敛信息。该修复也影响内部调用此路径的部分 CV estimator,但不等于所有 ElasticNetCV 的无效数据、收敛警告或参数组合都已修好。


