#python #pandas #numpy #nan #numpy-dtype
#python #pandas #numpy #nan #numpy-dtype
Вопрос:
Я пытаюсь подогнать простую модель машинного обучения, используя scikit learn. В этой строке:
clf.fit(features, labels)
Я получаю знакомую ошибку:
Input contains NaN, infinity or a value too large for dtype('float64').
Всякий раз, когда я сталкивался с этим раньше, это было, когда в моих данных были значения NaN. Я подтвердил, что в данных нет NAN. Два входных сигнала для метода .fit() (объекты и метки) являются массивами np, но они получены из фрейма данных pandas. Прямо перед извлечением значений NaN, которые я напечатал:
print(features_df[features_df.isnull().any(axis=1)])
print(labels_df[labels_df.isnull().any(axis=1)])
Это напечатанные пустые фреймы данных, поэтому я знаю, что в нем нет строки со значением NaN. Я также проверил массивы numpy на наличие значений NaN после преобразования и даже успешно суммировал их с помощью метода np sum (), поэтому в np-массивах объектов или меток, переданных в fit, нет значений NaN.
Это означает, что должны быть значения бесконечности или действительно большие значения, в оба из которых мне трудно поверить. Есть ли какой-нибудь способ, которым я могу напечатать любые значения в dataframe или np-массиве, которые:
are NaN, infinity or a value too large for dtype('float64')?
Мне нужно, чтобы они были специально указаны мне, поскольку я не могу найти их своими глазами, и там нет значений NaN.
Комментарии:
1. вы пытались отфильтровать значения с помощью чего-то вроде:
df = df[df.column_name.notnull()]
?df = df[df.notnull()]
вероятно, также должно сработать.df
это фрейм данных pandas2. Я не знаю о значениях, слишком больших для float64 (как вы вообще ввели их в свой массив?), Но /-inf, nan, вы можете найти, используя
~np.isfinite
, начальная тильда инвертирует маску. Если вам нужны индексы вместо маски, используйтеnp.where
для маски
Ответ №1:
Предполагая, что это массив numpy с формой (3,3)
:
ar = np.array([1, 2, 3, 4, np.nan, 5, np.nan, 6, np.inf]).reshape((3,3))
print (ar)
[[ 1. 2. 3.]
[ 4. nan 5.]
[nan 6. inf]]
Чтобы проверить наличие NaN, положительной бесконечности, отрицательной бесконечности или различных их комбинаций, мы можем использовать:
numpy.isnan(ar) # True wherever nan
numpy.isposinf(ar) # True wherever pos-inf
numpy.isneginf(ar) # True wherever neg-inf
numpy.isinf(ar) # True wherever pos-inf or neg-inf
~numpy.isfinite(ar) # True wherever pos-inf or neg-inf or nan
соответственно. Каждое из них возвращает массив bool, и передача массива bool в numpy.where()
дает нам два массива индексов (по одному массиву индексов на измерение ar
):
ar_nan = np.where(np.isnan(ar))
print (ar_nan)
(array ([1, 2], dtype=int64), array ([1, 0], dtype = int64)) # Означает, nans
в (1,1) и (2,0)
и
ar_inf = np.where(np.isinf(ar))
print (ar_inf)
(array ([2], dtype=int64), array([2], dtype = int64)) # Означает, что inf находится в
(2,2)
Также, чтобы увидеть пределы float64:
np.finfo(np.float64)
finfo (разрешение = 1e-15, min =-1.7976931348623157 e 308,
max = 1.7976931348623157 e 308, dtype = float64)