ValueError: значение в x_new ниже диапазона интерполяции
Это ошибка научения scikit, которую я получаю, когда делаю
my_estimator = LassoLarsCV(fit_intercept=False, normalize=False, positive=True, max_n_alphas=1e5)
Обратите внимание, что если я уменьшу max_n_alphas с 1e5 до 1e4, я больше не получу эту ошибку.
Кто-нибудь имеет представление о том, что происходит?
Ошибка происходит когда я звоню
my_estimator.fit(x, y)
я имею 40k
Точки данных в 40
размеры.
Полная трассировка стека выглядит следующим образом
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.
1 ответ
Там должно быть что-то конкретное в ваших данных. LassoLarsCV()
кажется, работает правильно с этим синтетическим примером довольно хороших данных:
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
Это в sklearn 0.16, у меня нет positive=True
вариант.
Я не уверен, почему вы все равно захотите использовать очень большой max_n_alphas. Хотя я не знаю, почему 1e+4 работает, а 1e+5 не работает в вашем случае, я подозреваю, что пути, которые вы получаете из max_n_alphas=ndims+1 и max_n_alphas=1e+4 или что-то еще, будут идентичны для данных с хорошим поведением. Также оптимальная альфа, которая оценивается путем перекрестной проверки в clf.alpha_
будет идентичным. Посмотрите путь Лассо, используя пример LARS для того, что пытается сделать альфа.
Также из документации LassoLars
массив alphas_, форма (n_alphas + 1,)
Максимум ковариаций (в абсолютном значении) на каждой итерации. n_alphas - это либо max_iter, n_features, либо число узлов в пути с корреляцией, превышающей альфа, в зависимости от того, что меньше.
так что имеет смысл, что мы заканчиваем с alphas_ размером ndims + 1 (т.е. n_features + 1) выше.
PS Протестировано с sklearn 0.17.1 и положительным = также верно, также проверено с некоторыми положительными и отрицательными коэффициентами, тот же результат: alphas_ равен ndims + 1 или меньше.