【发布时间】:2020-04-18 15:07:31
【问题描述】:
对于回归问题,我有一个训练数据集: - 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 ?
-
是的,但是我没有找到如何将它用于回归问题,所有示例都是关于分类的。
-
尝试将
labels=list(range(BINS_NUMBER))添加到您对 pd.cut 的调用中。当您使用 resample 时,它会将S1_range值视为分层标签。但是您的值包含 Interval 对象。这可能会导致问题,因为它们都可能被视为不同的对象。 -
是一样的。我找到了另一种有效的方法。你帮我回答第一个。我发现,即使是回归问题,重采样也可以看作是目标是每一行的 bin 的分类问题。
标签: python machine-learning scikit-learn regression imbalanced-data