我使用sklearn和有一个问题的亲和传播。我已经建立了一个输入矩阵,我一直得到以下错误。
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
我已经跑了
np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True
我试着用
mat[np.isfinite(mat) == True] = 0
去除掉无限值,但这也没用。
我要怎么做才能去掉矩阵中的无穷大值,这样我就可以使用亲和传播算法了?
我使用anaconda和python 2.7.9。
注意:此解决方案仅适用于有意在数据集中保留NaN条目的情况。
这个错误发生在我使用一些scikit-learn功能时(在我的情况下:GridSearchCV)。在底层,我使用了一个xgboost XGBClassifier,它可以优雅地处理NaN数据。然而,GridSearchCV使用sklearn.utils.validation模块,通过调用_assert_all_finite函数强制缺少输入数据中的缺失数据。这最终导致了一个错误:
ValueError: Input contains NaN, infinity or a value too large for dtype('float64')
旁注:_assert_all_finite接受allow_nan参数,如果设置为True,则不会引起问题。但是,scikit-learn API不允许我们控制这个参数。
解决方案
我的解决方案是使用patch模块静默_assert_all_finite函数,这样它就不会引发ValueError。下面是一个片段
import sklearn
with mock.patch("sklearn.utils.validation._assert_all_finite"):
# your code that raises ValueError
这将用一个虚拟模拟函数替换_assert_all_finite,因此它不会被执行。
请注意,补丁不是一个推荐的做法,可能会导致不可预知的行为!
编辑:
这个Pull Request应该可以解决这个问题(尽管截至2022年1月修复程序还没有发布)
注意:此解决方案仅适用于有意在数据集中保留NaN条目的情况。
这个错误发生在我使用一些scikit-learn功能时(在我的情况下:GridSearchCV)。在底层,我使用了一个xgboost XGBClassifier,它可以优雅地处理NaN数据。然而,GridSearchCV使用sklearn.utils.validation模块,通过调用_assert_all_finite函数强制缺少输入数据中的缺失数据。这最终导致了一个错误:
ValueError: Input contains NaN, infinity or a value too large for dtype('float64')
旁注:_assert_all_finite接受allow_nan参数,如果设置为True,则不会引起问题。但是,scikit-learn API不允许我们控制这个参数。
解决方案
我的解决方案是使用patch模块静默_assert_all_finite函数,这样它就不会引发ValueError。下面是一个片段
import sklearn
with mock.patch("sklearn.utils.validation._assert_all_finite"):
# your code that raises ValueError
这将用一个虚拟模拟函数替换_assert_all_finite,因此它不会被执行。
请注意,补丁不是一个推荐的做法,可能会导致不可预知的行为!
编辑:
这个Pull Request应该可以解决这个问题(尽管截至2022年1月修复程序还没有发布)