【问题标题】:Handling missing (nan) values on sklearn.preprocessing处理 sklearn.preprocessing 上的缺失 (nan) 值
【发布时间】:2019-08-12 06:51:23
【问题描述】:

我正在尝试使用 scikit-learn 预处理在处理数据之前对缺失(即 nan)值的数据进行标准化。

显然,一些缩放器(例如 StandardScaler)以我想要的方式处理缺失值 - 我的意思是在保持 nans 的同时规范化现有值 - 而其他(例如 Normalizer)只会引发错误。

我环顾四周并没有找到 - 如何使用具有缺失值的 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))    

【问题讨论】:

  • 我认为您正在寻找imputer,请查看scikit-learn.org/stable/modules/generated/…
  • 我不是;我不想估算缺失值。我想让它们保持原样,让其他人处理它们,就像 StandardScaler 允许我做的那样。

标签: python numpy scikit-learn


【解决方案1】:

根据文档,您的请求的问题在于 Normalizer 以这种方式运行:

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

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

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

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

  1. 首先创建一个掩码以记录您的数组中缺少哪些元素
  2. 创建一个用缺失值填充的响应数组
  3. 仅选择有效条目后将 Normalizer 应用到您的数组
  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)

【讨论】:

  • 谢谢!我以为我不需要面具就可以做到,但事实就是如此......
猜你喜欢
  • 2020-08-22
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2014-06-09
  • 2014-06-09
相关资源
最近更新 更多