lỗi sklearn ValueError: Đầu vào chứa NaN, vô cực hoặc giá trị quá lớn cho loại dtype ('float64')


129

Tôi đang sử dụng sklearn và gặp sự cố với việc truyền mối quan hệ. Tôi đã xây dựng một ma trận đầu vào và tôi tiếp tục gặp lỗi sau.

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

tôi chạy

np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True

Tôi đã thử sử dụng

mat[np.isfinite(mat) == True] = 0

để loại bỏ các giá trị vô hạn nhưng điều này cũng không hoạt động. Tôi có thể làm gì để loại bỏ các giá trị vô hạn trong ma trận của mình để có thể sử dụng thuật toán lan truyền ái lực?

Tôi đang sử dụng anaconda và python 2.7.9.


3
Tôi bỏ phiếu để đóng điều này, vì tác giả tự nói rằng dữ liệu của anh ấy không hợp lệ và mặc dù mọi thứ đã chỉ ra nó, anh ấy đã không xác thực - dữ liệu tương đương với lỗi đánh máy, đó là lý do đóng.
Marcus Müller

11
Tôi đã gặp vấn đề tương tự với tập dữ liệu của mình. Cuối cùng: một lỗi dữ liệu, không phải một lỗi học scikit. Hầu hết các câu trả lời dưới đây đều hữu ích nhưng gây hiểu lầm. Kiểm tra kiểm tra kiểm tra dữ liệu của bạn, đảm bảo rằng khi chuyển đổi sang float64nó là cả hữu hạn và không nan. Thông báo lỗi là apt - đây gần như chắc chắn là vấn đề đối với bất kỳ ai tìm thấy chính mình ở đây.
Owen

1
Đối với bản ghi và +1 cho @Owen, hãy kiểm tra dữ liệu đầu vào của bạn và đảm bảo rằng bạn không có bất kỳ giá trị nào bị thiếu trong bất kỳ hàng hoặc lưới nào. Bạn có thể sử dụng lớp Imputer để tránh vấn đề này.
abautista

Câu trả lời:


103

Điều này có thể xảy ra bên trong scikit, và nó phụ thuộc vào những gì bạn đang làm. Tôi khuyên bạn nên đọc tài liệu về các chức năng bạn đang sử dụng. Bạn có thể đang sử dụng một cái phụ thuộc vào việc ma trận của bạn là xác định dương và không đáp ứng các tiêu chí đó.

CHỈNH SỬA : Làm thế nào tôi có thể bỏ lỡ điều đó:

np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True

rõ ràng là sai. Đúng sẽ là:

np.any(np.isnan(mat))

np.all(np.isfinite(mat))

Bạn muốn kiểm tra bất kỳ phần tử nào có phải là NaN hay không và giá trị trả về của anyhàm có phải là số hay không ...


4
Các tài liệu không đề cập đến bất cứ điều gì về lỗi này tôi cần một cách để loại bỏ các giá trị vô hạn từ mảng nupy tôi
Ethan Waldie

3
Như tôi đã nói: Chúng có thể không có trong mảng đầu vào của bạn. Chúng có thể xảy ra trong phép toán xảy ra giữa đầu vào và đầu ra ma thuật. Vấn đề là tất cả phép toán này phụ thuộc vào các điều kiện nhất định cho đầu vào. Bạn phải đọc kỹ các tài liệu để tìm hiểu xem đầu vào của bạn có đáp ứng các điều kiện này hay không.
Marcus Müller

1
@ MarcusMüller bạn có thể chỉ cho tôi vị trí của tài liệu này nơi họ chỉ định các yêu cầu của ma trận đầu vào không? Tôi dường như không thể tìm thấy "tài liệu" mà bạn đang đề cập đến. Cảm ơn bạn :)
user2253546 23/02/17

39

Tôi nhận được thông báo lỗi tương tự khi sử dụng sklearn với gấu trúc . Giải pháp của tôi là đặt lại chỉ mục của khung dữ liệu của tôi dftrước khi chạy bất kỳ mã sklearn nào:

df = df.reset_index()

Tôi đã gặp sự cố này nhiều lần khi xóa một số mục nhập trong của mình df, chẳng hạn như

df = df[df.label=='desired_one']

1
Tôi mến bạn! Đó là một trường hợp hiếm hoi về việc tôi tìm ra giải pháp phù hợp mặc dù không biết nguyên nhân gây ra lỗi là gì!
Alexandr Kapshuk

Bằng cách thực hiện df.reset_index (), nó sẽ thêm "chỉ mục" như một cột trong df kết quả. Điều này có thể không hữu ích cho tất cả các trường hợp. Nếu df.reset_index (drop = True) chạy thì nó sẽ gặp lỗi tương tự.
smm

16

Đây là chức năng của tôi (dựa trên này ) để làm sạch các bộ dữ liệu của nan, Infvà thiếu các tế bào (ví bộ dữ liệu sai lệch):

import pandas as pd

def clean_dataset(df):
    assert isinstance(df, pd.DataFrame), "df needs to be a pd.DataFrame"
    df.dropna(inplace=True)
    indices_to_keep = ~df.isin([np.nan, np.inf, -np.inf]).any(1)
    return df[indices_to_keep].astype(np.float64)

Tại sao bạn lại làm rơi nan hai lần? Lần đầu tiên dropnasau đó lần thứ hai khi thả inf.
luca

Tôi mất một số dữ liệu khi sử dụng chức năng này để xóa tập dữ liệu của mình. Bất kỳ sự kiện tại sao ???
hackerbuddy

2
Đây là câu trả lời duy nhất có hiệu quả. Tôi đã thử 20 câu trả lời khác trên SO mà không hoạt động. Tôi nghĩ cái này cần nhiều lượt ủng hộ hơn.
Contango


