当前位置:文档之家› 决策树课程设计报告

决策树课程设计报告

课程设计报告设计题目:决策树构造算法的实现学生姓名:班级:学号:完成日期:(一) 需求和规格说明(1) 决策树是通过一系列规则对数据进行分类的过程。

它提供一种在什么条件下会得到什么值的类似规则的方法。

它是一个从上到下、分而治之的归纳过程,是决策树的一个经典的构造算法。

应用于很多预测的领域,如通过对信用卡客户数据构建分类模型,可预测下一个客户他是否属于优质客户。

(2) 分类是数据挖掘、机器学习和模式识别中一个重要的研究领域。

数据分类是一个两步过程。

第一步,使用已知类别标记的训练数据集建立一个分类模型。

例如:图1是一个决策树模型。

第二步,对未知标记的数据使用模型进行分类。

例如,根据图1的决策树模型,运用自顶而下的属性测试过程,将表2中的样例1-6分别分类为“Y ”、“Y ”、“Y ”、“Y ”、“N ”、“N ”。

图1. 一个决策树模型的例子 (3) 举例:对下表运用算法构建决策树表1. 一个训练数据集编号 天况 温度 湿度 风况 分类 1 晴 热 大 无 N 2 晴 热 大 有 N 3 多云 热 大 无 Y 4 雨 中 大 无 Y 5 雨 冷 正常 无 Y 6 雨 冷 正常 有 N 7 多云 冷 正常 有 Y 8 晴 中 大 无 N 9 晴 冷 正常 无 Y 10 雨 中 正常 无 Y 11 晴 中 正常 有 Y 12 多云 中 大 有 Y 13 多云 热 正常 无 Y 14雨中大有N对下列样例输入使用构建的决策树模型预测其分类属性:表2. 一个待分类的数据集编号 天况 温度 湿度 风况 分类 1 晴 热 正常 无 ? 2晴热正常有?天况湿度风况晴多云雨大有无YYNNY正常(二)设计基本算法描述:输入:训练样例集S,未标记的节点T,属性集A输出:以T为根的决策树①如果S中所有样例都是正例,则标记节点T为“Y”,并结束;②如果S中所有样例都是反例,则标记节点T为“N”,并结束;③否则,从A中选择一个属性X,(可随机选)标记节点T为X;④设X的所有取值为V1, V2,…,V n,依据这些取值将S划分为n个子集S1, S2, …, S n,建T的n个孩子节点T i,并分别以V i作为从T到T i的分支标号;⑤对每对(S i,T i,A-{X}),递归调用ID3算法建立一棵以T i为根的子树;决策树算法是非常常用的分类算法,是逼近离散目标函数的方法,学习得到的函数以决策树的形式表示。

其基本思路是不断选取产生信息增益最大的属性来划分样例集和,构造决策树。

信息增益定义为结点与其子结点的信息熵之差。

信息熵是香农提出的,用于描述信息不纯度(不稳定性),其计算公式是Pi为子集合中不同性(而二元分类即正样例和负样例)的样例的比例。

这样信息收益可以定义为样本按照某属性划分时造成熵减少的期望,可以区分训练样本中正负样本的能力,其计算公式是根据此基本算法,设计一个链表结构体LNode,并用link作为指针,定义LL为训练样式集;设计另一个链表AttrNode,用Attributes作为指针,定义attr_L为属性集;设计一个树结构Tnode,存储形式为孩子-兄弟结点。

另外,定义Attributes_kind存储属性名称,定义Attr_kind存储属性值的个数,OutLook_kind;Temperature_kind;Humidity_kind;Wind_kind存储各属性对应的值。

训练样式集最初存储在” data\\examples.xls”中,决策树以广义表的形式输出到文件"data\\result.dat",未知类别属性数据样例存放在”data/undec.xls”。

系统结构图(三)用户手册给定训练数据集,本程序将构建决策树模型,并实现对未知类别属性数据样例的分类。

程序运行前,请先将训练数据集存放在<data/examples.xls>,请确保数据与天况、温度、湿度、风况、分类一一对应。

例如:分类结果将显示在屏幕中。

决策树模型将以广义表的形式显示在<data/result.dat>中。

(四)调试及测试运行实例:输入文件同(三)用户手册,输出文件"data\\result.dat"为:界面设计:因可能不使用未知类别属性数据样例文件,故需提供一个界面供用户自由选择。

不足与改进:因需对属性名、属性值进行匹配,对于每一个不同的属性,需使用不同的代码,故本程序比较繁琐,在后期增加了一些函数精简了代码。

(五)附录——源程序#include <iostream>#include <fstream>#include <math.h>#include <cstring>#include <stdlib.h>#include<iomanip>using namespace std;#define ROW 20#define COL 5#define log2 0.69314718055typedef struct TNode //决策树{string data;string weight;TNode *firstchild,*nextsibling;}*tree;typedef struct LNode{string OutLook;string Temperature;string Humidity;string Wind;string PlayTennis;LNode *next;}*link;typedef struct AttrNode{string attributes;//各个属性名称int attr_Num;//属性对应的值的个数AttrNode *next;}*Attributes;string Attributes_kind[4] = {"OutLook","Temperature","Humidity","Wind"};//属性名称int Attr_kind[4] = {3,3,2,2}; //属性对应的值的个数string OutLook_kind[3] = {"Sunny","OverCast","Rain"}; //各个属性的值string Temperature_kind[3] = {"Hot","Mild","Cool"};string Humidity_kind[2] = {"High","Normal"};string Wind_kind[2] = {"Weak","Strong"};string undec[4];ifstream fin("data\\examples.xls");ofstream fout("data\\result.dat");ifstream fin2("data\\undec.xls");link LL;Attributes attr_L;tree T;void treelists(tree T);void InitAttr();void InitLink();void ID3(tree &T,link L,link T arget_Attr,Attributes attr);void PN_Num(link L,int &positve,int &negative);double Gain(int positive,int negative,string atrribute,link L,Attributes attr_L);void copy1(link q, link link_child);void input();void decision(tree T);int main1();int main2();int main(){int choice;bool get_1=false;while(1){cout<<" ======决策树构造算法的实现======"<<endl;cout<<"│1、训练并构建决策树模型"<<setw(9)<<"│"<<endl;cout<<"│2、对未知类别属性数据样例分类"<<setw(3)<<"│"<<endl;cout<<"│3、帮助"<<setw(25)<<"│"<<endl;cout<<"│4、退出"<<setw(25)<<"│"<<endl;cin>>choice;switch (choice){case 1:get_1=true;system("cls");main1();system("C:\\windows\\notepad.exe data\\result.dat");system("pause");system("cls");break;case 2:system("cls");if(!get_1)cout<<"Please choose 1 first."<<endl;else main2();system("pause");system("cls");break;case 3:system("cls");cout<<endl<<"\a 给定训练数据集,本程序将构建决策树模型,并实现对未知类别属性数据样例的分类。

"<<endl;cout<<" 训练数据集请存放在<data/examples.xls>,未知类别属性数据样例请存放在<data/undec.xls>,决策树模型显示在<data/result.dat>。

相关主题