gpt4 book ai didi

java - 更改将 double 写入 CSV 的 Java 代码以将 double[] 写入 CSV(用例 = WEKA 库)

转载 作者:行者123 更新时间:2023-11-30 02:40:20 28 4
gpt4 key购买 nike

我使用 WEKA 库编写了一个 Java 程序,

  1. 训练分类算法
  2. 使用经过训练的算法对未标记的数据集运行预测
  3. 将结果写入 .csv 文件

问题在于它当前写出离散分类结果(即算法猜测一行属于哪个类别)。我想要的是写出给定类别的概率(例如,如果我将行分类为“垃圾邮件”或“非垃圾邮件”,那么我希望结果是垃圾邮件的概率)。

我的理解是,要做到这一点,我需要在代码中使用 distributionForInstance 而不是 classifyInstance 。来自 WEKA :

If you're interested in the distribution over all the classes, use the method distributionForInstance(Instance). This method returns a double array with the probability for each class.

我遇到的问题是,使用 classifyInstance 时,我正在处理 double 数据类型,而使用 distributionForInstance 时,我正在处理处理 double[] 数据类型,显然没有正确调整我的代码。

这是写出谨慎预测的工作代码:

public class runPredictions {
public static void runPredictions(ArrayList al2) throws IOException, Exception{
// Retrieve objects
Instances newTest = (Instances) al2.get(0);
Classifier clf = (Classifier) al2.get(1);

// Print status
System.out.println("Generating predictions...");

// create copy
Instances labeled = new Instances(newTest);

// label instances
for (int i = 0; i < newTest.numInstances(); i++) {
double clsLabel = clf.classifyInstance(newTest.instance(i));
labeled.instance(i).setClassValue(clsLabel);

}
System.out.println("Predictions complete! Writing output file to csv...");
BufferedWriter outFile = new BufferedWriter(new FileWriter("C:/Users/hackr/Desktop/silverbullet_output.csv"));

for (int i = 0; i < labeled.size(); i++)
{
outFile.write(labeled.get(i).toString());
outFile.write("\n");
}
System.out.println("Output file written.");
System.out.println("Completed successfully!");
outFile.close();
}
}

现在我正在处理的代码具有以下内容:

   for (int i = 0; i < labeled.size(); i++)

{
double[] clsLabel = clf.distributionForInstance(newTest.instance(i));
//outFile.write(labeled.get(i).toString());
outFile.write(Double.toString(clsLabel[i]));
outFile.write("\n");
}

并抛出一个

Index out of bounds

错误。

我还移动了 clsLabel 的创建,因为显然当数据类型更改时它再也找不到符号了,除非我将其移动到 for 循环内。

最佳答案

重新措辞我的评论。

clf.distributionForInstance(newTest.instance(i)); 返回的结果本身就是一个 double[]。这意味着您不是从分布函数中获取一个值,而是将整个分布作为一组值返回。

要正确显示整体分布,您需要单独循环结果集并打印值:

for (int i = 0; i < labeled.size(); i++) {
double[] clsLabel = clf.distributionForInstance(newTest.instance(i));
for(double d : clsLabel) {
outFile.write(Double.toString(d));
}
outFile.write("\n");
}

假设有 2 个类别(正在预测 2 个类别,例如“垃圾邮件”和“非垃圾邮件”),则以下内容有效:

BufferedWriter outFile = new BufferedWriter(new FileWriter("silverbullet_rro_output.csv"));
StringBuilder builder = new StringBuilder();

for (int i = 0; i < labeled.size(); i++)
{
double[] clsLabel = clf.distributionForInstance(newTest.instance(i));
for(int j=0;j<2;j++){
builder.append(clsLabel[j]+"");
if(j < clsLabel.length - 1)
builder.append(",");
}
builder.append("\n");
}
outFile.write(builder.toString());//save the string representation
System.out.println("Output file written.");
System.out.println("Completed successfully!");
outFile.close();

关于java - 更改将 double 写入 CSV 的 Java 代码以将 double[] 写入 CSV(用例 = WEKA 库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41940204/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com