2014-01-23 58 views
2

我正在從csv文件導入一些數據。該文件具有用文本「NA」標記的nan值。 我導入數據有:Scikit NaN或無窮大錯誤消息

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

我使用這個代碼用previosly計算列替換楠的意思。

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

,但我得到了同樣的錯誤。

+0

是什麼'np.max(np.abs(X))'返回? –

+0

np.max(np.abs(X))= 8.9932064170227995e + 41 – ADJ

回答

5

scikit學習的決定樹木投下自己的輸入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)) 

(我承認錯誤消息還有待改進。 )

+0

謝謝!這解決了它! – ADJ

3

我也遇到過這個問題。但相反,我的問題是陣列中有一些'NaN'。

下面是如何解決它。

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

參考這裏:sklearn.preprocessing.Imputer

相關問題