天天看点

mahout如何使用随机森林测试数据集

      最近在研究机器学习经典的分类算法随机森林,需要用随机森林算法来测试一个小的数据集。开源项目mahout实现了大多数经典的机器学习算法,里面也提供了很多处理数据,提取特征,训练算法模型的类和方法,但是貌似国内用这个开源项目的人并不多,因为网上关于具体如何使用mahout算法的资料廖若晨星,而mahout实战中也没有关于随机森林的使用例子,这部分信息只能从mahout官网中搜集到,而mahout官网中对随机森林的使用也并没有描述的很详细,于是博主在研究如何使用mahout随机森林时废了很大心力,最后发现,官网给出的mahout使用例子是用linux命令行直接运行jar包的方式来完成随机树的建模和测试的。

     mahout随机树测试分为三个步骤:1.对数据生成对应的描述信息文件(这个生成的描述信息文件需要作为随机森林建模时的一个输入文件)。2.根据训练集及第一步生成的描述信息文件训练一个随机森林。3.用训练好的随机森林来测试数据。

     第一步:对数据生成对应的描述信息文件,这个类位于mahout-examples-版本号-job.jar(注意一定要有job后缀,mahout下面还有一个mahout-examples-版本号.jar包,但是这个包里面的类并不全)的org.apache.mahout.classifier.df.tools.Describe,这个类里面有个主方法,因此可以在命令行直接运行这个类。你可以在hadoop环境下直接运行这个类对数据生成相应的描述文件,如下命令行:

$hadoop  jar  /usr/local/mahout-0.8/mahout-examples-0.8-job.jar(你的mahout-examples-版本号-job.jar这个包所在的路径)  org.apache.mahout.classifier.df.tools.Describe  -p  /testdata/datatrain.csv(需要处理的目标数据,这里是在hdfs文件系统中的路径)  -f  /testdata/datatrain.info(生成的描述信息文件的存放路径,描述信息后缀为info)  -d  20 N L(需要处理的目标数据的格式)

     这里我来好好说一下这个-d后面的数据格式如何设置,其实这个非常简单,我们知道数据属性无非就两种,一种是数值型,还有一种是类别型。数值型就是纯代数值,比如工资收入,商品价格,商品数量等等,这些属性值在分类的时候只能定义区间去分类,这些就属于数值型属性。还有一类是种类型属性,这种类型的数据更像是枚举类型,因为它的所有情况都可以一一列举出来,比如对一个商品的评价good,bad,not bad,对是否具有某个特征的属性yes,no等等,一般是通过单词字符的形式来描述的,但是也有通过数字的形式来表示的,比如0,1,0表示no,1表示yes,虽然看起来好像是数字,但其实它们不是数值型,而是种类型,所以我们在分析数据时一定要搞清楚这些数据的类型到底是数值型还是种类型。

     数值型属性我们用N表示(Numerical),种类型我们用C表示(Categories),如有一组数据为:

name  age  income  adress  commodity_number  telephone_fare  is_pass

 tom     22     23.3   NewYork              320                        24.3              1

 jack     34     34.5    Miami                1400                       45.8              0

     如果是这组数据,那么-d后面应该写成C  2  N  C  2  N  L,从左往右依次写过来,如果有连续n个C类型的话,就可以写成n  C,如果有连续m个N类型的话,就可以写成m  N,L是label的缩写即标签属性。

     经过上面的第一步处理后,我们就得到了一个对应于训练数据集datatrain.csv对应的datatrain.info描述信息文件,然后我们进入第二部随机森林建模过程。这个过程有点扯,我当时弄了好久都没成功,最后发现是因为mahout的版本问题。建模过程需要用到的类是mahout-examples-版本号-job.jar中的org.apache.mahout.classifier.df.mapreduce.BuildForest,但是这个类貌似只有在mahout版本小于等于0.8的时候才有主方法,也就是只有在mahout版本小于0.8的时候才能直接在命令行里面运行。也许mahout后面为了提高框架的可扩展性,把命令行使用的方法逐渐拿掉了,转为提供更多丰富的接口,类,方法,这样可以直接在java程序中调用,更加的灵活。但介于博主找了好久也没找到相关的api帮助文档,于是就放弃了自己撸代码去调用随机森林方法这条路。我改用了mahout-examples-0.8-job.jar这个版本的随机森林建模方法,顺便还提一句,mahout-0.8这个版本比较老,貌似是不支持hadoop-2.x的,所以你只能用hadoop-1.x运行。看命令行代码调用:

$hadoop  jar  /usr/local/mahout-0.8/mahout-examples-0.8-job.jar(你的mahout-examples-版本号-job.jar这个包所在的路径)  org.apache.mahout.classifier.df.mapreduce.BuildForest  -D  mapreduce.job.queuename=root.default(设置队列,我也不知道为啥,总之不设置我这边的环境就出错)  -Dmapred.max.split.size=1074231(这个参数应该是设置最大的map数)  -d  /testdata/datatrain.csv(需要处理的目标数据,这里是在hdfs文件系统中的路径)  -ds  /testdata/datatrain.info(第一步生成的info文件路径)  -t  100(随机森林树的个数)  -sl  6(随机因子,即每个节点分裂时随机选择多少个分裂节点数)  -o  /testdata/dataforest(存放训练后的随机森林模型文件的目录)

     还有一些参数,可以直接运行$hadoop  jar  /usr/local/mahout-0.8/mahout-examples-0.8-job.jar(你的mahout-examples-版本号-job.jar这个包所在的路径)  org.apache.mahout.classifier.df.mapreduce.BuildForest 来查看。

     最后一步,测试数据,测试的数据也必须先像第一步那样Describe一下生产info描述文件。

$hadoop  jar  /usr/local/mahout-0.8/mahout-examples-0.8-job.jar(你的mahout-examples-版本号-job.jar这个包所在的路径)  org.apache.mahout.classifier.df.mapreduce.TestForest  -i  /testdata/datatest.csv(测试集的数据hdfs的存放路径)  -ds  /testdata/datatest.info(测试集经过第一步生成的info文件)  -m  /testdata/dataforest/file.seq(具体到第二步生成的那个随机森林的模型文件那,这里我忘了是个啥文件了,反正第二步会在目录/testdata/dataforest/下生成一个模型文件)  -mr  -a(运行后在命令行界面可以看到分析结果,包括准确率等信息,不加就看不到)   -o  /testdata/datatest_result(测试结果信息文件,测试结果的输出)

     好了,上面就是mahout随机森林算法使用整个过程,最后还有一点问题,就是数据集中千万不要出现空格,出现空格的数据,随机森林会把空格也当成分隔符,最后导致出错。如1,more than 1,less than 20, very good这样的数据是会识别出错的,要改为1,more_than_1,less_than_20,very_good才能正确识别。

    个人的一点小总结,因为确实发现国内关于这一块的资料太少了,自己使用的时候费了很大精力,版本问题,环境问题和数据格式问题都碰到过了,所以,为了避免其他程序猿和攻城狮朋友们又走我走过的歧路,费心费时,所以我就在前面把杂草啥的都除掉了,让你们走上舒服平坦的大路。

继续阅读