Java 如何将DataSetitor拆分为测试和训练迭代器?
我使用的是Deeplearning4j和datavec,我有一个DataSetIterator对象,它代表我的所有数据,这是一个时间序列。如何将其划分为训练和测试迭代器?我检查了一下,DataSetIterator类的方法被弃用了。谢谢。迭代您的Java 如何将DataSetitor拆分为测试和训练迭代器?,java,deep-learning,training-data,deeplearning4j,Java,Deep Learning,Training Data,Deeplearning4j,我使用的是Deeplearning4j和datavec,我有一个DataSetIterator对象,它代表我的所有数据,这是一个时间序列。如何将其划分为训练和测试迭代器?我检查了一下,DataSetIterator类的方法被弃用了。谢谢。迭代您的数据集编辑器,并为每个数据集条目创建两个新的数据集,分别用于训练和测试 关键是使用该方法,该方法接受一个双分形序列,该序列将指定要训练的数据量(其余要测试的数据量)。该方法有不同的重载,因此您可以选择最适合您需要的重载。如果希望将所有训练和测试数据集添加
数据集编辑器
,并为每个数据集
条目创建两个新的数据集
,分别用于训练和测试
关键是使用该方法,该方法接受一个双分形序列
,该序列将指定要训练的数据量(其余要测试的数据量)。该方法有不同的重载,因此您可以选择最适合您需要的重载。如果希望将所有训练和测试数据集添加到一个公共迭代器中,可以将它们存储在两个不同的列表中,稍后再获取它们相应的迭代器。比如:
List<DataSet> trainList = new ArrayList<>();
List<DataSet> testList= new ArrayList<>();
while (yourDataSetIterator.hasNext())
{
DataSet ds = yourDataSetIterator.next();
SplitTestAndTrain splData = ds.splitTestAndTrain(0.5); //half for each
DataSet trainDs = splData.getTrain();
trainList.add(trainDs);
DataSet testDs = splData.getTest();
testList.add(testDs);
(...)
}
Iterator<DataSet> trainIterator = trainList.iterator();
Iterator<DataSet> testIterator = testList.iterator();
List trainList=new ArrayList();
List testList=new ArrayList();
while(yourDataSeterator.hasNext())
{
DataSet ds=yourDataSetItemator.next();
SplitTestAndTrain splData=ds.SplitTestAndTrain(0.5);//每个一半
DataSet trainDs=splData.getTrain();
列车列表。添加(列车);
数据集testDs=splData.getTest();
testList.add(testDs);
(...)
}
迭代器trainIterator=trainList.Iterator();
迭代器testIterator=testList.Iterator();
因为我不知道这个库的具体细节,所以这个示例只创建了“basic”迭代器
。这可能是定制的,因此您可以创建DataSetIterators
请注意,您可能还需要在拆分数据集之前对其进行洗牌(ds.shuffle()
)。你可以找到一些例子
如果您希望以特定的方式拆分它,您可以标记不同的条目并找到测试数据集的最大索引;然后,调用方法,该方法专门拆分有关max参数的数据集。该方法在这里也可能有所帮助
在关于其他机制的评论中给出了一个很好的建议,以便拆分
DataSetitors
,这似乎也是一种“更自然”的方式
它提供了
getTraineIterator()
和getTestIterator()
方法,它们返回库的特定迭代器DataSetIterator,谢谢。我想这几乎解决了我的问题。然而,我的数据是时间序列。那么,我的训练数据不应该是集合的第一部分,而测试数据应该是第二部分吗?在您的代码中,对于每一批,您将一半分为培训,一半分为测试,我相信这会打乱时间序列顺序。对于时间序列数据集,您将如何调整它?谢谢你的回答。如果你知道第一部分的结尾,你可以称之为这个,所以它只得到测试的数量和更新,希望能有所帮助…我相信关键是标记每个数据集,以便知道每个数据集的结尾,因此,您可以使用特定的范围调用splitTestAndTrain。请注意,您也可以使用splitter:这是一个非常好的技巧,包括在答案中