ValueError:x_new 中的值低于插值范围
Posted
技术标签:
【中文标题】ValueError:x_new 中的值低于插值范围【英文标题】:ValueError: A value in x_new is below the interpolation range 【发布时间】:2016-07-19 03:53:42 【问题描述】:这是我在执行此操作时遇到的 scikit-learn 错误
my_estimator = LassoLarsCV(fit_intercept=False, normalize=False, positive=True, max_n_alphas=1e5)
请注意,如果我将 max_n_alphas 从 1e5 降低到 1e4,则不会再出现此错误。
有人知道发生了什么吗?
当我调用时发生错误
my_estimator.fit(x, y)
我在40
维度中有40k
数据点。
完整的堆栈跟踪如下所示
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.
【问题讨论】:
当我运行from sklearn.linear_model import LassoLarsCV
后跟您的代码行时,我没有收到任何错误。请提供足够的代码来重现您遇到的错误以及完整的回溯消息。
该行没有发生错误,但是当我调用 .fit() 时。不幸的是,这里很难重现,我的数据集有 40k 点。
scipy 中的插值器通常要求 x
值单调递增。 x
是否为您的数据集单调增加?如果不是,请尝试使用 x
作为键对数据集进行排序,然后重试。如果可行,请告诉我,我会为赏金添加正确的答案:)
如果没有赏金,我会投票关闭,因为缺少minimal reproducible example。
好吧 - 为“荒谬的建议”道歉,但您会注意到实际上引发错误的位是 scipy
包中的 interpolate.py
,它确实有这些要求。但是,如果您不提供数据进行复制并认为建议提供免费帮助的人很荒谬是个好主意,我真的不介意进一步跟踪它。
【参考方案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_
中的交叉验证估计的最佳 alpha 将是相同的。查看Lasso path using LARS 示例,了解 alpha 正在尝试做什么。
另外,来自 LassoLars documentation
alphas_ 数组,形状 (n_alphas + 1,)
最大协方差(在 绝对值)在每次迭代。 n_alphas 是 max_iter, n_features,或具有相关性的路径中的节点数 大于 alpha,以较小者为准。
所以我们以上面大小为 ndims+1(即 n_features+1)的 alphas_ 结尾是有意义的。
附:用 sklearn 0.17.1 和 positive=True 测试,也用一些正负系数测试,结果相同:alphas_ 是 ndims+1 或更少。
【讨论】:
与数据无关。在同一个数据集上,当减小 n_alphas 时,如上所述,问题就消失了。错误发生在生成 alpha 时,而不是在处理问题集时。 @BaronYugovich 你看的代码,同维度的不同数据集,一个巨大的max_n_alphas,是没有问题的。为什么您认为问题与数据无关?请发布一个完整的可运行示例来重现您的问题。谢谢:) 有道理。出于好奇,通过您对随机数据的实验,您通过正交匹配追求得到了什么***.com/questions/36287045/… @BaronYugovich 这是否解决了您的问题?我相信您发现的确实是一个 skearn 错误,但是如果没有您的数据很难重现。最重要的是,它对您获得的结果没有影响,使用任何大于 40 的最大 alphas 并且您将获得相同的结果,只要它不会崩溃。如果您满意,请记得奖励赏金(并接受答案)以上是关于ValueError:x_new 中的值低于插值范围的主要内容,如果未能解决你的问题,请参考以下文章
在 Flask-migrate ValueError 中:位置 15 的连接字符串中的插值语法无效
如何过滤数组中不需要的值以进行绘图?使用numpy数组的matplotlib中的ValueError
Python中的ValueError:解压缩的值太多[重复]
python OpenCV中的ValueError - 没有足够的值来解包(预期3,得到2)
从变量中的值构造 pandas DataFrame 会给出“ValueError:如果使用所有标量值,则必须传递一个索引”