Java 如何将DataSetitor拆分为测试和训练迭代器?

Java 如何将DataSetitor拆分为测试和训练迭代器?,java,deep-learning,training-data,deeplearning4j,Java,Deep Learning,Training Data,Deeplearning4j,我使用的是Deeplearning4j和datavec,我有一个DataSetIterator对象,它代表我的所有数据,这是一个时间序列。如何将其划分为训练和测试迭代器?我检查了一下,DataSetIterator类的方法被弃用了。谢谢。迭代您的数据集编辑器,并为每个数据集条目创建两个新的数据集,分别用于训练和测试 关键是使用该方法,该方法接受一个双分形序列,该序列将指定要训练的数据量(其余要测试的数据量)。该方法有不同的重载,因此您可以选择最适合您需要的重载。如果希望将所有训练和测试数据集添加

我使用的是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:这是一个非常好的技巧,包括在答案中