根据给定概率随机按行分割文件

来源:互联网 发布:松下剃须刀哪款好 知乎 编辑:程序博客网 时间:2024/06/07 04:44

最近处理决策树输入数据的时候遇到一个问题:如果输入文件为一个文件,如何分为训练样本和测试样本呢?而且一般是训练数据多于测试数据。下面就说下我的实现思路:

假如以7:3的概率分割输入文件,那么可以使用一个随机数。随机产生一个0~9的随机数,判断此数是否小于7(此处数值可以根据训练数据和测试数据的比值进行设置),若小于则应该把此行输入数据归为训练数据,否则归为测试数据;

下面是java实现代码:

package org.fansy.filesplit.random;import java.io.*;import java.util.*;public class SplitFile {/** * 随机把一个文件以行为单位按照一定概率分为两个 * 主要是为了一个做训练样本,一个做测试样本; * @param args * @throws IOException  */public static void main(String[] args) throws IOException {String sourceStr="/home/fansy/data/forest/car.txt";String des1Str="/home/fansy/data/forest/car_train.txt";String des2Str="/home/fansy/data/forest/car_test.txt";File source =new File(sourceStr);File des1=new File(des1Str);File des2=new File(des2Str);if(!source.exists()){System.out.println("source file does not exist");return ;}exist(des1);exist(des2);FileWriter des1W=new FileWriter(des1,true);FileWriter des2W=new FileWriter(des2,true);// read source file and split it into two filesFileReader fileReader =new FileReader(source);BufferedReader bf=new BufferedReader(fileReader);String line=null;Random r=new Random();int temp=0;while((line=bf.readLine())!=null){ temp=Math.abs(r.nextInt())%10; if(temp<7){  //  '7' can be changed in order to set the probability of train data and test data des1W.append(line+"\n"); }else{ des2W.append(line+"\n"); }}bf.close();fileReader.close();des1W.close();des2W.close();System.out.println("split file done ...");}private static void exist(File f){if(f.exists()){f.delete();boolean flag=false;try {flag = f.createNewFile();} catch (IOException e) {e.printStackTrace();}System.out.println("create file:"+f.getName()+" :"+flag);}}}

分享,快乐,成长


转载请注明出处:http://blog.csdn.net/fansy1990 

原创粉丝点击