我想将原始数据帧分成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)ALso,在字典中添加数据帧是否会导致:在字典或列表中帮助数据帧失去性能优势的bottle_neck效果?从理论上讲,添加新列会增加数据的维度,创建新的数据帧是最糟糕的变体,因为它会消耗大量内存
发布于 2016-07-01 15:36:09
添加一个新列不会占用大量内存,但是每当您想要访问三个集合中的一个时,您都会添加一个切片成本。创建新的数据帧导致此切片部分只需执行一次。
为此,您可以使用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)发布于 2016-07-01 15:34:49
从技术上讲,我认为如果你想测试你的机器学习模型,你不需要有三个数据帧。为什么?因为您是在training_set上构建模型,并且需要使用validation_set对其进行验证。只有在您的模型通过验证后,您才能使用test_set。而且,您的test_set没有包含Y标签。
有几个库包含可以轻松拆分数据的函数。
scikit-learn提供了使用http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.htmlspark-ml has randomSplittrain_test_split 的选项
在不使用任何外部库的情况下,您可以这样做:
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?)
希望这能有所帮助!
发布于 2016-07-01 15:39:40
仅针对单个迭代的纯pandas解决方案将使用sample,并在使用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
https://stackoverflow.com/questions/38139306
复制相似问题