ここの話を試す.まず,テストデータをダウンロードする.
$ wget http://nsl.cs.unb.ca/NSL-KDD/KDDTrain+.arff $ wget http://nsl.cs.unb.ca/NSL-KDD/KDDTest+.arff
ダウンロードしたら,それらのファイルで@で始まる行を削除する.そしたら,それらのファイルをhdfsに上げる.
$ hadoop fs -mkdir mahout $ hadoop fs -mkdir mahout/nslkdd $ hadoop fs -put KDDTrain+.arff mahout/nslkdd $ hadoop fs -put KDDTest+.arff mahout/nslkdd
次に説明ファイルを作る.
$ hadoop jar $MAHOUT_HOME/core/target/mahout-core-0.5-SNAPSHOT-job.jar org.apache.mahout.df.tools.Describe -p mahout/nslkdd/KDDTrain+.arff -f mahout/nslkdd/KDDTrain+.info -d N 3 C 2 N C 4 N C 8 N 2 C 19 N L
できたら,モデルを作るために以下を実行.
$ hadoop jar $MAHOUT_HOME/examples/target/mahout-examples-0.5-SNAPSHOT-job.jar org.apache.mahout.df.mapreduce.BuildForest -Dmapred.max.split.size=1874231 -oob -d mahout/nslkdd/KDDTrain+.arff -ds mahout/nslkdd/KDDTrain+.info -sl 5 -p -t 100 -o nsl-forest
モデルができたら,テスト例でテストを流す.
$ hadoop jar $MAHOUT_HOME/examples/target/mahout-examples-0.5-SNAPSHOT-job.jar org.apache.mahout.df.mapreduce.TestForest -i mahout/nslkdd/KDDTest+.arff -ds mahout/nslkdd/KDDTrain+.info -m nsl-forest -a -mr -o predictions
という感じで,一通り完了.
がしかし,今日時点のtrunkはバグっていました….数日待てば修正されそうな気もするけど,とりあえず,試したかったので,以下の修正で回避しました.
Index: core/src/main/java/org/apache/mahout/df/mapreduce/Classifier.java =================================================================== --- core/src/main/java/org/apache/mahout/df/mapreduce/Classifier.java (リビジョン 1090534) +++ core/src/main/java/org/apache/mahout/df/mapreduce/Classifier.java (作業コピー) @@ -158,6 +158,8 @@ // read all the output for (Path path : outfiles) { +log.info("path = {}", path.toString()); +if(path.getName().startsWith("part-m-")){ FSDataOutputStream ofile = null; try { for (Pair<LongWritable,Text> record : new SequenceFileIterable<LongWritable,Text>(path, true, conf)) { @@ -179,7 +181,7 @@ } } finally { ofile.close(); - } + }} } } Index: core/src/main/java/org/apache/mahout/df/mapreduce/partial/PartialBuilder.java =================================================================== --- core/src/main/java/org/apache/mahout/df/mapreduce/partial/PartialBuilder.java (リビジョン 1090534) +++ core/src/main/java/org/apache/mahout/df/mapreduce/partial/PartialBuilder.java (作業コピー) @@ -170,6 +170,7 @@ // read all the outputs int index = 0; for (Path path : outfiles) { +if(path.getName().startsWith("part-m-")){ for (Pair<TreeID,MapredOutput> record : new SequenceFileIterable<TreeID, MapredOutput>(path, conf)) { TreeID key = record.getFirst(); MapredOutput value = record.getSecond(); @@ -181,7 +182,7 @@ } processOutput(firstIds, key, value, callback); index++; - } + }} } // make sure we got all the keys/values Index: core/src/main/java/org/apache/mahout/df/mapreduce/partial/Step0Job.java =================================================================== --- core/src/main/java/org/apache/mahout/df/mapreduce/partial/Step0Job.java (リビジョン 1090534) +++ core/src/main/java/org/apache/mahout/df/mapreduce/partial/Step0Job.java (作業コピー) @@ -139,10 +139,12 @@ // read all the outputs for (Path path : outfiles) { +log.info("path = {}", path.toString()); +if(path.getName().startsWith("part-m-")){ for (Pair<IntWritable,Step0Output> record : new SequenceFileIterable<IntWritable,Step0Output>(path, conf)) { keys.add(record.getFirst().get()); values.add(record.getSecond()); - } + }} } return processOutput(keys, values);
という感じで,Random Forestsを試してみたものの,今やりたいことがこのままでは適用できない感じだから,このRandom Forestsを手直しするか,自前でCARTを実装するか,迷い中….どうしようかな.