三、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);

浙公网安备 33010602011771号