如何在不为 WEKA 中的实例创建 ARFF 文件的情况下对该实例进行预测?
How to make a prediction for an instance without creating an ARFF file for that instance in WEKA?
上学期我有一个项目,当给出一组关于汽车的数据时,我必须构建一个模型并使用该模型根据用户输入的数据进行预测(它涉及 GUI 等)。教授介绍了 Weka,但仅限于 GUI 形式。我正在重新创建项目,但这次是使用 Weka 库。这是有问题的 class:
public class TreeModel {
private J48 model = new J48();
private String[] options = new String[1];
private DataSource source;
private Instances data;
private Evaluation eval;
// Constructor
public TreeModel(String file) throws Exception {
source = new DataSource(file);
// By default, the options are set to produce unpruned tree '-U'
options[0] = "-U";
data = source.getDataSet();
model.setOptions(options);
}
// Overloaded constructor allowing you to choose options for the model
public TreeModel(String file, String[] options) throws Exception {
DataSource source = new DataSource(file);
data = source.getDataSet();
model.setOptions(options);
}
// Builds the decision tree
public void buildDecisionTree() throws Exception {
data.setClassIndex(data.numAttributes() - 1);
model.buildClassifier(data);
}
/*
* Uses cross validation technique to calculate the accuracy.
* Gives a more respected accuracy that is more likely to hold
* with instances not in the dataset.
*/
public void crossValidatedEvaluation(int folds) throws Exception {
eval = new Evaluation(data);
eval.crossValidateModel(model, data, folds, new Random());
System.out.println("The model predicted "+eval.pctCorrect()+" percent of the data correctly.");
}
/*
* Evaluates the accuracy of a decision tree when using all available data
* This should be looked at with skepticism (less interpretable)
*/
public void evaluateModel() throws Exception {
eval = new Evaluation(data);
eval.evaluateModel(model, data);
System.out.println("The model predicted "+eval.pctCorrect()+" percent of the data correctly.");
}
/*
* Returns a prediction for a particular instance. Will take in an instance
* as a parameter.
*/
public String getPrediction() throws Exception {
DataSource predFile = new DataSource("./predict.arff");
Instances pred = predFile.getDataSet();
Instance predic = pred.get(0);
pred.setClassIndex(pred.numAttributes() - 1);
double classify = model.classifyInstance(predic);
pred.instance(0).setClassValue(classify);
return pred.instance(0).stringValue(6);
}
// Returns source code version of the model (warning: messy code)
public String getModelSourceCode() throws Exception {
return model.toSource("DecisionTree");
}
}
在我的 getPrediction() 方法中,我有一个获取 ARFF 文件中实例预测的简单示例。问题是我无法弄清楚如何初始化单个 Instance 对象,然后将我想要用 "in" 该实例进行预测的数据放入。我已经查看了 Instance class 的文档,但乍一看没有看到任何内容。有没有办法手动将数据放入实例中,或者我是否需要将预测数据转换为 ARFF 文件?
这段代码应该可以帮助您在没有 ARFF 文件的情况下构建自己的实例集。下面我展示了从具有两个属性的数组创建一组新的实例;纬度和经度。
import weka.core.Attribute;
import weka.core.DenseInstance;
import weka.core.FastVector;
import weka.core.Instances;
public class AttTest {
public static void main(String[] args) throws Exception
{
double[] one={0,1,2,3};
double[] two={3,2,1,0};
double[][] both=new double[2][4];
both[0]=one;
both[1]=two;
Instances to_use=AttTest.buildArff(both);
System.out.println(to_use.toString());
}
public static Instances buildArff(double[][] array) throws Exception
{
FastVector atts = new FastVector();
atts.addElement(new Attribute("lat")); //latitude
atts.addElement(new Attribute("lon")); //longitude
// 2. create Instances object
Instances test = new Instances("location", atts, 0);
// 3. fill with data
for(int s1=0; s1 < array[0].length; s1=s1+1)
{
double vals[] = new double[test.numAttributes()];
vals[0] = array[0][s1];
vals[1] = array[1][s1];
test.add(new DenseInstance(1.0, vals));
}
return(test);
}
}
上学期我有一个项目,当给出一组关于汽车的数据时,我必须构建一个模型并使用该模型根据用户输入的数据进行预测(它涉及 GUI 等)。教授介绍了 Weka,但仅限于 GUI 形式。我正在重新创建项目,但这次是使用 Weka 库。这是有问题的 class:
public class TreeModel {
private J48 model = new J48();
private String[] options = new String[1];
private DataSource source;
private Instances data;
private Evaluation eval;
// Constructor
public TreeModel(String file) throws Exception {
source = new DataSource(file);
// By default, the options are set to produce unpruned tree '-U'
options[0] = "-U";
data = source.getDataSet();
model.setOptions(options);
}
// Overloaded constructor allowing you to choose options for the model
public TreeModel(String file, String[] options) throws Exception {
DataSource source = new DataSource(file);
data = source.getDataSet();
model.setOptions(options);
}
// Builds the decision tree
public void buildDecisionTree() throws Exception {
data.setClassIndex(data.numAttributes() - 1);
model.buildClassifier(data);
}
/*
* Uses cross validation technique to calculate the accuracy.
* Gives a more respected accuracy that is more likely to hold
* with instances not in the dataset.
*/
public void crossValidatedEvaluation(int folds) throws Exception {
eval = new Evaluation(data);
eval.crossValidateModel(model, data, folds, new Random());
System.out.println("The model predicted "+eval.pctCorrect()+" percent of the data correctly.");
}
/*
* Evaluates the accuracy of a decision tree when using all available data
* This should be looked at with skepticism (less interpretable)
*/
public void evaluateModel() throws Exception {
eval = new Evaluation(data);
eval.evaluateModel(model, data);
System.out.println("The model predicted "+eval.pctCorrect()+" percent of the data correctly.");
}
/*
* Returns a prediction for a particular instance. Will take in an instance
* as a parameter.
*/
public String getPrediction() throws Exception {
DataSource predFile = new DataSource("./predict.arff");
Instances pred = predFile.getDataSet();
Instance predic = pred.get(0);
pred.setClassIndex(pred.numAttributes() - 1);
double classify = model.classifyInstance(predic);
pred.instance(0).setClassValue(classify);
return pred.instance(0).stringValue(6);
}
// Returns source code version of the model (warning: messy code)
public String getModelSourceCode() throws Exception {
return model.toSource("DecisionTree");
}
}
在我的 getPrediction() 方法中,我有一个获取 ARFF 文件中实例预测的简单示例。问题是我无法弄清楚如何初始化单个 Instance 对象,然后将我想要用 "in" 该实例进行预测的数据放入。我已经查看了 Instance class 的文档,但乍一看没有看到任何内容。有没有办法手动将数据放入实例中,或者我是否需要将预测数据转换为 ARFF 文件?
这段代码应该可以帮助您在没有 ARFF 文件的情况下构建自己的实例集。下面我展示了从具有两个属性的数组创建一组新的实例;纬度和经度。
import weka.core.Attribute;
import weka.core.DenseInstance;
import weka.core.FastVector;
import weka.core.Instances;
public class AttTest {
public static void main(String[] args) throws Exception
{
double[] one={0,1,2,3};
double[] two={3,2,1,0};
double[][] both=new double[2][4];
both[0]=one;
both[1]=two;
Instances to_use=AttTest.buildArff(both);
System.out.println(to_use.toString());
}
public static Instances buildArff(double[][] array) throws Exception
{
FastVector atts = new FastVector();
atts.addElement(new Attribute("lat")); //latitude
atts.addElement(new Attribute("lon")); //longitude
// 2. create Instances object
Instances test = new Instances("location", atts, 0);
// 3. fill with data
for(int s1=0; s1 < array[0].length; s1=s1+1)
{
double vals[] = new double[test.numAttributes()];
vals[0] = array[0][s1];
vals[1] = array[1][s1];
test.add(new DenseInstance(1.0, vals));
}
return(test);
}
}