1

我有一个data包含实际值和一些 NaN 值的数据框。我正在尝试使用随机投影执行局部敏感散列,以将维度减少到 25 个组件,特别是sklearn.random_projection.GaussianRandomProjection类。但是,当我运行时:

tx = random_projection.GaussianRandomProjection(n_components = 25) data25 = tx.fit_transform(data)

我明白了Input contains NaN, infinity or a value too large for dtype('float64')。有解决方法吗?我尝试将所有 NaN 值更改为我的数据集中从未存在的值,例如 -1。在这种情况下,我的输出有多有效?我不是局部敏感散列/随机投影理论背后的专家,因此任何见解也会有所帮助。谢谢。

4

1 回答 1

0

我发现 NA / NaN 值(不可用/非数字)只是很麻烦。

您不想只替换像 -1 这样的随机值。如果您倾向于这样做,请使用Imputer 类之一。否则,您可能会极大地改变点之间的距离。如果您使用随机投影,您可能希望尽可能地保持距离:

控制随机投影矩阵的维度和分布,以保持数据集任意两个样本之间的成对距离。

然而,这可能会或可能不会导致合理的学习价值。据我所知,插补是一个开放的研究领域,(例如)这位先生专门研究的领域。

如果您有足够的示例,请考虑删除包含 NaN 值的行或列。另一种可能性是训练像受限玻尔兹曼机这样的生成模型并使用它来填充缺失值:

rbm = sklearn.neural_network.BernoulliRBM().fit( data_with_no_nans )
mean_imputed_data = sklearn.preprocessing.Imputer().fit_transform( all_data )
rbm_imputation = rbm.gibbs( mean_imputed_data )
nan_mask = np.isnan( all_data )
all_data[ nan_mask ] = rbm_imputation[ nan_mask ]

最后,您可以考虑使用最近邻进行插补。对于给定的列,使用所有完整行在该列之外的所有变量上训练最近邻模型。然后,对于缺少该列的行,找到 k 个最近的邻居并使用它们之间的平均值。(这会变得非常昂贵,特别是如果您有多个缺失值的行,因为您必须为缺失列的每个组合训练一个模型)。

于 2015-06-17T14:17:11.237 回答