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