【问题标题】:Scikit NaN or infinity error messageScikit NaN 或无穷大错误消息
【发布时间】:2014-02-14 17:25:33
【问题描述】:

我正在从 csv 文件导入一些数据。该文件具有标有文本“NA”的 nan 值。 我使用以下方式导入数据:

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))

但我得到了同样的错误。

【问题讨论】:

  • np.max(np.abs(X)) 返回什么?
  • np.max(np.abs(X)) = 8.9932064170227995e+41

标签: python scikit-learn nan


【解决方案1】:

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))

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

【讨论】:

    【解决方案2】:

    我也遇到过这个问题。但相反,我的问题是数组中有一些'NaN'。

    这里是如何解决它。

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

    参考这里:sklearn.preprocessing.Imputer

    【讨论】:

      猜你喜欢
      • 2013-09-07
      • 2016-04-19
      • 2016-12-27
      • 2021-05-27
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      相关资源
      最近更新 更多