Choisir la tolérance SAGA pour une régression logistique multiclasses parcimonieuse
Résumé
Cette note de configuration explique pourquoi une régression logistique à trois classes pénalisée par L1 utilise SAGA avec une tolérance explicitement resserrée. Elle compare SAGA à liblinear sur un panel de prédiction de microstructure du Nasdaq 100, et rapporte des ajustements plus rapides ainsi qu’une meilleure perte logarithmique et une meilleure précision hors échantillon pour SAGA lors des exécutions mesurées. Elle explique aussi pourquoi liblinear ne convient pas aux contraintes de version de scikit-learn du projet.
Le point méthodologique central est qu’une tolérance de convergence trop lâche peut laisser des coefficients numériquement proches de zéro plutôt qu’exactement nuls, faussant le décompte de parcimonie des coefficients. À la force de pénalisation retenue, resserrer la tolérance rend le nombre exact de zéros de SAGA conforme au nombre de coefficients dont la valeur absolue est sous un petit seuil. La note présente les mesures de durée et de parcimonie pour plusieurs valeurs de pénalité, mais précise que la durée sur le panel complet reste incertaine, car son estimation repose sur peu d’éléments de mise à l’échelle.
Idées clés
- SAGA prend en charge la configuration à trois classes dans les limites de compatibilité indiquées pour scikit-learn.
- Sur le panel cité, les exécutions mesurées de SAGA étaient plus rapides et obtenaient de meilleurs scores hors échantillon que liblinear.
- Une tolérance plus stricte améliore la fiabilité du décompte exact des zéros dans un balayage de parcimonie L1.
- La durée de cette configuration sur le panel complet reste incertaine et doit être mesurée directement.
Étiquettes
Texte intégral
# logistic_l1_C0.01.yaml ```yaml # L1 logistic regression. The solver is `saga` rather than `liblinear`, and the tolerance # is set explicitly rather than left at scikit-learn's 1e-4 default. # # Two reasons, and the first one is not optional. These labels are three-class (-1, 0, 1), # and scikit-learn 1.8 makes multiclass `liblinear` a hard error; #740 already moved our # floor to 1.7. `OneVsRestClassifier(liblinear)` would reproduce the current objective # exactly - liblinear multiclass IS one-vs-rest - and would keep the problem below. # # The second is that `liblinear` does not finish. It is single-threaded coordinate descent # and scales about N^1.4 here. Measured on nasdaq100_microstructure's `fwd_dir_15m` panel: # # rows liblinear 1000/1e-4 saga 200/1e-2 # 400,000 144.4s converged 11.0s converged # 1,200,000 716.9s converged 44.8s converged # # which extrapolates to roughly eight hours per configuration at the full 16.9M rows against # about twenty minutes. That is not a projection: `06_linear` ran 7h23m at 100% of one core # on 2026-09-05 and was killed with two of thirteen configurations still unfinished, both of # them these L1 ones. # # saga is also better out of sample at every C measured here: log loss 1.0273-1.0276 against # liblinear's 1.0293-1.0294, and accuracy 0.415-0.420 against 0.404-0.410. # # `tol: 0.001` here rather than the 0.01 the weakly-penalised configurations use, because # this is where the penalty binds and exact sparsity is the point of the sweep. At 1e-2 saga # leaves coefficients stranded NEAR zero instead of AT zero, which `coef_ != 0` then counts # as live. Measured on the same panel, exact zeros against coefficients below 1e-8, out of # 198: # # C liblinear 1e-4 saga 1e-2 saga 1e-3 # 0.001 128 / 128 148 / 149 157 / 157 # 0.01 40 / 40 24 / 52 87 / 87 # 0.1 8 / 8 3 / 4 24 / 26 # # The 24-against-52 at C=0.01 is the defect: twenty-eight coefficients below 1e-8 that are # not zero. At 1e-3 the two counts agree and saga is *more* sparse than liblinear at every C # here, so the tighter tolerance is not a concession - it is what makes the L1 solution an # L1 solution. # # Cost at 1.2M rows: 226s, 352s and 287s for C=0.001, 0.01 and 0.1 against liblinear's 30s, # 202s and 499s. **The full-panel cost of this arm is not established** - the 16.9M-row # extrapolation is uncertain because it rests on a single scaling estimate taken from the # tol=1e-2 timings. Watch it on the first run rather than assuming it is small. model_class: LogisticRegression params: C: 0.01 max_iter: 200 penalty: l1 solver: saga tol: 0.001 ```
Reproduit dans son intégralité avec attribution, conformément à la licence de la source. Licence: MIT
Ce résumé a été rédigé par l’agent de recherche de Stratmill à partir de la source originale ; il n’en est pas une copie.