Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scikit网格搜索KNN回归值错误:数组包含NaN或无穷大_Python_Numpy_Scikit Learn - Fatal编程技术网

Python Scikit网格搜索KNN回归值错误:数组包含NaN或无穷大

Python Scikit网格搜索KNN回归值错误:数组包含NaN或无穷大,python,numpy,scikit-learn,Python,Numpy,Scikit Learn,我正在尝试使用Scikit学习实现网格搜索,以便为KNN回归选择最佳参数。 特别是我想做的: parameters = [{'weights': ['uniform', 'distance'], 'n_neighbors': [5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]}] clf = GridSearchCV(neighbors.KNeighborsRegressor(), parameters) clf.fit(features, rewards)

我正在尝试使用Scikit学习实现网格搜索,以便为KNN回归选择最佳参数。 特别是我想做的:

parameters = [{'weights': ['uniform', 'distance'], 'n_neighbors': [5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]}]
clf = GridSearchCV(neighbors.KNeighborsRegressor(), parameters)
clf.fit(features, rewards)
不幸的是,我得到了ValueError:数组包含NaN或无穷大

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/grid_search.pyc in fit(self, X, y, **params)
705                           " The params argument will be removed in 0.15.",
706                           DeprecationWarning)
--> 707         return self._fit(X, y, ParameterGrid(self.param_grid))
708 
709 

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/grid_search.pyc in _fit(self, X, y, parameter_iterable)
491                     X, y, base_estimator, parameters, train, test,
492                     self.scorer_, self.verbose, **self.fit_params)
--> 493                 for parameters in parameter_iterable
494                 for train, test in cv)
495 

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in __call__(self, iterable)
515         try:
516             for function, args, kwargs in iterable:
--> 517                 self.dispatch(function, args, kwargs)
518 
519             self.retrieve()

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in dispatch(self, func, args, kwargs)
310         """
311         if self._pool is None:
--> 312             job = ImmediateApply(func, args, kwargs)
313             index = len(self._jobs)
314             if not _verbosity_filter(index, self.verbose):

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in __init__(self, func, args, kwargs)
134         # Don't delay the application, to avoid keeping the input
135         # arguments in memory
--> 136         self.results = func(*args, **kwargs)
137 
138     def get(self):

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/grid_search.pyc in fit_grid_point(X, y, base_estimator, parameters, train, test, scorer, verbose, loss_func, **fit_params)
309             this_score = scorer(clf, X_test, y_test)
310         else:
--> 311             this_score = clf.score(X_test, y_test)
312     else:
313         clf.fit(X_train, **fit_params)

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/base.pyc in score(self, X, y)
320 
321         from .metrics import r2_score
--> 322         return r2_score(y, self.predict(X))
323 
324 

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/metrics/metrics.pyc in r2_score(y_true, y_pred)
2181 
2182     """
-> 2183     y_type, y_true, y_pred = _check_reg_targets(y_true, y_pred)
2184 
2185     if len(y_true) == 1:

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/metrics/metrics.pyc in _check_reg_targets(y_true, y_pred)
 59         Estimated target values.
 60     """
---> 61     y_true, y_pred = check_arrays(y_true, y_pred)
 62 
 63     if y_true.ndim == 1:

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.pyc in check_arrays(*arrays, **options)
231                 else:
232                     array = np.asarray(array, dtype=dtype)
--> 233                 _assert_all_finite(array)
234 
235         if copy and array is array_orig:

/Users/zikesjan/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.pyc in _assert_all_finite(X)
 25     if (X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.sum())
 26             and not np.isfinite(X).all()):
---> 27         raise ValueError("Array contains NaN or infinity.")
 28 
 29 

ValueError: Array contains NaN or infinity.
基于此,我已经尝试使用以下适合的线条,而不是上面的线条:

clf.fit(np.asarray(features).astype(float), np.asarray(rewards).astype(float))
基于此,我甚至尝试过:

scaler = preprocessing.StandardScaler().fit(np.asarray(features).astype(float))
transformed_features = scaler.transform(np.asarray(features).astype(float))
clf.fit(transformed_features, rewards)
但不幸的是没有任何成功。因此,我想问一下,是否有人知道问题可能出在哪里,以及如何使代码正常工作

事先非常感谢

编辑:

我发现,如果我只有以下参数,则不会出现此错误:

parameters = [{'weights': ['uniform'], 'n_neighbors': [5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]}]
所以问题似乎是在重量=距离的情况下。有人知道为什么吗

现在又出现了一个与此相关的问题,我正在问这个问题

编辑2:

如果在调试时使用日志设置运行代码,则会收到以下警告:

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/neighbors/regression.py:160: RuntimeWarning: invalid value encountered in divide
y_pred[:, j] = num / denom 

所以用零除显然存在问题。所以我的问题是,为什么在regression.py的第160行有scikit除以0?

除了您已经尝试过的,您还可以看到

import numpy as np
features = np.nan_to_num(features)
rewards = np.nan_to_num(rewards)
这会将数组中的所有非数值设置为
0
,并且至少应该使算法运行,除非错误发生在算法内部的某个地方。确保您的数据中没有太多的非数字条目,因为将它们全部设置为0可能会导致您的估计中出现奇怪的偏差

如果情况并非如此,且您使用的是
weights='distance'
,请检查列车样本是否相同。这将导致反距离除以零

如果反距离是被零除的原因,您可以通过使用自己的距离函数(例如

def better_inv_dist(dist):
    c = 1.
    return 1. / (c + dist)

然后使用
“权重”:更好的\u inv\u dist
。您可能需要将常数
c
调整到正确的刻度。在任何情况下,只要我在scikit learn上遇到与KNN回归相同的问题,它都将避免被零除。我在计算预测时使用了weights='distance',这导致了无穷大的值(但在拟合KNN模型(即学习适当的KD树或Ball树)时没有)。我切换到weights='uniform',程序正确运行完成,表明提供的权重函数是问题所在。如果您想使用基于距离的权重,请提供一个自定义权重函数,该函数不会像艾肯伯格的回答中所示在零距离处爆炸到无穷大。

确实
numpy.isnan(功能)。any()
numpy.isnan(奖励)
产生
True
?我已经尝试过这个方法,但它对np.nan\u-to\num也不起作用。我仍然得到ValueError:数组包含NaN或无穷大。好的,这排除了输入数据中的问题。但它可能会导致,例如,在途中的某个地方被零除。您是否在IPython中尝试过%debug以查看到底出了什么问题?是的,您是对的。可能会有一些除法为零,有关更多详细信息,请参阅文章中的编辑2。但问题仍然存在:为什么scikit除以0?看起来在内部权重可能被设置为0。您能否仅在网格搜索中检查
'weights':['distance']
?您有多少个样本?如果这不会破坏您的内存,请检查sklearn.metrics导入欧几里德距离的
,然后
距离=欧几里德距离(特征,特征)
,然后报告是否
(距离==0。)。any()
报告
真值