স্কলারন ত্রুটি ভ্যালুএররার: ইনপুটটিতে 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

অসীম মানগুলি অপসারণ করতে কিন্তু এটি কার্যকর হয়নি। আমার ম্যাট্রিক্সের অসীম মানগুলি থেকে মুক্তি পেতে আমি কী করতে পারি, যাতে আমি স্নেহ প্রচারের অ্যালগরিদম ব্যবহার করতে পারি?

আমি অ্যানাকোন্ডা এবং পাইথন ২.7.৯ ব্যবহার করছি।


3
আমি এটিকে বন্ধ করার পক্ষে ভোট দিচ্ছি, যেমন লেখক নিজেই বলেছেন যে তার ডেটা অবৈধ ছিল এবং যদিও সবকিছুই এটি নির্দেশ করেছিল, তিনি বৈধতা দেননি - টাইপোর সমতূল্য ডেটা, এটি একটি সমাপ্ত কারণ।
মার্কাস মুলার

11
আমার ডেটাসেটের সাথে আমারও একই সমস্যা ছিল। শেষ পর্যন্ত: একটি ডেটা ভুল, একটি বিজ্ঞানী শিখার বাগ নয়। নীচের উত্তরগুলির বেশিরভাগই সহায়ক তবে বিভ্রান্তিকর। চেক চেক আপনার ডেটা পরীক্ষা করে দেখুন, float64এটিতে রূপান্তর করার সময় উভয়ই সীমাবদ্ধ এবং না তা নিশ্চিত করুন nan। ত্রুটি বার্তাটি উপযুক্ত - এটি এখানে অবশ্যই নিজেরাই খুঁজে পাওয়া যেকোন ব্যক্তির পক্ষে এটি অবশ্যই সমস্যা।
ওয়েন

1
রেকর্ডের জন্য এবং @ ওভেনের জন্য +1, আপনার ইনপুট ডেটা পরীক্ষা করে দেখুন এবং নিশ্চিত করুন যে কোনও সারি বা গ্রিডে আপনার কোনও মূল্য নেই। আপনি এই সমস্যা এড়াতে ইম্পিউটার ক্লাসটি ব্যবহার করতে পারেন।
আবুটিস্তা

উত্তর:


103

এটি বিজ্ঞানের ভিতরে ঘটতে পারে এবং এটি আপনি কী করছেন তার উপর নির্ভর করে। আপনি যে ফাংশনগুলি ব্যবহার করছেন তার জন্য ডকুমেন্টেশন পড়ার পরামর্শ দিচ্ছি। আপনি সম্ভবত এমন একটি ব্যবহার করছেন যা উদাহরণস্বরূপ আপনার ম্যাট্রিক্সের উপর ইতিবাচক সুনির্দিষ্ট এবং সেই মানদণ্ডটি পূরণ করছে না on

সম্পাদনা : আমি কীভাবে এটি মিস করতে পারি:

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
@ মার্কাসমুলার আপনি কি আমাকে এই দস্তাবেজের অবস্থানটিতে নির্দেশ করতে পারবেন যেখানে তারা ইনপুট ম্যাট্রিক্সের প্রয়োজনীয়তা নির্দিষ্ট করে? আপনি যে "ডক্স" উল্লেখ করছেন তা আমি খুঁজে পাচ্ছি না। আপনাকে ধন্যবাদ :)
ব্যবহারকারীর 25253546

38

যখন ব্যবহার আমারও একই ভুল বার্তা পেয়েছিলাম sklearn সঙ্গে পান্ডাস । আমার সমাধানটি হ'ল যে 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দ্বিতীয়বার যখন ইনফটি নামা যায়।
লুকা

আমি আমার ডেটাসেট পরিষ্কার করার জন্য এই ফাংশনটি ব্যবহার করি তখন আমি কিছু ডেটা হারাতে পারি। কোন মহামারী কেন ???
হ্যাকারবাডি

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 মান নেই। এবং এই সমস্ত মানগুলি আসলে ভাসমান মান। মানগুলির কোনওটি ইনফ হওয়া উচিত নয়।


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মানগুলি থাকার একটি কারণ রয়েছে ; আপনার এটি খুঁজে পাওয়া উচিত।
ইলিয়াস স্ট্রেলে

ডেটাতে ন্যান থাকতে পারে এবং এটি সেই মানগুলির সাথে ডেটা দিয়ে এটি প্রতিস্থাপনের একটি উপায় দেয় যা সে গ্রহণযোগ্য মনে করে
ব্যবহারকারী 2867432

0

আমার ক্ষেত্রে সমস্যাটি ছিল যে অনেকগুলি স্কাইকিট ফাংশন নমফি অ্যারেগুলি ফিরিয়ে দেয়, যা পান্ডাস সূচক থেকে বঞ্চিত। সুতরাং যখন একটি নতুন সূচি তৈরির জন্য আমি সেই নাম্বার অ্যারেগুলি ব্যবহার করেছি এবং তখন আমি সেগুলি মূল ডেটার সাথে মিশ্রিত করার চেষ্টা করেছি an


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 হয়) আপনি ত্রুটি পাবেন।

সাইকিট সোর্স কোড থেকে বৈধতা.পায়িতে _সেট্রি_স_ফিনেট ফাংশনটি দেখুন:

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))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.