gpt4 book ai didi

python - 针对回归问题对连续数据的数据集进行重采样(引导)

转载 作者:行者123 更新时间:2023-11-30 09:59:34 28 4
gpt4 key购买 nike

对于回归问题,我有一个训练数据集: - 3个具有高斯分布的变量 - 20 个均匀分布的变量。

我的所有变量都是连续的,在 [0;1] 之间。

问题是用于对我的回归模型进行评分的测试数据对所有变量具有均匀分布。实际上,我在尾端分布中得到了不好的结果,所以我想对我的训练集进行过采样,以便复制最稀有的行。

所以我的想法是在我的训练集上进行引导(使用带替换的采样),以获得一组与测试集具有相同分布的数据。

为了做到这一点,我的想法(不知道这是否好!)是为我的 3 个变量添加 3 个带有间隔的列,并使用这些列对重采样进行分层。

示例:一、生成数据

from scipy.stats import truncnorm
def get_truncated_normal(mean=0.5, sd=0.15, min_value=0, max_value=1):
return truncnorm(
(min_value - mean) / sd, (max_value - mean) / sd, loc=mean, scale=sd)

generator = get_truncated_normal()


import numpy as np
from sklearn.preprocessing import MinMaxScaler
S1 = generator.rvs(1000)
S2 = generator.rvs(1000)
S3 = generator.rvs(1000)
u = np.random.uniform(0, 1, 1000)

然后检查分布:

import seaborn as sns
sns.distplot(u);
sns.distplot(S2);

没关系,所以我会添加类别列

import pandas as pd
df = pd.DataFrame({'S1':S1,'S2':S2,'S3':S3,'Unif':u})

BINS_NUMBER = 10
df['S1_range'] = pd.cut(df.S1,
bins=BINS_NUMBER,
precision=6,
right=True,
include_lowest=True)
df['S2_range'] = pd.cut(df.S2,
bins=BINS_NUMBER,
precision=6,
right=True,
include_lowest=True)
df['S3_range'] = pd.cut(df.S3,
bins=BINS_NUMBER,
precision=6,
right=True,
include_lowest=True)

一张支票

df.groupby('S1_range').size()
S1_range
(0.022025899999999998, 0.116709] 3
(0.116709, 0.210454] 15
(0.210454, 0.304199] 64
(0.304199, 0.397944] 152
(0.397944, 0.491689] 254
(0.491689, 0.585434] 217
(0.585434, 0.679179] 173
(0.679179, 0.772924] 86
(0.772924, 0.866669] 30
(0.866669, 0.960414] 6
dtype: int64

这对我来说有好处。所以现在我将尝试重新采样,但它没有按预期工作

from sklearn.utils import resample
df_resampled = resample(df,replace=True,n_samples=1000, stratify=df['S1_range'])
df_resampled.groupby('S1_range').size()
S1_range
(0.022025899999999998, 0.116709] 3
(0.116709, 0.210454] 15
(0.210454, 0.304199] 64
(0.304199, 0.397944] 152
(0.397944, 0.491689] 254
(0.491689, 0.585434] 217
(0.585434, 0.679179] 173
(0.679179, 0.772924] 86
(0.772924, 0.866669] 30
(0.866669, 0.960414] 6
dtype: int64

所以它不起作用,我在输出中得到与输入相同的分布...

你能帮我吗?也许这不是这样做的好方法?

谢谢!!

最佳答案

您应该利用库来重新采样回归数据,而不是从头开始编写代码来重新采样连续数据。

虽然流行的库(imbalanced-learn等)专注于分类(分类)变量,但最近有一个Python库(称为resreg - REGression的RESampling),它允许您对连续数据进行重新采样( resreg GitHub page )

此外,您可能希望在正态分布变量的尾部生成合成数据点,而不是引导,因为这样做可能会带来更好的结果(请参阅 this paper )。与用于分类的 SMOTE(在特征之间进行插值)类似,您可以使用 resreg 包中的 SMOTER(用于回归的 SMOTE)来生成回归/连续数据中的合成值。

下面是如何使用 resreg 通过几行代码实现重采样的示例:


import numpy as np
import resreg


cl = np.percentile(y,10) # Oversample values less than the 10th percentile
ch = np.percentile(y,90) # Oversample values less than the 10th percentile


# Assign relevance scores to indicate which samples in your dataset are
# to be resampled. Values below cl and above ch are assigned a relevance
# value above 0.5, other values are assigned a relevance value above 0.5

relevance = resreg.sigmoid_relevance(X, y, cl=cl, ch=ch)


# Resample the relevant values (i.e relevance >= 0.5) by interpolating
# between nearest k-neighbors (k=5). By setting over='balance', the
# relevant values are oversampled so that the number of relevant and
# irrelevant values are equal

X_res, y_res = resreg.smoter(X, y, relevance=relevance, relevance_threshold=0.5, k=5, over='balance', random_state=0)


关于python - 针对回归问题对连续数据的数据集进行重采样(引导),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59521185/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com