当前位置:编程学习 > 网站相关 >>

mahout决策树之Partial Implementation源码分析 part1

昨天决策树Partial Implementation实战演示了三个部分:1、Describe ;2、BuildTree;3、ClassfyData;
 
今天主要分析下Describe的源码,看下这个类做了什么事情。
 
打开Describe的源码可以看到这个类主要可以分为三个部分,如下:
 
(1)生成描述:
 
String descriptor = DescriptorUtils.generateDescriptor(description);
(2)生成dataset:
Dataset dataset = generateDataset(descriptor, dataPath, regression);
(3)存储dataset:
DFUtils.storeWritable(new Configuration(), fPath, dataset);
下面分别介绍:
第(1)步是把-d参数转换的,比如输入为:3 N I N N 2 C L 5 I,转换为N N N I N N C C L I I I I I;
 
第(2)步,生成dataset,首先先介绍下dataset:
 
Dataset有五个参数:atrribute,values, nbInstance,ignored,labelId;
 
(a) attribute主要存储的是把-d参数转换后的值,比如-d N 3 C 2 N C 4 N C 8 N 2 C 19 N L N,转换后为: NUMERICAL,CATEGORICAL,CATEGORICAL,CATEGORICAL,NUMERICAL,NUMERICAL,CATEGORICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,CATEGORICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,CATEGORICAL,CATEGORICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,NUMERICAL,CATEGORICAL,NUMERICAL;
 
(b) values主要存储的是Categorical的值,比如kdd的数据其中的values如下:
 
icmp,udp,tcp,
vmnet,shell,smtp,ntp_u,kshell,aol,imap4,urh_i,netbios_ssn,tftp_u,uucp,mtp,nnsp,echo,tim_i,ssh,iso_tsap,time,netbios_ns,systat,login,hostnames,efs,supdup,http_8001,courier,ctf,finger,nntp,ftp_data,red_i,ldap,http,pm_dump,ftp,exec,klogin,auth,netbios_dgm,other,link,X11,discard,private,remote_job,IRC,pop_3,daytime,pop_2,gopher,sunrpc,rje,name,domain,uucp_path,http_2784,Z39_50,domain_u,csnet_ns,eco_i,whois,bgp,sql_net,printer,telnet,ecr_i,urp_i,netstat,http_443,harvest,
S3,RSTR,SF,RSTO,SH,OTH,S2,RSTOS0,S1,REJ,S0,
1,0,
1,0,
1,0,
1,0,
phf,buffer_overflow,teardrop,guess_passwd,loadmodule,multihop,smurf,spy,normal,land,portsweep,back,warezclient,ftp_write,nmap,satan,rootkit,perl,imap,neptune,warezmaster,ipsweep,pod,
 
可以看出最后一行为Label的取值范围;
 
(c) nbInstance表示的是原始数据的样本数;
 
(d) ignored存储的是被忽略的属性,比如glass.data 被忽略的属性的id为0,(一般如果第一列属性是样本的id,则一般都被忽略)
 
(e) labeld存储的是Label所在的列,比如kdd的数据labelId为41;
 
第(3)步是把上面生成的dataset存入文件中,可以在类Dataset中查看write方法,如下:
 
    out.writeInt(attributes.length); // nb attributes
    for (Attribute attr : attributes) {
      WritableUtils.writeString(out, attr.name());
    }
for(int ig:ignored){
System.out.print(ig+",");
}
    DFUtils.writeArray(out, ignored);
 
    // only CATEGORICAL attributes have values
    System.out.println("values:");
    for (String[] vals : values) {
      if (vals != null) {
        WritableUtils.writeStringArray(out, vals);
      }
    }
    out.writeInt(labelId);
    out.writeInt(nbInstances);
上面的代码中的每个out.writeXxx(),就是把相关信息保存在文件中;
 
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,