ValueError: un valor en x_new está por debajo del rango de interpolación

Este es un error de scikit-learn que recibo cuando lo hago.

my_estimator = LassoLarsCV(fit_intercept=False, normalize=False, positive=True, max_n_alphas=1e5) 

Tenga en cuenta que si disminuyo max_n_alphas de 1e5 a 1e4, no volveré a aparecer este error.

¿Alguien tiene una idea de lo que está pasando?

El error ocurre cuando llamo

 my_estimator.fit(x, y) 

Tengo 40k puntos de datos en 40 dimensiones.

La traza de stack completa se ve así

  File "/usr/lib64/python2.7/site-packages/sklearn/linear_model/least_angle.py", line 1113, in fit axis=0)(all_alphas) File "/usr/lib64/python2.7/site-packages/scipy/interpolate/polyint.py", line 79, in __call__ y = self._evaluate(x) File "/usr/lib64/python2.7/site-packages/scipy/interpolate/interpolate.py", line 498, in _evaluate out_of_bounds = self._check_bounds(x_new) File "/usr/lib64/python2.7/site-packages/scipy/interpolate/interpolate.py", line 525, in _check_bounds raise ValueError("A value in x_new is below the interpolation " ValueError: A value in x_new is below the interpolation range. 

Debe haber algo particular a sus datos. LassoLarsCV() parece estar funcionando correctamente con este ejemplo sintético de datos de buen comportamiento:

 import numpy import sklearn.linear_model # create 40000 x 40 sample data from linear model with a bit of noise npoints = 40000 ndims = 40 numpy.random.seed(1) X = numpy.random.random((npoints, ndims)) w = numpy.random.random(ndims) y = X.dot(w) + numpy.random.random(npoints) * 0.1 clf = sklearn.linear_model.LassoLarsCV(fit_intercept=False, normalize=False, max_n_alphas=1e6) clf.fit(X, y) # coefficients are almost exactly recovered, this prints 0.00377 print max(abs( clf.coef_ - w )) # alphas actually used are 41 or ndims+1 print clf.alphas_.shape 

Esto está en sklearn 0.16, no tengo positive=True opción positive=True .

No estoy seguro de por qué querría usar un max_n_alphas muy grande de todos modos. Si bien no sé por qué 1e + 4 funciona y 1e + 5 no funciona en su caso, sospecho que los caminos que obtiene de max_n_alphas = ndims + 1 y max_n_alphas = 1e + 4 o lo que sea sería idéntico para datos de buen comportamiento. También el alfa óptimo que se estima por validación cruzada en clf.alpha_ será idéntico. Echa un vistazo a la ruta Lasso usando el ejemplo LARS para ver lo que Alpha está tratando de hacer.

Además, desde la documentación de LassoLars.

alfas_ array, forma (n_alphas + 1,)

Máximo de covarianzas (en valor absoluto) en cada iteración. n_alphas es max_iter, n_features o el número de nodos en la ruta con una correlación mayor que alfa, el que sea menor.

así que tiene sentido que terminemos con alphas_ de tamaño ndims + 1 (es decir, n_features + 1) arriba.

PS probado con sklearn 0.17.1 y positivo = verdadero también, también probado con algunos coeficientes positivos y negativos, mismo resultado: alphas_ es ndims + 1 o menos.