sklearn error ValueError: इनपुट में NaN, अनंत या dtype के लिए बहुत बड़ा मान है ('float64')


127

मैं स्केलेर का उपयोग कर रहा हूं और आत्मीयता के प्रसार के साथ समस्या है। मैंने एक इनपुट मैट्रिक्स बनाया है और मुझे निम्न त्रुटि मिलती रहती है।

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

मै भाग चुका

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

मैंने प्रयोग करने की कोशिश की

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

अनंत मूल्यों को हटाने के लिए लेकिन यह काम नहीं किया। मैं अपने मैट्रिक्स में अनंत मूल्यों से छुटकारा पाने के लिए क्या कर सकता हूं, ताकि मैं आत्मीयता के प्रचार एल्गोरिथ्म का उपयोग कर सकूं?

मैं एनाकोंडा और अजगर 2.7.9 का उपयोग कर रहा हूं।


3
मैं इसे बंद करने के लिए मतदान कर रहा हूं, जैसा कि लेखक खुद कहता है कि उसका डेटा अमान्य था और यद्यपि सब कुछ बताया गया था, वह मान्य नहीं था - एक टाइपो के बराबर डेटा, जो एक समापन कारण है।
मार्कस मूलर

11
मेरे डेटासेट के साथ भी यही समस्या थी। अंतत: एक डेटा गलती, न कि एक डरावना सीख बग। नीचे दिए गए अधिकांश उत्तर उपयोगी लेकिन भ्रामक हैं। अपने डेटा की जांच की जांच करें, सुनिश्चित करें कि जब float64इसे परिवर्तित किया गया है, दोनों परिमित हैं और नहीं nan। त्रुटि संदेश उपयुक्त है - यह लगभग निश्चित रूप से किसी के लिए भी मुद्दा है जो खुद को यहां पाता है।
ओवेन

1
@ ओवेन के रिकॉर्ड और +1 के लिए, अपने इनपुट डेटा की जांच करें और सुनिश्चित करें कि आपके पास किसी भी पंक्ति या ग्रिड में कोई गुम मूल्य नहीं है। इस समस्या से बचने के लिए आप इंप्यूटर वर्ग का उपयोग कर सकते हैं।
अबूनिस्टा

जवाबों:


103

यह स्कोरिक के अंदर हो सकता है, और यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। मैं आपके द्वारा उपयोग किए जा रहे कार्यों के लिए दस्तावेज़ पढ़ने की सलाह देता हूं। आप एक का उपयोग कर रहे हैं जो आपके मैट्रिक्स पर निर्भर करता है जैसे सकारात्मक निश्चित होना और उस मानदंड को पूरा नहीं करना।

संपादित करें : मैं कैसे चूक सकता है:

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

स्पष्ट रूप से गलत है। अधिकार होगा:

np.any(np.isnan(mat))

तथा

np.all(np.isfinite(mat))

आप किसी भी तत्व को व्हीटर की जांच करना चाहते हैं, यह NaN है, न कि anyफ़ंक्शन का रिटर्न मान एक संख्या ...


4
डॉक्स ने इस त्रुटि के बारे में कुछ भी उल्लेख नहीं किया है, मुझे अपने नैपी ऐरे से अनंत मूल्यों से छुटकारा पाने का एक तरीका चाहिए
एथन

3
जैसा कि मैंने कहा: वे शायद आपके इनपुट ऐरे में नहीं हैं। वे उस गणित में हो सकते हैं जो इनपुट और जादुई आउटपुट के बीच होता है। मुद्दा यह है कि यह सब गणित इनपुट के लिए कुछ शर्तों पर निर्भर करता है। आपको यह जानने के लिए डॉक्स को ध्यान से पढ़ना होगा कि क्या आपका इनपुट इन शर्तों को पूरा करता है।
मार्कस म्यूलर

1
@ MarcusMüller क्या आप मुझे इस दस्तावेज़ के स्थान पर इंगित कर सकते हैं जहाँ वे इनपुट मैट्रिक्स की आवश्यकताओं को निर्दिष्ट करते हैं? मुझे लगता है कि आप जिस "डॉक्स" का उल्लेख नहीं कर सकते हैं। धन्यवाद :)
user2253546

38

पंडों के साथ स्केलेर का उपयोग करते समय मुझे वही त्रुटि संदेश मिला । मेरा समाधान किसी भी स्केलेर कोड को चलाने से पहले मेरे डेटाफ़्रेम के सूचकांक को रीसेट करना है :df

df = df.reset_index()

मुझे इस समस्या का कई बार सामना करना पड़ा जब मैंने अपनी कुछ प्रविष्टियों को हटा दिया df, जैसे कि

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

1
मैं तुमसे प्यार करता हूँ! यह एक दुर्लभ उदाहरण है कि मुझे पता नहीं है कि त्रुटि का कारण क्या है!
एलेक्जेंड्रा कपशुक

