Java 使用WEKA评估样本类别

Java 使用WEKA评估样本类别,java,classification,weka,Java,Classification,Weka,我使用SMO算法在Weka中创建了一个模型。我正在尝试使用所提到的模型评估一个测试样本,以便在我的两类问题中对其进行分类。我对如何使用Weka Smo代码评估示例感到有点困惑。我构建了一个空的arff文件,其中只包含该文件的元数据。我计算样本特征并将向量添加到arff文件中。我创建了下面的函数Evaluate来评估一个示例。文件template.arff是包含arff文件和models/smo my model的元数据的模板 public static void Evaluate(ArrayL

我使用SMO算法在Weka中创建了一个模型。我正在尝试使用所提到的模型评估一个测试样本,以便在我的两类问题中对其进行分类。我对如何使用Weka Smo代码评估示例感到有点困惑。我构建了一个空的arff文件,其中只包含该文件的元数据。我计算样本特征并将向量添加到arff文件中。我创建了下面的函数Evaluate来评估一个示例。文件template.arff是包含arff文件和models/smo my model的元数据的模板

 public static void Evaluate(ArrayList<Float> temp) throws Exception {

    temp.add(Float.parseFloat("1"));
    System.out.println(temp.size());
    double dt[] = new double[temp.size()];
    for (int index = 0; index < temp.size(); index++) {
        dt[index] = temp.get(index);
    }

    double data[][] = new double[1][];
    data[0] = dt;
    weka.classifiers.Classifier c = loadModel(new File("models/"), "/smo"); // loads smo model

    File tmp = new File("template.arff"); //loads data template
    Instances dataset = new weka.core.converters.ConverterUtils.DataSource(tmp.getAbsolutePath()).getDataSet();
    int numInstances = data.length;

    for (int inst = 0; inst < numInstances; inst++) {
        dataset.add(new Instance(1.0, data[inst]));
    }
    dataset.setClassIndex(dataset.numAttributes() - 1);
    Evaluation eval = new Evaluation(dataset);
    //returned evaluated index
    double a = eval.evaluateModelOnceAndRecordPrediction(c, dataset.instance(0));
    double arr[] = c.distributionForInstance(dataset.instance(0));


    System.out.println(" Confidence Scores");
    for (int idx = 0; idx < arr.length; idx++) {
        System.out.print(arr[idx] + " ");
    }
    System.out.println();
}
此外,loadModel功能如下所示:

public static SMO loadModel(File path, String name) throws Exception {

    SMO classifier;

    FileInputStream fis = new FileInputStream(path + name + ".model");
    ObjectInputStream ois = new ObjectInputStream(fis);

    classifier = (SMO) ois.readObject();
    ois.close();

    return classifier;
}
我找到了这篇文章,建议找到SMO.java文件并更改以下行
SMO.buildClassifier(train,cl1,cl2,true,-1,-1)//从false到true。
然而,当我这样做时,我似乎得到了相同的二进制输出

我的培训职能:

   public void weka_train(File input, String[] options) throws Exception {   

     long start = System.nanoTime();
     File tmp = new File("data.arff");
     TwitterTrendSetters obj = new TwitterTrendSetters();
     Instances data = new weka.core.converters.ConverterUtils.DataSource(
            tmp.getAbsolutePath()).getDataSet();
     data.setClassIndex(data.numAttributes() - 1);
     Classifier c = null;
     String ctype = null;
     boolean newmodel = false;

     ctype = "SMO";
     c = new SMO();

     for (int i = 0; i < options.length; i++) {
        System.out.print(options[i]);

     }

     c.setOptions(options);
     c.buildClassifier(data);
     newmodel = true;

     if (newmodel) {
        obj.saveModel(c, ctype, new File("models"));
     }
    }
public void weka_train(文件输入,字符串[]选项)引发异常{
长启动=System.nanoTime();
文件tmp=新文件(“data.arff”);
TwitterTrendSetters obj=新TwitterTrendSetters();
实例数据=new weka.core.converters.ConverterUtils.DataSource(
tmp.getAbsolutePath()).getDataSet();
data.setClassIndex(data.numAttributes()-1);
分类器c=null;
字符串ctype=null;
布尔newmodel=false;
ctype=“SMO”;
c=新SMO();
对于(int i=0;i
我有一些建议,但我不知道它们是否有效。让我知道这是否适合你

首先使用SMO,而不仅仅是父对象分类器类。我创建了一个新方法loadModelSMO作为例子

然后

SMO c = loadModelSMO(new File("models/"), "/smo");
...
我在邮件列表主题中找到了一篇文章,标题为

建议设置使用-M以适合您的物流模型,该模型可通过该方法使用

setOptions(java.lang.String[] options)
另外,您可能需要将构建物流模型设置为true


让我知道这是否有帮助。

基本上,在培训过程中,您应该尝试为SMO使用“-M”选项以适应物流模型。检查提出的解决方案。它应该有用

你得到了什么输出?我得到了两个值的信心分数:1.0.0。我认为这些值对应于分类结果。但是,我不太确定。试着传递不同的元数据,看看值是否改变。元数据是标准的。我不能在那里改变什么。是的,看起来不错。。。问题是什么?你答案的第一部分完全脱离主题。对于第二部分,pred变量总是返回1.0或0.0。将分类器类强制转换为SMO完全脱离主题是什么?根据我对这个问题的理解,你想得到每个二进制SMO的偏差。这可以通过将分类器对象强制转换为SMO对象来实现,SMO对象扩展了分类器。然后你可以使用SMO对象提供的bias方法,可以在这里找到,我试图将它转换为SMO分类器。它根本找不到bias函数。weka.classifiers.SMO c=loadModel(新文件(“models/”),/SMO);我这里出错了,因为它找不到weka.classifiers.SMO,我搞错了。它应该是weka.classifiers.functions.SMO,而不是weka.classifiers.SMO
SMO c = loadModelSMO(new File("models/"), "/smo");
...
setOptions(java.lang.String[] options)
c.setBuildLogisticModels(true);