ValueError: Đầu vào chứa NaN, vô cực hoặc giá trị quá lớn đối với dtype ('float32')


41

Tôi đã nhận được ValueError khi dự đoán dữ liệu thử nghiệm bằng mô hình RandomForest.

Ma cua toi:

clf = RandomForestClassifier(n_estimators=10, max_depth=6, n_jobs=1, verbose=2)
clf.fit(X_fit, y_fit)

df_test.fillna(df_test.mean())
X_test = df_test.values  
y_pred = clf.predict(X_test)

Lỗi:

ValueError: Input contains NaN, infinity or a value too large for dtype('float32').

Làm cách nào để tìm các giá trị xấu trong tập dữ liệu thử nghiệm? Ngoài ra, tôi không muốn bỏ các hồ sơ này, tôi chỉ có thể thay thế chúng bằng giá trị trung bình hoặc trung bình?

Cảm ơn.

Câu trả lời:


45

Với np.isnan(X)bạn nhận được mặt nạ boolean trở lại với True cho các vị trí chứa NaNs.

Với np.where(np.isnan(X))bạn nhận lại một tuple với tọa độ i, j của NaNs.

Cuối cùng, với np.nan_to_num(X)bạn "thay nan bằng 0 và inf bằng số hữu hạn".

Ngoài ra, bạn có thể sử dụng:

  • sklearn.impute.SimpleImputer cho việc loại bỏ giá trị trung bình / trung bình của các giá trị bị thiếu hoặc
  • gấu trúc ' pd.DataFrame(X).fillna(), nếu bạn cần một cái gì đó ngoài việc lấp đầy nó bằng số không.

Tôi thích điều kiện nhận dạng để kiểm tra nan, nếu x! = X trả về Không, nhiều lần np.isnan (x) đã thất bại đối với tôi, đừng nhớ lý do
Itachi

1
Không nên thay thế giá trị NaN bằng số không. Các giá trị NaN vẫn có thể có ý nghĩa trong việc bị thiếu và bỏ qua chúng bằng các số không có lẽ là điều tồi tệ nhất bạn có thể làm và phương pháp cắt bỏ tồi tệ nhất bạn sử dụng. Bạn sẽ không chỉ giới thiệu các số 0 tùy ý có thể làm lệch biến của bạn mà 0 thậm chí có thể không phải là một giá trị chấp nhận được trong các biến của bạn, có nghĩa là biến của bạn có thể không có số 0 thực.
hussam

Tôi nhận ra rằng tôi đã không cung cấp bất kỳ hướng dẫn. Nếu bạn muốn áp đặt dữ liệu của mình, hãy sử dụng trung bình cán bằng cách sử dụng .rolling()để thay thế giá trị thiếu bằng giá trị trung bình của cửa sổ cuộn. Nếu bạn muốn một cái gì đó mạnh mẽ hơn, hãy sử dụng mô-đun <b> thiếupy </ b>, bạn có thể sử dụng MissForestcho việc cắt bỏ dựa trên ngẫu nhiên.
hussam

7

Giả sử X_testlà một khung dữ liệu gấu trúc, bạn có thể sử dụng DataFrame.fillnađể thay thế các giá trị NaN bằng giá trị trung bình:

X_test.fillna(X_test.mean())

X_test là mảng numpy. Chỉ cần cập nhật df_test trong câu hỏi ban đầu, vẫn gặp lỗi tương tự ...
Edamame

6

Đối với bất kỳ ai xảy ra trên này, để thực sự sửa đổi bản gốc:

X_test.fillna(X_train.mean(), inplace=True)

Để ghi đè lên bản gốc:

X_test = X_test.fillna(X_train.mean())

Để kiểm tra xem bạn đang ở bản sao so với chế độ xem:

X_test._is_view

2
Mặc dù điều này đúng về mặt kỹ thuật, nhưng thực tế nó sai. Bạn không thể điền các NA X_test bằng trung bình X_test, bởi vì trong cuộc sống thực, bạn sẽ không có nghĩa là X_test khi bạn dự đoán một mẫu. Bạn nên sử dụng ý nghĩa X_train vì đây là dữ liệu duy nhất bạn thực sự có trong tay (trong 99% các kịch bản)
Omri374

4

Đừng quên

col_mask=df.isnull().any(axis=0) 

Trả về mặt nạ boolean cho biết giá trị np.nan.

row_mask=df.isnull().any(axis=1)

Mà trả về các hàng nơi np.nan xuất hiện. Sau đó, bằng cách lập chỉ mục đơn giản, bạn có thể gắn cờ tất cả các điểm của mình là np.nan.

df.loc[row_mask,col_mask]

2

Tôi đã đối mặt với vấn đề tương tự và thấy rằng numpy xử lý NaN và Inf khác nhau.
Nếu dữ liệu của bạn có Inf, hãy thử điều này:

np.where(x.values >= np.finfo(np.float64).max)
Where x is my pandas Dataframe 

Điều này sẽ đưa ra một bộ vị trí của các vị trí có giá trị NA.

Nếu dữ liệu của bạn có Nan, hãy thử điều này:

np.isnan(x.values.any())

2

Đừng quên kiểm tra giá trị inf. Điều duy nhất làm việc cho tôi:

df[df==np.inf]=np.nan
df.fillna(df.mean(), inplace=True)

Và thậm chí tốt hơn nếu bạn đang sử dụng sklearn

def replace_missing_value(df, number_features):

    imputer = Imputer(strategy="median")
    df_num = df[number_features]
    imputer.fit(df_num)
    X = imputer.transform(df_num)
    res_def = pd.DataFrame(X, columns=df_num.columns)
    return res_def

Ví dụ, khi number_features sẽ là một mảng của nhãn number_features:

number_features = ['median_income', 'gdp']

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.