sklearn hatası ValueError: Giriş, NaN, infinity veya dtype için çok büyük bir değer içeriyor ('float64')


129

Sklearn kullanıyorum ve afinite yayılımıyla ilgili bir sorun yaşıyorum. Bir girdi matrisi oluşturdum ve şu hatayı alıyorum.

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

Koştum

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

Kullanmayı denedim

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

sonsuz değerleri kaldırmak için ama bu da işe yaramadı. Afinite yayılma algoritmasını kullanabilmek için matrisimdeki sonsuz değerlerden kurtulmak için ne yapabilirim?

Anaconda ve python 2.7.9 kullanıyorum.


3
Bunu kapatmak için oy kullanıyorum, çünkü yazar kendi verisinin geçersiz olduğunu ve her şeyin buna işaret etmesine rağmen doğrulamadı - kapanış nedeni olan bir yazım hatası ile eşdeğer veriler.
Marcus Müller

11
Veri kümemle aynı sorunu yaşadım. Sonuçta: bir veri hatası, scikit öğrenme hatası değil. Aşağıdaki yanıtların çoğu yararlıdır ancak yanıltıcıdır. Verilerinizi kontrol edin, float64ona dönüştürüldüğünde hem sonlu hem de sınırlı olmadığından emin olun nan. Hata mesajı uygundur - bu, kendilerini burada bulan herkes için neredeyse kesinlikle bir sorundur.
Owen

1
@Owen için kayıt ve +1 için, girdi verilerinizi kontrol edin ve herhangi bir satırda veya ızgarada eksik değer olmadığından emin olun. Bu sorunu önlemek için Imputer sınıfını kullanabilirsiniz.
abautista

Yanıtlar:


103

Bu scikit içinde olabilir ve ne yaptığınıza bağlıdır. Kullandığınız işlevlerin belgelerini okumanızı tavsiye ederim. Örneğin matrisinizin pozitif tanımlı olmasına ve bu kriterleri karşılamamasına bağlı olan birini kullanıyor olabilirsiniz.

DÜZENLEME : Bunu nasıl özleyebilirim:

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

açıkça yanlış. Doğru:

np.any(np.isnan(mat))

ve

np.all(np.isfinite(mat))

Herhangi bir elemanın NaN olup olmadığını kontrol etmek istersiniz, anyfonksiyonun dönüş değerinin bir sayı olup olmadığını değil ...


4
Dokümanlar bu hata hakkında hiçbir şeyden bahsetmiyorlar.Nupy dizimdeki sonsuz değerlerden kurtulmanın bir yoluna ihtiyacım var
Ethan Waldie

3
Dediğim gibi: Girdi dizinizde olmayabilir. Girdi ve sihirli çıktı arasında gerçekleşen matematikte ortaya çıkabilirler. Önemli olan, tüm bu matematiğin girdi için belirli koşullara bağlı olmasıdır. Verdiğiniz bilgilerin bu koşulları karşılayıp karşılamadığını öğrenmek için belgeleri dikkatlice okumalısınız.
Marcus Müller

1
@ MarcusMüller, girdi matrisinin gereksinimlerini belirledikleri bu belgenin konumunu gösterebilir misiniz? Bahsettiğiniz "dokümanları" bulamıyorum. Teşekkür ederim :)
user2253546

39

Kullanırken aynı hata mesajı var sklearn ile pandalar . Çözümüm, dfherhangi bir sklearn kodunu çalıştırmadan önce veri çerçevemin dizinini sıfırlamaktır :

df = df.reset_index()

Bu sorunla birçok kez karşılaştım ve bazı girişleri kaldırdım. df .

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

1
Seni seviyorum! Bu, hatanın sebebinin ne olduğunu bilmeme rağmen doğru çözümü bulmamın nadir bir örneği!
Alexandr Kapshuk

Df.reset_index () işlemini yaparak, sonuçta elde edilen df'ye sütun olarak "indeksi" ekleyecektir. Tüm senaryolar için yararlı olmayabilir. Df.reset_index (drop = True) çalıştırılırsa aynı hatayı verir.
smm

16

Bu (dayanan benim işlevidir bu ) ait veri kümesi temizlemek için nan, Infve (çarpık veri setleri için) hücreleri eksik:

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)

Nanı neden iki kez düşürdün? İlk kez dropnadaha sonra ikinci kez inf bırakıldığında.
luca

Veri kümemi temizlemek için bu işlevi kullandığımda bazı verileri kaybediyorum. Herhangi bir öneri neden ???
hackerbuddy

2
Bu sadece çalıştı cevap. SO'da işe yaramayan 20 diğer yanıtı denedim. Bence bunun daha fazla oy kullanması gerekiyor.
Contango


10

Başarısız olduğu kontrol budur:

Hangi diyor

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)

Bu nedenle, girişinizde NaN olmayan değerler bulunduğundan emin olun. Ve tüm bu değerler aslında kayan değerlerdir. Değerlerin hiçbiri Inf da olmamalıdır.


5

Python 3'ün bu sürümüyle:

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

Hatanın ayrıntılarına baktığımda, hataya neden olan kod satırlarını buldum:

/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').

Bundan, hata mesajıyla verilen aynı testi kullanarak verilerimde neler olup bittiğini test etmenin doğru yolunu çıkarabildim: np.isfinite(X)

Sonra hızlı ve kirli bir döngü ile verilerimin gerçekten şunları içerdiğini bulabildim 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
...

Şimdi tek yapmam gereken bu indekslerdeki değerleri kaldırmak.


4

Bir satır alt kümesini seçmeye çalıştıktan sonra hata aldım:

df = df.reindex(index=my_index)

Çıkıyor my_indexkapsamına alınamayan alan değerler df.indexreindex fonksiyonu bazı yeni satırlar eklenen ve onları doldurdu yüzden nan.


2

Çoğu durumda sonsuz ve boş değerlerden kurtulmak bu sorunu çözer.

sonsuz değerlerden kurtulun.

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

null değerlerden istediğiniz gibi kurtulun, 999 gibi belirli bir değeri ifade edin veya eksik değerleri belirlemek için kendi işlevinizi oluşturun

df.fillna(999, inplace=True)

2

Aynı hatayı aldım ve benim durumumda X ve y veri çerçeveleri idi, bu yüzden önce onları matrislere dönüştürmek zorunda kaldım:

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

Düzenleme: Orijinal olarak önerilen X.as_matrix () Kullanımdan Kaldırıldı


1

Aynı hatayı aldım. df.fillna(-99999, inplace=True)herhangi bir değiştirme, ikame vb. yapmadan önce çalıştı


4
Bu kirli bir düzeltmedir. Dizinizin nandeğerler içermesinin bir nedeni vardır ; bulmalısın.
Elias Strehle

veriler nan içerebilir ve bu, veriyi kabul edilebilir bulduğu değerlerle değiştirmenin bir yolunu sağlar
user2867432

0

Benim durumumda sorun, birçok scikit işlevinin pandas indeksinden yoksun numpy dizileri döndürmesiydi. Dolayısıyla, yeni DataFrame'leri oluşturmak için bu uyuşuk dizileri kullandığımda bir dizin uyuşmazlığı vardı ve sonra bunları orijinal verilerle karıştırmaya çalıştım.


0

Tüm sonsuz değerleri kaldırın:

(ve bu sütun için min veya maks ile değiştirin)

# 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

Deneyin

mat.sum()

Verilerinizin toplamı sonsuzsa (maksimum kayan değer olan 3.402823e + 38'den büyükse) bu hatayı alırsınız.

scikit kaynak kodundan validation.py'deki _assert_all_finite işlevine bakın:

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.