您的位置:首页 > 产品设计 > 产品经理

Weka生成和加载PMML文件

2016-07-13 19:22 441 查看
网络上太多示例展示了Weka怎么样调用数据分类算法,但想想我如何针对一个训练好的分类模型进行重用呢。所以必须要“导出来”。导出模型,一个标准的方式就是用PMML了。

标准的方式,Weka一定会支持。找了一下,不负所望。将上一次的代码整理了一下,加上PMML的支持:

训练模型,导出PMML文件

static void trainModelToPmml(String arffFile, int classIndex, File pmmlFile) throws Exception {

File inputFile = new File(arffFile); //训练文件
ArffLoader loader = new ArffLoader();
loader.setFile(inputFile);
Instances insTrain = loader.getDataSet(); // 读入训练文件
insTrain.setClassIndex(classIndex);

Logistic logic=new Logistic();
logic.buildClassifier(insTrain);//根据训练数据构造分类器

String pmml = logic.toPMML(insTrain);

PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(pmmlFile)));
writer.println(pmml);
writer.close();
}


加载PMML文件

static PMMLClassifier getClassifier(String filePath) {
PMMLClassifier regression = null;
try {
PMMLModel model = PMMLFactory
.getPMMLModel(new BufferedInputStream(
new FileInputStream(new File(filePath))));

regression = (PMMLClassifier) model;

} catch (Exception ex) {
ex.printStackTrace();
}
return regression;
}


验证模型

static void verifyModel(PMMLClassifier logic, String arffFile, int classIndex) throws Exception {
ArffLoader loader = new ArffLoader();

File inputFile = new File(arffFile);//测试数据
loader.setFile(inputFile);
Instances insTest =loader.getDataSet(); // 读入测试文件
insTest.setClassIndex(classIndex); //设置分类属性所在行号(第一行为0号),instancesTest.numAttributes()可以取得属性总数

double sum = insTest.numInstances();//测试实例数
double right=0.0f;
for(int i=0;i<sum;i++){

Instance ins = insTest.instance(i);

double a = logic.classifyInstance(ins);
double b = ins.classValue();
if(java.lang.Math.abs(logic.classifyInstance(ins)-ins.classValue()) < 0.0001) {
right++;//正确值加一
}
}
System.out.println("classification precision:" + (right/sum));
}


main函数

public static void main(String[] args) throws Exception {

final String arffTrainData = "data/LogisticRegressionFakeDataTrain.arff";
final String arffData = "data/LogisticRegressionFakeData.arff";
final String pmmlFile = "data/LogisticRegression.pmml";

trainModelToPmml(arffTrainData, 6, new File(pmmlFile));

PMMLClassifier classifier = getClassifier(pmmlFile);
verifyModel(classifier, arffData, 6);
}


其实还有另外一种,就是通过Java序列化类实例的方式保存模型。

参考文章:使用Weka进行数据挖掘(Weka教程九)模型序列化/持久化存储和加载

核心就是:

// 序列化保存
public static void persistModel(J48 model, String ModelPath) {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(
new FileOutputStream(ModelPath));
oos.writeObject(model);
oos.flush();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}

// 反序列化,加载
public static J48 reloadPersistModel(String ModelPath) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(
new FileInputStream(new File(ModelPath)));
J48 model = (J48) ois.readObject();
return model;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据挖掘 weka pmml