在sklearn.preprocessing上处理缺失的(nan)值

时间:2019-03-21 12:05:46

标签: python numpy scikit-learn

我正在尝试使用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))    

1 个答案:

答案 0 :(得分:2)

您的请求存在的问题是,规范化器按照文档的规定以这种方式运行:

  

将样本分别归一化为单位范数。

     

每个样本(即数据矩阵的每一行)中至少有一个非   零分量独立于其他样本重新缩放,因此其   范数(l1或l2)等于一个(source here

这意味着每一行都必须求和成单位范数。如何处理缺失值?理想情况下,您似乎不希望它计入总和,并且希望对行进行归一化而不管它如何,但是内部函数check_array通过抛出错误来阻止它。

您需要规避这种情况。最合理的方法是:

  1. 首先创建一个蒙版,以记录数组中缺少哪些元素
  2. 创建一个填充缺失值的响应数组
  3. 仅选择有效条目后,
  4. 将规范化器应用于您的数组
  5. 在响应数组上记录基于原始位置的标准化值

根据您的示例,以下代码详细说明了该过程:

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)