源起:
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();
}
}
根據自己的具體情況,更改相關的參數就可以了。