Javaマシン学習ライブラリMLの8モデル反復訓練に関する試験

3717 ワード

前述したように、データセットが大きすぎるため、分割して順次反復訓練するしかなく、実験では結果にばらつきがあることが分かった.参考コードは以下の通りである.
package com.vip;

import java.io.File;
import java.util.Map;

import be.abeel.util.Pair;
import net.sf.javaml.classification.Classifier;
import net.sf.javaml.classification.KNearestNeighbors;
import net.sf.javaml.core.Dataset;
import net.sf.javaml.core.DefaultDataset;
import net.sf.javaml.core.DenseInstance;
import net.sf.javaml.core.Instance;
import net.sf.javaml.sampling.Sampling;
import net.sf.javaml.tools.data.FileHandler;

public class VIPClassifer {
	 public static void main(String[] args)throws Exception {	 
		    if (args.length != 1) {
				System.err.println("Usage:      。。。");
				System.exit(2);
			}				    
		    //   :              
		    Sampling s = Sampling.SubSampling;   
		    Classifier knn = new KNearestNeighbors(2);  
            Dataset ds_validate=new DefaultDataset();  
            for(int i=0;i<=11;i++){//  11  
            	String filePath=args[0]+"/sam_"+String.format("%02d", i);  
            	Dataset ori_data = FileHandler.loadDataset(new File(filePath), 12, "\\s+"); //  12      ,  1    
            	//                    
                Pair sam_data = s.sample(ori_data, (int) (ori_data.size() * 0.9));            
                knn.buildClassifier(sam_data.x());//         
                for(Instance inst:sam_data.y()){//       
                    ds_validate.add(inst);  
                }  
                System.out.println("     "+String.valueOf(i)+"    ");  
            }
            //   :         
            System.out.println("    。。。");
	        int correct = 0, wrong = 0;
	        for (Instance inst : ds_validate) {
	            Object predictedClassValue = knn.classify(inst);
	            Object realClassValue = inst.classValue();
	            if (predictedClassValue.equals(realClassValue)) correct++;
	            else wrong++;
	        }
	        System.out.println("Correct predictions  " + correct);
	        System.out.println("Wrong predictions " + wrong);
	        //          
	        System.out.println("    。。。");
	        Dataset out_data = new DefaultDataset();    
	        for(int i=0;i<=59;i++){//  59  
	        	String filePath=args[0]+"/lim_"+String.format("%02d", i);
	        	//     ,  13      ,  2  uid spuid    
	        	Dataset pre_data = FileHandler.loadDataset(new File(filePath),"\\s+");
	        	for(Instance inst:pre_data){
	        		double[] values = new double[12]; 
		        	for(int j=0;j<11;j++) values[j]=inst.value(j);
		        	values[11]=inst.value(12);// 12      
		        	Instance pre_inst = new DenseInstance(values); //   ,12       
		        	Map classProb=knn.classDistribution(pre_inst);//      
		        	double[] pprob=new double[]{classProb.get("1")};//       
		        	Instance out_inst = new DenseInstance(pprob); //  
		        	out_data.add(out_inst);
		        	System.out.println("     "+String.valueOf(i)+"    "); 
	        	}
	        }
	        //  u_Id+spu_id+action_type
	        FileHandler.exportDataset(out_data, new File(args[0]+"/output.txt"));
	 }
}

コード実行の結果,検証セットは10万の検証セットがあり,2つだけが正しいことが分かったが,具体的な原因は分からず,訓練セットを分割して訓練する方法が不可能であることが分かった.
また,処理が特に遅いこと,特に単一の記録検証と予測ではモデルトレーニングdatasetの導入が速く,理解できないことが分かった.単一の予測と検証は1秒に数本しか感じられず、数百本の記録にとっては長すぎる.これはMLライブラリがどうやって作ったのか分かりません.
大きなサンプルセットのトレーニングをどのように解決するかは、pythonがサポートしたほうがいいです.1つはspark mlibプラットフォームです.
学習タスクについて、3つの仕事をまとめます.
1)サンプル:等化サンプリング、サンプル選択、クロス検証;  2)特徴:特徴マイニング、特徴選択、特徴値処理;  3)モデル:パラメータ調整、モデル選択、学習方法;