我正在尝试使用scikit-learn预处理对具有缺失(即nan)值的数据进行规范化处理。
显然,某些缩放器(例如StandardScaler)以我想要的方式处理缺失值-我的意思是规范化现有值,同时保留nans-而其他(例如规范化器)只会引发错误。
我环顾四周,却未找到-如何使用缺少值的Normalizer或复制其行为(使用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))
答案 0 :(得分:2)
您的请求存在的问题是,规范化器按照文档的规定以这种方式运行:
将样本分别归一化为单位范数。
每个样本(即数据矩阵的每一行)中至少有一个非 零分量独立于其他样本重新缩放,因此其 范数(l1或l2)等于一个(source here)
这意味着每一行都必须求和成单位范数。如何处理缺失值?理想情况下,您似乎不希望它计入总和,并且希望对行进行归一化而不管它如何,但是内部函数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)