如何在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中无法使用。
参考文献:
编辑:事实证明这是3.6.13中的一个问题。该代码适用于3.7.10。
答案 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);
}
}
}