决策树ID3算法
决策树之ID3算法
决策树之ID3算法⼀、决策树之ID3算法简述 1976年-1986年,J.R.Quinlan给出ID3算法原型并进⾏了总结,确定了决策树学习的理论。
这可以看做是决策树算法的起点。
1993,Quinlan将ID3算法改进成C4.5算法,称为机器学习的⼗⼤算法之⼀。
ID3算法的另⼀个分⽀是CART(Classification adn Regression Tree, 分类回归决策树),⽤于预测。
这样,决策树理论完全覆盖了机器学习中的分类和回归两个领域。
本⽂只做了ID3算法的回顾,所选数据的字段全部是有序多分类的分类变量。
C4.5和CART有时间另花篇幅进⾏学习总结。
本⽂需要有⼀定的pandas基础、了解递归函数。
1、ID3算法研究的核⼼思想是if-then,本质上是对数据进⾏分组操作。
下表是包含⽤户信息和购买决策的表。
这张表已经对1024个样本进⾏了分组统计。
依此为例解释if-then(决策)和数据分组。
对于第0条和第7条数据,唯⼀的区别是income不同,于是可以认为,此时income不具有参考价值,⽽应考察student值或reputation的信息。
于是:if-then定义了⼀套规则,⽤于确定各个分类字段包含的信息计算⽅法,以及确定优先按照哪个字段进⾏分类决策。
假如根据if-then,确定优先按照age对数据集进⾏拆分,那么可以确定三个⽔平(青年、中年、⽼年)对应的⼦数据集。
然后,继续对着三个⼦数据集分别再按照剩余的字段进⾏拆分。
如此循环直到除了购买决策之外的所有字段都被遍历。
你会发现,对于每个拆分的⼦数据集,根本不需要关注⾥⾯的值是汉字、字符串或数字,只需要关注有⼏个类别即可。
根据if-then的分类结果,对于⼀个样本,可以根据其各个字段的值和if-then规则来确定它最终属于下表哪个组。
决策树强调分组字段具有顺序性,认为字段层级关系是层层递进的;⽽我们直接看这张表时,所有字段都是并排展开的,存在于同⼀层级。
决策树ID3分类算法
决策树ID3分类算法一、ID3算法介绍决策树学习是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一颗决策树。
ID3算法的思想就是自顶向下构造决策树,它使用统计测试来确定每一个实例属性单独分类训练样例的能力,继而判断哪个属性是最佳的分类属性,直到建立一棵完整的决策树。
利用这棵决策树,我们可以对新的测试数据进行分类。
二、算法的实现算法实现了对于给定的数据信息, 基于信息增益构造决策树,最后给出决策树和对训练数据集的分类准确率。
程序给定的测试样本如下:实例序号颜色体形毛型类别1黑大卷毛危险2棕大光滑危险3棕中卷毛不危险4黑小卷毛不危险5棕中光滑危险6黑大光滑危险7棕小卷毛危险8棕小光滑不危险9棕大卷毛危险10黑中卷毛不危险11黑中光滑不危险12黑小光滑不危险先对上述数据进行预处理:保存为“data1.txt”再运行程序,读入数据,输出分析过程和决策规则:中间还有一些过程,为了节约资源,不复制过来了,下面是决策规则:根据该规则,树形图如下:三、程序代码及其部分注释其中最核心的部分:void Generate_decision_tree(Tree_Node * & root,vector<int> Samples, vector<int> attribute_list,int class_id)该函数由给定的训练数据产生一棵判定树。
完整代码:#include <stdio.h>#include <iostream>#include <vector>#include <math.h>#include <string.h>using namespace std;typedef struct tnode{char tdata[100];}tnode;typedef struct Tree_Node{char name[100];bool isLeaf; //标记是否叶子节点vector<tnode> att_list;//属性名称列表vector<Tree_Node * > child_list;}Tree_Node,* pTreeNpde;typedef struct dnode{vector<tnode>row;}dnode;typedef struct D_Node{vector<dnode>DB;vector<tnode> attr_name;tnode class_name;}D_Node;D_Node G_DB;pTreeNpde Root = NULL;typedef struct FreeQNode{char name[100];int count;vector<int> Set_ID;}FreeQNode;typedef struct FreeQNodeDouble{char name[100];int count;vector<int> row_id;vector<FreeQNode> classes;//存放分类属性列表及相应的出现次数}FreeQNodeDouble;typedef struct attr_node{int attr_id;vector<tnode> attr_name;vector<int> count_list;}attr_node;vector<attr_node> G_Attr_List;typedef struct binNode{char name[100];int count;vector<int> Set_ID;struct binNode * lchild;struct binNode * rchild;}binNode;typedef struct binNodeDouble{char name[100];int count;vector<int> row_id;struct binNodeDouble * lchild;struct binNodeDouble * rchild;vector<FreeQNode> classes;}binNodeDouble;void insert_tree(binNode * & r, char str[100]){if (NULL == r){binNode * node = new binNode;strcpy(node->name,str);node->count = 1;//printf("[%s,%d]\n",node->name,node->count);node->lchild = node->rchild = NULL;r = node;}else{if (strcmp(r->name,str) == 0){r->count ++;}else if (strcmp(r->name,str) < 0){insert_tree(r->lchild,str);}else{insert_tree(r->rchild,str);}}}void delete_bin_tree(binNode *& r){if (r != NULL){delete_bin_tree(r->lchild);delete_bin_tree(r->rchild);delete(r);r = NULL;}}void Bin_tree_inorder(binNode * r,vector<FreeQNode> & Fq) {if (r != NULL){Bin_tree_inorder(r->lchild,Fq);FreeQNode ft;//printf("%s,%d\n",r->name,r->count);strcpy(,r->name);ft.count = r->count;for (int i= 0;i < r->Set_ID.size();i++){ft.Set_ID.push_back(r->Set_ID[i]); //保存子集对应的ID号}Fq.push_back(ft); //此处少了这条语句,造成结果无法返回Bin_tree_inorder(r->rchild,Fq);}}void Get_attr(binNode * r,attr_node & attr){if (r != NULL){Get_attr(r->lchild,attr);tnode t;strcpy(t.tdata,r->name);//printf("%s,%d\n",r->name,r->count);attr.attr_name.push_back(t);attr.count_list.push_back(r->count);//保存出现次数Get_attr(r->rchild,attr);}}void insert_tree_double(binNodeDouble *& r, int DB_ID,char attr_name[100],char class_name[100]){if (NULL == r){binNodeDouble * node = new binNodeDouble;strcpy(node->name,attr_name);node->count = 1;node->row_id.push_back(DB_ID);node->lchild = node->rchild = NULL;FreeQNode fq;strcpy(,class_name);fq.count = 1;fq.Set_ID.push_back(DB_ID); //保存子集所对应的ID号node->classes.push_back(fq);r= node;}else{if (strcmp(r->name,attr_name) == 0){r->count ++;r->row_id.push_back(DB_ID);//这里也需要保存相应的ID号bool found = false;for (int i = 0; i< r->classes.size();i++){if (strcmp(r->classes[i].name,class_name) == 0){r->classes[i].count ++;r->classes[i].Set_ID.push_back(DB_ID);//保存子集对应的ID号found = true; //发现相同的变量名,计数器增1,break; //并退出循环}}if (!found){FreeQNode fq;strcpy(,class_name);fq.count = 1;fq.Set_ID.push_back(DB_ID);//保存子集所对应的ID号r->classes.push_back(fq);}}else if (strcmp(r->name,attr_name) < 0){insert_tree_double(r->lchild,DB_ID,attr_name,class_name);}else{insert_tree_double(r->rchild,DB_ID,attr_name,class_name);}}void delete_bin_tree_double(binNodeDouble *& r){if (r != NULL){delete_bin_tree_double(r->lchild);delete_bin_tree_double(r->rchild);delete(r);r = NULL;}}void Bin_tree_inorder_double(binNodeDouble *& r,vector<FreeQNodeDouble> &Fq){if (r != NULL){Bin_tree_inorder_double(r->lchild,Fq);FreeQNodeDouble ft;strcpy(,r->name); //保存候属性的名称ft.count = r->count;for (int k = 0;k< r->row_id.size();k++){ft.row_id.push_back(r->row_id[k]);}//printf("doubleTree. %s,%d\n",r->name,r->count);for (int i = 0;i< r->classes.size();i++){FreeQNode fq;strcpy(,r->classes[i].name);fq.count = r->classes[i].count;for (int j = 0;j < r->classes[i].Set_ID.size();j++){fq.Set_ID.push_back( r->classes[i].Set_ID[j]); //保存子集对应的ID号}ft.classes.push_back(fq);}Fq.push_back(ft);ft.classes.erase(ft.classes.begin(),ft.classes.end());//使用完,必须清空Bin_tree_inorder_double(r->rchild,Fq);}}void getFqI(vector<int> S,int class_id,vector<FreeQNode> & Fq){binNode * root = NULL;for (int i = 0;i< S.size();i++){insert_tree(root,G_DB.DB[S[i]].row[class_id].tdata);}Bin_tree_inorder(root,Fq);delete_bin_tree(root);}void getFqIA(vector<int> S,int attr_id,int class_id,vector<FreeQNodeDouble> & Fq){binNodeDouble * root = NULL;for (int i = 0;i< S.size();i++){insert_tree_double(root,S[i],G_DB.DB[S[i]].row[attr_id].tdata,G_DB.DB[S[i]].row[class_id] .tdata);}Bin_tree_inorder_double(root,Fq);delete_bin_tree_double(root);}void readdata(char *filename){char str[1000];FILE * fp;fp = fopen(filename,"r");fgets(str,1000,fp);int len = strlen(str);int attr_no = 0; //属性个数int row_num = 0;if (str != NULL){row_num = 1;}for (int i = 0;i< len;i++){if (str[i] == '\t'){attr_no ++;}}attr_no ++;//最后一个是回车,整个属性值+1printf("%d\n",attr_no);while(fgets(str,1000,fp) != NULL){row_num ++; //统计行数}fclose(fp);fopen(filename,"r");tnode t;for (i = 0;i<attr_no;i++){fscanf(fp,"%s",t.tdata);G_DB.attr_name.push_back(t);printf("%s\n",t.tdata);}strcpy(G_DB.class_name.tdata,G_DB.attr_name[attr_no-1].tdata); for (int j = 1;j< row_num;j++){dnode dt;tnode temp;for (int i = 0;i<attr_no;i++){fscanf(fp,"%s",temp.tdata);dt.row.push_back(temp);}G_DB.DB.push_back(dt);dt.row.erase(dt.row.begin(),dt.row.end());}printf("%d\n",G_DB.DB.size());for (i = 0;i< G_DB.DB.size();i++){for (int j = 0;j< G_DB.DB[i].row.size();j++){printf("%s\t",G_DB.DB[i].row[j].tdata);}printf("\n");}}double Fnc_I(vector<int> S,int class_id){//给定一个子集,计算其按照class_id所对应的分类属性进行分类时的期望I// printf("called Fnc_I(%d)\n ",class_id);vector<FreeQNode> Fq;getFqI(S,class_id,Fq); //调用getFqI获取按照Class_id为分类标准的分类结果,当Fq中为一条数据时,则子集S都属于一个分类//否则,从中找到出现此时最大的,作为返回结果// printf("begin to compute I \n");double total = 0;for (int i = 0;i< Fq.size();i++){total += Fq[i].count;// printf("%s,%d\n",Fq[i].name,Fq[i].count);}double result = 0;if (0 == total){return 0;}for (i = 0;i< Fq.size();i++){double p = Fq[i].count/total;result += -1*(p * log(p)/log(2));}// printf("FNC_I return\n\n");return result;}double Fnc_IA(vector<int> S,int attr_id,int class_id,vector<FreeQNodeDouble> & Fq) {//给定一个子集,计算其按照class_id所对应的分类属性进行分类时的期望I getFqIA(S,attr_id,class_id,Fq);double total = 0;for (int i = 0;i< Fq.size();i++){total += Fq[i].count;}double result = 0;if (0 == total){return 0;}bool pr= false;for (i = 0;i< Fq.size();i++){double stotal = Fq[i].count;double sresult = 0;if (pr) printf("[%s,%d]\n",Fq[i].name,Fq[i].count);for (int j = 0;j < Fq[i].classes.size();j++){if (pr) printf("%s,%d\n",Fq[i].classes[j].name,Fq[i].classes[j].count);for (int k = 0;k < Fq[i].classes[j].count;k++){// printf("%d\t",Fq[i].classes[j].Set_ID[k]+1);}//printf("\n");double sp = Fq[i].classes[j].count/stotal; //计算子集的频率sresult += -1*(sp*log(sp)/log(2));}result += (stotal/total) * sresult;}if (pr) printf("\n");return result;}int SelectBestAttribute(vector<int> Samples,vector<int> attribute_list,int class_id) {//输入训练数据集Samples,候选属性列表attribute_list//分类属性标记class_id//返回best_attributedouble fi = Fnc_I(Samples,5);// printf("%lf\n",fi);double IA = 999999999;int best_attrib = -1;for (int i = 0;i < attribute_list.size();i++){vector<FreeQNodeDouble> fqd;double tfa = Fnc_IA(Samples,attribute_list[i],class_id,fqd);// printf("%d, FIA = %lf\n",i,tfa);if (IA > tfa){IA = tfa;best_attrib = i;}}//printf("%lf\n",IA);printf("gain(%d) = %lf - %lf = %lf\n",best_attrib,fi,IA,fi - IA);return attribute_list[best_attrib];}void fnc_getattr(vector<int> Samples,int att_id,attr_node &at){binNode * root = NULL;for (int i = 0;i< Samples.size();i++){insert_tree(root,G_DB.DB[Samples[i]].row[att_id].tdata);}Get_attr(root,at);delete_bin_tree(root);}void get_class_num_and_name(vector<int> Samples,int class_id,int & class_num,tnode & class_name){attr_node at;binNode * root = NULL;for (int i = 0;i< Samples.size();i++){insert_tree(root,G_DB.DB[Samples[i]].row[class_id].tdata);}Get_attr(root,at);delete_bin_tree(root);//printf("att_size = %d\n",at.attr_name.size());class_num = at.attr_name.size();int num = 0;int id = 0;if (1 == class_num){strcpy(class_name.tdata,at.attr_name[0].tdata);}else{for (int j = 0;j < at.attr_name.size();j++ ){if (at.count_list[j] > num){num = at.count_list[j];id = j;}}}strcpy(class_name.tdata,at.attr_name[id].tdata);//保存最普通的类名}void getAllTheAttribute(vector<int> Samples,vector<int> attribute_list,int class_id){printf("all the attribute are:\n");for (int i = 0;i < attribute_list.size();i++){attr_node at;at.attr_id = attribute_list[i];fnc_getattr(Samples,attribute_list[i],at);G_Attr_List.push_back(at);}for (i = 0;i <G_Attr_List.size();i++){printf("%d\n",G_Attr_List[i].attr_id);for (int j = 0;j< G_Attr_List[i].attr_name.size();j++){printf("%s\t",G_Attr_List[i].attr_name[j].tdata);}printf("\n");}}void Generate_decision_tree(Tree_Node * & root,vector<int> Samples, vector<int>attribute_list,int class_id){/*算法:Generate_decision_tree(samples, attribute)。
仿照例题,使用id3算法生成决策树
标题:使用ID3算法生成决策树一、概述在机器学习领域,决策树是一种常见的分类和回归算法。
它基于一系列属性对数据进行划分,最终生成一棵树状图来表示数据的分类规则。
在本文中,我们将介绍ID3算法,一种经典的决策树生成算法,并演示如何使用ID3算法生成决策树。
二、ID3算法概述ID3算法是一种基于信息论的决策树生成算法,其全称为Iterative Dichotomiser 3。
它由Ross Quinlan于1986年提出,是C4.5算法的前身。
ID3算法的核心思想是在每个节点选择最佳的属性进行划分,使得各个子节点的纯度提高,从而最终生成一棵有效的决策树。
ID3算法的主要步骤包括计算信息增益、选择最佳属性、递归划分数据集等。
在这一过程中,算法会根据属性的信息增益来确定最佳的划分属性,直到满足停止条件为止。
三、使用ID3算法生成决策树的步骤使用ID3算法生成决策树的步骤如下:1. 收集数据集:需要收集一个包含多个样本的数据集,每个样本包含多个属性和一个类别标签。
2. 计算信息增益:对每个属性计算信息增益,信息增益越大表示该属性对分类的贡献越大。
3. 选择最佳属性:选择信息增益最大的属性作为当前节点的划分属性。
4. 划分数据集:根据选择的属性值将数据集划分成若干子集,每个子集对应属性的一个取值。
5. 递归生成子节点:对每个子集递归调用ID3算法,生成子节点,直到满足停止条件。
6. 生成决策树:将所有节点连接起来,生成一棵完整的决策树。
四、使用ID3算法生成决策树的示例为了更好地理解ID3算法的生成过程,我们以一个简单的示例来说明。
假设有一个包含天气、温度和湿度三个属性的数据集,我们希望使用ID3算法生成一个决策树来预测是否适合外出活动。
我们需要计算每个属性的信息增益。
然后选择信息增益最大的属性进行划分,将数据集划分成若干子集。
接着递归调用ID3算法,直到满足停止条件为止。
经过计算和递归划分,最终我们得到一棵决策树,可以根据天气、温度和湿度来预测是否适合外出活动。
决策树的三种算法
决策树的三种算法一、决策树算法的简单介绍决策树算法就像是一个超级智能的树状决策指南。
你可以把它想象成一棵倒着长的树,树根在上面,树枝和树叶在下面。
它的任务呢,就是根据不同的条件来做出各种决策。
比如说,你想决定今天穿什么衣服,天气就是一个条件,如果天气冷,你可能就选择穿厚衣服;如果天气热,那薄衣服就比较合适啦。
决策树算法在很多地方都超级有用,像预测一个人会不会买某个商品,或者判断一个邮件是不是垃圾邮件之类的。
二、决策树的三种算法1. ID3算法这个算法就像是一个很会找重点的小机灵鬼。
它主要是根据信息增益来构建决策树的。
啥是信息增益呢?就是通过计算某个属性带来的信息量的增加。
比如说,在判断一个水果是苹果还是香蕉的时候,颜色这个属性可能就有很大的信息增益。
如果一个水果是红色的,那它是苹果的可能性就比较大。
ID3算法会优先选择信息增益大的属性来作为树的节点,这样就能更快更准地做出决策啦。
不过呢,这个算法也有个小缺点,就是它比较容易对噪声数据敏感,就像一个很敏感的小娃娃,稍微有点风吹草动就可能受到影响。
2. C4.5算法C4.5算法就像是ID3算法的升级版。
它在ID3算法的基础上做了一些改进。
它不仅仅考虑信息增益,还考虑了信息增益率。
这就好比是一个更加全面考虑的智者。
通过考虑信息增益率,它能够更好地处理那些属性值比较多的情况。
比如说,在一个数据集中有一个属性有很多很多不同的值,C4.5算法就能比ID3算法更好地处理这种情况,不会轻易地被这种复杂情况给弄晕。
而且C4.5算法还能够处理连续的属性值,这就像是它多了一项特殊的技能,让它在更多的情况下都能发挥作用。
3. CART算法CART算法又有自己的特点。
它使用的是基尼系数来选择属性进行划分。
基尼系数就像是一个衡量公平性的小尺子,在决策树这里,它是用来衡量数据的纯度的。
如果基尼系数越小,说明数据越纯,就越容易做出准确的决策。
CART算法既可以用于分类问题,就像前面说的判断水果是苹果还是香蕉这种,也可以用于回归问题,比如预测房价之类的。
(完整版)ID3算法
(2)用信息增益作为属性选择量存在一个假设, 即训 练例子集中的正, 反例的比例应与实际问题领域里正、 反例比例相同。一般情况不能保证相同, 这样计算训练 集的信息增益就有偏差。
(3)ID3在建树时, 每个节点仅含一个属性, 是一种单 变元的算法, 属性间的相关性强调不够。虽然它将多个 属性用一棵树连在一起, 但联系还是松散的。
该算法的计算时间是例子个数、属性个数、结点个数 之积的线性函数。对有4761个关于苯的质谱例子作了试验。 其中正例2361个, 反例2400个, 每个例子由500个属性描述, 每个属性取值数目为6, 得到一棵1514个结点的决策树。对 正、反例各100个测试例作了测试, 正例判对82个, 反例判对 80个, 总预测正确率81%, 效果是令人满意的。
J.R.Quinlan的工作主要是引进了信息论中的信息增益, 他将其称为信息增益(information gain), 作为属性 判别能力的度量, 设计了构造决策树的递归算法。
下面通过一个例子, 说明ID3算法的基本思想。
5
一、ID3基本思想
对于气候分类问题,属性为: 天气(A1) 取值为: 晴,多云,雨 气温(A2) 取值为: 冷 ,适中,热 湿度(A3) 取值为: 高 ,正常 风 (A4) 取值为: 有风, 无风
16
Gain(S, A1) Entropy(S) v晴,多云,雨
Sv S
Entropy(Sv )
Entropy(S
)
5 14
Entropy(S晴
)
4 14
Entropy(S多云
)
5 14
Entropy(S雨
)
而
Entropy(S晴 )
2 5
log
id3算法的原理
ID算法的原理
ID3(Iterative Dichotomiser 3)是一种经典的决策树学习算法,用于从特征数据中构建决策树模型。
以下是ID3算法的基本原理:
1. 根据信息增益选择最佳特征:ID3算法首先计算每个特征对于目标变量的信息增益。
信息增益衡量了用该特征对数据进行划分所带来的纯度提升。
特征的信息增益越大,表示使用该特征进行划分可以更好地区分目标变量的不同类别。
因此,ID3算法选择具有最大信息增益的特征作为当前节点的划分特征。
2. 构建决策树:根据选择的最佳特征,在当前节点上建立子节点,每个子节点包含特征的一个可能取值。
如果特征的某个取值导致了目标变量完全一致,则该子节点成为叶节点,并将该目标变量值赋予该叶节点。
如果某特征取值导致目标变量不一致,则递归地应用ID3算法来生成更深层次的子树。
3. 重复以上步骤:重复执行步骤1和步骤2,直到满足以下条件之一:
所有实例都属于相同的类别。
即叶节点中只包含一个类别的实例。
没有剩余特征可供选择,此时使用多数投票法来确定叶
节点的类别。
ID3算法的目标是通过构建决策树来实现对样本数据的分类。
决策树具有良好的可解释性,容易理解和解释,且适用于离散型的特征。
然而,ID3算法可能存在过拟合问题,因为它倾向于选择具有更多取值的特征进行划分。
一些改进的算法(如C4.5和CART)对ID3进行了扩展,解决了一些问题,并增加了对连续型特征的支持。
机器学习决策树算法ID3
机器学习决策树算法ID3决策树是一种重要的机器学习算法,它能够处理分类和回归的问题,并且易于理解和解释。
其中,ID3(Iterative Dichotomiser 3)算法是决策树学习中最简单和最流行的一种算法,本文将介绍ID3算法的基本原理和实现过程。
什么是决策树决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个叶子节点表示一种分类结果。
决策树的生成分为两个步骤:构建和剪枝。
构建过程是将数据集通过分裂形成一颗完整的决策树;剪枝过程是通过去除不必要的分支来提高模型的泛化能力。
ID3算法的基本原理ID3算法是一种贪心算法,也就是说,在每一次分裂时,它都会选择当前最优的特征进行分裂。
其基本思想是:通过计算某个特征的信息增益来确定每个节点的最优分割策略。
信息增益是指在选择某个特征进行分割后,熵的减少量。
熵的计算公式如下:$$ H(D) = -\\sum_{k=1}^{|y|}p_klog_2p_k $$其中,|y|表示类别的数量,p k表示第k个类别在所有样本中出现的概率。
信息增益的计算公式如下:$$ Gain(D,F) = H(D) - \\sum_{v\\in V(F)}\\frac{|D_v|}{|D|}H(D_v) $$其中,F表示属性,V(F)表示属性F的取值集合。
D v表示选择属性F取值为v时的样本集。
在计算信息增益时,需要选择具有最大信息增益的属性作为分裂属性。
ID3算法的实现过程ID3算法的实现过程可以分为以下几个步骤:1.选择分裂属性:选择信息增益最大的属性作为分裂属性;2.构建节点:将节点标记为分裂属性;3.分裂样本:按照分裂属性将样本集分裂为若干子集;4.递归继续分裂:对于每个子集,递归地执行步骤1到步骤3,直到构建完整个决策树。
具体实现时,可以使用递归函数来实现决策树的构建。
代码如下所示:```python def create_tree(dataset, labels):。
决策树ID3算法ppt课件
决策树基本概念
决策树的优点
1、推理过程容易理解,决策推理过程可以表示成If Then形式;
2、推理过程完全依赖于属性变量的取值特点;
3、可自动忽略目标变量没有贡献的属性变量,也为判断属性 变量的重要性,减少变量的数目提供参考。
第6章 决策树 在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确
第6章 决策树
关于分类问题
决策树基本概念
名称 人类
体温 恒温
表皮覆 盖
毛发
胎生 是
水生动 物
否
飞行动 物
否
有腿 是
冬眠 否
海龟 冷血 鳞片
否
半
否
是
否
鸽子 恒温 羽毛
否
否
是
是
否
鲸
恒温 毛发
是
是
否
否
否
X
分类与回归 分类目标属性y是离散的,回归目标属性y是连续的
类标号
哺乳动 物
爬行类 鸟类 哺乳类
y
在整堂课的教学中,刘教师总是让学 生带着 问题来 学习, 而问题 的设置 具有一 定的梯 度,由 浅入深 ,所提 出的问 题也很 明确
第6章 决策树 在整堂课的教学中,刘教师总是让学生带着问题来学习,而问题的设置具有一定的梯度,由浅入深,所提出的问题也很明确
决策树基本概念
关于归纳学习(2)
归纳学习的过程就是寻找一般化描述的过程。这种一般性 描述能够解释给定的输入数据,并可以用来预测新的数据。
锐角三角形内角和等于180度; 钝角三角形内角和等于180度; 直角三角形内角和等于180度;
1、模型构建(归纳) 通过对训练集合的归纳,建立分类模型。
决策树的训练算法
决策树的训练算法
决策树的训练算法主要有以下几种:
1. ID3算法:ID3(Iterative Dichotomiser 3)是一种用于决策树学习的经典算法。
它基于信息熵的概念,通过计算每个特征的信息增益来选择最优的划分特征。
2. C4.5算法:C4.5算法是ID3算法的改进版,它在选择划分特征时使用信息增益比来解决ID3算法中对取值较多的特征有偏好的问题。
此外,C4.5算法还支持处理连续特征。
3. CART算法:CART(Classification and Regression Tree)算法是一种用于生成二叉决策树的算法。
它根据基尼系数来选择最优的划分特征,并使用回归树或分类树来处理连续特征。
4. CHAID算法:CHAID(Chi-square Automatic Interaction Detector)算法是一种适用于分类问题的决策树算法。
它使用卡方检验来选择最优的划分特征,并根据卡方统计量的值来评估特征的重要性。
5. 梯度提升决策树(GBDT)算法:GBDT算法是一种集成学习算法,它将多颗决策树进行级联,每颗树的输出作为下一颗树的输入。
GBDT通过梯度下降的方式逐步优化模型的预测能力。
这些算法在决策树的构建过程中采用不同的策略和指标,适用于不同类型的数据和问题。
在实际应用中,可以根据数据特点和问题需
求选择合适的算法进行训练。
决策树_ID3算法
决策树_ID3算法决策树是一种用于分类和预测的机器学习算法,其中ID3(Iterative Dichotomiser 3)是一种常用的决策树算法。
ID3算法通过选择最佳特征将数据集划分为更小的子集,直到达到预定的条件或者无法进一步划分为止。
在此过程中,它使用信息增益来选择最佳划分特征。
ID3算法的核心思想是利用信息增益来判断每个特征的重要性。
信息增益是指在划分数据前后的熵的差值,熵表示数据的混乱程度。
熵越大,数据越混乱,熵越小,数据越有序。
在决策树中,我们希望选择使得熵减最大的特征作为划分依据,即信息增益最大的特征。
以下是ID3算法的具体步骤:3. 计算数据集的熵。
熵的计算公式为:E(S) = -p1*log2(p1) -p2*log2(p2) - ... - pn*log2(pn),其中pi表示数据集中属于类别i的实例占总实例数的比例。
4.对于每个特征,计算划分后的熵和信息增益,并选择信息增益最大的特征作为划分依据。
5.根据选择的特征将数据集进行划分,形成子集。
6.递归地对每个子集应用上述步骤,生成决策树的左右子树。
7.返回决策树。
ID3算法的优点是简单易懂,效率高,在处理具有大量特征的数据集时也能取得较好的结果。
然而,由于ID3算法倾向于选择具有较多取值的特征作为划分依据,可能导致生成的决策树过于复杂,容易出现过拟合现象。
此外,ID3算法只能处理离散型特征,无法处理连续型特征。
为了解决ID3算法的缺点,后续的决策树算法如C4.5和CART进行了改进。
C4.5算法在ID3算法基础上引入了对连续型特征的处理,同时使用信息增益比来选择划分特征。
CART算法则使用基尼指数来衡量划分的质量,划分后的熵越小,基尼指数越小,表示数据越有序。
综上所述,决策树算法是一种基于特征选择的分类和预测方法,其中ID3算法通过信息增益选择最佳特征进行划分。
ID3算法简单有效,但有部分局限性。
进一步改进的决策树算法能够处理连续型特征和更好地提高划分的质量。
id3算法阈值 -回复
id3算法阈值-回复关于ID3算法阈值的介绍和应用。
ID3 (Iterative Dichotomiser 3) 是一种决策树算法,它是由美国计算机科学家Ross Quinlan开发的。
该算法的目标是通过迭代地根据特征对数据进行分割来构建决策树。
在构建决策树时,ID3算法使用一个阈值来帮助判断何时终止决策树的构建过程。
ID3算法的基本原理是通过计算每个特征的信息增益来选择最佳特征进行分割。
信息增益可以被看作是熵的差值,即父节点的熵减去子节点的熵。
熵是衡量数据的不确定性的度量,熵越小,分类越纯粹。
通过计算不同特征的信息增益,ID3算法选择具有最大信息增益的特征来进行分割,直到所有数据都被分类或者没有更多的特征可供选择。
然而,在决策树的构建过程中,ID3算法存在一个终止条件的问题。
如果我们不设定阈值,决策树可能会无限地生长,这会导致过拟合。
过拟合指的是决策树过于复杂,根据训练数据过于准确,但在新的数据上的预测能力较差。
因此,我们需要设置一个阈值,以在决策树构建过程中合适地限制树的深度。
阈值的设定是一个相对复杂的过程,需要综合考虑数据集的大小、特征的数量和特征与标签之间的关系等因素。
一般来说,如果数据集较小,我们可以选择设定较大的阈值以限制决策树的深度。
这样可以避免决策树的过拟合问题。
如果数据集较大,我们可以选择设定较小的阈值,以提高决策树的预测能力。
此外,特征的数量和特征与标签之间的关系也会影响阈值的设定。
如果特征数量较少,我们可以选择设定较小的阈值,这样决策树可以更深入地探索不同的特征组合。
如果特征与标签之间的关系较强,则可以选择设定较大的阈值,以避免过拟合。
实际应用中,我们可以通过交叉验证和网格搜索等方法来找到最佳的阈值。
交叉验证是一种将数据集划分为训练集和验证集的方法,通过比较不同阈值下模型的性能来选择最佳阈值。
网格搜索则是通过遍历不同阈值的组合来寻找最佳阈值。
总结起来,ID3算法使用阈值来限制决策树的深度,避免过拟合的问题。
id3算法计算过程
id3算法计算过程ID3算法是一种决策树学习算法,用于从给定的数据集中产生一个决策树。
决策树是一种常见的分类和回归方法,它通过一系列的规则和决策节点来预测目标变量的值。
下面是ID3算法的具体计算过程:2.计算信息增益:信息增益用于衡量在给定特征值条件下关于目标变量的不确定性减少。
对于每个特征,需要计算其信息增益。
由于ID3算法仅处理离散特征,因此需要将所有连续特征进行离散化处理。
a. 对于每个特征,计算它的熵。
熵可以衡量一个随机变量的不确定性。
计算公式为:熵 = -Σ(p*log2(p)),其中p表示不同类别的比例。
b.对于每个特征,计算它的条件熵。
条件熵表示在已知一些特征值的条件下,目标变量的不确定性。
条件熵的计算公式为:条件熵=Σ(p*熵),其中p表示特征值的比例。
c.计算信息增益,信息增益表示特征引入后不确定性的减少程度。
信息增益的计算公式为:信息增益=熵-条件熵。
3.选择信息增益最大的特征作为节点:在第2步中,对于每个特征都计算了信息增益,选择信息增益最大的特征作为决策树的节点。
该特征将用于划分数据集,将数据集中的样本分成不同的子集。
4.重复步骤1-3:根据划分后的子集重复执行上述步骤,直到满足终止条件。
终止条件可以是以下几种情况之一:所有的样本都属于同一类别,没有剩余的特征可以选择,或者达到了预先设定的最大深度。
5.构建决策树:通过不断地重复步骤1-4,最终构建出一棵完整的决策树。
ID3算法的核心思想是选择信息增益最大的特征来进行划分。
信息增益越大,说明该特征对于分类的贡献越大。
总体而言,ID3算法是一种自上而下的贪心算法,通过选择最佳特征来划分数据集,并递归地构建决策树。
ID3算法的优点是简单快速,易于理解和实现。
然而,它也有一些缺点,例如对缺失数据敏感,对于具有大量特征和类别的数据集效果不好。
为了解决这些问题,后续的决策树学习算法如C4.5和CART算法进行了改进和优化。
决策树id3算法例题经典
决策树id3算法例题经典一、决策树ID3算法例题经典之基础概念决策树ID3算法就像是一个超级聪明的小侦探,在数据的世界里寻找线索。
它是一种用来分类的算法哦。
比如说,我们要把一群小动物分成哺乳动物和非哺乳动物,就可以用这个算法。
它的基本思想呢,就是通过计算信息增益来选择特征。
就好比是在一堆乱糟糟的东西里,先找到那个最能区分开不同类别的特征。
比如说在判断小动物的时候,有没有毛发这个特征可能就很关键。
如果有毛发,那很可能就是哺乳动物啦。
二、经典例题解析假设我们有这样一个数据集,是关于一些水果的。
这些水果有颜色、形状、是否有籽等特征,我们要根据这些特征来判断这个水果是苹果、香蕉还是橙子。
首先看颜色这个特征。
如果颜色是红色的,那可能是苹果的概率就比较大。
但是仅仅靠颜色可不够准确呢。
这时候就需要计算信息增益啦。
通过计算发现,形状这个特征对于区分这三种水果的信息增益更大。
比如说圆形的可能是苹果或者橙子,弯弯的可能就是香蕉啦。
再考虑是否有籽这个特征。
苹果和橙子有籽,香蕉没有籽。
把这个特征也加入到决策树的构建当中,就可以更准确地判断出到底是哪种水果了。
三、决策树ID3算法的优缺点1. 优点这个算法很容易理解,就像我们平常做选择一样,一步一步来。
它的结果也很容易解释,不像有些复杂的算法,结果出来了都不知道怎么回事。
它不需要太多的计算资源,对于小数据集来说,速度很快。
就像小马拉小车,轻松就能搞定。
2. 缺点它很容易过拟合。
就是在训练数据上表现很好,但是一到新的数据就不行了。
比如说我们只根据训练数据里的几个苹果的特征构建了决策树,新的苹果稍微有点不一样,就可能判断错了。
它只能处理离散型的数据。
如果是连续型的数据,就需要先进行离散化处理,这就多了一道工序,比较麻烦。
四、实际应用场景1. 在医疗领域,可以用来判断病人是否患有某种疾病。
比如说根据病人的症状、年龄、性别等特征来判断是否得了感冒或者其他疾病。
就像医生的小助手一样。
id3算法原理
id3算法原理ID3(Iterative Dichotomiser 3)算法是一种常用的决策树算法,用于分类和回归问题。
它是由Ross Quinlan于1986年提出的,是基于信息熵的一种算法。
决策树是一种流行的分类方法,它通过对属性进行划分来构建一个树形结构,每个节点表示一个属性,每个分支表示属性的一个取值,每个叶子节点表示一个分类或回归结果。
ID3算法通过计算信息熵来选择最佳的属性进行划分,以最小化信息熵,即最大化信息增益。
信息熵是表示随机变量不确定性的度量,数学上可以定义为每个可能取值的概率乘以其对数的相反数的和。
在决策树中,信息熵可以用来衡量一个属性对于分类结果的不确定性程度。
信息熵越小,说明属性对于分类结果的影响越大。
在ID3算法中,首先需要选择一个最佳的属性作为根节点。
算法通过计算每个属性的信息增益,选择增益最大的属性作为根节点。
信息增益是指划分前后信息熵的差值,即划分后的信息熵减去划分前的信息熵。
通过选择信息增益最大的属性,可以使得划分后的子集的纯度更高。
然后,对于每个子集,重复选择最佳属性作为分支节点,直到所有属性都被使用或者子集中的样本都属于同一类别。
这样就构建了一个完整的决策树。
在构建决策树时,需要考虑一些终止条件,比如限定树的最大深度或者节点中的样本数达到一定的数量。
ID3算法的优点是简单易懂,计算效率高,可以处理具有缺失值的数据。
然而,它也有一些缺点。
首先,ID3算法倾向于选择具有较多取值的属性,这可能导致过拟合。
其次,ID3算法不能处理连续型属性,需要将其离散化。
此外,ID3算法对于噪声和异常值比较敏感,容易产生不稳定的决策树。
为了克服ID3算法的缺点,后续提出了C4.5算法和CART算法。
C4.5算法在ID3算法的基础上进行了改进,可以处理连续型属性和缺失值,同时引入了信息增益比来解决属性取值较多的问题。
CART 算法是一种二叉决策树算法,可以处理分类和回归问题,通过计算基尼指数来选择最佳的属性进行划分。
《2024年决策树ID3算法的改进研究》范文
《决策树ID3算法的改进研究》篇一一、引言决策树算法是一种常用的机器学习算法,广泛应用于分类问题。
ID3(Iterative Dichotomiser 3)算法作为决策树算法的一种,具有简单易懂、易于实现等优点。
然而,随着数据集的复杂性和规模的增加,ID3算法在处理高维、非线性等问题时存在一定局限性。
本文旨在研究ID3算法的改进方法,以提高其分类性能和泛化能力。
二、ID3算法概述ID3算法是一种基于信息增益的决策树学习算法。
它通过计算各个特征的信息增益,选择信息增益最大的特征进行划分,递归地构建决策树。
ID3算法具有简单、直观、易于理解等优点,但在处理高维、非线性等问题时,容易受到噪声和无关特征的影响,导致过拟合和分类性能下降。
三、ID3算法的改进思路针对ID3算法的局限性,本文提出以下改进思路:1. 特征选择:引入新的特征选择方法,如基于基尼指数、卡方统计量等,以提高信息增益计算的准确性和鲁棒性。
同时,可以考虑使用多特征组合或特征融合的方法,提高决策树的分类性能。
2. 剪枝策略:引入预剪枝和后剪枝策略,以避免过拟合和提高泛化能力。
预剪枝通过提前停止树的生长来控制模型复杂度,后剪枝则通过剪去决策树的部分分支来优化模型。
3. 参数优化:对ID3算法的参数进行优化,如选择合适的阈值、惩罚项等,以提高算法的分类性能和稳定性。
四、改进的ID3算法实现根据上述改进思路,本文提出一种改进的ID3算法实现方法:1. 特征选择:采用基尼指数作为特征选择的标准。
基尼指数越小,说明数据的纯度越高,因此选择基尼指数最小的特征进行划分。
同时,可以考虑将多个特征进行组合或融合,以充分利用特征之间的互补信息。
2. 剪枝策略:引入预剪枝和后剪枝两种策略。
预剪枝通过设定一个阈值,当信息增益小于该阈值时停止树的生长。
后剪枝则从完全生长的决策树开始,逐步剪去部分分支以优化模型。
3. 参数优化:通过交叉验证等方法确定最佳参数值,如阈值、惩罚项等。
决策树算法之ID3(基于信息增益的最优特征选取)
决策树算法之ID3(基于信息增益的最优特征选取)决策树(Decision Tree)是一种常用的机器学习算法,用于解决分类和回归问题。
决策树通过对数据集进行递归分割,将数据集划分为更小的子集,使得每个子集内的样本具有更纯的类别。
ID3算法是决策树算法中的一种,它是基于信息增益的最优特征选取算法,它的核心思想是选择能够带来最大信息增益的特征作为划分标准。
下面将详细介绍ID3算法的原理、步骤和示例。
1.原理:在ID3算法中,使用信息增益来度量特征对数据集的划分能力。
信息增益是一种统计量,表示在已知特征值的条件下,熵的减少量。
熵是度量系统无序程度的指标,熵越大表示系统越无序,熵越小表示系统越有序。
2.步骤:(1) 计算数据集的熵。
熵的计算公式为H(D) = -Σ(p(i) *log2(p(i))),其中p(i)表示第i类样本在数据集中的比例,log2为以2为底的对数。
(2) 选择最优特征划分数据集。
对于每个特征,计算其信息增益,信息增益的计算公式为Gain(D, A) = H(D) - Σ(,Di, / ,D,) *H(Di),其中D表示数据集,A表示特征,Di表示在特征A上取值为i的样本子集,Di,表示Di的样本个数,D,表示数据集的样本个数。
(3)递归构建决策树。
选择信息增益最大的特征作为根节点,将数据集根据该特征的不同取值划分为多个子数据集,对每个子数据集使用步骤(1)和(2),直到满足停止条件为止。
(4)停止条件。
停止条件可以是所有样本属于同一类别,或者所有特征已经被遍历完。
3.示例:天气,玩是否尽兴,是否去游乐场------,---------,-----------晴天,是,是晴天,是,是阴天,是,否小雨,否,否小雨,是,否首先计算数据集的熵:H(D) = - (2/5 * log2(2/5) + 3/5 *log2(3/5)) ≈ 0.971然后计算每个特征的信息增益:- 对于天气特征,计算H(D,天气),根据天气的取值将数据集划分为晴天、阴天和小雨三个子数据集,分别求其熵并加权求和,得到H(D,天气) ≈ (2/5 * 0 + 1/5 * log2(1/5) + 2/5 * log2(2/5)) ≈ 0.918、然后计算信息增益Gain(D, 天气) = H(D) - H(D,天气) ≈ 0.971 -0.918 ≈ 0.053- 对于玩是否尽兴特征,计算H(D,玩是否尽兴),根据玩是否尽兴的取值将数据集划分为是和否两个子数据集,分别求其熵并加权求和,得到H(D,玩是否尽兴) ≈ (3/5 * 0 + 2/5 * log2(2/5)) ≈ 0.971、然后计算信息增益Gain(D, 玩是否尽兴) = H(D) - H(D,玩是否尽兴) ≈ 0.971 - 0.971 ≈ 0。
分类决策树_ID3算法
分类决策树_ID3算法决策树是一种用于分类和回归问题的机器学习算法。
其中,ID3(Iterative Dichotomiser 3)是一种用于构建分类决策树的算法。
在本文中,我们将介绍ID3算法的工作原理、步骤和优缺点。
1.工作原理:ID3算法基于信息论的概念,主要使用的指标是信息增益(Information Gain)和熵(Entropy)。
信息增益用于度量分割属性对于减少不确定性的能力,熵用于度量数据集的混乱程度。
2.步骤:(1)选择最佳属性:计算数据集中每个属性的信息增益,选择具有最高信息增益的属性作为当前节点的划分属性。
(2)划分数据集:根据选定的划分属性,将数据集分成多个子集。
(3)递归构建决策树:对每个子集,继续执行步骤(1)和步骤(2),直到子集中的所有实例都属于同一类别或者无法再划分为止。
3.优点:(1)简单直观:决策树易于理解和解释,可以可视化展示决策过程。
(2)适用性广泛:决策树可以用于分类和回归问题,并且可以处理多分类问题和缺失数据。
(3)高效性:决策树的构建和预测速度快,适用于大数据集。
4.缺点:(1)容易过拟合:当决策树生长过深时,可能会过拟合训练数据,导致在新数据上表现不佳。
(2)对噪声敏感:决策树对噪声和异常值非常敏感,容易产生不稳定的结果。
(3)局部最优解:由于采用贪心算法选择属性分割点,可能得到局部最优解而非全局最优解。
5.改进方法:(1)剪枝:通过剪枝操作,减少决策树的分支,降低过拟合风险。
(2)集成学习:通过使用多个决策树进行集成学习,如随机森林和梯度提升树,提高预测性能。
(3)特征选择:通过使用其他特征选择技术(如信息增益比、卡方检验等),可以改进决策树的特征选择过程。
总结:ID3算法是一种基于信息增益的分类决策树算法,它通过选择最佳属性进行数据集的划分,递归构建决策树。
ID3算法的主要优点是简单直观、适用性广泛和高效性,缺点是容易过拟合、对噪声敏感和可能产生局部最优解。
决策树ID3算法
IF 年龄=“31...40”
THEN 购买电脑=“会购买”
IF 年龄=“>40” AND 信用等级=“良好” THEN 购买电脑=“不会购买”
IF 年龄=“>40” AND 信用等级=“一般” THEN 购买电脑=“会购买”
论文中的应用
• 题目: 决策树算法的研究与应用
• 作者: 杨静1,张楠男2,李建1,刘延明1,梁美红1
决策树 ID3算法
(1)决策树技术
构造决策树的基本算法是贪心算法,它以自顶向下递归的各个击 破方式构造决策树。一种著名的决策树算法是ID3,算法的基本策略 如下: • ①创建一个节点。如果样本都在同一类,则算法停止,把该节点改成 树叶节点,并用该类标记。 • ②否则,选择一个能够最好的将训练集分类的属性,该属性作为该节 点的测试属性。 • ③对测试属性中的每一个值,创建相应的一个分支,并据此划分样本。 • ④使用同样的过程,自顶向下的递归,直到满足下面的三个条件中的 一个时就停止递归。 • 给定节点的所有样本都属于同一类。 • 没有剩余的属性可以用来划分。 • 分支没有样本。
• 由于 “年龄” 属性具有最高信息增益,它被选作测试属性。创建一个
节点,用“年龄”标记,并对每个属性值引出一个分支。样本据此划
分,如图所示。
年龄
<=30
31…40
>40
收入
高 高 中等 低 中等
学生
否 否 否 是 是
信用等级
一般 良好 一般 一般 良好
类
不会购买 不会购买 不会购买 会购买 会购买
I
3, 3
3 6
log2
3 6
3 6
log2
3 6
1
• 如果样本按“信用等级”划分,对一个给定的样本分类所需的期望信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 因此,这种划分的信息增益是 因此, • Gain(学生 学生)=I(s1,s2) - E(学生 学生)=0.940-0.789=0.151。 学生 学生 = 。 • 计算“信用等级”的熵。 计算“信用等级”的熵。 • 对于信用等级=“一般”: s11=6,s21=2,p11=6/8,p21=2/8, 对于信用等级= 一般” , , , , 6 6 2 2 I ( s 11 , s 2 1 ) = I ( 6 , 2 ) = − lo g 2 − lo g 2 = 0 .8 1 1 8 8 8 8 • 对于信用等级=“良好”: s12=3,s22=3,p12=3/6,p22=3/6, 对于信用等级= 良好” , , , , 3 3 3 3 I ( s1 2 , s 2 2 ) = I ( 3, 3 ) = − lo g 2 − lo g 2 = 1 6 6 6 6
2 2 2 2 lo g 2 − lo g 2 =1 4 4 4 4 对于收入= 中等” 对于收入=“中等”: s12=4,s22=2,p12=4/6,p22=2/4, , , , , 4 4 2 2 I ( s 1 2 , s 2 2 ) = I ( 4 , 2 ) = − lo g 2 − lo g 2 = 0 .9 1 8 6 6 6 6 I ( s 11 , s 2 1 ) = I ( 2 , 2 ) = −
收入
高 高 高 中等 低 低 低 中等 低 中等 中等 中等 高 中等
类别: 学生 信用等级 类别:购买电脑
否 否 否 否 是 是 是 否 是 是 是 否 是 否 一般 良好 一般 一般 一般 良好 良好 一般 一般 一般 良好 良好 一般 良好 不会购买 不会购买 会购买 会购买 会购买 不会购买 会购买 不会购买 会购买 会购买 会购买 会购买 会购买 不会购买
• 例:构造决策树。 构造决策树。 下表给出了取自AllElectronics顾客数据库元组训练集。 顾客数据库元组训练集。 下表给出了取自 顾客数据库元组训练集
编号
1 2 3 4 5 6 7 8 9 10 11 12 13 14
年龄
<=30 <=30 31…40 >40 >40 >40 31…40 <=30 <=30 >40 <=30 31…40 31…40 >40
E ( 信用等级 ) =
I ( s11 , s21 ) +
I ( s12 , s22 ) = 0.892
年龄
<=30 收入 学生 信用等级
高 高 中等 低 中等 否 否 否 是 是 一般 良好 一般 一般 良好
I ( s1 2 , s 2 2 ) = I ( 4, 0 ) = −
4
lo g 2 1 − 0 = 0
• 对于年龄=“>40”:s13=3,s23=2,p13=3/5,p23=2/5, 对于年龄= : , , , , 3 3 2 2 I ( s13 , s 2 3 ) = I ( 3, 2 ) = − lo g 2 − lo g 2 = 0 .9 7 1 5 5 5 5 • 如果样本按“年龄”划分,对一个给定的样本分类所需的期望信息为: 如果样本按“年龄”划分,对一个给定的样本分类所需的期望信息为: 5 4 5 E ( 年龄 ) = I ( s11 , s21 ) + I ( s12 , s22 ) + I ( s13 , s23 ) = 0.694 14 14 14 • 因此,这种划分的信息增益是 因此, • Gain(年龄 年龄)=I(s1,s2) - E(年龄 年龄)=0.246。 年龄 年龄 。 • 计算“收入”的熵。 计算“收入”的熵。 • 对于收入=“高”: s11=2,s21=2,p11=0.5,p21=0.5, 对于收入= , , , ,
• 解:由题意可知: 由题意可知: • s=14,类标号属性“购买电脑”有两个不同值(即{会购买,不会 = ,类标号属性“购买电脑”有两个不同值( 会购买, 购买}),因此有两个不同的类( }),因此有两个不同的类 )。设类 购买}),因此有两个不同的类(即m=2)。设类 1对应于“会购买”, = )。设类C 对应于“会购买” 对应于“不会购买” 类C2对应于“不会购买”。则s1=9,s2=5,p1=9/14,p2=5/14。 , , , 。 • ①计算对给定样本分类所需的期望信息: 计算对给定样本分类所需的期望信息: 2 9 9 5 5 I ( s1 , s2 ) = I ( 9, 5 ) = − ∑ pi log 2 ( pi ) = − log 2 − log 2 = 0.940 14 14 14 14 i =1 • ②计算每个属性的熵。 计算每个属性的熵。 • 先计算属性“年龄”的熵。 先计算属性“年龄”的熵。 • 对于年龄=“<=30”:s11=2,s21=3,p11=2/5,p21=3/5, 对于年龄= : , , , , 2 2 3 3 I ( s 11 , s 2 1 ) = I ( 2 , 3 ) = − lo g 2 − lo g 2 = 0 .9 7 1 5 5 5 5 • • 对于年龄=“31…40”: s12=4,s22=0,p12=4/4=1,p22=0, 对于年龄= : , , , , • 4
• 设 sij 是子集 Sj 中类 Ci 的样本数。根据由 划分成子集的熵或期望信息由 的样本数。根据由A划分成子集的熵或期望信息由 下式给出: 下式给出:
E (A) =
v
∑
s1 j + s 2 j + ⋯ + s m j s
j =1
I ( s1 j , s 2 j , ⋯ , s m j )
s1 j + s2 j + ⋯ + smj
7 7 E ( 学生 ) = I ( s11 , s21 ) + I ( s12 , s22 ) = 0.789 14 14
• 如果样本按“信用等级”划分,对一个给定的样本分类所需的期望信 如果样本按“信用等级”划分, 息为: 息为: 8 6
14 14 • 因此,这种划分的信息增益是 因此, • Gain(信用等级 信用等级)=I(s1,s2) - E(信用等级 信用等级)=0.940-0.892=0.048。 信用等级 信用等级 = 。 • 由于 “年龄” 属性具有最高信息增益,它被选作测试属性。创建一个 年龄” 属性具有最高信息增益,它被选作测试属性。 节点, 年龄”标记,并对每个属性值引出一个分支。 节点,用“年龄”标记,并对每个属性值引出一个分支。样本据此划 如图所示。 分,如图所示。
决策树 ID3算法 ID3算法
(1)决策树技术 )
构造决策树的基本算法是贪心算法, 构造决策树的基本算法是贪心算法,它以自顶向下递归的各个击 破方式构造决策树。一种著名的决策树算法是ID3,算法的基本策略 破方式构造决策树。一种著名的决策树算法是 , 如下: 如下: 创建一个节点。如果样本都在同一类,则算法停止, ①创建一个节点。如果样本都在同一类,则算法停止,把该节点改成 树叶节点,并用该类标记。 树叶节点,并用该类标记。 否则,选择一个能够最好的将训练集分类的属性, ②否则,选择一个能够最好的将训练集分类的属性,该属性作为该节 点的测试属性。 点的测试属性。 对测试属性中的每一个值,创建相应的一个分支,并据此划分样本。 ③对测试属性中的每一个值,创建相应的一个分支,并据此划分样本。 使用同样的过程,自顶向下的递归, ④使用同样的过程,自顶向下的递归,直到满足下面的三个条件中的 一个时就停止递归。 一个时就停止递归。 给定节点的所有样本都属于同一类。 给定节点的所有样本都属于同一类。 没有剩余的属性可以用来划分。 没有剩余的属性可以用来划分。 分支没有样本。 分支没有样本。
I ( s1 , s 2 , ⋯ , s m ) = − ∑ pi log 2 ( pi )
i =1
• 其中 i是任意样本属于 i的概率,并用 i/s估计。 其中p 是任意样本属于C 的概率,并用s 估计 估计。 • 设属性A具有 个不同值{a1,a2,…,av}。可以用属 具有v个不同值 设属性 具有 个不同值{ , }。可以用属 划分为v个子集 其中, 性A将S划分为 个子集{S1,S2,…,SV};其中,Sj包含 将 划分为 个子集{ , };其中 S中这样一些样本,它们在 上具有值 j。如果 选作测试 中这样一些样本, 上具有值a 如果A选作测试 中这样一些样本 它们在A上具有值 属性(即最好的分裂属性), ),则这些子集对应于由包含集 属性(即最好的分裂属性),则这些子集对应于由包含集 的节点生长出来的分枝。 合S的节点生长出来的分枝。 的节点生长出来的分枝
• • • • • • •
8.5 决策树
• 设S是s个数据样本的集合。假定类标号属性具有 个不同 个数据样本的集合。 是 个数据样本的集合 假定类标号属性具有m个不同 定义m个不同类 个不同类C = , , , )。 )。设 是类C 值,定义 个不同类 i(i=1,2,…,m)。设si是类 i中 的样本数。 的样本数。对一个给定的样本分类所需要的期望信息由下 m 式给出: 式给出:
•
• 对于收入=“低”: s13=3,s23=1,p13=3/4,p23=1/4, 对于收入= , , , ,
3 3 1 1 log 2 − log 2 = 0.811 4 4 4 4 如果样本按“收入”划分,对一个给定的样本分类所需的期望信息为: 如果样本按“收入”划分,对一个给定的样本分类所需的期望信息为: I ( s13 , s 2 3 ) = I ( 3,1 ) = −
I ( s1 j , s 2 j , ⋯ , s mj ) = − ∑ p ij log 2 ( p ij )
m
p • 其中, ij = 其中,
s ij S
j
i =1
的概率。 是 Sj 中的样本属于类 Ci 的概率。
• 在A上分枝将获得的编码信息是 Gain ( A) = I ( s1 , s2 ,⋯, sm ) − E ( A) 上分枝将获得的编码信息是 。 • Gain(A)称为信息增益,它是由于知道属性A的值而导致的熵的期望压缩。 Gain(A)称为信息增益 它是由于知道属性A的值而导致的熵的期望压缩。 称为信息增益, 具有最高信息增益的属性选作给定集合S的测试属性。创建一个节点, 具有最高信息增益的属性选作给定集合S的测试属性。创建一个节点,并 以该属性标记,对属性的每个值创建分枝,并据此划分样本。 以该属性标记,对属性的每个值创建分枝,并据此划分样本。