微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建连续分布并从中取样

如何解决创建连续分布并从中取样

我目前有一个包含很多缺失值的大型数据集。

我正在尝试通过使用我拥有的数据创建随机分布并对其进行采样来填充这些缺失值。例如创建一个随机分布然后随机选择一个从 0 到 1 的数字并用相应的值填充缺失的数据

我已经阅读了 scipy 和 numpy 的文档。我想我正在寻找 random.choice 的连续版本。

公司 重量
30
45
27
57
57

我正在尝试通过使用我已有的数据创建连续分布来填充 NA 列。

到目前为止,我已经尝试使用 np.random.choice, 即: random.choice(30,45,27,57,[0.2,0.2,0.4])

然而,这只会返回我输入的特定论点,但是,我正在尝试创建一个连续模型,以便我可以根据某个值出现在我之前的次数中的概率返回 27 到 57 之间的任何数字数据。

因此,在这种情况下,更接近于 57 的数字将更有可能被选中,因为它在我之前的数据中出现的频率更高。

解决方法

核密度估计 (KDE) 是一种从样本数据生成连续分布的常用方法,但它通常需要调整一些参数。其他方法包括均值/模式插补(基本)和基于模型的预测(更复杂)。

我们在下面拟合一个核密度估计器,然后用 kde.sample 从密度中生成随机样本来填充下面的 nan 值:

import pandas as pd
import numpy as np
from numpy import nan
from sklearn.neighbors import KernelDensity

BANDWIDTH = 1
KERNEL = "gaussian"

data = {'company': {0: 'A',1: 'A',2: 'A',3: 'A',4: 'A',5: 'A',6: 'A'},'weight': {0: 30.0,1: 45.0,2: 27.0,3: nan,4: 57.0,5: 57.0,6: nan}}
df = pd.DataFrame.from_dict(data)

kde = KernelDensity(kernel=KERNEL,bandwidth=BANDWIDTH).fit(df[["weight"]].dropna().values)

# replace nan with sampled values from kde    
n_missing = df.weight.isna().sum()
df.loc[df.weight.isna(),"weight"] = kde.sample(n_missing)

输出:

  company     weight
0       A  30.000000
1       A  45.000000
2       A  27.000000
3       A  56.542771
4       A  57.000000
5       A  57.000000
6       A  38.970918

样本数据和密度图:

import plotly.express as px

# histogram
px.histogram(df.weight,nbins=40).show()

# density line plot
x_vals = np.linspace(df.weight.min(),df.weight.max(),1000)
density = np.exp(kde.score_samples(x_vals.reshape(-1,1)))
px.line(x=x,y=density).show()

enter image description here

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。