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

Weka:加载没有标题的CSV文件,csv,weka,Csv,Weka,如何在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

如何在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"});
我还尝试了DirectAPI
loader.setNoHeaderRowPresent(true),但它似乎在Weka 3.6.13中不可用

参考资料:


编辑:原来这是3.6.13中的一个问题。代码在3.7.10中运行良好。

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

如果设置为false,请将其设置为true。参考CSV加载程序的

设置数据中是否没有标题行。
参数:btrueif 数据中没有标题行
public void setNoHeaderRowPresent(布尔b){
m_noHeaderRow=b;293
}

所以在你的代码使用中

loader.setNoHeaderRowPresent(true)

和notloader.setNoHeaderRowPresent(false)将第一行包含在数据集中。

作为一种解决方法,它读取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);
        }
    }
}
//javac-Xlint-cp weka.jar Test.java&&java-cp.:weka.jar Test
进口weka.core.converters.csv装载机;
导入weka.core.Instances;
导入weka.classifiers.Classifier;
导入weka.classifiers.bayes.NaiveBayes;
导入weka.classifiers.Evaluation;
导入java.io.FileReader;
导入java.io.BufferedReader;
导入java.io.StringReader;
导入java.lang.StringBuffer;
课堂测试
{
公共静态void main(字符串[]args){
试一试{
字符串filename=“test.csv”;
BufferedReader br=新的BufferedReader(新文件读取器(文件名));
String line=br.readLine();
int cols=line.length()-line.replace(“,”,“).length()+1;
StringBuilder arff=新的StringBuilder(“@relationship test\n”);
对于(int i=0;i
谢谢,我阅读文档的速度太快了。但问题是它似乎没有在3.6.13中实现:
Test.java:16:error:not find symbol loader.setNoHeaderRowPresent(true)。但奇怪的是,
loader.setOptions(新字符串[]{“-H”})也不适用于我。我正在发布一个变通方法作为替代答案……好的,我已经尝试了开发人员版本3.7.10,两个版本都可以使用:
setNoHeaderRowPresent()
setOption()
。看起来像是稳定版本3.6.13的bug。我在
3.8.4
上,我正试图用
Explorer
GUI应用程序打开
CSV
无头文件。即使将
setNoHeaderRowPresent
指定为
true
也不起作用,或者给出了“无效流头”错误。@Naruto,这显然是一种黑客行为,也是一种MWE黑客行为。我不能编辑原始的CSV文件,如果这是你的建议。该模型必须集成到我们的研究框架的其他部分,包括其他语言。我们不会只为一个Weka模型编辑CSV文件。
// 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);
        }
    }
}