Java机器学习库ML之八关于模型迭代训练的试验
生活随笔
收集整理的這篇文章主要介紹了
Java机器学习库ML之八关于模型迭代训练的试验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前文提到因為數據集過大,只能拆分然后依次迭代訓練,實驗發現對結果有所偏差,參考代碼如下:
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<Dataset, Dataset> 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<Object,Double> 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_typeFileHandler.exportDataset(out_data, new File(args[0]+"/output.txt"));} }代碼執行結果就是驗證集發現,共有10萬驗證集,只有2個是正確的,具體原因不知道,可見通過拆分訓練集來訓練的方法似乎不可行。
另外發現處理特別慢,尤其是單條記錄驗證和預測時,對于模型訓練dataset導入倒是很快,很不解。單條預測和驗證一秒感覺只有幾條,對于幾百條記錄來說,實在運行太久了。這個不知道ML庫是怎么弄的。
如何解決大樣本集的訓練,一個是python支持比較好,一個就是spark mlib平臺。
對于學習任務來說,總結三方面的工作:
1)樣本:均衡采樣、樣本選擇、交叉驗證;
? 2)特征:特征挖掘、特征選擇、特征值處理;
? 3)模型:參數調優、模型選擇、學習方法;
總結
以上是生活随笔為你收集整理的Java机器学习库ML之八关于模型迭代训练的试验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下为文件增加列的shell脚本
- 下一篇: Java机器学习库ML之九交叉验证法(C