Df.reset_index () करने से परिणामी df में एक कॉलम के रूप में "इंडेक्स" जुड़ जाएगा। जो सभी परिदृश्य के लिए उपयोगी नहीं हो सकता है। यदि df.reset_index (ड्रॉप = ट्रू) चला तो यह उसी त्रुटि को फेंक देगा।
एस.एम.

14

यह मेरा समारोह (पर आधारित है इस ) की डाटासेट साफ करने के लिए nan, Infऔर याद आ रही कोशिकाओं (विषम डेटासेट के लिए):

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)

आप दो बार नान को क्यों गिराते हैं? पहली बार dropnaतब दूसरी बार जब inf को गिराने के बाद।
लूका

जब मैं अपने डेटासेट को साफ करने के लिए इस फ़ंक्शन का उपयोग करता हूं तो मुझे कुछ डेटा का नुकसान होता है। कोई भी सुध क्यों ???
हैकरबुडी

2
यह एकमात्र उत्तर है जिसने काम किया। मैंने एसओ पर 20 अन्य उत्तर देने की कोशिश की जो काम नहीं किए। मुझे लगता है कि इसे और अधिक बढ़ाने की जरूरत है।
कंटैंगो


10

यह जाँच है जिस पर यह विफल रहता है:

जो कहते हैं

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)

इसलिए सुनिश्चित करें कि आपके इनपुट में गैर NaN मान हैं। और वे सभी मूल्य वास्तव में फ्लोट मूल्य हैं। कोई भी मान Inf नहीं होना चाहिए।


5

अजगर 3 के इस संस्करण के साथ:

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

त्रुटि के विवरण को देखते हुए, मुझे कोड की विफलता के कारण मिले:

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

इससे, मैं परीक्षण करने के लिए सही तरीका निकालने में सक्षम था कि मेरे डेटा के साथ क्या हो रहा था उसी परीक्षण का उपयोग करके जो त्रुटि द्वारा दिए गए विफल रहता है: np.isfinite(X)

फिर एक त्वरित और गंदे लूप के साथ, मुझे पता चला कि मेरे डेटा में वास्तव में शामिल है 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
...

अब मुझे बस इतना करना है कि इन इंडेक्स पर मौजूद वैल्यूज को हटा दें।


4

पंक्तियों के सबसेट का चयन करने के बाद मुझे त्रुटि हुई:

df = df.reindex(index=my_index)

उन my_indexसम्‍मिलित मानों को बंद कर देता है जो सम्‍मिलित नहीं थे df.index, इसलिए रेनडेक्‍स फ़ंक्शन ने कुछ नई पंक्तियों को सम्मिलित किया और उन्हें भरा nan


2

ज्यादातर मामलों में अनंत और अशक्त मूल्यों से छुटकारा पाना इस समस्या को हल करता है।

अनंत मूल्यों से छुटकारा पाएं।

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

शून्य मानों से छुटकारा पाएं जिस तरह से आप चाहते हैं, विशिष्ट मूल्य जैसे कि 999, माध्य, या लापता मानों को लागू करने के लिए अपना स्वयं का फ़ंक्शन बनाएं

df.fillna(999, inplace=True)

2

मेरे पास एक ही त्रुटि थी, और मेरे मामले में एक्स और वाई डेटाफ्रेम थे इसलिए मुझे उन्हें पहले मैट्रिसेस में बदलना पड़ा:

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

संपादित करें: मूल रूप से सुझाए गए X.as_matrix () को पदावनत किया गया है


1

मुझे भी यही त्रुटि मिली। यह df.fillna(-99999, inplace=True)किसी भी प्रतिस्थापन, प्रतिस्थापन आदि करने से पहले काम करता था


4
यह एक गंदा फिक्स है। आपके सरणी में nanमान शामिल होने का एक कारण है ; आपको इसे ढूंढना चाहिए।
एलियास स्ट्रील

डेटा में नैनो हो सकता है और यह मानों के साथ डेटा के साथ इसे बदलने का एक तरीका देता है जो उसे स्वीकार्य लगता है
user2867432

0

मेरे मामले में समस्या यह थी कि कई डरावने फ़ंक्शंस सुन्न सरणियाँ देते हैं, जो पांडा इंडेक्स से रहित होते हैं। इसलिए एक सूचकांक बेमेल था जब मैंने नए डेटाफ्रेम के निर्माण के लिए उन संख्यात्मक सरणियों का उपयोग किया और फिर मैंने उन्हें मूल डेटा के साथ मिलाने की कोशिश की।


0

सभी अनंत मान निकालें:

(और उस कॉलम के लिए न्यूनतम या अधिकतम के साथ बदलें)

# 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

प्रयत्न

mat.sum()

यदि आपके डेटा का योग अनंत है (अधिक से अधिक फ्लोट मूल्य जो 3.402823e + 38 है) तो आपको वह त्रुटि मिलेगी।

scikit स्रोत कोड से validation.py में _assert_all_finite फ़ंक्शन देखें:

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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.