安利一个缺失值填充的包fancyimpute

1. 写在前面

这两天看比赛, 发现了一个比较不错的包可以用来缺失值的填充, 那就是fancyimpute, 比赛中数据的存在缺失貌似已经成了家常便饭了, 而找到正确的方式去填充这些缺失值就显得尤为重要, 关于缺失值处理的方式,之前整理到的, 有几种情况:不处理(这是针对xgboost等树模型), 有些模型有处理缺失的机制,所以可以不处理,如果缺失的太多,可以考虑删除该列, 另外还有插值补全(均值,中位数,众数,建模预测,多重插补等), 还可以分箱处理,缺失值一个箱。

# 删除重复值
data.drop_duplicates()
# dropna()可以直接删除缺失样本,但是有点不太好

# 填充固定值
train_data.fillna(0, inplace=True) # 填充 0
data.fillna({0:1000, 1:100, 2:0, 4:5})   # 可以使用字典的形式为不用列设定不同的填充值

train_data.fillna(train_data.mean(),inplace=True) # 填充均值
train_data.fillna(train_data.median(),inplace=True) # 填充中位数
train_data.fillna(train_data.mode(),inplace=True) # 填充众数

train_data.fillna(method='pad', inplace=True) # 填充前一条数据的值,但是前一条也不一定有值
train_data.fillna(method='bfill', inplace=True) # 填充后一条数据的值,但是后一条也不一定有值

"""插值法:用插值法拟合出缺失的数据,然后进行填充。"""
for f in features: 
    train_data[f] = train_data[f].interpolate()
    
train_data.dropna(inplace=True)

"""填充KNN数据:先利用knn计算临近的k个数据,然后填充他们的均值"""
from fancyimpute import KNN
train_data_x = pd.DataFrame(KNN(k=6).fit_transform(train_data_x), columns=features)

# 还可以填充模型预测的值, 这一个在我正在写的数据竞赛修炼笔记的第三篇里面可以看到, 待补充

而今天, 再安利一个用于矩阵计算和填充缺失值的包fancyimpute, 这里面也提供了几种填充缺失值的方式, 并且试了其中的一两种, 要比上面的简单填充的方式要好的多。 这个是它的官方文档:https://pypi.org/project/fancyimpute/

fancyimpute是python的第三方工具包,主要提供了各种矩阵计算、填充算法的实现。这个包在使用之前, 还是需要先安装:

pip install fancyimpute

不过安装过程中, 可能会出现一些报错, 我这里面但是报了一个错误:
安利一个缺失值填充的包fancyimpute_第1张图片
看到红色的一片, 就有点后怕的感觉, 我这个核心句子就是: ERROR: Failed building wheel for scs, 也就是创建这个scs失败, 具体原因不清楚, 但是我的解决方式就是报这个错误, 就到这里https://www.lfd.uci.edu/~gohlke/pythonlibs/#ecos去下载了scs包(下的是for xxxxxx哈, 不一定都是scs), 然后手动安装了一下这个包之后, 再接着pip之后就没事了。注意别改文件名!

安装完毕之后, 就说一下如何使用了, 其实非常简单, 因为数据填充嘛, fancyimpute提供了下面几种填充方式: KNN、 NuclearNormMinimization、SoftImpute、IterativeImputer、BiScaler,在调用这些算法时需要import一下,代码如下:

from fancyimpute import KNN, NuclearNormMinimization, SoftImpute, IterativeImputer, BiScaler

下面说一下每个算法到底是怎么回事:

  1. SimpleFill
    这个很简单, 就是用每列的平均值或者中位数来填充缺失值, 不用这个, 直接用上面的方法就行。

  2. KNN
    最近邻估算,使用两行都具有观测数据的特征的均方差来对样本进行加权。然后用加权的结果进行特征值填充。连续特征一般是加权平均,对于离散特征一般是加权投票,所以如果是离散的特征, 可以标注一下。 这个sklearn里面的KNN也是可以的。

    X_filled_knn = KNN(k=3).fit_transform(X_incomplete)
    
  3. SoftImpute
    通过SVD分解的迭代软阈值处理来填充矩阵(https://web.stanford.edu/~hastie/swData/softImpute/vignette.html)。

    X_incomplete_normalized = BiScaler().fit_transform(X_incomplete)
    X_filled_softimpute = SoftImpute().fit_transform(X_incomplete_normalized)
    
  4. BiScaler
    通过行/列均值和标准偏差的迭代估计得到双重归一化矩阵。 不保证收敛但在实践中运作良好。 基本原理请参考矩阵完成和低秩SVD通过快速交替最小二乘。

  5. IterativeSVD
    通过迭代低秩SVD分解来填充矩阵。 原理类似于DNA微阵列缺失值估算方法中的SVDimpute。

  6. IterativeImputer
    通过以循环方式将具有缺失值的每个特征建模为其他特征的函数来估算缺失值的策略。

    X_filled_ii = IterativeImputer().fit_transform(X_incomplete)
    
  7. MatrixFactorization
    将不完全矩阵直接分解为低秩“U”和“V”,对“U”元素进行L1稀疏性惩罚,对“V”元素进行L2惩罚。 通过梯度下降解决。

  8. NuclearNormMinimization
    矩阵填充使用凸优化来找到仍然匹配观测值的低秩解(http://statweb.stanford.edu/~candes/papers/MatrixCompletion.pdf)。对于大型矩阵来说非常缓慢

    X_filled_nnm = NuclearNormMinimization().fit_transform(X_incomplete)
    

你可能感兴趣的:(数据竞赛修炼,数据分析和挖掘技术系列)