对于回归问题,我有一个训练数据集: - 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
所以它不起作用,我在输出中得到与输入相同的分布......
你能帮助我吗 ?也许这不是这样做的好方法?
谢谢 !!