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


41

रैंडमफॉरस्ट मॉडल का उपयोग करते हुए परीक्षण डेटा की भविष्यवाणी करते समय मुझे वैल्यूआवर मिला।

मेरा कोड:

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)

त्रुटि:

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

मुझे परीक्षण डेटासेट में खराब मान कैसे मिलते हैं? इसके अलावा, मैं इन रिकॉर्ड्स को नहीं छोड़ना चाहता, क्या मैं उन्हें केवल माध्य या माध्यिका से बदल सकता हूं?

धन्यवाद।

जवाबों:


45

एस के साथ np.isnan(X)पदों के लिए ट्रू के साथ आपको बूलियन मास्क वापस मिलता है NaN

np.where(np.isnan(X))आप के साथ एक tuple वापस पाने के साथ मैं, जम्मू के निर्देशांक NaN

अंत में, np.nan_to_num(X)आप के साथ "नैनो को शून्य के साथ बदलें और परिमित संख्या के साथ inf"।

वैकल्पिक रूप से, आप उपयोग कर सकते हैं:


मैं नैन की जाँच के लिए पहचान की स्थिति को प्राथमिकता देता हूं, अगर x! = X वापस कोई नहीं, कई बार np.isnan (x) मेरे लिए विफल हो गया, तो कारण याद नहीं है
इताची

1
शून्य मान के साथ NaN मानों को प्रतिस्थापित करना उचित नहीं है। NaN मूल्यों का अभी भी लापता होने में महत्व हो सकता है और उन्हें शून्य के साथ लागू करना संभवत: सबसे खराब चीज है जो आप कर सकते हैं और आपके द्वारा उपयोग की जाने वाली सबसे खराब प्रतिरूपण विधि है। न केवल आप मनमाने ढंग से शून्य का परिचय देंगे, जो आपके चर को तिरछा कर सकता है, लेकिन आपके चर में स्वीकार्य मूल्य भी नहीं हो सकता है, जिसका अर्थ है कि आपके चर में एक शून्य नहीं हो सकता है।
hussam

मुझे एहसास हुआ कि मैंने कोई मार्गदर्शन नहीं दिया। यदि आप अपने डेटा को लागू करना चाहते हैं, तो .rolling()रोलिंग विंडो के औसत मूल्य के साथ लापता मूल्य को बदलने के लिए रोलिंग औसत का उपयोग करें। यदि आप कुछ और अधिक मजबूत उपयोग मॉड्यूल चाहते हैं <b> याद आ रही है </ b> आप MissForestबेतरतीब ढंग से आधारित प्रतिनियुक्ति के लिए उपयोग कर सकते हैं ।
hussam

7

मान X_testलेना एक पंडों का डेटाफ्रेम है, आप DataFrame.fillnaNaN मूल्यों को माध्य से बदलने के लिए उपयोग कर सकते हैं :

X_test.fillna(X_test.mean())

X_test सुन्न सरणी है। बस मूल प्रश्न में df_test को अपडेट किया, फिर भी वही त्रुटि हुई ...
एडमेम

6

वास्तव में मूल को संशोधित करने के लिए:

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

मूल को अधिलेखित करने के लिए:

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

यह देखने के लिए कि क्या आप प्रतिलिपि बनाम किसी दृश्य में हैं:

X_test._is_view

2
जबकि यह तकनीकी रूप से सच है, यह व्यावहारिक रूप से गलत है। आप X_test NA को X_test माध्य के साथ नहीं भर सकते हैं, क्योंकि वास्तविक जीवन में आपके पास नमूना की भविष्यवाणी करते समय X_test का अर्थ नहीं होगा। आपको X_train माध्य का उपयोग करना चाहिए क्योंकि यह एकमात्र डेटा है जो आपके हाथ में है (99% परिदृश्य में)
Omri374

4

मत भूलना

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

जो np.nan मानों को इंगित करते हुए एक बूलियन मास्क देता है।

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

जहाँ पंक्तियाँ लौटती हैं जहाँ np.nan दिखाई देता है। फिर सरल अनुक्रमण द्वारा आप अपने सभी बिंदुओं को चिह्नित कर सकते हैं जो np.nan हैं।

df.loc[row_mask,col_mask]

2

मैंने इसी तरह की समस्या का सामना किया और देखा कि सुन्न NaN और Inf को अलग तरह से हैंडल करता है।
यदि आपके पास Inf है, तो यह प्रयास करें:

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

यह उन स्थानों के स्थान का विवरण दे रहा है जहां NA मान मौजूद हैं।

यदि आपके डेटा में नेन है, तो यह कोशिश करें:

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

2

के रूप में अच्छी तरह से मूल्यों के लिए जाँच करने के लिए मत भूलना। केवल एक चीज जो मेरे लिए काम करती है:

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

और इससे भी बेहतर अगर आप स्केलेर का उपयोग कर रहे हैं

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

जब नंबर_फ्रीचर उदाहरण के लिए नंबर_फ्रीचर लेबल का एक सरणी होगा:

number_features = ['median_income', 'gdp']

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