前文提到因为数据集过大,只能拆分然后依次迭代训练,实验发现对结果有所偏差,参考代码如下:

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之八关于模型迭代训练的试验相关推荐

  1. Java机器学习库ML之六关于模型迭代训练的思考

    我遇到的场景是:样本集有5000万条,接近5个G,那么这样的样本集一次导入训练,我放着一天一夜都没跑出结果,机器性能还特别好,是64位linux有128G内存. 针对这样的情况,我想到的是两种思路: ...

  2. Java机器学习库ML之十模型选择准则AIC和BIC

    学习任务所建立的模型多数是参数估计并采用似然函数作为目标函数,当训练数据足够多时,可以不断提高模型精度,但是以提高模型复杂度为代价的,同时也带来一个机器学习中非常普遍的问题--过拟合.模型选择问题是在 ...

  3. Java机器学习库ML之一Dataset和Instance

    Java机器学习库ML官网:http://java-ml.sourceforge.net/ 对于一个机器学习库来说,最基础就是数据处理能力,ml库给了dataset和instance两个类,datas ...

  4. Java机器学习库ML之四模型训练和预测示例

    基于ML库机器学习的步骤: 1)样本数据导入: 2)样本数据特征抽取和特征值处理(结合模型需要归一化或离散化):这里本文没有做处理,特征选择和特征值处理本身就很大: 3)样本集划分训练集和验证集: 4 ...

  5. Java机器学习库ML之十一线性SVM

    线性SVM的原理就不多说了,最强大的就是libsvm库(ml库也是用这个),参考:http://blog.csdn.net/fjssharpsword/article/details/53883340 ...

  6. Java机器学习库ML之二Feature Selection(特征选择)

    机器学习中训练模型的前提必备工作就是特征选择,起到降维和降低计算开销的目的,当然在获取尽可能小的特征子集的同时,应不显著降低分类精度.不影响类分布.保持特征子集的稳定适应性强等. ML库提供了特征选择 ...

  7. Java机器学习库ML之九交叉验证法(Cross Validation)

    交叉验证(Cross Validation,CV)是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分 ...

  8. Java机器学习库ML之五样本不均衡

    样本不均衡的问题是指训练集中类别之间的样本数据量比例失衡.有研究表明,部分学习任务,在类别出现1∶35比例时就会使某些分类学习方法无效,甚至1∶10比例也会.样本不均衡导致的问题有: 1)少数类所包含 ...

  9. Java机器学习库ML之七分类预测输出概率值

    场景:一般分类预测直接输出类别标记,不过有些情况需要输出对应类别的概率值,比如判定为正例的概率是0.6,而判定为负例的概率是0.3,那自然标记为正例,这里就是看ML用classDistribution ...

最新文章

  1. android - Animation详解
  2. 从VC 6.0移植代码到VS C++ 2005得出的一些经验
  3. 文本分类从入门到精通
  4. Windows和Linux环境下搭建SVN服务器
  5. 零基础学习ruby_学习Ruby:从零到英雄
  6. 快速排序quicksort算法细节优化(一次申请内存/无额外内存排序)
  7. java指令导出data文件_直接用 java 命令行动态生成jpg文件 (转)
  8. Spring Cloud文档阅读笔记-初识Spring Cloud(对Spring Cloud初步了解)
  9. Python 多版本共存问题 2
  10. Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
  11. 20210924 python 技术点
  12. 谈谈对三大框架的理解
  13. NSString+NSMutableString+NSValue+NSAraay用法汇总
  14. 两度转向,做社区团购,生鲜电商留给美团的时间并不多
  15. 基于LSTM-Attention模型的光伏电站发电量预估(1)
  16. matlab 浮雕算法,photoshop图像滤镜——浮雕算法(含matlab代码)
  17. props的动态传值 以及 v-for列表渲染
  18. 助力高校科研信息化升级,让高校更“高效”
  19. Word文件如何进行关键词查询
  20. 笨办法学Python3——习题33(巩固练习)

热门文章

  1. 哪一个不是html5新增的语义化标记元素,东师19春《HTML5开发基础与应用》作业考核【标准答案】...
  2. apache服务器配置证书方法!
  3. 4.7地铁查询开发进度
  4. servlet+javabean+service+dao完成注册登录
  5. grep与正则表达式基础
  6. ListView position
  7. 根据html页面模板动态生成html页面(c#类)
  8. vs 2010 下使用VLD工具
  9. FCC有意支持Sprint与T-Mobile合并?
  10. 华为如何打造智能终端的有趣灵魂?(下)