Scikit NaN或无穷大错误消息

时间:2014-01-23 22:15:12

标签: python scikit-learn nan

我正在从csv文件导入一些数据。该文件的nan值标记为文本“NA”。 我用以下内容导入数据:

X = genfromtxt(data, delimiter=',', dtype=float, skip_header=1)

我使用此代码用一个普遍计算的列平均值替换nan。

inds = np.where(np.isnan(X))
X[inds]=np.take(col_mean,inds[1])
然后我运行了几个检查并获得了空数组:

np.where(np.isnan(X))
np.where(np.isinf(X))

最后我运行了一个scikit分类器:

RF = ensemble.RandomForestClassifier(n_estimators=100,n_jobs=-1,verbose=2)
RF.fit(X, y)

并收到以下错误:

  File "C:\Users\m&g\Anaconda\lib\site-packages\sklearn\ensemble\forest.py", line 257, in fit
    check_ccontiguous=True)
  File "C:\Users\m&g\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 233, in check_arrays
    _assert_all_finite(array)
  File "C:\Users\m&g\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 27, in _assert_all_finite
    raise ValueError("Array contains NaN or infinity.")
ValueError: Array contains NaN or infinity.

为什么它告诉我有NaN或无穷大的任何想法? 我看了this post并尝试运行:

RF.fit(X.astype(float), y.astype(float))

但我得到同样的错误。

2 个答案:

答案 0 :(得分:5)

scikit-learn的决策树将其输入投射到float32以提高效率,但您的值不适合该类型:

>>> np.float32(8.9932064170227995e+41)
inf

解决方案是在使用sklearn.preprocessing.StandardScaler拟合模型之前进行标准化。在预测之前不要忘记transform。您可以使用sklearn.pipeline.Pipeline在单个对象中组合标准化和分类:

rf = Pipeline([("scale", StandardScaler()),
               ("rf", RandomForestClassifier(n_estimators=100, n_jobs=-1, verbose=2))])

或者,使用当前的开发版本/下一版本:

rf = make_pipeline(StandardScaler(),
                   RandomForestClassifier(n_estimators=100, n_jobs=-1, verbose=2))

(我承认可以改进错误信息。)

答案 1 :(得分:4)

我也遇到过这个问题。但恰恰相反,我的问题是阵列中有一些“NaN”。

以下是如何修复它。

from sklearn.preprocessing import Imputer
X = Imputer().fit_transform(X)
RF.fit(X, y)

参考此处:sklearn.preprocessing.Imputer