weka 决策树 pmml

之前使用weka 将一个离线的决策树分类算法移植到线上,主要是借助于weka中对决策树的PMML规范的支持,对于使用方法也是琢磨了半天才搞定的,为了方便后来人故在此给出主要的使用步骤,鉴于当时使用的weka 3.7.3对决策树支持有bug,所以我修改了源码,故会给出使用的jar包。

 

首先给出java代码,这里主要是给出使用流程框架,具体的结果例子等涉及一些内部信息不便于直接举例,同时我本机的spss软件貌似被删除了,所以也找不到比较好的例子了。

 

前提说明:PMML 文件是一种通用的数据挖掘模型文件,spss软件支持将模型导出为pmml文件,weka目前支持的pmml类型不多,但是对于C5这种决策树算法是支持的。

 

package all;

import java.util.ArrayList;

import weka.classifiers.pmml.consumer.PMMLClassifier;
import weka.core.Attribute;
import weka.core.DenseInstance;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.pmml.PMMLFactory;
import weka.core.pmml.PMMLModel;

public class TestWekaPmml {

    /**
     * @param args
     * @throws Throwable 
     */
    public static void main(String[] args) throws Throwable {
	String pmmlFile = "";
	
	//加载pmml文件,支持File  InputStream等
	PMMLModel model = PMMLFactory.getPMMLModel(pmmlFile);
	
	//得到PMML分类器
	PMMLClassifier classifier =(PMMLClassifier) model;
	
	//实例化属性列表
	ArrayList<Attribute> attributes = new ArrayList<Attribute>();
	
	//设置pmml文件中各属性类型,这里需要循环将pmml文件中的DataDictionary中的所有属性字段列出,同时确定数据类型
	int  order = 0;//这里按照pmml文件里的属性属性来,从0开始
	Attribute stringAttribute  = new Attribute("多值String属性",new ArrayList<String>(),order);
	
	Attribute doubleAttribute = new Attribute("单值double属性",order);
			
	attributes.add(stringAttribute);
	attributes.add(doubleAttribute);
	
	double result[] = null;
	//构造数据集
	Instance instance = new DenseInstance(attributes.size());
	Instances paramInstances = new Instances("数据集名字", attributes,attributes.size());
	instance.setDataset(paramInstances);
	
	//依据属性类型设置属性值,weka中只支持double和string 够用了
	//这里需要注意String类型的值必须是上面属性列表中String List中的某个
	instance.setValue(doubleAttribute, (Double)0.00000);
	instance.setValue(stringAttribute, (String)"type?");
	
	//开始执行模型会返回2个double值,一个是正样本结果,一个是负样本结果
	result= classifier.distributionForInstance(instance);
    }
}
 

附件中是使用的weka源文件和jar包

 

你可能感兴趣的:(决策树)