【问题标题】:Weka : how to use cross validation in codeWeka:如何在代码中使用交叉验证
【发布时间】:2016-06-27 11:06:45
【问题描述】:

我试图在以下代码中使用交叉验证: 计划:

   TextDirectoryToArff d = new TextDirectoryToArff();

      try {
    Instances dataset = d.createDataset("C:\\mytest");
    dataset.setClassIndex(dataset.numAttributes() - 1 );

    double precision = 0, recall=0,fmeasure=0,error=0;

    int size1 = dataset1.numInstances() / 10;

    int begin = 0;
    int end = size1 - 1 ;

    for (int i=1 ; i<=10;i++)
    {
        System.out.println("iteration :" + 1);

        Instances training = new Instances(dataset);
        Instances testing = new Instances(dataset, begin , (end - begin));

        for (int j=0;j < (end - begin); j++)
            training.delete(begin);

        Classifier tree = new NaiveBayes();

        Instances filteredInstaces = training;
        StringToNominal nominal ;

        for(int a=0;a<training.numAttributes()-1;a++)
        {
            if(training.attribute(a).isString())
            {
                nominal = new StringToNominal();

                nominal.setInputFormat(filteredInstaces);
                training = Filter.useFilter(training, nominal);
            }
        }

        tree.buildClassifier(training);

        Evaluation eval = new Evaluation(testing);

        eval.evaluateModel(tree, testing);
        System.out.println("Precision:" + eval.precision(1));
        System.out.println("Recall:" + eval.recall(1));
        System.out.println("Fmeasure:" + eval.fMeasure(1));
        System.out.println("Error:" + eval.errorRate());

我有一些用于交叉验证的代码,但无法与上述代码集成。请建议我如何将以下代码集成到上述代码中以找到交叉验证?

代码:

 Evaluation eval = new Evaluation(dataset);
 eval.evaluateModel(cls, dataset2);
 eval.crossValidateModel(cls,dataset1,10, dataset2.getRandomNumberGenerator(1));   
 System.out.println(eval.toSummaryString("\nResults\n======\n", false));

【问题讨论】:

标签: classification weka evaluation cross-validation


【解决方案1】:

我认为您对 weka Evaluation.crossValidateModel 方法有些困惑。它已经计算了 10 个不同的训练和测试折叠,并在训练上训练 10 个模型并在测试中评估模型,因此无需像您在代码中尝试的那样计算它。

所以在你的代码中: TextDirectoryToArff d = new TextDirectoryToArff();

  try {
Instances dataset = d.createDataset("C:\\mytest");
dataset.setClassIndex(dataset.numAttributes() - 1 );

// 你已经有一个数据集

Classifier naiveBayes = new NaiveBayes();
//you need a classifier
Evaluation eval = new Evaluation(dataset);
//only call the crossValidateModel with your classifier, on your dataset, with 10 fold, and random
eval.crossValidateModel(naiveBayes, dataset, 10, new Random(1));
//print the results of 10 fold
System.out.println(classifier);
System.out.println(eval.toSummaryString());
System.out.println(eval.toMatrixString());
System.out.println(eval.toClassDetailsString());

您可以在https://weka.wikispaces.com/Generating+cross-validation+folds+(Java+approach)找到更多信息

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2019-07-27
    • 2015-10-25
    • 2021-12-10
    • 2014-09-16
    相关资源
    最近更新 更多