菜鸟真的需要耗费大量的时间各种试才能解决问题啊。。。~~o(>_<)o ~~
首先介绍一下我尝试的过程,大家可以参考着排排错。
1. 我最初用的是mahout最新的0.13版本,想要按照官方给出的案例(Classifying with random forests)测试并学习一下随机森林的用法,但是发现根本没办法按照这个官方文档去做。虽然官方给出的0.13版本API的文档,但是它的测试用例还是之前的老版本。新版本根本没有没给出mahout-core-..这样的jar包,它的mahout-examples-job-..jar下面也没有BuildForest这个java文件。所以没有办法按照案例在mahout0.13版本上做实验。由于初学mahout,想尽快的做些测试,不想现在就尝试写一个BuildForest.java。所以就想着,换mahout的版本。
Exception in thread "main" java.lang.NoSuchMethodException: org.apache.mahout.classifier.df.mapreduce.Builder.main([Ljava.lang.String;)
at java.lang.Class.getMethod(Class.java:1786)
at org.apache.hadoop.util.RunJar.run(RunJar.java:228)
at org.apache.hadoop.util.RunJar.main(RunJar.java:148)
2.我看网上的一些例子都是基于mahout0.9做的,我就换成了mahout0.9版本,但是在执行随机森林训练的时候,会抛出下面的异常
Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected
at org.apache.mahout.classifier.df.mapreduce.partial.PartialBuilder.processOutput(PartialBuilder.java:113)
at org.apache.mahout.classifier.df.mapreduce.partial.PartialBuilder.parseOutput(PartialBuilder.java:89)
at org.apache.mahout.classifier.df.mapreduce.Builder.build(Builder.java:294)
at org.apache.mahout.classifier.df.mapreduce.BuildForest.buildForest(BuildForest.java:228)
at org.apache.mahout.classifier.df.mapreduce.BuildForest.run(BuildForest.java:188)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
at org.apache.mahout.classifier.df.mapreduce.BuildForest.main(BuildForest.java:252)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:234)
at org.apache.hadoop.util.RunJar.main(RunJar.java:148)
这个异常的原因是因为mahout0.9及以下版本依赖的是hadoop1.X版本,与hadoop2.X版本不兼容。
所以最后我换成了mahout0.10.0版本。
这个案例跟着根据官网Classifying with random forests 来做的。
1. Generate a file descriptor for the dataset 生成一个对数据集的描述文件
hadoop jar mahout-mr-0.13.0-job.jar org.apache.mahout.classifier.df.tools.Describe -p testdata/DataSet10000-100.csv -f testdata/DataSet10000-100.info -d 7 N L
当然,也可以按照官方给的去执行
$HADOOP_HOME/bin/hadoop jar $MAHOUT_HOME/core/target/mahout-core--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
这里解释一下-d后面跟着的东西,其实是特征类型的描述,比如我的7 N 就是表示连续7个都是连续型,C是类别型,最后一个L表示类别标签。
另外,数据集文件最好不要包含第一行的特征标题。
2. Run the example 训练随机森林
hadoop jar mahout-examples-0.10.0-job.jar org.apache.mahout.classifier.df.mapreduce.BuildForest -Dmapred.max.split.size=1874231 -d testdata/DataSet10000-100.csv -ds testdata/DataSet10000-100.info2 -sl 5 -p -t 100 -o nsl-forest
-t 决策树的数目
-p 将数据集拆分到不同的mapper中去,然后训练决策树
-sl 每棵树随机选择5个特征进行训练
-o 随机森林模型输出的路径
-Dmapred,max.split.size 被拆分的每一部分数据集最大的容量
训练成功之后,会在你的输出路径下生成一个forest.seq的文件
3. Using the Decision Forest to Classify newdata 使用生成的模型去检测新的样本
hadoop jar mahout-examples-0.10.0-job.jar org.apache.mahout.classifier.df.mapreduce.TestForest -i testdata/DataSet1000-1000.csv -ds testdata/DataSet10000-100.info2 -m nsl-forest -a -mr -o predictions
-i 测试数据集
-ds 数据集的描述信息
-m 生成的随机森林模型
-a 给出混淆矩阵
-o 分类结果的输出路径
-mr 使用hadoop去实现这个分类过程
执行完毕之后,控制台会打印出相应的结果