Как приписать значения NaN к значению по умолчанию, если стратегия терпит неудачу? - PullRequest
0 голосов
/ 29 мая 2018

Проблема

Я использую класс sklearn.preprocessing.Imputer для вменения значений NaN, используя стратегию mean по столбцам, т.е. ось = 0.Моя проблема в том, что некоторые данные, которые должны быть вменены только , имеют значения NaN в своем столбце, например, когда есть только одна запись.

import numpy as np
import sklearn.preprocessing import Imputer

data = np.array([[1, 2, np.NaN]])
data = Imputer().fit_transform(data)

Это дает вывод array([[1., 2.]])

Достаточно справедливо, очевидно, что Imputer не может вычислить среднее значение для набора значений, которые все являются NaN.Однако вместо удаления значения я хотел бы вернуться к значению по умолчанию, в моем случае 0.

Текущий подход

Чтобы решить эту проблему, я сначала проверяю, содержит ли весь столбец толькоЗначения NaN и, если да, замените их на мое значение по умолчанию 0:

# Loop over all columns in data
for column in data.T:
    # Check if all values in column are NaN
    if all(np.isnan(value) for value in column):
        # Fill the column with default value 0
        column.fill(0)

Вопрос

Существует ли более элегантный способ вменения значения по умолчанию, если вся ось содержит только NaNзначения?

1 Ответ

0 голосов
/ 29 мая 2018

Это векторизованное решение для выполнения того, что вы делаете в цикле for, поэтому оно должно быть намного быстрее

default = 0
data[:, np.isnan(data).all(axis=0)] = default

Затем вы можете применить свой метод Imputer().fit_transform() к новому data.


Пример

data = np.array([[np.nan, 1, 1], [np.nan]*3, [1, 2, 3]]).T

, который выглядит как

[[nan nan  1.]
 [ 1. nan  2.]
 [ 1. nan  3.]]

Применение нашего метода для удаления nan s

default = 0
data[:, np.isnan(data).all(axis=0)] = default

имы получаем

[[nan  0.  1.]
 [ 1.  0.  2.]
 [ 1.  0.  3.]]
...