使用 Weka Java 代码 - 如何将 CSV(无标题行)转换为 ARFF 格式?

Posted

技术标签:

【中文标题】使用 Weka Java 代码 - 如何将 CSV(无标题行)转换为 ARFF 格式?【英文标题】:Using Weka Java Code - How Convert CSV (without header row) to ARFF Format? 【发布时间】:2011-03-31 20:07:36 【问题描述】:

我正在使用 Weka Java 库读取 CSV 文件将其转换为 ARFF 文件

问题在于 CSV 文件没有标题行,只有数据。导入 CSV 文件后如何分配属性名称? (所有列都是字符串数据类型)

这是我目前的代码:

    CSVLoader loader = new CSVLoader();
    loader.setSource(new File(CSVFilePath));
    Instances data = loader.getDataSet();

    ArffSaver saver = new ArffSaver();
    saver.setInstances(data);
    saver.setFile(new File(outputFilePath));
    saver.writeBatch();

我尝试查看 Weka 源代码来弄清楚这一点,但我无法弄清楚它的正面或反面 :-(

【问题讨论】:

【参考方案1】:

简短的回答是,您不能在文件中读取之后分配属性名称。

CSVLoader 假定 CSV 的第一行是标题。如果那是一个实例,它将使用该实例数据作为标题行而不是作为实例数据,这绝对不是你想要的。

在上面的代码之前,你需要把文件读进去,写一个标题行,然后再次保存文件。

见my answer to your question on the weka mailing list。

【讨论】:

谢谢。我会试试的。我假设我对邮件列表的问题在洗牌中丢失了:-( 别担心,通过不同的途径询问是个好主意 :)【参考方案2】:

如果数据中没有标题行,则可以使用选项 -H。

CSVLoader loader = new CSVLoader();
loader.setSource(new File(CSVFilePath));

String[] options = new String[1]; 
options[0] = "-H";
loader.setOptions(options);

Instances data = loader.getDataSet();

见: http://weka.sourceforge.net/doc.dev/weka/core/converters/CSVLoader.html

【讨论】:

现在好像有一个速记,loader.setNoHeaderRowPresent(true)。见:weka.sourceforge.net/doc.dev/weka/core/converters/…【参考方案3】:

我的解决方案:

SELECT 'nameColumn1','nameColumn2'
UNION
SELECT idColumn1,idColumn2
FROM path
 INTO OUTFILE '/tmp/w.csv'
 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
 LINES TERMINATED BY '\n';

nameColumn1 和 nameColumn2 是列标题,将显示为 csv 文件的第一行。

【讨论】:

这个解决方案似乎有点不合适,但还可以。

以上是关于使用 Weka Java 代码 - 如何将 CSV(无标题行)转换为 ARFF 格式?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Weka 进行文本分类

Weka 从命令行预测到 CSV

如何使用带有 Java 代码的 WEKA 评估类来显示标准差值

如何在我的 Java 代码中使用带有 Weka 的 LibSVM?

Java Weka:如何指定拆分百分比?

在 Weka 中将分类预测输出到 CSV——输出文件保存在哪里?