您的位置:首页 > 其它

机器学习工具Weka 使用已知进行实时预测

2014-10-17 14:10 351 查看
本文使用Weka的classifyInstance和已知的机器学习模型来对数据进行实时预测

对数据进行实时预测一般有以下几个要点:

1、自己根据属性构建instance实例。

2、调用之前已经训练的模型,调用时需要将模型强制转变为模型机器学习类型,如NaiveBayes的模型需要这样操作。

Classifier m_Classifier = (NaiveBayes)SerializationHelper.read(new FileInputStream("model/bayes.model"));

以下是本文构建的Weka实时预测功能:

本实例中instance具有四个属性,第一个为double属性,第二个是double属性,第三个是Nominal类型,第四个是Class类型(预测值)。

:本文中使用的模型可以使用Weka图形界面操作生成。

代码思路:

首先,构建一个instances结构,构建instances具有什么样的属性;其次,指定instances的类别索引,即指定哪个属性代表的是类别。之后,构建instance实例,将instances的结构框架指定为instance的数据集,给instance赋值,此处传值时不需要传入Class值,因为这是我们要预测的;最后,使用已知模型的classifyInstance方法对instance进行预测,再根据预测出的索引得到预测类别的值。

以下是编写的Weka实时预测代码:

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import weka.classifiers.Classifier;
import weka.classifiers.bayes.NaiveBayes;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.SerializationHelper;

public class WekaTestInstance
{
Instances m_Data = null;
Classifier m_Classifier = null;
public WekaTestInstance() throws FileNotFoundException, Exception
{
m_Classifier = (NaiveBayes)SerializationHelper.read(new FileInputStream("model/bayes.model"));

String nameOfDataset = "messDataset";
FastVector attributes = new FastVector();
attributes.addElement(new Attribute("aa"));
attributes.addElement(new Attribute("bb"));

FastVector fvNominalVal = new FastVector(3);
fvNominalVal.addElement("blue");
fvNominalVal.addElement("gray");
fvNominalVal.addElement("black");
attributes.addElement(new Attribute("Nominal", fvNominalVal));

FastVector classValues = new FastVector(2);
classValues.addElement("pos");
classValues.addElement("neg");
attributes.addElement(new Attribute("Class", classValues));
m_Data = new Instances(nameOfDataset, attributes, 10);
m_Data.setClassIndex(m_Data.numAttributes()-1);
}
public void classifyMessage(double aa,double bb,String nominal) throws Exception
{
Instances testset = m_Data.stringFreeStructure();
Instance instance = makeInstance(aa,bb,nominal,testset);
System.out.println(m_Data.numAttributes());
System.out.println(instance);
double predicted = m_Classifier.classifyInstance(instance);
System.out.println("predicted:"+predicted);
System.out.println("Message classified as : " +
m_Data.classAttribute().value((int)predicted));
}
private Instance makeInstance(double aa,double bb,String nominal,Instances data)
{
Instance instance = new Instance(4);
instance.setDataset(data);
Attribute aaAtt = data.attribute("aa");
Attribute bbAtt = data.attribute("bb");
Attribute nominalAtt = data.attribute("Nominal");

instance.setValue(aaAtt, aa);
instance.setValue(bbAtt, bb);
instance.setValue(nominalAtt, nominal);

// instance.setValue((Attribute)instance.attribute(0), aa);
// instance.setValue((Attribute)instance.attribute(1), bb);
// instance.setValue((Attribute)instance.attribute(2),nominal);
return instance;
}
public static void main(String[] args) throws Exception
{
WekaTestInstance wTestInstance = new WekaTestInstance();
wTestInstance.classifyMessage(5.6,9.9,"gray");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