目录
Missforest
ycimpute
安装
使用
Missingpy
SKlearn
缺失值填充: 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/
- 简单填充(均值填充,补充0,选择变量最大值、最小值等填充方式)(sample)
- 基于随机森林的填充(IterForest)
- 多重插补MICE
- 基于期望最大化填充(EM)
- 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,默认值 = 无
要使用的伪随机数生成器的种子