python 科学知识工具学习:随机抽样填补缺失值

q8l4jmvw  于 2023-01-16  发布在  Python
关注(0)|答案(3)|浏览(244)

我很惊讶sklearn.preprocessing.Imputer没有提供以下策略来填充缺失值:对于任何缺失值,从给定值中均匀随机抽取一个值并替换。
我认为这是一个比用平均值、最频繁值或中值替换更好的策略,因为它不会在值的分布中产生人为的尖峰。
我需要写一个变压器来自己做这个吗?
ps.在更元层次的讨论中,当我在像scikit-learn这样的库中找不到我认为简单的、几乎标准的操作作为组件时,我总是有点困惑。这个库是非常未完成还是我试图做一些违背最佳实践的事情?有什么建议吗?

kdfy810k

kdfy810k1#

对于离散数字序列,从现有值中随机抽样可能比使用平均值或中位数更好,后者将所有缺失值替换为单个数字,并肯定会给分布带来人为尖峰。

wmvff8tz

wmvff8tz2#

我认为这是一个比用平均值、最频繁值或中值替换更好的策略,因为它不会在值的分布中产生人为的尖峰。
不幸的是,这是错误的,当你对一个连续变量的分布一无所知时,最好的猜测是总是均值,因为它不太可能在你的数据中引入偏差。
如果你决定从 * 任何 * 分布中随机抽样来填补缺失值,你总是假设该分布是产生观测值的分布,因此,在数据集中引入了明显的偏倚。
但是,您可以查看sklearn.impute.IterativeImputer,它提供了一种更复杂的插补方法。

rbl8hiat

rbl8hiat3#

我参加这次讨论有点晚了,但既然我看到了,我想我应该加上我的2美分。
使用开源Python库Feature-engine,我们可以立即执行随机样本插补。我在这里留下了RandomSampleImputer的链接。
在下面的代码片段中,我展示了其功能与Scikit-learn transformers非常相似:

import pandas as pd
import numpy as np
from feature_engine.imputation import RandomSampleImputer

X = pd.DataFrame(dict(

       x1 = [np.nan,1,1,0,np.nan],

       x2 = ["a", np.nan, "b", np.nan, "a"],

       ))

rsi = RandomSampleImputer()

rsi.fit(X)

rsi.transform(X)

输出将为:

    x1 x2
0  1.0  a
1  1.0  b
2  1.0  b
3  0.0  a
4  1.0  a

其中缺失的数据被从原始变量中提取的随机样本(其中值是可用的)代替。
关于这个方法没有被包括在Scikit-learn中,开发者喜欢包括那些有很好的(科学的,如果可能的话)记录的方法。
我还要说的是,这不是一种标准的插补方法,当谈到简单的单变量方法时,使用最广泛的是均值、中位数、众数和任意插补。
这种方法确实保留了变量分布(对于所有分布),因为根据定义,变量的随机样本将显示相同的分布,但缺点是,它有一个随机性元素,这是很难解释的,特别是当我们想将模型投入生产时。
举一个极端的例子,假设我们有两个病人,10个变量中有9个显示相同的数据,而第10个变量的值缺失。当我们进行随机插补时,很可能每个病人会得到不同的值,这反过来又会导致不同的预测。而且,就对客户公平而言,这是不可行的。简而言之,我们会为表现出相同特征的病人提供不同的解决方案。
此外,当我们将模型投入生产时,为了提取随机样本,我们必须存储训练数据集的副本,如果数据集很大,可能会占用大量内存。

相关问题