10

Đây là kiểm tra mà nó không thành công:

Mà nói

def _assert_all_finite(X):
    """Like assert_all_finite, but only for ndarray."""
    X = np.asanyarray(X)
    # First try an O(n) time, O(1) space solution for the common case that
    # everything is finite; fall back to O(n) space np.isfinite to prevent
    # false positives from overflow in sum method.
    if (X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.sum())
            and not np.isfinite(X).all()):
        raise ValueError("Input contains NaN, infinity"
                         " or a value too large for %r." % X.dtype)

Vì vậy, hãy đảm bảo rằng bạn có các giá trị không phải NaN trong đầu vào của mình. Và tất cả những giá trị đó thực sự là giá trị float. Không có giá trị nào phải là Inf.


5

Với phiên bản python 3 này:

/opt/anaconda3/bin/python --version
Python 3.6.0 :: Anaconda 4.3.0 (64-bit)

Xem xét chi tiết của lỗi, tôi tìm thấy các dòng mã gây ra lỗi:

/opt/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in _assert_all_finite(X)
     56             and not np.isfinite(X).all()):
     57         raise ValueError("Input contains NaN, infinity"
---> 58                          " or a value too large for %r." % X.dtype)
     59 
     60 

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

Từ đó, tôi đã có thể trích xuất cách chính xác để kiểm tra những gì đang xảy ra với dữ liệu của mình bằng cách sử dụng cùng một bài kiểm tra không thành công do thông báo lỗi đưa ra: np.isfinite(X)

Sau đó, với một vòng lặp nhanh và bẩn, tôi có thể thấy rằng dữ liệu của tôi thực sự chứa nans:

print(p[:,0].shape)
index = 0
for i in p[:,0]:
    if not np.isfinite(i):
        print(index, i)
    index +=1

(367340,)
4454 nan
6940 nan
10868 nan
12753 nan
14855 nan
15678 nan
24954 nan
30251 nan
31108 nan
51455 nan
59055 nan
...

Bây giờ tất cả những gì tôi phải làm là loại bỏ các giá trị tại các chỉ mục này.


4

Tôi đã gặp lỗi sau khi cố gắng chọn một tập hợp con các hàng:

df = df.reindex(index=my_index)

Hóa ra có my_indexchứa các giá trị không được chứa trong df.index, vì vậy hàm reindex đã chèn một số hàng mới và lấp đầy chúng nan.


2

Trong hầu hết các trường hợp, việc loại bỏ các giá trị vô hạn và vô hạn sẽ giải quyết được vấn đề này.

thoát khỏi giá trị vô hạn.

df.replace([np.inf, -np.inf], np.nan, inplace=True)

loại bỏ các giá trị null theo cách bạn thích, giá trị cụ thể như 999, giá trị trung bình hoặc tạo hàm của riêng bạn để gán các giá trị bị thiếu

df.fillna(999, inplace=True)

2

Tôi đã gặp lỗi tương tự và trong trường hợp của tôi, X và y là khung dữ liệu nên trước tiên tôi phải chuyển đổi chúng thành ma trận:

X = X.values.astype(np.float)
y = y.values.astype(np.float)

Chỉnh sửa: X.as_matrix () được đề xuất ban đầu không được dùng nữa


1

tôi gặp lỗi tương tự. nó đã hoạt động với df.fillna(-99999, inplace=True)trước khi thực hiện bất kỳ sự thay thế, thay thế nào, v.v.


4
Đây là một bản sửa lỗi bẩn. Có một lý do tại sao mảng của bạn chứa nancác giá trị; bạn nên tìm nó.
Elias Strehle

các dữ liệu có thể chứa nan và điều này mang lại một cách để thay thế nó với dữ liệu với giá trị mà ông / bà thấy chấp nhận được
user2867432

0

Trong trường hợp của tôi, vấn đề là nhiều hàm scikit trả về mảng numpy, không có chỉ mục gấu trúc. Vì vậy, có sự không khớp về chỉ mục khi tôi sử dụng các mảng trống đó để xây dựng các DataFrame mới và sau đó tôi cố gắng trộn chúng với dữ liệu ban đầu.


0

Xóa tất cả các giá trị vô hạn:

(và thay thế bằng tối thiểu hoặc tối đa cho cột đó)

# find min and max values for each column, ignoring nan, -inf, and inf
mins = [np.nanmin(matrix[:, i][matrix[:, i] != -np.inf]) for i in range(matrix.shape[1])]
maxs = [np.nanmax(matrix[:, i][matrix[:, i] != np.inf]) for i in range(matrix.shape[1])]

# go through matrix one column at a time and replace  + and -infinity 
# with the max or min for that column
for i in range(log_train_arr.shape[1]):
    matrix[:, i][matrix[:, i] == -np.inf] = mins[i]
    matrix[:, i][matrix[:, i] == np.inf] = maxs[i]

-1

thử

mat.sum()

Nếu tổng dữ liệu của bạn là vô cùng (lớn hơn giá trị float tối đa là 3,402823e + 38), bạn sẽ gặp lỗi đó.

xem hàm _assert_all_finite trong validation.py từ mã nguồn scikit:

if is_float and np.isfinite(X.sum()):
    pass
elif is_float:
    msg_err = "Input contains {} or a value too large for {!r}."
    if (allow_nan and np.isinf(X).any() or
            not allow_nan and not np.isfinite(X).all()):
        type_err = 'infinity' if allow_nan else 'NaN, infinity'
        # print(X.sum())
        raise ValueError(msg_err.format(type_err, X.dtype))
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.