随机样本集,用于基于标签创建交叉验证和训练集

时间:2017-08-09 00:50:17

标签: python-3.x pandas dataframe

我试图从训练集中提取随机样本60:20:20以创建训练,交叉验证和测试集。

我使用了以下代码:

 train=data.sample(frac=0.6)
 trcv=data.drop(train.index)
 test=trcv.sample(frac=0.5)
 cv=trcv.drop(test.index)

但是我意识到我的训练集是一个有监督的学习数据,数据帧的最后一列包含一个值为1或0的标签Y(列名)。

我想要创建训练,测试和交叉验证集的方式是我想要分配.99:.1的样本,其中y = 0且y = 1并将其分配给训练集。这意味着如果训练集有100条记录,我希望99条记录为y = 0,只有一条记录为y = 1。

剩余的99%y = 1的记录需要拆分btw交叉验证和测试设置为45%,44%

一种可行的方法是创建一个包含记录副本的数据框,其中列Y的值为1,然后从主数据框中删除y = 1的所有记录。

Y1=data[data.iloc[:,8]==1]
data=data[data.iloc[:,8]!=1]

然后将上面的样本分布应用于cv,测试和训练集。

 train=data.sample(frac=0.6)
 trcv=data.drop(train.index)
 test=trcv.sample(frac=0.5)
 cv=trcv.drop(test.index)

现在从数据帧中取样0.1:0.44:0.45,其中y = 1

ycvT=Y1.sample(frac=0.99)
ytr=Y1.drop(ycvT.index)
ytest= ycvT.sample(frac=0.45)
ycv= ycvT.drop(ytest.index)

这将创建3个不同的数据帧,其中包含y = 1。

Now I can add them to the training , cross validation and test set.
train=train.append(ytr)
train=train.sample(frac=1).reset_index(drop=True)

..和cv和测试集。

我想知道是否有更聪明(更短)的方式。我想把自己限制在熊猫,numpy和scipy。

任何提示?感谢。

1 个答案:

答案 0 :(得分:1)

y = data.iloc[:, -1].values
g = data.groupby(y)

frac = .2

ones = g.get_group(1).sample(frac=frac)
zero = g.get_group(0).sample(len(ones) * 99)

train = pd.concat([ones, zero]).sample(frac=1)