【问题标题】:Getting prediction error with WEKA (Java API)使用 WEKA (Java API) 获取预测错误
【发布时间】:2019-08-30 10:27:27
【问题描述】:

实际上,我已经开发了一个使用 RandomTree 进行预测的项目 分类器。你可以输入不同的参数,算法会告诉你 您的回答可以是“是”或“否”。

我希望这个答案是“是”或“否”以及概率(百分比预测或预测误差)。例如:

是 - 0.754%

没有 - 0.64%

如何使用 WEKA 制作这个?有教程或参考可以看吗?

这是我的 RandomTree 分类器代码

RandomTree cls = new RandomTree();
        cls = (RandomTree) weka.core.SerializationHelper.read("randomTreeSerializadoEnfermedad.model");
        System.out.println("Muestro la profundidad al cargar el modelo: " + cls);

        BufferedReader breader = new BufferedReader(new FileReader(patharff));
        Instances originalTrain = null;
        originalTrain = new Instances(breader);
        originalTrain.setClassIndex(originalTrain.numAttributes() - 1);
        //originalTrain.set
        System.out.println("Muestro lo de numAttributes para ver qué es:" + originalTrain.attribute(13));
                int s1 = 0;

        // perform your prediction
        double value = cls.classifyInstance(originalTrain.instance(s1));

        // get the prediction percentage or distribution
        System.out.println("La instancia sobre la que se van a predecir los datos es: " + originalTrain.instance(s1));
        double[] percentage = cls.distributionForInstance(originalTrain.instance(s1));
        System.out.println("Percentage: "+percentage);

        // get the name of the class value
        String prediction = originalTrain.classAttribute().value((int) value);
        //originalTrain.classAttribute().value((int) value).
        System.out.println("xxx: " + originalTrain.classAttribute());

        System.out.println("The predicted value of instance " + Integer.toString(s1) + ": " + prediction);
        String distribution = "";
        for (int i = 0; i < percentage.length; i = i + 1) {
            if (i == value) {
                distribution = distribution + "*" + Double.toString(percentage[i]) + ",";
            } else {
                distribution = distribution + Double.toString(percentage[i]) + ",";
            }
        }
        distribution = distribution.substring(0, distribution.length() - 1);

        System.out.println("Distribution:" + distribution);

        String finalpred = "The predicted value of instance " + Integer.toString(s1) + ": " + prediction +"\n"
                + "Distribution:" + distribution;
        return finalpred;

这就是我使用这段代码得到的输出

我怎样才能得到预测误差?

提前谢谢你!

【问题讨论】:

    标签: java machine-learning deep-learning weka prediction


    【解决方案1】:

    这是一个使用 iris 数据集的工作示例。请注意,设置 numFolds > 0 (cls.setNumFolds(2);) 以获得 0 和 1 以外的概率。

    package test;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Random;
    import java.util.StringJoiner;
    
    import weka.classifiers.trees.RandomTree;
    import weka.core.Attribute;
    import weka.core.Instance;
    import weka.core.Instances;
    import weka.core.converters.ConverterUtils.DataSource;
    
    public class WekaTest {
    
        public static void main(String[] args) throws Exception {
            DataSource dataSource = new DataSource("C:\\Program Files\\Weka-3-8\\data\\iris.arff");
            Instances instances = dataSource.getDataSet();
    
            if (instances.classIndex() == -1) {
                instances.setClassIndex(instances.numAttributes() - 1);
            }
    
            instances.randomize(new Random(1));
    
            int trainSize = (int) Math.round(instances.numInstances() * 66 / 100);
            int testSize = instances.numInstances() - trainSize;
            Instances train = new Instances(instances, 0, trainSize);
            Instances test = new Instances(instances, trainSize, testSize);
    
            RandomTree cls = new RandomTree();
            cls.setNumFolds(2);
            cls.buildClassifier(train);
    
            Attribute classAttribute = train.classAttribute();
            ArrayList<Object> classNames = Collections.list(classAttribute.enumerateValues());
    
            for (int i = 0; i < testSize; i++) {
                Instance instance = test.get(i);
                // perform your prediction
                double value = cls.classifyInstance(instance);
                double[] percentage = cls.distributionForInstance(instance);
                int predictedIndex = (int) value;
    
                StringJoiner sj = new StringJoiner(", ");
                for (int j = 0; j < percentage.length; j++) {
                    sj.add(String.format("%s%s %.2f", classNames.get(j), j == predictedIndex ? "*" : "", percentage[j]));
                }
    
                System.out.println("Distribution for index " + i + ": " + sj.toString());
            }
        }
    }
    

    这个输出:

    Distribution for index 0: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 1: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 2: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 3: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 4: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 5: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 6: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 7: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 8: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 9: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 10: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 11: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 12: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 13: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 14: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 15: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 16: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 17: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 18: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 19: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 20: Iris-setosa 0.00, Iris-versicolor 0.00, Iris-virginica* 1.00
    Distribution for index 21: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 22: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 23: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 24: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 25: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 26: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 27: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 28: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 29: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 30: Iris-setosa 0.00, Iris-versicolor 0.00, Iris-virginica* 1.00
    Distribution for index 31: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 32: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 33: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 34: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 35: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 36: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 37: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 38: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 39: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 40: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 41: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 42: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 43: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 44: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 45: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 46: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 47: Iris-setosa* 1.00, Iris-versicolor 0.00, Iris-virginica 0.00
    Distribution for index 48: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    Distribution for index 49: Iris-setosa 0.00, Iris-versicolor* 1.00, Iris-virginica 0.00
    Distribution for index 50: Iris-setosa 0.00, Iris-versicolor 0.13, Iris-virginica* 0.88
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-12
      • 2017-12-07
      • 2016-06-21
      • 1970-01-01
      • 2015-03-23
      • 2017-10-12
      • 2015-04-13
      • 2014-03-07
      相关资源
      最近更新 更多