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 или меньше.

Другие вопросы по тегам