源起:
hadoop-imbalanced-preprocessing是基于MapReduce实现的随机过采样,随机欠采样和SMOTE算法的程序,它主要解决在大数据环境下类别不平衡问题的数据预处理的问题。该项目直接集成在Mahout项目的代码里面。如果对hadoop 的MapReduce框架和Mahout了解很少的话,会对这个代码很难入手,不知道如何运行它。
解决方案:
我一开始没有去了解Mahout方法,就直接去运行这个程序,结果遇到了很多问题。
首先,在UndersamplingMapper.java有一行代码是这样的,
dataset = UndersamplingBuilder.loadDataset(conf);
我想当然的把Dataset理解为了整个数据集,其实它是Mahout自己的方法生成的对数据集的一个JSON格式的描述。要得到这个描述,可以使用命令行的方式运行下面的指令,可参考
Classifying with random forests
$HADOOP_HOME/bin/hadoop jar $MAHOUT_HOME/core/target/mahout-core-<VERSION>-job.jar org.apache.mahout.classifier.df.tools.Describe -p testdata/KDDTrain+.arff -f testdata/KDDTrain+.info -d N 3 C 2 N C 4 N C 8 N 2 C 19 N L
有了dataset的描述信息以后,就可以去执行程序了。
首先,准备好数据集iris.info 是我上一步生成的Dataset的描述文件,iris2.csv是去除了第一行标题的数据集文件。
第二步,在org.apache.mahout.classifier.df.mapreduce包下,建立一个新的Java文件
以过采样方法为例,在新建的Java文件中输入以下代码:
package org.apache.mahout.classifier.df.mapreduce;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.log4j.BasicConfigurator;
import org.apache.mahout.classifier.df.mapreduce.UndersamplingBuilder;
import org.apache.mahout.classifier.df.mapreduce.resampling.UndersamplingMapper;
import org.apache.mahout.classifier.df.mapreduce.resampling.UndersamplingReducer;
public class App {
public static void main(String[] args) throws Exception {
BasicConfigurator.configure();
Path dataPreprocessingPath = new Path(
"hdfs://192.168.217.128:9000/user/pangying/testdata/DataSet10010with.csv");
Path datasetPath = new Path(
"hdfs://192.168.217.128:9000/user/pangying/testdata/DataSet10010.info");
Path dataPath = new Path(
"hdfs://192.168.217.128:9000/user/root/output/smote/traffic");
Configuration conf = new Configuration();
conf.set("fs.dafaultFS", "hdfs://192.168.217.128:9000");
conf.set("yarn.resourcemanager.hostname", "192.168.217.128");
conf.addResource(new Path("core-site.xml"));
int npos = 10;
int nneg = 100;
String posclass = "malicious";
String negclass = "benign";
OversamplingBuilder ub = new OversamplingBuilder(dataPreprocessingPath,
dataPath, datasetPath, conf, npos, nneg, negclass);
ub.build();
}
}
根据自己的具体情况,更改相关的参数就可以了。