我想将原始数据框分成3个子组:训练,测试,验证
我看到三种解决方案,但担心它们不正确并可能导致瓶颈效应
1)使用键添加词典
my_dict = {'train':raw_df.loc[start:end], 'test':raw_df.loc[start:end],
'val':raw_df.loc[start:end]}
2)创建三个数据帧
train_df = df.loc[start:end]
test_df = df.loc[start:end]
val_df = df.loc[start:end]
3)使用随机的三个随机值之一添加新列
df['train/test/val'] = pd.Series('train', index=df.index)
另外,会在字典中添加数据帧导致:在字典或列表中帮助丢失数据帧性能优势的bottle_neck效果? 理论上添加新列是增加数据维度 创建新的数据帧我认为是最糟糕的变种,因为它会占用大量的内存
答案 0 :(得分:3)
添加新列不会吃掉大量的记忆,但只要您想要访问三个中的一个,就会增加切片成本。创建新的数据框导致这个切片部分只能完成一次。
为此,您可以使用sample
。让您想要80%的数据帧在列车中,10%在测试和验证中:
train = df.sample(frac = 0.8)
test = df.drop(train.index).sample(frac = 0.5)
validate = df.drop(train.index).drop(test.index)
答案 1 :(得分:0)
从技术上讲,如果您想测试机器学习模型,我认为您不需要有三个数据帧。为什么?因为您在training_set
上构建了模型,并且需要使用validation_set
对其进行验证。只有在验证模型后才能使用test_set
。此外,您的test_set
不包含Y
标签。
多个库包含轻松分割数据的功能。
scikit-learn
为您提供了使用train_test_split
http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html spark-ml
有randomSplit
不使用任何外部库,您可以这样做:
msk = np.random.rand(len(df)) < 0.8
train = df[msk]
validation = df[~msk]
(回答:How do I create test and train samples from one dataframe with pandas?)
希望这有帮助!
答案 2 :(得分:0)
仅用于单次迭代的纯大熊猫解决方案就是使用样本,并使用pd.Index.difference
排除样本的索引以供下次迭代使用:
validation = df.sample(validation_size)
# Get the other part of the dataframe
train_test = df.loc[df.index.difference(validation.index)]
test = train_test.sample(test_size)
train = train_test.loc[train_test.index.difference(test.index)]
请注意,validation_size
和test_size
分别是验证和测试框架所需的行数。
Sklearn还具有很强的功能,可以在循环中进行拆分,以便于交叉验证。这里的文档:http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.ShuffleSplit.html