Weka:加载没有标题的CSV文件

时间:2015-12-19 04:55:35

标签: csv weka

如何在Weka中加载没有标题的CSV文件?

有一些相关的问题,但似乎都没有达到目的。

MWE

以下是20,1,"+" 30,2,"+" 30,1,"+" 15,1,"-" 10,0,"-" 文件:

Test.java

以下是// javac -Xlint -cp weka.jar Test.java && java -cp .:weka.jar Test import weka.core.converters.CSVLoader; import weka.core.Instances; import weka.classifiers.Classifier; import weka.classifiers.bayes.NaiveBayes; import weka.classifiers.Evaluation; import java.io.File; class Test { public static void main(String[] args) { try { CSVLoader loader = new CSVLoader(); loader.setOptions(new String[] {"-H"}); loader.setSource(new File("test.csv")); Instances tr = loader.getDataSet(); tr.setClassIndex(tr.numAttributes() - 1); Classifier m = (Classifier) new NaiveBayes(); m.buildClassifier(tr); Evaluation eval = new Evaluation(tr); eval.evaluateModel(m, tr); System.out.println(eval.toSummaryString()); } catch(Exception ex) { System.out.println(ex); } } } 代码:

Correctly Classified Instances           4              100      %
Incorrectly Classified Instances         0                0      %
Kappa statistic                          1     
Mean absolute error                      0.0065
Root mean squared error                  0.0112
Relative absolute error                  1.3088 %
Root relative squared error              2.2477 %
Total Number of Instances                4     

运行时,它仅报告 4 个实例,而非 5 。如果我添加标题,那么它可以正常工作。

            loader.setOptions(new String[] {"-H"});

注意我使用过:

loader.setNoHeaderRowPresent(true);

我也尝试过直接API <div id="id_div_1" class="cl_div_comment_container"></div> <form id="id_form_1" method="POST"> <input type="hidden" value="1" name="nm_hidden_post_id"> <textarea class="cl_textarea_comment" style="resize:none;" rows="1" cols="50" name="nm_comment_content"></textarea> <input class="cl_submit_comment" type="submit" value="Comment" name="nm_submit_comment"> </form> ,但似乎在Weka 3.6.13中无法使用。

参考文献:

  • enter image description here

编辑:事实证明这是3.6.13中的一个问题。该代码适用于3.7.10。

2 个答案:

答案 0 :(得分:2)

我不确定3.6.13,但3.7.10的代码显示,如果setNoHeaderRowPresent设置为 true ,则会添加第一行数据。

您设置为false,将其设置为true.Revrence from grepcode CSVLoader

  

设置数据中是否没有标题行    参数:b true if   数据中没有标题行      public void setNoHeaderRowPresent(boolean b){
       m_noHeaderRow = b; 293个
  }

if (m_noHeaderRow) {    
  m_rowBuffer.add(firstRow);  
 }

所以在你的代码中使用

loader.setNoHeaderRowPresent(true)

而不是 loader.setNoHeaderRowPresent(false)以包含数据集中的第一行。

答案 1 :(得分:0)

作为解决方法,它会读取CSV文件并将其作为ARFF文件传递:

// javac -Xlint -cp weka.jar Test.java && java -cp .:weka.jar Test

import weka.core.converters.CSVLoader;
import weka.core.Instances;
import weka.classifiers.Classifier;
import weka.classifiers.bayes.NaiveBayes;
import weka.classifiers.Evaluation;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.StringReader;
import java.lang.StringBuffer;

class Test
{
    public static void main(String[] args) {
        try {
            String filename = "test.csv";
            BufferedReader br = new BufferedReader(new FileReader(filename));
            String line = br.readLine();
            int cols = line.length() - line.replace(",", "").length() + 1;

            StringBuilder arff = new StringBuilder("@RELATION test\n");
            for(int i = 0; i < cols-1; i++) {
                arff.append("@ATTRIBUTE ");
                arff.append(String.valueOf((char)(i + 'a')));
                arff.append(" NUMERIC\n");
            }
            arff.append("@ATTRIBUTE class {+,-}\n");
            arff.append("@DATA\n");

            while(line != null) {
                arff.append(line);
                arff.append("\n");
                line = br.readLine();
            }

            System.out.println(arff.toString());
            Instances tr = new Instances(new StringReader(arff.toString()));

            tr.setClassIndex(tr.numAttributes() - 1);

            Classifier m = (Classifier) new NaiveBayes();
            m.buildClassifier(tr);

            Evaluation eval = new Evaluation(tr);
            eval.evaluateModel(m, tr);

            System.out.println(eval.toSummaryString());
        }
        catch(Exception ex) {
            System.out.println(ex);
        }
    }
}