Проблема с вашим запросом состоит в том, что Normalizer работает таким образом, согласно документации:
Нормализация образцов индивидуально в единицу нормы.
Каждая выборка (то есть каждая строка матрицы данных), по крайней мере, с одним
нулевой компонент масштабируется независимо от других образцов, так что его
норма (l1 или l2) равна одному ( источник здесь )
Это означает, что каждая строка должна суммироваться в единицу нормы. Как бороться с отсутствующим значением? В идеале кажется, что вы не хотите, чтобы она учитывалась в сумме, и вы хотите, чтобы строка нормализовалась независимо от нее, но внутренняя функция check_array предотвращает это, выдавая ошибку.
Вам нужно обойти такую ситуацию. Наиболее разумный способ сделать это:
- сначала создайте маску, чтобы записать, какие элементы отсутствовали в вашем массиве
- создать массив ответов, заполненный пропущенными значениями
- применить нормализатор к вашему массиву после выбора только допустимых записей
- записать в свой массив ответов нормализованные значения, основанные на их исходной позиции
вот код, детализирующий процесс, на основе вашего примера:
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)