使用 KNN 在 python 中缺失值插补

新手上路,请多包涵

我有一个看起来像这样的数据集

1908    January 5.0 -1.4
1908    February    7.3 1.9
1908    March   6.2 0.3
1908    April   NaN   2.1
1908    May NaN   7.7
1908    June    17.7    8.7
1908    July    NaN   11.0
1908    August  17.5    9.7
1908    September   16.3    8.4
1908    October 14.6    8.0
1908    November    9.6 3.4
1908    December    5.8 NaN
1909    January 5.0 0.1
1909    February    5.5 -0.3
1909    March   5.6 -0.3
1909    April   12.2    3.3
1909    May 14.7    4.8
1909    June    15.0    7.5
1909    July    17.3    10.8
1909    August  18.8    10.7

我想使用 KNN 作为方法替换 NaN s。我查找了 sklearn s Imputer 类,但它仅支持均值、中位数和众数插补。 这里 有一个功能请求,但我认为到目前为止还没有实现。关于如何使用 KNN 替换最后两列中的 NaN 的任何想法?

编辑:因为我需要在另一个环境中运行代码,所以我没有安装包的奢侈。 Sklearn、pandas、numpy 和其他标准包是我唯一可以使用的。

原文由 Clock Slave 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 692
1 个回答

fancyimpute 包 支持这种插补,使用以下 API:

 from fancyimpute import KNN
# X is the complete data matrix
# X_incomplete has the same values as X except a subset have been replace with NaN

# Use 3 nearest rows which have a feature to fill in each row's missing features
X_filled_knn = KNN(k=3).complete(X_incomplete)

以下是此软件包支持的插补:

•SimpleFill:用每列的平均值或中值替换缺失的条目。

• KNN:最近邻插补,它使用两行都有观测数据的特征的均方差对样本进行加权。

•SoftImpute:通过SVD 分解的迭代软阈值完成矩阵。受 R 的 softImpute 包的启发,它基于 Mazumder 等人的用于学习大型不完全矩阵的谱正则化算法。阿尔。

•IterativeSVD:通过迭代低秩SVD 分解完成矩阵。应该类似于 Troyanskaya 等人的 DNA 微阵列缺失值估计方法中的 SVDimpute。阿尔。

•MICE:通过链式方程重新实现多重插补。

•MatrixFactorization:将不完全矩阵直接分解为低阶U 和V,对U 的元素进行L1 稀疏性惩罚,对V 的元素进行L2 惩罚。通过梯度下降法解决。

•NuclearNormMinimization:Emmanuel Candes 和Benjamin Recht 使用cvxpy 通过凸优化简单实现精确矩阵完成。对于大矩阵来说太慢了。

•BiScaler:迭代估计行/列均值和标准差以获得双归一化矩阵。不能保证收敛,但在实践中效果很好。取自 Matrix Completion and Low-Rank SVD via Fast Alternating Least Squares。

原文由 Miriam Farber 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题