Обработка отсутствующих значений (nan) в sklearn.предварительная обработка

#python #numpy #scikit-learn

#python #numpy #scikit-learn

Вопрос:

Я пытаюсь нормализовать данные с отсутствующими значениями (т. Е. nan) перед их обработкой, используя предварительную обработку scikit-learn.

По-видимому, некоторые программы масштабирования (например, StandardScaler) обрабатывают отсутствующие значения так, как я хочу — под этим я подразумеваю нормализацию существующих значений с сохранением nans — в то время как другие (например, нормализатор) просто выдают ошибку.

Я осмотрелся и не нашел — как я могу использовать нормализатор с отсутствующими значениями или воспроизвести его поведение (с norm = ‘l1’ и norm = ‘l2’; мне нужно протестировать несколько вариантов нормализации) каким-либо другим способом?

 from sklearn.preprocessing import Normalizer, StandardScaler
import numpy as np

data = np.array([0,1,2,np.nan, 3,4])

scaler = StandardScaler(with_mean=True, with_std=True)
scaler.fit_transform(data.reshape(-1,1))

normalizer = Normalizer(norm='l2')
normalizer.fit_transform(data.reshape(-1,1))    
  

Комментарии:

1. Я думаю, вы ищете imputer , загляните в scikit-learn.org/stable/modules/generated /…

2. Это не так; я не хочу приписывать недостающее значение. Я хочу оставить их такими, какие они есть, и позволить кому-то другому по конвейеру разобраться с ними, точно так же, как это позволил бы мне сделать StandardScaler.

Ответ №1:

Проблема с вашим запросом заключается в том, что нормализатор работает таким образом, в соответствии с документацией:

Нормализуйте выборки по отдельности до единичной нормы.

Каждая выборка (т. Е. каждая строка матрицы данных) с по крайней мере одним ненулевым компонентом масштабируется независимо от других выборок, так что ее норма (l1 или l2) равна единице (источник здесь)

Это означает, что каждая строка должна суммироваться до единичной нормы. Как справиться с отсутствующим значением? В идеале кажется, что вы не хотите, чтобы это учитывалось в сумме, и вы хотите, чтобы строка нормализовалась независимо от этого, но внутренняя функция check_array предотвращает это, выдавая ошибку.

Вам нужно обойти такую ситуацию. Наиболее разумный способ сделать это -:

  1. сначала создайте маску, чтобы записать, какие элементы отсутствовали в вашем массиве
  2. создайте массив ответов, заполненный отсутствующими значениями
  3. примените нормализатор к вашему массиву после выбора только допустимых записей
  4. запишите в свой массив ответов нормализованные значения на основе их исходного положения

вот некоторый код, детализирующий процесс, основанный на вашем примере:

 from sklearn.preprocessing import Normalizer, StandardScaler
import numpy as np

data = np.array([0,1,2,np.nan, 3,4])

# set valid mask
nan_mask = np.isnan(data)
valid_mask = ~nan_mask

normalizer = Normalizer(norm='l2')

# create a result array
result = np.full(data.shape, np.nan)

# assign only valid cases to 
result[valid_mask] = normalizer.fit_transform(data[valid_mask].reshape(-1,1)).reshape(data[valid_mask].shape)
  

Комментарии:

1. Спасибо! Я думал, что смогу сделать это без необходимости в маске, но это то, что есть…