我试图从训练集中提取随机样本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。
任何提示?感谢。
答案 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)