问题 使用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  

我想替换 NaN使用KNN作为方法。我抬头 sklearn小号 Imputer 但它只支持均值,中位数和模式插补。有一项功能要求 这里 但我认为现在没有实施。关于如何更换的任何想法 NaN使用KNN从最后两列开始?

编辑: 由于我需要在另一个环境中运行代码,我没有安装软件包的奢侈。我只能使用sklearn,pandas,numpy和其他标准包装。


2085
2017-07-26 08:28


起源

Sklearn似乎非常接近发布这个: github.com/scikit-learn/scikit-learn/pull/9212 - Cody Glickman


答案:


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完成矩阵   分解。应该类似于SVDimpute来自Missing值   Troyanskaya等人的DNA微阵列估计方法。人。

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

•MatrixFactorization:不完整矩阵的直接分解   进入低等级U和V,对L1的元素进行L1稀疏惩罚   U和V元素的L2惩罚由梯度下降解决。

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

•BiScaler:行/列均值和标准的迭代估计   偏差得到双重归一化矩阵。不保证收敛   但在实践中运作良好。取自Matrix Completion和Low-Rank   通过快速交替最小二乘法进行SVD​​。


12
2017-07-26 08:36



道歉。我的错。必须使用此代码的环境没有fancyImpute。它支持标准软件包,如-numpy,pandas,sklearn。将编辑问题。 - Clock Slave
@ClockSlave然后你可以查看fancyImpute的代码并自己实现它。 - Vivek Kumar


这个对sklearn的请求添加了KNN支持。你可以从中获取代码 - https://github.com/scikit-learn/scikit-learn/pull/9212


1
2018-02-27 20:38