使用WEKA评估样本的类别

时间:2015-01-05 10:16:22

标签: java classification weka

我使用SMO算法在Weka中创建了一个模型。我正在尝试使用上述模型评估测试样本,以便在我的两类问题中对其进行分类。我对如何使用Weka Smo代码评估样本感到困惑。我已经构建了一个空的arff文件,其中只包含文件的元数据。我计算样本特征,然后在arff文件中添加矢量。我创建了以下函数Evaluate以评估样本。文件template.arff是包含arff文件的元数据和模型/ smo我的模型的模板。

 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();
}

我不确定我是不是在这里。我创建了示例文件。之后我正在加载我的模型。如果我的代码是我需要的,以便评估样本温度等级,我就会徘徊。如果此代码没问题,我如何提取置信度得分而不是关于该类的二元决策? template.arff文件的结构是:

@relation Dataset
@attribute Attribute0 numeric
@attribute Attribute1 numeric
@attribute Attribute2 numeric
...
@ATTRIBUTE class {1, 2}

@data

此外,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;
}

我发现这篇帖子here建议找到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"));
     }
    }

2 个答案:

答案 0 :(得分:3)

我有一些建议,但我不知道它们是否会起作用。如果这对您有用,请告诉我。

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

SMO Class

public static SMO loadModelSMO(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 c = loadModelSMO(new File("models/"), "/smo");
...

我找到了一篇文章,可能会帮助你从邮件列表标题为主题 I used SMO with logistic regression but I always get a confidence of 1.0

建议设置使用-M以适合您可以通过方法

使用的物流模型
setOptions(java.lang.String[] options)

也许您需要将构建物流模型设置为true Confidence score in SMO

c.setBuildLogisticModels(true); 

让我知道这是否有帮助。

答案 1 :(得分:0)

基本上你应该尝试使用选项&#34; -M&#34;适用于SMO,以适应物流模型,在培训过程中。检查建议的解决方案here。它应该工作!