【问题标题】:Weka: loading CSV file without headersWeka:加载没有标题的CSV文件
【发布时间】:2016-03-25 20:35:38
【问题描述】:

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

有一些相关的问题,但似乎没有一个问题。

MWE

这是test.csv 文件:

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);
        }
    }
}

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

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     

注意我用过:

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

我也尝试过直接 API loader.setNoHeaderRowPresent(true);,但似乎在 Weka 3.6.13 中不可用。

参考资料:

编辑:原来这是 3.6.13 中的一个问题。该代码适用于 3.7.10。

【问题讨论】:

    标签: csv weka


    【解决方案1】:

    作为一种解决方法,这会读取 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);
            }
        }
    }
    

    【讨论】:

    • @Naruto,这显然是一个 hack,它是一个 MWE hack。如果这是您的建议,我无法编辑原始 CSV 文件。该模型必须集成到我们研究框架的其余部分中,其中包括其他语言。我们不会只为一个 Weka 模型编辑 CSV 文件。
    【解决方案2】:

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

    你设置为false,设置为true.Refrence from grepcode of CSVLoader

    设置数据中是否没有标题行。
    参数:b true if 数据中没有标题行
    公共无效 setNoHeaderRowPresent(boolean b) {
    m_noHeaderRow = b; 293
    }

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

    所以在你的代码中使用

    loader.setNoHeaderRowPresent(true)
    

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

    【讨论】:

    • 谢谢,我阅读文档太快了。但问题是它似乎没有为 3.6.13 实现:Test.java:16: error: cannot find symbol loader.setNoHeaderRowPresent(true);。但奇怪的是loader.setOptions(new String[] {"-H"}); 也不适合我。我正在发布一个解决方法作为替代答案...
    • 好的,我已经尝试了开发者版本 3.7.10,两个版本都可以工作:setNoHeaderRowPresent()setOption()。似乎是稳定版 3.6.13 中的一个错误。 cs.waikato.ac.nz/ml/weka/downloading.html
    • 我在3.8.4 上,我正在尝试使用Explorer GUI 应用程序打开CSV 无头文件。即使将 setNoHeaderRowPresent 指定为 true 也不起作用或给出“无效的流标头”错误。
    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 2014-11-20
    • 2017-08-28
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    相关资源
    最近更新 更多