如果策略失败,如何将 NaN 值归因于默认值?
How to impute NaN values to a default value if strategy fails?
问题
我正在使用 sklearn.preprocessing.Imputer class 在列上使用 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 值,是否有更优雅的方法来估算默认值?
这是一个矢量化解决方案,可以在 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.]]
应用我们的方法删除 nan
s
default = 0
data[:, np.isnan(data).all(axis=0)] = default
我们得到
[[nan 0. 1.]
[ 1. 0. 2.]
[ 1. 0. 3.]]
问题
我正在使用 sklearn.preprocessing.Imputer class 在列上使用 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 值,是否有更优雅的方法来估算默认值?
这是一个矢量化解决方案,可以在 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.]]
应用我们的方法删除 nan
s
default = 0
data[:, np.isnan(data).all(axis=0)] = default
我们得到
[[nan 0. 1.]
[ 1. 0. 2.]
[ 1. 0. 3.]]