您的位置:首页 > 其它

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

2013-01-23 17:57 232 查看
最近处理决策树输入数据的时候遇到一个问题:如果输入文件为一个文件,如何分为训练样本和测试样本呢?而且一般是训练数据多于测试数据。下面就说下我的实现思路:
假如以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 files
		FileReader 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