三、weka中libsvm的算法学习

weka中的算法对象,如logistic、libsvm等的训练、测试的api都差不多,有些只是变量对象不一致而已。

一、weka中训练libsvm模型,需要weka.jar

  由于libsvm等的训练和logistic的步骤一致。

  1.加载数据instances,有查询数据库数据或者读取arff文件两种方式。

      A:读取arff文件加载数据

public static Instances getInstances(String sourceFile) throws Exception{
        System.out.println("开始分析 ");
        ArffLoader atf = new ArffLoader();        
        File inputFile = new File(sourceFile);
        atf.setFile(inputFile);
        System.out.println("读取文件成功");
        Instances instancesTrain = atf.getDataSet(); //获取每一行的实例
        instancesTrain.setClassIndex(instancesTrain.numAttributes()-1);//设置分析的列(即结果列)
        System.out.println("设置分析结果成功");
        return instancesTrain;
    };

      B:连接数据库加载数据

package com.cmcc.dataAnalysis;
import weka.core.converters.DatabaseLoader;
public  class DatabaseLoaderUtil {
    public final static String URL = "jdbc:oracle:thin:@10.2.44.56:1521:orcl";
    public final static String USER = "ykfx";
    public final static String PASSWORD = "root";
    public  DatabaseLoader JDBCQuery(String querySql) throws Exception{
        DatabaseLoader atf = new DatabaseLoader(); 
             atf.setUrl(URL);
             atf.setUser(USER);
             atf.setPassword(PASSWORD);
             atf.setQuery(querySql);
        return atf;
    }
}

Instances instancesTest = atf.getDataSet();

 

  2.设置分析index。

instancesTest.setClassIndex(instancesTest.numAttributes() - 1);

 

  3.处理分类特征,默认特征都是数值类型的。

 

static Instances NumericToNominal(Instances origin)
    {
        NumericToNominal rm=new NumericToNominal();
        Integer indice=origin.numAttributes()-1; 
    //1,2-9应该也可以 rm.setAttributeIndices(indice.toString()); Instances newData
=new Instances(origin); try { rm.setInputFormat(origin); newData=Filter.useFilter(origin, rm); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // apply filter return newData; }

 

  4.将处理好的instances数据集加载到libsvm或者logistic算法对象中。(如果是libsvm等比较复杂的算法,还可以设定libsvm对象模型训练的参数)。

  svmType有的是分析数值结果类型,有的是分析分类结果类型,都可以成功!
/**
     * 设置libsvm的属性
     * @param libsvm
     */
    private static void setLibsvmParam(LibSVM libsvm) {
        int svmTypeNum = 3;
        Tag [] tags =LibSVM.TAGS_SVMTYPE;
        System.out.println("当前选择的svmType:"+tags[svmTypeNum].getReadable());
        SelectedTag stag = new SelectedTag(svmTypeNum,tags);
        libsvm.setSVMType(stag);
        libsvm.setGamma(0.5);
    }

 

libsvm.buildClassifier(instances);

 

  5.用对象来分析数据。如果是libsvm,有时候result数组的长度是1,有时候是2,根据libsvm分析属性的不同而不同。

 

double [] result = libsvm.distributionForInstance(instance);

 

posted @ 2016-08-05 17:59  博智星  Views(1131)  Comments(0)    收藏  举报