【问题标题】:Multilayer Neuronal Network Perceptron; FileWriter is not working, Output does not work properly多层神经元网络感知器; FileWriter 不工作,输出不正常
【发布时间】:2023-01-17 08:50:06
【问题描述】:

我尝试使用 Weka 在 Java 中构建机器学习模型。 这是我的代码:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.ArrayList;

import weka.classifiers.Evaluation;
import weka.classifiers.functions.MultilayerPerceptron;
import weka.classifiers.evaluation.Prediction;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;

public class multiLayerExample {
    public static void main(String[] args) throws Exception {

        String filename = "../train.arff";
        DataSource source = new DataSource(filename);
        Instances train = source.getDataSet();
        int cid1 = train.numAttributes() - 1;
        train.setClassIndex(cid1);
        
        Instances validation = DataSource.read(".../validation.arff");
        int cid2 = validation.numAttributes() - 1;
        validation.setClassIndex(cid2);

        Instances test = DataSource.read("../test1.arff");
        int cid3 = test.numAttributes() - 1;
        test.setClassIndex(cid3);

        MultilayerPerceptron tree = new MultilayerPerceptron();
        tree.buildClassifier(train);

        Evaluation eval = new Evaluation(train);
        eval.evaluateModel(tree, validation);
        System.out.println(eval.toSummaryString("\nResults_RF\n\n", false));
    //  System.out.println(eval.toClassDetailsString());
    //  System.out.println(eval.toMatrixString());

        ArrayList<Prediction> al = eval.predictions();
        ArrayList<String[]> as = new ArrayList<String[]>(al.size());
        for (int i = 0; i < al.size(); i++) {
            String[] s = new String[1];
            s[0] = al.get(i).toString();
            s[0] = s[0].substring(9, 11);
            as.add(s);
            System.out.println(s);
        }
        ArrayList<String[]> li = new ArrayList<String[]>(al.size());
        li.addAll(as);
         
        System.out.println(li.addAll(as));
//      String csv = "../output.csv";
//      CSVSaver writer = new CSVSaver(new FileWriter(csv));
//
//      writer.writeAll(li);
//      writer.close();
//      
        //Storing again in csv
        BufferedWriter writer1 = new BufferedWriter(
        new FileWriter("../output.csv"));
        System.out.print(li);
        writer1.write(li.toString());
        writer1.newLine();
        writer1.flush();
        writer1.close();
    }
}

我遇到的问题是: CSVSaver writer = new CSVSaver(new FileWriter(csv)); 出现以下错误消息:“CSVSaver 无法解析为类型” 如果我将其注释掉并使用在其下方插入的方法(//再次存储在 csv 中),它会在输出 csv 中插入以下数据: “[[Ljava.lang.String;@53f65459, [Ljava.lang.String;@3b088d51, [Ljava.lang.String;@1786dec2,...”

我能做什么,让它发挥作用? 提前感谢您的帮助!

我尝试编写一个新的 CSV 保存程序(请参阅://再次存储在 csv 中)但输出不可读。 我希望将预测写入输出文件。格式是所有数字(双精度)。

【问题讨论】:

    标签: csv machine-learning weka perceptron


    【解决方案1】:

    Weka 的 CSVSaver 用于将 weka.core.Instances 对象存储在 CSV 文件中,而不仅仅是任何列表。

    此外,Java 数组是对象,但缺少自定义的 toString() 方法。相反,您会看到类似 [Ljava.lang.String;@3b088d51 的内容,它由类型签名和对象 ID 组成(请参阅 JNI type signatures)。

    根据您的代码,您似乎正在尝试将预测值保存在 CSV 文件中。但不是将预测转换为字符串然后提取相关部分,您可以直接从 Prediction 对象中获取预测值(数字类的具体实现是 NumericPrediction 和标称类的 NominalPrediction)。

    我将重写您的代码以生成包含预测的 CSV 文件,如下所示:

    FileWriter fwriter1 = new FileWriter("../output.csv");
    BufferedWriter writer1 = new BufferedWriter(fwriter1);
    for (Prediction p: eval.predictions()) {
      writer1.write("" + p.predicted());
      writer1.newLine();
    }
    writer1.flush();
    writer1.close();
    fwriter1.close();
    

    如果你的类应该是名义上的,.predicted() 将返回标签索引。您可以将此索引转换为 int 并从您的类属性中检索标签:

    String label = train.classAttribute().value((int) p.predicted());
    

    注意:您应该始终确保您的训练集、验证集和测试集兼容,以避免分类器出现奇怪的行为,使用 equalHeadersMsg 方法:

    String msg;
    msg = train.equalHeadersMsg(test);
    if (msg != null)
      throw new IllegalStateException("Train/test not compatible:
    " + msg);
    msg = train.equalHeadersMsg(validation);
    if (msg != null)
      throw new IllegalStateException("Train/validation not compatible:
    " + msg);
    

    【讨论】:

      猜你喜欢
      • 2015-01-17
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2016-05-04
      • 2015-01-27
      • 2017-02-28
      相关资源
      最近更新 更多