Machine learning Weka中单个实例的分类

Machine learning Weka中单个实例的分类,machine-learning,classification,weka,prediction,decision-tree,Machine Learning,Classification,Weka,Prediction,Decision Tree,我使用WEKA gui训练并创建了一个J48模型。我将模型文件保存到我的计算机中,现在我想用它对Java代码中的单个实例进行分类。我想得到属性“cluster”的预测。我所做的是: public void classify(double lat, double lon, double co) { // Create attributes to be used with classifiers Attribute latitude

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

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(纬度,纬度)行上得到了BoundsException的IndexArrayOutofBoundsException。我找不到这个异常的原因。如果有人能给我指出正确的方向,我将不胜感激。

你需要将你的仪器添加到你的数据集中,一个实例对象。下面的代码应该可以工作

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.setDataSet()方法,而不是addInstance方法。因此,您的代码应该是inst_co.setDataSet(data)。

谢谢您的回答。只是澄清一下,classA和classB是分类的可能结果,即我的集群名称,对吗?我想它们需要与我创建模型时使用的相同。不起作用,我得到的是weka.core.UnassignedDatasetException:DenseInstance没有访问数据集的权限!错误。我想我必须将它分配给一个数据集,也许是我用来训练它的那个?@babatenor您需要将它分配给具有相同标题的数据集。它们的头信息应该是相同的,以确保:我在我的arff文件中读取了我与分类器一起使用的数据,将我的实例分配给这个数据集,并且还分配了一个类值?@babatenor您能给出一个arff文件的简单示例吗?。标题和3-4行数据?
Instances data = new Instances("TestInstances",attributeList,0);
inst_co = new DenseInstance(data.numAttributes());
data.add(inst_co);