【问题标题】:How to impute NaN values to a default value if strategy fails?如果策略失败,如何将 NaN 值归为默认值?
【发布时间】:2018-11-08 03:38:26
【问题描述】:

问题

我正在使用 sklearn.preprocessing.Imputer 类在列上使用 mean 策略来估算 NaN 值,即轴 = 0。我的问题是某些需要估算的数据 only 在其列中具有 NaN 值,例如当只有一个条目时。

import numpy as np
import sklearn.preprocessing import Imputer

data = np.array([[1, 2, np.NaN]])
data = Imputer().fit_transform(data)

这给出了array([[1., 2.]])的输出

很公平,显然 Imputer 无法计算一组全为 NaN 的值的平均值。但是,我不想删除该值,而是想回退到默认值,在我的例子中是 0。

目前的做法

为了解决这个问题,我首先检查一整列是否只包含 NaN 值,如果是,则将它们替换为我的默认值 0:

# Loop over all columns in data
for column in data.T:
    # Check if all values in column are NaN
    if all(np.isnan(value) for value in column):
        # Fill the column with default value 0
        column.fill(0)

问题

如果整个轴仅包含 NaN 值,是否有更优雅的方法来估算默认值?

【问题讨论】:

  • 你能把does not have non-NaN values in it's column改成does have NaN values in it's column吗?这将很容易理解

标签: python scikit-learn imputation


【解决方案1】:

这是一个矢量化的解决方案,可以在 for 循环中执行您正在执行的操作,因此应该更快

default = 0
data[:, np.isnan(data).all(axis=0)] = default

然后您可以将 Imputer().fit_transform() 方法应用于新的 data


例子

data = np.array([[np.nan, 1, 1], [np.nan]*3, [1, 2, 3]]).T

看起来像

[[nan nan  1.]
 [ 1. nan  2.]
 [ 1. nan  3.]]

应用我们的方法删除nans

default = 0
data[:, np.isnan(data).all(axis=0)] = default

我们得到

[[nan  0.  1.]
 [ 1.  0.  2.]
 [ 1.  0.  3.]]

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2012-11-25
    • 1970-01-01
    • 2022-12-04
    • 2011-07-26
    相关资源
    最近更新 更多