从具有权重的不同大小的列表中返回随机数



我想在python中为列车测试拆分拆分现有数据。像sklearn.train_test_split()这样的函数通常选择均匀分布的值作为测试数据。但由于我想检查,我的模型是否能够处理偏斜的数据("函数左侧"上的更多训练数据(,我需要更多地向数据左侧权衡分割。

我考虑过使用random.choices()并在这里指定权重,但这似乎很奇怪,因为包含权重的列表必须很长。

我基本上是在寻找一个函数,我可以通过我的列表,告诉它从这个列表中选择n个随机数,但对前~30%的条目进行加权,明显高于其他条目。

有人有主意吗?

编辑:以下是一些演示问题的基本代码:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Apply function I´m looking for
l_train, l_test = function(l, testsize=0.5)
# Apply sklearn train/test/split
l_train_sk, l_test_sk = sklearn.train_test_split(l, testsize=0.5)

# Output:
l_train = [1, 3, 7, 2, 4]
l_test = [6, 9, 10, 5, 8]
l_train_sk = [2, 4, 8, 9, 3]
l_test_sk = [1, 6, 10, 5, 7]

可以看出,已经应用了分割,使得50%的数据可以用作训练数据。此外,sklearn函数从数据的左侧(1,2,3,4,5(和右侧(6,7,8,9,10(随机选择数据,而函数I在训练数据集中显著地从左侧寻找超重数据。

这是否说明了目标是什么?

我这样解决了问题:

首先,我创建了一个带有我想要的权重的累积概率列表:

# Input Array X_temp: np.array((n,1))
len_half = int(len(X_temp) / 2)
focus_left = 70 # choose values from the left side with a probability of 70%
cum_gesamt = []
cum_left = [x * ((focus_left * 100) / len_half) for x in np.linspace(1, len_half, len_half)]
cum_right = [((focus_left * 100) + (x * (((1 - focus_left) * 100) / len_half))) for x in np.linspace(1, len_half, len_half)]
cum_gesamt.extend(cum_left)
cum_gesamt.extend(cum_right)

然后我可以随机选择索引条目:

double = 1
while len(double) != 0:
count += 1
train_index = random.choices( np.linspace(0, len(X_temp) - 1, len(X_temp)),cum_weights=cum_gesamt, k=int((1 - test_size) * len(X_temp)),)
double = [item for item, count in collections.Counter(train_index).items() if count > 1]

列表train_index现在包含随机选择的索引条目,我现在可以使用这些条目从列表中获取元素:

Xtrain_temp = np.array([(X_temp[int(x)]) for x in train_index])

因此,这是一个不太好的变通方法,但对我来说很有效。也许其他人可以从这些想法中受益。

最新更新