【问题标题】:Classifying Single Instance in Weka在 Weka 中对单个实例进行分类
【发布时间】:2012-10-13 07:21:50
【问题描述】:

我使用 WEKA gui 训练并创建了一个 J48 模型。我将模型文件保存到我的计算机上,现在我想用它来分类我的 Java 代码中的单个实例。我想得到属性“集群”的预测。我要做的是:

public void classify(double lat, double lon, double co)
{            

// Create attributes to be used with classifiers
                    Attribute latitude = new Attribute("latitude");
                    Attribute longitude = new Attribute("longitude");
                    Attribute carbonmonoxide = new Attribute("co");

                    // Create instances for each pollutant with attribute values latitude, longitude and pollutant itself
                    inst_co = new DenseInstance(4);

                    // Set instance's values for the attributes "latitude", "longitude", and "pollutant concentration"
                    inst_co.setValue(latitude, lat);
                    inst_co.setValue(longitude, lon);
                    inst_co.setValue(carbonmonoxide, co);
                    inst_co.setMissing(cluster);


    Classifier cls_co = (Classifier) weka.core.SerializationHelper.read("/CO_J48Model.model");//load classifier from file

                    // Test the model
        double result = cls_co.classifyInstance(inst_co);
}

但是,我在行 inst_co.setValue(latitude, lat); 上收到了 IndexArrayOutofBoundsException。我找不到此异常的原因。如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

    标签: machine-learning classification weka prediction decision-tree


    【解决方案1】:

    您需要将您的 inst_co 添加到您的数据集,即 Instances 对象中。以下代码应该可以工作。

    import java.util.ArrayList;
    
    import weka.classifiers.Classifier;
    import weka.core.Attribute;
    import weka.core.DenseInstance;
    import weka.core.Instance;
    import weka.core.Instances;
    
    public class QuestionInstanceClassifiy {
    
        public static void main(String[] args) {
            QuestionInstanceClassifiy q = new QuestionInstanceClassifiy();
            double result = q.classify(1.0d, 1, 1);
            System.out.println(result);
        }
    
        private Instance inst_co;
    
        public double classify(double lat, double lon, double co)  {
    
            // Create attributes to be used with classifiers
            // Test the model
            double result = -1;
            try {
    
                ArrayList<Attribute> attributeList = new ArrayList<Attribute>(2);
    
                Attribute latitude = new Attribute("latitude");
                Attribute longitude = new Attribute("longitude");
                Attribute carbonmonoxide = new Attribute("co");
    
                ArrayList<String> classVal = new ArrayList<String>();
                classVal.add("ClassA");
                classVal.add("ClassB");
    
    
                attributeList.add(latitude);
                attributeList.add(longitude);
                attributeList.add(carbonmonoxide);
                attributeList.add(new Attribute("@@class@@",classVal));
    
                Instances data = new Instances("TestInstances",attributeList,0);
    
    
                // Create instances for each pollutant with attribute values latitude,
                // longitude and pollutant itself
                inst_co = new DenseInstance(data.numAttributes());
                data.add(inst_co);
    
                // Set instance's values for the attributes "latitude", "longitude", and
                // "pollutant concentration"
                inst_co.setValue(latitude, lat);
                inst_co.setValue(longitude, lon);
                inst_co.setValue(carbonmonoxide, co);
                // inst_co.setMissing(cluster);
    
                // load classifier from file
                Classifier cls_co = (Classifier) weka.core.SerializationHelper
                        .read("/CO_J48Model.model");
    
                result = cls_co.classifyInstance(inst_co);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return result;
        }
    }
    

    您从实例创建数据对象。将您的实例添加到此数据中。之后,您可以在 Instance 中设置您的值。

    Instances data = new Instances("TestInstances",attributeList,0);
    inst_co = new DenseInstance(data.numAttributes());
    data.add(inst_co);
    

    我建议从外部文件中获取标头信息和实例值,或者只创建一次此信息。

    【讨论】:

    • 感谢您的出色回答。澄清一下,classA 和 classB 是分类的可能结果,即我的集群名称,对吗?我想它们需要与我创建模型时使用的相同。
    • 不工作,我收到 weka.core.UnassignedDatasetException: DenseInstance 无权访问数据集!错误。我想我必须将它分配给一个数据集,也许是我用来训练它的那个?
    • @babatenor 您需要将其分配给具有相同标题的数据集。它们的标头信息应该相同
    • 只是为了确保:我在我的 arff 文件中读取了我与分类器一起使用的数据,将我的实例分配给该数据集并分配一个类值?
    • @babatenor 你能举一个你的 arff 文件的简单例子吗?标题和3-4行数据?
    【解决方案2】:

    实际上我在我的情况下尝试的是调用 instance.setDataSet() 方法,而不是 addInstance 方法。所以你的代码应该是 inst_co.setDataSet(data)。

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 2015-02-01
      • 2015-01-21
      • 2012-02-14
      • 1970-01-01
      • 2017-01-09
      • 2012-03-25
      • 2014-03-02
      • 2013-05-13
      相关资源
      最近更新 更多