2014-01-23 3 views
2

CSV 파일에서 일부 데이터를 가져옵니다. 파일의 텍스트에 'NA'라는 플래그가 지정된 값이 있습니다. 내가 함께 데이터를 가져옵니다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 분류 실행

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. 
:

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

및 다음과 같은 오류가

전화가 왜 필요한지 알아보십시오. 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을 잊지 마세요. 현재 DEV 버전/다음 릴리스,

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

또는 : 당신은 하나의 객체의 표준화 및 분류를 결합하는 sklearn.pipeline.Pipeline을 사용할 수 있습니다

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