В прошлом семестре у меня был проект, в котором при получении набора данных об автомобилях мне приходилось строить модель и использовать эту модель для прогнозирования на основе введенных пользователем данных (в ней использовался графический интерфейс и т. Д.).Профессор представил Weka, но только в виде графического интерфейса.Я воссоздаю проект, но на этот раз с библиотекой Weka.Вот этот класс:
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, но ничего не увидел на первый взгляд.Есть ли способ поместить данные вручную в экземпляр или мне нужно будет преобразовать данные прогноза в файл ARFF?