数据处理笔记9:缺失值-多变量插补

目录

Missforest

ycimpute

安装

使用

Missingpy

SKlearn


论文启发:

https://doi.org/10.1093/jamiaopen/ooab008

缺失值填充: MissForest及其算法流程

由于我们的数据集包括分类变量和数值变量的混合,因此我们使用MissForest推算方法. MissForest受益于RF算法中处理缺失值的内置例程[38,39]。

在这种推算方法中,对于每个变量,都会考虑对缺失值的初始猜测。然后,根据变量的缺失值数量从缺失值数量最少开始对变量进行排序。然后,对观测数据进行RF算法训练,然后利用训练后的RF模型预测缺失值。重复这一归罪过程,直到满足停止标准。此外,数据集在0和1之间进行了归一化处理。

Missforest

缺失值填充: 随机森林插补(missforest).

Missforest论文:

MissForest—non-parametric missing value imputation for mixed-type data

单独Missforest是R包, 找找python缺失值填充包

ycimpute

Python包使用说明:

https://hcmy.gitbooks.io/ycimpute/content/

  1. 简单填充(均值填充,补充0,选择变量最大值、最小值等填充方式)(sample)
  2. 基于随机森林的填充(IterForest)
  3. 多重插补MICE
  4. 基于期望最大化填充(EM)
  5. k近邻填充(KNN)

EM算法和MICE在各个数据集上都有不俗的表现。而Iterforest对于各变量之间相关性较大的数据集来说,表现最为优越。

严格来说,真实场景中的填充效果无法迅速评价其好坏,除非你知道答案并对效果进行测试,或者看填充后的完整数据在你的模型上的表现。

其中的IterForest用的是missforest的原理

安装

pip install ycimpute

使用

使用填充类IterImpute(),在其构造器里填入所需参数,回调complete()完成填充

from ycimpute.datasets import load_data

boston_missing, boston_full = load_data.load_boston()

from ycimpute.imputer import IterImput

X = boston_missing

complete_X = IterImput().complete(X)

print(complete_X)

from ycimpute.imputer import iterforest

iterforest.IterImput().complete(boston_mis)

(这里我将使用函数自带的数据集进行演示;使用时只需将数据换成你们需要填充的numpy array 格式的数据集)

Missingpy

数据量大跑的慢

运行速度和数据规模有关系,实验的时候抽一小部分数据去跑就可以了。确定没问题了再导入整个数据集

吴恩达: 验证算法的时候为了节约时间,只需要在抽取的小数据集上运行

抽取的小数据集能基本体现整个数据集的分布情况就可以评估算法的可行性了

库:

https://github.com/epsilon-machine/missingpy

例:

# Let X be an array containing missing values

from missingpy import MissForest

imputer = MissForest()

X_imputed = imputer.fit_transform(X)

分类变量需要是单热编码(也称为虚拟编码),并且需要在插补的 fit() 方法调用期间显式标识它们

>>> from missingpy import MissForest

>>> nan = float("NaN")

>>> X = [[1, 2, nan], [3, 4, 3], [nan, 6, 5], [8, 8, 7]]

>>> imputer = MissForest(random_state=1337)

>>> imputer.fit_transform(X)

Iteration: 0

Iteration: 1

Iteration: 2

array([[1.  , 2. , 3.92 ],

       [3.  , 4. , 3. ],

       [2.71, 6. , 5. ],

       [8.  , 8. , 7. ]])

max_iter : int,可选(默认 = 10)

     插补过程的最大迭代次数。 每列都有一个

     在给定的迭代中,缺失值仅估算一次。

n_estimators :整数,可选(默认=100)

     森林中的树木数量。

max_depth :整数或无,可选(默认=无)

     树的最大深度。 如果没有,那么节点被扩展直到

     所有叶子都是纯的或直到所有叶子含有少于

     min_samples_split 样本。

n_jobs :int或None,可选(默认=-1)

     `fit` 和 `predict` 并行运行的作业数。

     ``None`` 表示 1,除非在 :obj:`joblib.parallel_backend` 上下文中。

     ``-1`` 表示使用所有处理器。

random_state :int,RandomState 实例或无,可选(默认=无)

     如果是 int,则 random_state 是随机数种子;

方法

fit(self, X, y=None, cat_vars=None):

    Fit the imputer on X.

参数

     ----------

     X:{array-like},形状(n_samples,n_features)

         输入数据,其中“n_samples”是样本数,

         ``n_features`` 是特征的数量。

     cat_vars :整数或整数数组(int or array of ints),可选(默认 = None)

         包含分类列索引的 int 或数组(containing column indices of categorical)

         数据集 X 中存在的变量/特征。

         如果数据集中没有分类变量,则为“None”。

transform(X)

安装

在issue中找到了安装说明

这个项目有点旧,如果你只是尝试用最新的环境安装它,会导致一堆错误/警告。我发现这种组合有效:

numpy==1.15.4

scipy==1.1.0

scikit-learn==0.20.1

pandas==0.25.3

SKlearn

Multivariate feature imputation

多特征插补-迭代

算法是MICE包(链式方程的多变量插补)

例子:

 import numpy as np

 from sklearn.experimental import enable_iterative_imputer

 from sklearn.impute import IterativeImputer

 imp = IterativeImputer(max_iter=10, random_state=0)

 imp.fit([[1, 2], [3, 6], [4, 8], [np.nan, 3], [7, np.nan]])

IterativeImputer(random_state=0)

 X_test = [[np.nan, 2], [6, np.nan], [np.nan, 6]]

 # the model learns that the second feature is double the first

 print(np.round(imp.transform(X_test)))

[[ 1.  2.]

 [ 6. 12.]

 [ 3.  6.]]

API

 # explicitly require this experimental feature

 from sklearn.experimental import enable_iterative_imputer  # noqa

 # now you can import normally from sklearn.impute

 from sklearn.impute import IterativeImputer

参数

skip_complete布尔,默认值 = 假

如果True,则在变换过程中缺少值且在拟合期间没有任何缺失值的要素将仅使用初始插补方法进行归因。如果有许多要素在拟合和变换时间均未缺失值,则设置为True,以节省计算。

random_state int,RandomState 实例或 None,默认值 = 无

要使用的伪随机数生成器的种子

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值