数据挖掘算法学习(五)C4.5算法

转载请附上链接http://blog.csdn.net/iemyxie/article/details/39519767

C4.5分类决策树算法,其核心算法是ID3算法。目前应用在临床决策、生产制造、文档分析、生物信息学、空间数据建模等领域。算法的输入是带类标的数据,输出是树形的决策规则。

C4.5ID3改进:

1)用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;
2)在树构造过程中进行剪枝;
3)能够完成对连续属性的离散化处理;
4)能够对不完整数据进行处理。

C4.5算法优点:产生的分类规则易于理解,准确率较高

C4.5算法缺点:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。

算法过程:

C4.5( DataSet , featureList )
创建根节点 R
如果当前 DataSet 中的数据都属于同一类,则标 R 的类别为该
果当 featureList 合为空,则标记 R 的类别为当前 DataSet 中样本最多的类别
归情况:
featureList 中选择属性 F (选择 GainRatio ( DataSet , F) 最大的属性,连续属性参见上面的离散化过程)
F 的每一个值 v ,将 DataSet 划分为不同的子集 DS ,对于每一个 DS
创建节点 C
如果 DS 为空,节点 C 标记为 DataSet 中样本最多的类别
如果 DS 不为空,节点 C=C4.5(DS , featureList - F)
将节点 C 添加为 R 的子节点

利用weka将weather数据用c4.5分类构建的决策树如下图:


用SQL算法实现c4.5算法的核心代码:

drop procedure if exists buildtree;
DELIMITER |
create procedure buildtree()
begin
declare le int default 1;
declare letemp int default 1;
declare current_num int default 1;
declare current_class varchar(20);
declare current_gain double;
declare current_table varchar(20) default 'weather';
update infoset set state=1,statetemp=1;
rr:while (1=1) do
	set @weather = (select play from weather where class is null limit 0,1);
	set @feature =(select x from infoset where statetemp=1 limit 0,1);
	if (@weather is null ) then
		leave rr;
	else if(@feature is null) then
		update infoset set statetemp = state; 
	end if;
	end if;
	if (@weather is not null) then
		b:begin
			set current_gain = (select max(info_Gain) from infoset where statetemp=1);
			set current_class = (select x from infoset where info_Gain = current_gain);
			drop table if exists aa;
			set @a=concat('create temporary table aa select distinct ',current_class,' as namee from weather where class is null');
			prepare stmt1 from @a;
			execute stmt1;
			tt:while (1=1) do
				set @x = (select namee from aa limit 0,1);
				if (@x is not null) then
					a0:begin
						drop table if exists bb;
						set @b=concat('create temporary table bb select * from ', current_table,' where ',current_class,' = ? and class is null');
						prepare stmt2 from @b;
						execute stmt2 using @x;
						set @count = (select count(distinct play) from bb);
						if (@count =1) then
							a1:begin
								update weather set class = current_num,levelnum = letemp where id in (select id from bb); 
								set current_num = current_num+1;
								if (current_table ='cc') then
									delete from cc where id in (select id from bb);
								end if;
								set @f=(select play from cc limit 0,1);
								if (@f is null) then
									set current_table='weather';
									update infoset set statetemp=state; 
									set letemp =le;
								end if;
							delete from aa where namee = @x;
							end a1;
							end if;
						if (@count>1) then
								drop table if exists cc;
								create temporary table cc select * from bb;
								set current_table = 'cc';
								set letemp = letemp+1;
								leave tt;
							end if;
						if(@count=0) then
								delete from aa where namee = @x;
								set le = le+1;
							end if;
				end a0;
				else 
					update infoset set state=0 where x=current_class;
					leave tt;
				end if;
			end while;	
			update infoset set statetemp=0 where x=current_class; 
	 end b;
end if;
end while;
end |
delimiter ;

运行后分类结果如下图所示:



 

其中,class属性记录分类结果,levelnum属性记录各个数据在决策树中的层数。


对程序中各个表的解释:

1 weather 增加 levelnum 属性列,用于存放每条记录在生成的分类树中的层数。
2 C45_temp 用于存放中间结果。其中属性列 logv parent ,分别用于存储各属性分量的中间计算结果和所属类别。
3 infoset 用于存放各个属性的信息增益率。属性列 state statetemp用于在计算过程中做标记。


转载请附上链接http://blog.csdn.net/iemyxie/article/details/39519767


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值