决策树程序实验

决策树程序实验
决策树程序实验

决策树程序实验

众所周知,数据库技术从20世纪80年代开始,已经得到广泛的普及和应用。随着数据库容量的膨胀,特别是数据仓库以及web等新型数据源的日益普及,人们面临的主要问题不再是缺乏足够的信息可以使用,而是面对浩瀚的数据海洋如何有效地利用这些数据。

从数据中生成分类器的一个特别有效的方法是生成一个决策树(Decision Tree)。决策树表示方法是应用最广泛的逻辑方法之一,它从一组无次序、无规则的事例中推理出决策树表示形式的分类规则。决策树分类方法采用自顶向下的递归方式,在决策树的内部结点进行属性值的比较并根据不同的属性值判断从该结点向下的分支,在决策树的叶结点得到结论。所以从决策树的根到叶结点的一条路径就对应着一条合取规则,整棵决策树就对应着一组析取表达式规则。

决策树是应用非常广泛的分类方法,目前有多种决策树方法,如ID3、CN2、SLIQ、SPRINT等。

一、问题描述

1.1相关信息

决策树是一个类似于流程图的树结构,其中每个内部结点表示在一个属性上的测试,每个分支代表一个测试输入,而每个树叶结点代表类或类分布。数的最顶层结点是根结点。一棵典型的决策树如图1所示。它表示概念buys_computer,它预测顾客是否可能购买计算机。内部结点用矩形表示,而树叶结点用椭圆表示。为了对未知的样本分类,样本的属性值在决策树上测试。决策树从根到叶结点的一条路径就对应着一条合取规则,因此决策树容易转化成分类规则。

图1

ID3算法:

■决策树中每一个非叶结点对应着一个非类别属性,树枝代表这个属性的值。一个叶结点代表从树根到叶结点之间的路径对应的记录所属的类别属性值。

■每一个非叶结点都将与属性中具有最大信息量的非类别属性相关联。

■采用信息增益来选择能够最好地将样本分类的属性。

信息增益基于信息论中熵的概念。ID3总是选择具有最高信息增益(或最大熵压缩)的属性作为当前结点的测试属性。该属性使得对结果划分中的样本分类所需的信息量最小,并反映划分的最小随机性或“不纯性”。

1.2问题重述

1、目标概念为“寿险促销”

2、计算每个属性的信息增益

3、确定根节点的测试属性

模型求解

构造决策树的方法是采用自上而下的递归构造,其思路是:

■以代表训练样本的单个结点开始建树(步骤1)。

■如果样本都在同一类,则该结点成为树叶,并用该类标记(步骤2和3)。■否则,算法使用称为信息增益的机遇熵的度量为启发信息,选择能最好地将样本分类的属性(步骤6)。该属性成为该结点的“测试”或“判定”属性(步骤7)。值得注意的是,在这类算法中,所有的属性都是分类的,即取离散值的。连续值的属性必须离散化。

■对测试属性的每个已知的值,创建一个分支,并据此划分样本(步骤8~10)。

■算法使用同样的过程,递归地形成每个划分上的样本决策树。一旦一个属性出现在一个结点上,就不必考虑该结点的任何后代(步骤13)。

■递归划分步骤,当下列条件之一成立时停止:

(a)给定结点的所有样本属于同一类(步骤2和3)。

(b)没有剩余属性可以用来进一步划分样本(步骤4)。在此情况下,采用多数表决(步骤5)。这涉及将给定的结点转换成树叶,并用samples中的多数所在类别标记它。换一种方式,可以存放结点样本的类分布。

(c)分支test_attribute=a i没有样本。在这种情况下,以samples中的多数类创建一个树叶(步骤12)。

算法Decision_Tree(samples,attribute_list)

输入由离散值属性描述的训练样本集samples;

候选属性集合attribute_list。

输出一棵决策树。

(1)创建节点N;

(2)If samples 都在同一类C中then

(3)返回N作为叶节点,以类C标记;

(4) If attribute_list为空then

(5)返回N作为叶节点,以samples 中最普遍的类标记;//多数表决(6)选择attribute_list 中具有最高信息增益的属性test_attribute; (7)以test_attribute 标记节点N;

(8) For each test_attribute 的已知值v //划分 samples

(9)由节点N分出一个对应test_attribute=v的分支;

(10)令Sv为 samples中 test_attribute=v 的样本集合;//一个划分块

(11) If Sv为空 then

(12)加上一个叶节点,以samples中最普遍的类标记;

(13) Else 加入一个由

Decision_Tree(Sv,attribute_list-test_attribute)返回节点值E(S)=(-9\15)log2(9\15)-(6\15)log2(6\15)=0.971

Values(收入范围)={20-30K,30-40k,40-50K,50-60K}

E(S(20-30K))= (-2\4)log2(2\4)- (2\4)log2(2\4)=1

E(S(30-40K))= (-4\5)log2(4\5)- (1\5)log2(1\5)=0.7219

E(S(40-50K))= (-1\4)log2(1\4)- (3\4)log2(3\4)=0.8113

E(S(50-60K))= (-2\2)log2 (2\2)- (0\2)log2(0\2)=0

所以

E(S,收入范围)=(4/15) E(S(20-30K)) +(5/15) E(S(30-40K)) +(4/15) E(S(40-50K)) +(2/15) E(S(50-60K))=0.7236

Gain(S,收入范围)=0.971-0.7236=0.2474

同理:计算“保险”,“性别”,“年龄”的信息增益为:

E(S)=(-9\15)log2(9\15)-(6\15)log2(6\15)=0.971

Insurance(保险)={yes, no}

E(S(yes))= (-3\3)log2 (3\3)- (0\3)log2(0\3)=0

E(S(no))= (-6\12)log2 (6\12)- (6\12)log2(6\12)=1

E(S, 保险)=(3/15) E(S(yes)) +(12/15) E(S(no)) =0.8

Gain(S, 保险)=0.971-0.8=0.171

E(S)=(-9\15)log2(9\15)-(6\15)log2(6\15)=0.971

sex(性别)={male, female}

E(S(male))= (-3\7)log2 (3\7)- (4\7)log2(4\7)=0.9852

E(S(female))= (-6\8)log2 (6\8)- (2\8)log2(2\8)=0.8113

E(S, 性别)=(7/15) E(S(male)) +(8/15) E(S(female)) =0.8925

Gain(S, 性别)=0.971-0.8925=0.0785

E(S)=(-9\15)log2(9\15)-(6\15)log2(6\15)=0.971

age(年龄)={15~40,41 ~60}

E(S(15~40))= (-6\7)log2 (6\7)- (1\7)log2(1\7)=0.5917

E(S(41 ~60))= (-3\8)log2 (3\8)- (5\8)log2(5\8)=0.9544

E(S, 年龄)=(7/15) E(S(15~40)) +(8/15) E(S(41 ~60)) =0.7851 Gain(S, 年龄)=0.971-0.7851=0.1859

代码

package DecisionTree;

import java.util.ArrayList;

/**

* 决策树结点类

*/

public class TreeNode {

private String name; //节点名(分裂属性的名称)

private ArrayList rule; //结点的分裂规则

ArrayList child; //子结点集合

private ArrayList> datas; //划分到该结点的训练元组private ArrayList candAttr; //划分到该结点的候选属性

public TreeNode() {

https://www.360docs.net/doc/a13570178.html, = "";

this.rule = new ArrayList();

this.child = new ArrayList();

this.datas = null;

this.candAttr = null;

}

public ArrayList getChild() {

return child;

}

public void setChild(ArrayList child) {

this.child = child;

}

public ArrayList getRule() {

return rule;

}

public void setRule(ArrayList rule) {

this.rule = rule;

}

public String getName() {

return name;

}

public void setName(String name) {

https://www.360docs.net/doc/a13570178.html, = name;

}

public ArrayList> getDatas() {

return datas;

}

public void setDatas(ArrayList> datas) {

this.datas = datas;

}

public ArrayList getCandAttr() {

return candAttr;

}

public void setCandAttr(ArrayList candAttr) {

this.candAttr = candAttr;

}

}

package DecisionTree;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.StringTokenizer;

/**

* 决策树算法测试类

*/

public class TestDecisionTree {

/**

* 读取候选属性

* @return 候选属性集合

* @throws IOException

*/

public ArrayList readCandAttr() throws IOException{

ArrayList candAttr = new ArrayList();

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

String str = "";

while (!(str = reader.readLine()).equals("")) {

StringTokenizer tokenizer = new StringTokenizer(str);

while (tokenizer.hasMoreTokens()) {

candAttr.add(tokenizer.nextToken());

}

}

return candAttr;

}

/**

* 读取训练元组

* @return 训练元组集合

* @throws IOException

*/

public ArrayList> readData() throws IOException { ArrayList> datas = new ArrayList>();

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

String str = "";

while (!(str = reader.readLine()).equals("")) {

StringTokenizer tokenizer = new StringTokenizer(str);

ArrayList s = new ArrayList();

while (tokenizer.hasMoreTokens()) {

s.add(tokenizer.nextToken());

}

datas.add(s);

}

return datas;

}

/**

* 递归打印树结构

* @param root 当前待输出信息的结点

*/

public void printTree(TreeNode root){

System.out.println("name:" + root.getName());

ArrayList rules = root.getRule();

System.out.print("node rules: {");

for (int i = 0; i < rules.size(); i++) {

System.out.print(rules.get(i) + " ");

}

System.out.print("}");

System.out.println("");

ArrayList children = root.getChild();

int size =children.size();

if (size == 0) {

System.out.println("-->leaf node!<--");

} else {

System.out.println("size of children:" + children.size());

for (int i = 0; i < children.size(); i++) {

System.out.print("child " + (i + 1) + " of node " + root.getName() + ": ");

printTree(children.get(i));

}

}

}

/**

* 主函数,程序入口

* @param args

*/

public static void main(String[] args) {

TestDecisionTree tdt = new TestDecisionTree();

ArrayList candAttr = null;

ArrayList> datas = null;

try {

System.out.println("请输入候选属性");

candAttr = tdt.readCandAttr();

System.out.println("请输入训练数据");

datas = tdt.readData();

} catch (IOException e) {

e.printStackTrace();

}

DecisionTree tree = new DecisionTree();

TreeNode root = tree.buildTree(datas, candAttr);

tdt.printTree(root);

}

}

package DecisionTree;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

/**

* 选择最佳分裂属性

*/

public class Gain {

private ArrayList> D = null; //训练元组

private ArrayList attrList = null; //候选属性集

public Gain(ArrayList> datas, ArrayList attrList) { this.D = datas;

this.attrList = attrList;

}

/**

* 获取最佳侯选属性列上的值域(假定所有属性列上的值都是有限的名词或分类类型的)

* @param attrIndex 指定的属性列的索引

* @return 值域集合

*/

public ArrayList getValues(ArrayList> datas, int attrIndex){ ArrayList values = new ArrayList();

String r = "";

for (int i = 0; i < datas.size(); i++) {

r = datas.get(i).get(attrIndex);

if (!values.contains(r)) {

values.add(r);

}

}

return values;

}

/**

* 获取指定数据集中指定属性列索引的域值及其计数

* @param d 指定的数据集

* @param attrIndex 指定的属性列索引

* @return 类别及其计数的map

*/

public Map valueCounts(ArrayList> datas, int attrIndex){

Map valueCount = new HashMap();

String c = "";

ArrayList tuple = null;

for (int i = 0; i < datas.size(); i++) {

tuple = datas.get(i);

c = tuple.get(attrIndex);

if (valueCount.containsKey(c)) {

valueCount.put(c, valueCount.get(c) + 1);

} else {

valueCount.put(c, 1);

}

}

return valueCount;

}

/**

* 求对datas中元组分类所需的期望信息,即datas的熵

* @param datas 训练元组

* @return datas的熵值

*/

public double infoD(ArrayList> datas){

double info = 0.000;

int total = datas.size();

Map classes = valueCounts(datas, attrList.size());

Iterator iter = classes.entrySet().iterator();

Integer[] counts = new Integer[classes.size()];

for(int i = 0; iter.hasNext(); i++)

{

Map.Entry entry = (Map.Entry) iter.next();

Integer val = (Integer) entry.getValue();

counts[i] = val;

}

for (int i = 0; i < counts.length; i++) {

double base = DecimalCalculate.div(counts[i], total, 3);

info += (-1) * base * Math.log(base);

}

return info;

}

/**

* 获取指定属性列上指定值域的所有元组

* @param attrIndex 指定属性列索引

* @param value 指定属性列的值域

* @return 指定属性列上指定值域的所有元组

*/

public ArrayList> datasOfValue(int attrIndex, String value){ ArrayList> Di = new ArrayList>();

ArrayList t = null;

for (int i = 0; i < D.size(); i++) {

t = D.get(i);

if(t.get(attrIndex).equals(value)){

Di.add(t);

}

}

return Di;

}

/**

* 基于按指定属性划分对D的元组分类所需要的期望信息

* @param attrIndex 指定属性的索引

* @return 按指定属性划分的期望信息值

*/

public double infoAttr(int attrIndex){

double info = 0.000;

ArrayList values = getValues(D, attrIndex);

for (int i = 0; i < values.size(); i++) {

ArrayList> dv = datasOfValue(attrIndex, values.get(i));

info += DecimalCalculate.mul(DecimalCalculate.div(dv.size(), D.size(), 3), infoD(dv));

}

return info;

}

/**

* 获取最佳分裂属性的索引

* @return 最佳分裂属性的索引

*/

public int bestGainAttrIndex(){

int index = -1;

double gain = 0.000;

double tempGain = 0.000;

for (int i = 0; i < attrList.size(); i++) {

tempGain = infoD(D) - infoAttr(i);

if (tempGain > gain) {

gain = tempGain;

index = i;

}

}

return index;

}

}

package DecisionTree;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import javax.smartcardio.*;

/**

* 决策树构造类

*/

public class DecisionTree {

private Integer attrSelMode; //最佳分裂属性选择模式,1表示以信息增益度量,2表示以信息增益率度量。暂未实现2

public DecisionTree(){

this.attrSelMode = 1;

}

public DecisionTree(int attrSelMode) {

this.attrSelMode = attrSelMode;

}

public void setAttrSelMode(Integer attrSelMode) {

this.attrSelMode = attrSelMode;

}

/**

* 获取指定数据集中的类别及其计数

* @param datas 指定的数据集

* @return 类别及其计数的map

*/

public Map classOfDatas(ArrayList> datas){ Map classes = new HashMap();

String c = "";

ArrayList tuple = null;

for (int i = 0; i < datas.size(); i++) {

tuple = datas.get(i);

c = tuple.get(tuple.size() - 1);

if (classes.containsKey(c)) {

classes.put(c, classes.get(c) + 1);

} else {

classes.put(c, 1);

}

}

return classes;

}

/**

* 获取具有最大计数的类名,即求多数类

* @param classes 类的键值集合

* @return 多数类的类名

*/

public String maxClass(Map classes){

String maxC = "";

int max = -1;

Iterator iter = classes.entrySet().iterator();

for(int i = 0; iter.hasNext(); i++)

{

Map.Entry entry = (Map.Entry) iter.next();

String key = (String)entry.getKey();

Integer val = (Integer) entry.getValue();

if(val > max){

max = val;

maxC = key;

}

}

return maxC;

}

/**

* 构造决策树

* @param datas 训练元组集合

* @param attrList 候选属性集合

* @return 决策树根结点

*/

public TreeNode buildTree(ArrayList> datas, ArrayList attrList){

// System.out.print("候选属性列表:");

// for (int i = 0; i < attrList.size(); i++) {

// System.out.print(" " + attrList.get(i) + " ");

// }

System.out.println();

TreeNode node = new TreeNode();

node.setDatas(datas);

node.setCandAttr(attrList);

Map classes = classOfDatas(datas);

String maxC = maxClass(classes);

if (classes.size() == 1 || attrList.size() == 0) {

node.setName(maxC);

return node;

}

Gain gain = new Gain(datas, attrList);

int bestAttrIndex = gain.bestGainAttrIndex();

ArrayList rules = gain.getValues(datas, bestAttrIndex);

node.setRule(rules);

node.setName(attrList.get(bestAttrIndex));

if(rules.size() > 2){ //?此处有待商榷

attrList.remove(bestAttrIndex);

}

for (int i = 0; i < rules.size(); i++) {

String rule = rules.get(i);

ArrayList> di = gain.datasOfValue(bestAttrIndex, rule);

for (int j = 0; j < di.size(); j++) {

di.get(j).remove(bestAttrIndex);

}

if (di.size() == 0) {

TreeNode leafNode = new TreeNode();

leafNode.setName(maxC);

leafNode.setDatas(di);

leafNode.setCandAttr(attrList);

node.getChild().add(leafNode);

} else {

TreeNode newNode = buildTree(di, attrList);

node.getChild().add(newNode);

}

}

return node;

}

}

package DecisionTree;

import java.math.BigDecimal;

public class DecimalCalculate {

/**

* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精

* 确的浮点数运算,包括加减乘除和四舍五入。

*/

//默认除法运算精度

private static final int DEF_DIV_SCALE = 10;

//这个类不能实例化

private DecimalCalculate(){

}

/**

* 提供精确的加法运算。

* @param v1 被加数

* @param v2 加数

* @return 两个参数的和

*/

public static double add(double v1,double v2){

BigDecimal b1 = new BigDecimal(Double.toString(v1));

BigDecimal b2 = new BigDecimal(Double.toString(v2));

return b1.add(b2).doubleValue();

}

/**

* 提供精确的减法运算。

* @param v1 被减数

* @param v2 减数

* @return 两个参数的差

*/

public static double sub(double v1,double v2){

BigDecimal b1 = new BigDecimal(Double.toString(v1));

BigDecimal b2 = new BigDecimal(Double.toString(v2));

return b1.subtract(b2).doubleValue();

}

/**

* 提供精确的乘法运算。

* @param v1 被乘数

* @param v2 乘数

* @return 两个参数的积

*/

public static double mul(double v1,double v2){

BigDecimal b1 = new BigDecimal(Double.toString(v1));

BigDecimal b2 = new BigDecimal(Double.toString(v2));

return b1.multiply(b2).doubleValue();

}

/**

* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到

* 小数点以后10位,以后的数字四舍五入。

* @param v1 被除数

* @param v2 除数

* @return 两个参数的商

*/

public static double div(double v1,double v2){

return div(v1,v2,DEF_DIV_SCALE);

}

/**

* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指* 定精度,以后的数字四舍五入。

* @param v1 被除数

* @param v2 除数

* @param scale 表示表示需要精确到小数点以后几位。

* @return 两个参数的商

*/

public static double div(double v1,double v2,int scale){

if(scale<0){

throw new IllegalArgumentException(

"The scale must be a positive integer or zero");

}

BigDecimal b1 = new BigDecimal(Double.toString(v1));

BigDecimal b2 = new BigDecimal(Double.toString(v2));

return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

}

/**

* 提供精确的小数位四舍五入处理。

* @param v 需要四舍五入的数字

* @param scale 小数点后保留几位

* @return 四舍五入后的结果

*/

public static double round(double v,int scale){

if(scale<0){

throw new IllegalArgumentException(

"The scale must be a positive integer or zero");

}

BigDecimal b = new BigDecimal(Double.toString(v));

BigDecimal one = new BigDecimal("1");

return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

}

/**

* 提供精确的类型转换(Float)

* @param v 需要被转换的数字

* @return 返回转换结果

*/

public static float convertsToFloat(double v){

BigDecimal b = new BigDecimal(v);

return b.floatValue();

}

/**

* 提供精确的类型转换(Int)不进行四舍五入

* @param v 需要被转换的数字

* @return 返回转换结果

*/

public static int convertsToInt(double v){

BigDecimal b = new BigDecimal(v);

return b.intValue();

}

/**

* 提供精确的类型转换(Long)

* @param v 需要被转换的数字

* @return 返回转换结果

*/

public static long convertsToLong(double v){

BigDecimal b = new BigDecimal(v);

return b.longValue();

}

/**

* 返回两个数中大的一个值

* @param v1 需要被对比的第一个数

* @param v2 需要被对比的第二个数

* @return 返回两个数中大的一个值

*/

public static double returnMax(double v1,double v2){

BigDecimal b1 = new BigDecimal(v1);

BigDecimal b2 = new BigDecimal(v2);

return b1.max(b2).doubleValue();

}

/**

* 返回两个数中小的一个值

* @param v1 需要被对比的第一个数

* @param v2 需要被对比的第二个数

* @return 返回两个数中小的一个值

*/

public static double returnMin(double v1,double v2){

BigDecimal b1 = new BigDecimal(v1);

BigDecimal b2 = new BigDecimal(v2);

return b1.min(b2).doubleValue();

}

/**

* 精确对比两个数字

* @param v1 需要被对比的第一个数

* @param v2 需要被对比的第二个数

* @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1 */

public static int compareTo(double v1,double v2){

BigDecimal b1 = new BigDecimal(v1);

BigDecimal b2 = new BigDecimal(v2);

return https://www.360docs.net/doc/a13570178.html,pareTo(b2);

}

}

测试

三、模型评价

基于决策树的分类算法的一个最大的优点就是她在学习过程中不需要使用者了解很多背景知识(这同时也是它的最大的缺点),只要训练例子能够用属性-结论式表示出来,就能使用该算法来学习。

在ID3算法的假设空间包含所有的决策树,它是关于现有属性的有限离散值函数的一个完整空间。因为每个有限离散值函数可被表示为某个决策树,所以ID3算法避免了搜索不完整假设空间的一个主要风险:假设空间可能不包含目标函数。

ID3算法只能处理离散值的属性。首先,学习到的决策树要预测的目标属性必须是离散的,其次树的决策结点的属性也必须是离散的。

数据挖掘实验报告

《数据挖掘》Weka实验报告 姓名_学号_ 指导教师 开课学期2015 至2016 学年 2 学期完成日期2015年6月12日

1.实验目的 基于https://www.360docs.net/doc/a13570178.html,/ml/datasets/Breast+Cancer+WiscOnsin+%28Ori- ginal%29的数据,使用数据挖掘中的分类算法,运用Weka平台的基本功能对数据集进行分类,对算法结果进行性能比较,画出性能比较图,另外针对不同数量的训练集进行对比实验,并画出性能比较图训练并测试。 2.实验环境 实验采用Weka平台,数据使用来自https://www.360docs.net/doc/a13570178.html,/ml/Datasets/Br- east+Cancer+WiscOnsin+%28Original%29,主要使用其中的Breast Cancer Wisc- onsin (Original) Data Set数据。Weka是怀卡托智能分析系统的缩写,该系统由新西兰怀卡托大学开发。Weka使用Java写成的,并且限制在GNU通用公共证书的条件下发布。它可以运行于几乎所有操作平台,是一款免费的,非商业化的机器学习以及数据挖掘软件。Weka提供了一个统一界面,可结合预处理以及后处理方法,将许多不同的学习算法应用于任何所给的数据集,并评估由不同的学习方案所得出的结果。 3.实验步骤 3.1数据预处理 本实验是针对威斯康辛州(原始)的乳腺癌数据集进行分类,该表含有Sample code number(样本代码),Clump Thickness(丛厚度),Uniformity of Cell Size (均匀的细胞大小),Uniformity of Cell Shape (均匀的细胞形状),Marginal Adhesion(边际粘连),Single Epithelial Cell Size(单一的上皮细胞大小),Bare Nuclei(裸核),Bland Chromatin(平淡的染色质),Normal Nucleoli(正常的核仁),Mitoses(有丝分裂),Class(分类),其中第二项到第十项取值均为1-10,分类中2代表良性,4代表恶性。通过实验,希望能找出患乳腺癌客户各指标的分布情况。 该数据的数据属性如下: 1. Sample code number(numeric),样本代码; 2. Clump Thickness(numeric),丛厚度;

实验二-决策树实验-实验报告

决策树实验 一、实验原理 决策树是一个类似于流程图的树结构,其中每个内部结点表示在一个属性上的测试,每个分支代表一个测试输入,而每个树叶结点代表类或类分布。数的最顶层结点是根结点。一棵典型的决策树如图1所示。它表示概念buys_computer,它预测顾客是否可能购买计算机。内部结点用矩形表示,而树叶结点用椭圆表示。为了对未知的样本分类,样本的属性值在决策树上测试。决策树从根到叶结点的一条路径就对应着一条合取规则,因此决策树容易转化成分类规则。 图1 ID3算法: ■决策树中每一个非叶结点对应着一个非类别属性,树枝代表这个属性的值。一个叶结点代表从树根到叶结点之间的路径对应的记录所属的类别属性值。 ■每一个非叶结点都将与属性中具有最大信息量的非类别属性相关联。 ■采用信息增益来选择能够最好地将样本分类的属性。 信息增益基于信息论中熵的概念。ID3总是选择具有最高信息增益(或最大熵压缩)的属性作为当前结点的测试属性。该属性使得对结果划分中的样本分类所需的信息量最小,并反映划分的最小随机性或“不纯性”。 二、算法伪代码 算法Decision_Tree(data,AttributeName) 输入由离散值属性描述的训练样本集data; 候选属性集合AttributeName。 输出一棵决策树。 (1)创建节点N; (2)If samples 都在同一类C中then (3)返回N作为叶节点,以类C标记; (4)If attribute_list为空then (5)返回N作为叶节点,以samples 中最普遍的类标记;//多数表决 (6)选择attribute_list 中具有最高信息增益的属性test_attribute; (7)以test_attribute 标记节点N; (8)For each test_attribute 的已知值v //划分samples

决策树示例

决策树示例 %************************************************************** %* mex interface to Andy Liaw et al.'s C code (used in R package randomForest) %* Added by Abhishek Jaiantilal ( abhishek.jaiantilal@https://www.360docs.net/doc/a13570178.html, ) %* License: GPLv2 %* Version: 0.02 % % Calls Regression Random Forest % A wrapper matlab file that calls the mex file % This does training given the data and labels % Documentation copied from R-packages pdf % https://www.360docs.net/doc/a13570178.html,/web/packages/randomForest/randomForest.pdf % Tutorial on getting this working in tutorial_ClassRF.m %%************************************************************** % function model = classRF_train(X,Y,ntree,mtry, extra_options) % %___Options % requires 2 arguments and the rest 3 are optional % X: data matrix % Y: target values % ntree (optional): number of trees (default is 500). also if set to 0 % will default to 500 % mtry (default is floor(sqrt(size(X,2))) D=number of features in X). also if set to 0 % will default to 500 % % % Note: TRUE = 1 and FALSE = 0 below % extra_options represent a structure containing various misc. options to % control the RF % extra_options.replace = 0 or 1 (default is 1) sampling with or without % replacement % extra_options.strata = (not Implemented) % extra_options.sampsize = Size(s) of sample to draw. For classification, % if sampsize is a vector of the length the number of strata, then sampling is stratified by strata, % and the elements of sampsize indicate the numbers to be drawn from the strata. I don't yet know how this works. % extra_options.nodesize = Minimum size of terminal nodes. Setting this number larger causes

实验报告:乳腺肿瘤数据集基于决策树算法的数据挖掘

基于决策树算法的医疗数据挖掘 一、实验目的 利用商业智能分析项目中的数据分析功能,对乳腺癌数据集breast-cancer基于决策树算法进行挖掘,产生相关规则,从而预测女性乳腺癌复发的高发人群。并通过本次实验掌握决策树算法关联规则挖掘的知识及软件操作,以及提高数据分析能力。 二、实验步骤 1、在SQL server 2005中建立breast-cancer数据库,导入breast-cancer数据集; 2、对该数据集进行数据预处理,包括列名的中文翻译、以及node-caps缺失值的填充,即将‘null’填充成‘?’; 3、新建数据分析服务项目,导入数据源、新建数据源视图、新建挖掘结构,其中,将breast-cancer表中的‘序号’作为标识,‘是否复发’作为分类; 4、部署; 5、查看决策树、依赖关系网络等,并根据结果进行分析、预测。 三、实验结果分析 1、如以下三张图片所示,通过调整依赖网络图的依赖强度,可得出,在众多因素中,‘受侵淋巴结数’、‘肿瘤大小’、‘恶心肿瘤程度’这三个因素对于是否复发的影响是较大的,并且影响强度依次递减。

2、从‘全部’节点的挖掘图例可以看到,在breast-cancer数据集中,复发占了29.91%,不复发占了68.32%,说明乳腺肿瘤的复发还是占了相当一部分比例的,因此此挖掘是具备前提意义的。 3、由下两张图可知,‘受侵淋巴数’这一因素对于是否复发是决定程度是最高的。在‘受侵淋巴结数不等于0-2’(即大于0-2)节点中,复发占了50.19%的比例,不复发占了44.44%的比例,而在‘受侵淋巴结数=0-2’的节点中,复发只占了21.71%的比例,不复发占了77.98%的比例。由此可见,当受侵淋巴节点数大于‘0-2’时,复发的几率比较高。

实验三决策树算法实验实验报告

实验三决策树算法实验 一、实验目的:熟悉和掌握决策树的分类原理、实质和过程;掌握典型的学习算法和实现技术。 二、实验原理: 决策树学习和分类. 三、实验条件: 四、实验内容: 1 根据现实生活中的原型自己创建一个简单的决策树。 2 要求用这个决策树能解决实际分类决策问题。 五、实验步骤: 1、验证性实验: (1)算法伪代码 算法Decision_Tree(data,AttributeName) 输入由离散值属性描述的训练样本集data; 候选属性集合AttributeName。 输出一棵决策树。(1)创建节点N; 资料.

(2)If samples 都在同一类C中then (3)返回N作为叶节点,以类C标记;(4)If attribute_list为空then (5)返回N作为叶节点,以samples 中最普遍的类标记;//多数表决(6)选择attribute_list 中具有最高信息增益的属性test_attribute; (7)以test_attribute 标记节点N; (8)For each test_attribute 的已知值v //划分samples ; (9)由节点N分出一个对应test_attribute=v的分支; (10令Sv为samples中test_attribute=v 的样本集合;//一个划分块(11)If Sv为空then (12)加上一个叶节点,以samples中最普遍的类标记; (13)Else 加入一个由Decision_Tree(Sv,attribute_list-test_attribute)返回节点值。 (2)实验数据预处理 Age:30岁以下标记为“1”;30岁以上50岁以下标记为“2”;50岁以上标记为“3”。 Sex:FEMAL----“1”;MALE----“2” Region:INNER CITY----“1”;TOWN----“2”; RURAL----“3”; SUBURBAN----“4” Income:5000~2万----“1”;2万~4万----“2”;4万以上----“3” Married Children Car Mortgage 资料.

决策树算法研究及应用概要

决策树算法研究及应用? 王桂芹黄道 华东理工大学实验十五楼206室 摘要:信息论是数据挖掘技术的重要指导理论之一,是决策树算法实现的理论依据。决 策树算法是一种逼近离散值目标函数的方法,其实质是在学习的基础上,得到分类规则。本文简要介绍了信息论的基本原理,重点阐述基于信息论的决策树算法,分析了它们目前 主要的代表理论以及存在的问题,并用具体的事例来验证。 关键词:决策树算法分类应用 Study and Application in Decision Tree Algorithm WANG Guiqin HUANG Dao College of Information Science and Engineering, East China University of Science and Technology Abstract:The information theory is one of the basic theories of Data Mining,and also is the theoretical foundation of the Decision Tree Algorithm.Decision Tree Algorithm is a method to approach the discrete-valued objective function.The essential of the method is to obtain a clas-sification rule on the basis of example-based learning.An example is used to sustain the theory. Keywords:Decision Tree; Algorithm; Classification; Application 1 引言 决策树分类算法起源于概念学习系统CLS(Concept Learning System,然后发展 到ID3

决策树算法介绍(DOC)

3.1 分类与决策树概述 3.1.1 分类与预测 分类是一种应用非常广泛的数据挖掘技术,应用的例子也很多。例如,根据信用卡支付历史记录,来判断具备哪些特征的用户往往具有良好的信用;根据某种病症的诊断记录,来分析哪些药物组合可以带来良好的治疗效果。这些过程的一个共同特点是:根据数据的某些属性,来估计一个特定属性的值。例如在信用分析案例中,根据用户的“年龄”、“性别”、“收入水平”、“职业”等属性的值,来估计该用户“信用度”属性的值应该取“好”还是“差”,在这个例子中,所研究的属性“信用度”是一个离散属性,它的取值是一个类别值,这种问题在数据挖掘中被称为分类。 还有一种问题,例如根据股市交易的历史数据估计下一个交易日的大盘指数,这里所研究的属性“大盘指数”是一个连续属性,它的取值是一个实数。那么这种问题在数据挖掘中被称为预测。 总之,当估计的属性值是离散值时,这就是分类;当估计的属性值是连续值时,这就是预测。 3.1.2 决策树的基本原理 1.构建决策树 通过一个实际的例子,来了解一些与决策树有关的基本概念。 表3-1是一个数据库表,记载着某银行的客户信用记录,属性包括“姓名”、“年龄”、“职业”、“月薪”、......、“信用等级”,每一行是一个客户样本,每一列是一个属性(字段)。这里把这个表记做数据集D。 银行需要解决的问题是,根据数据集D,建立一个信用等级分析模型,并根据这个模型,产生一系列规则。当银行在未来的某个时刻收到某个客户的贷款申请时,依据这些规则,可以根据该客户的年龄、职业、月薪等属性,来预测其信用等级,以确定是否提供贷款给该用户。这里的信用等级分析模型,就可以是一棵决策树。在这个案例中,研究的重点是“信用等级”这个属性。给定一个信用等级未知的客户,要根据他/她的其他属性来估计“信用等级”的值是“优”、“良”还是“差”,也就是说,要把这客户划分到信用等级为“优”、“良”、“差”这3个类别的某一类别中去。这里把“信用等级”这个属性称为“类标号属性”。数据集D中“信用等级”属性的全部取值就构成了类别集合:Class={“优”,

(完整版)生物数据挖掘-决策树实验报告

实验四决策树 一、实验目的 1.了解典型决策树算法 2.熟悉决策树算法的思路与步骤 3.掌握运用Matlab对数据集做决策树分析的方法 二、实验内容 1.运用Matlab对数据集做决策树分析 三、实验步骤 1.写出对决策树算法的理解 决策树方法是数据挖掘的重要方法之一,它是利用树形结构的特性来对数据进行分类的一种方法。决策树学习从一组无规则、无次序的事例中推理出有用的分类规则,是一种实例为基础的归纳学习算法。决策树首先利用训练数据集合生成一个测试函数,根据不同的权值建立树的分支,即叶子结点,在每个叶子节点下又建立层次结点和分支,如此重利生成决策树,然后对决策树进行剪树处理,最后把决策树转换成规则。决策树的最大优点是直观,以树状图的形式表现预测结果,而且这个结果可以进行解释。决策树主要用于聚类和分类方面的应用。 决策树是一树状结构,它的每一个叶子节点对应着一个分类,非叶子节点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分成若干个子集。构造决策树的核心问题是在每一步如何选择适当的属性对样本进行拆分。对一个分类问题,从已知类标记的训练样本中学习并构造出决策树是一个自上而下分而治之的过程。 2.启动Matlab,运用Matlab对数据集进行决策树分析,写出算法名称、数据集名称、关键代码,记录实验过程,实验结果,并分析实验结果 (1)算法名称: ID3算法 ID3算法是最经典的决策树分类算法。ID3算法基于信息熵来选择最佳的测试属性,它选择当前样本集中具有最大信息增益值的属性作为测试属性;样本集的划分则依据测试属性的取值进行,测试属性有多少个不同的取值就将样本集划分为多少个子样本集,同时决策树上相应于该样本集的节点长出新的叶子节点。ID3算法根据信息论的理论,采用划分后样本集的不确定性作为衡量划分好坏的标准,用信息增益值度量不确定性:信息增益值越大,不确定性越小。因此,ID3算法在每个非叶节点选择信息增益最大的属性作为测试属性,这样可以得到当前情况下最纯的划分,从而得到较小的决策树。 ID3算法的具体流程如下: 1)对当前样本集合,计算所有属性的信息增益; 2)选择信息增益最大的属性作为测试属性,把测试属性取值相同的样本划为同一个子样本集; 3)若子样本集的类别属性只含有单个属性,则分支为叶子节点,判断其属性值并标上相应的符号,然后返回调用处;否则对子样本集递归调用本算法。 (2)数据集名称:鸢尾花卉Iris数据集 选择了部分数据集来区分Iris Setosa(山鸢尾)及Iris Versicolour(杂色鸢尾)两个种类。

机器学习实验报告

决策树算法 一、决策树算法简介: 决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。决策树方法的基本思想是:利用训练集数据自动地构造决策树,然后根据这个决策树对任意实例进行判定。其中决策树(Decision Tree)是一种简单但是广泛使用的分类器。通过训练数据构建决策树,可以高效的对未知的数据进行分类。决策数有两大优点:1)决策树模型可以读性好,具有描述性,有助于人工分析;2)效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度。 决策树算法构造决策树来发现数据中蕴涵的分类规则.如何构造精度高、规模小的决策树是决策树算法的核心内容。决策树构造可以分两步进行。第一步,决策树的生成:由训练样本集生成决策树的过程。一般情况下,训练样本数据集是根据实际需要有历史的、有一定综合程度的,用于数据分析处理的数据集。第二步,决策树的剪技:决策树的剪枝是对上一阶段生成的决策树进行检验、校正和修下的过程,主要是用新的样本数扼集(称为测试数据集)中的数据校验决策树生成过程中产生的初步规则,将那些影响预衡准确性的分枝剪除、决策树方法最早产生于上世纪60年代,到70年代末。由J Ross Quinlan 提出了ID3算法,此算法的目的在于减少树的深度。但是忽略了叶子数目的研究。C4.5算法在ID3算法的基础上进行了改进,对于预测变量的缺值处理、剪枝技术、派生规则等方面作了较大改进,既适合于分类问题,又适合于回归问题。 本节将就ID3算法展开分析和实现。 ID3算法: ID3算法最早是由罗斯昆(J. Ross Quinlan)于1975年在悉尼大学提出的一种分类预测算法,算法的核心是“信息熵”。ID3算法通过计算每个属性的信息增益,认为信息增益高的是好属性,每次划分选取信息增益最高的属性为划分标准,重复这个过程,直至生成一个能完美分类训练样例的决策树。 在ID3算法中,决策节点属性的选择运用了信息论中的熵概念作为启发式函数。

新决策树例子

rpart包的rpart函数 Iris数据集 library(rpart) #加载rpart包 head(iris) #看看iris数据集里有哪些变量 iris以鸢尾花的特征作为数据来源,数据集包含150个数据,分为3类,每类50个数据,每个数据包含4个属性分别是花萼长度、花萼宽带、花瓣长度、花瓣宽度 用gini度量纯度 iris.rp1=rpart(Species~.,data=iris,method="class",parms=list(split="g ini")) # rpart(formula, data, method, parms, ...)得到决策树对象,其中(1)formula是回归方程的形式,y~x1+x2+…,iris一共有5个变量,因变量是Species,自变量是其余四个变量,所以formula可以省略为 Species~. (2)data是所要学习的数据集 (3)method根据因变量的数据类型有如下几种选择:anova(连续型),poisson (计数型),class(离散型),exp(生存型),因为我们的因变量是花的种类,属于离散型,所以method选择class (4)parms可以设置纯度的度量方法,有gini(默认)和information(信息增益)两种。 plot(iris.rp1, uniform=T, branch=0, margin=0.1,main="Classification Tree\nIris Species by Petal and Sepal Length") #plot的对象是由rpart得到的决策树对象,可以把这课决策树画出来,其中 (1) uniform可取T,F两个值,T表示图形在空间上均匀分配 (2) branch刻画分支的形状,取值在0和1之间,branch=0是倒v型,branch=1是直角型,而当branch属于(0,1)时是梯形

实验三-决策树算法实验实验报告

实验三-决策树算法实验实验报告

实验三决策树算法实验 一、实验目的:熟悉和掌握决策树的分类原理、实质和过程;掌握典型的学习算法和实现技术。 二、实验原理: 决策树学习和分类. 三、实验条件: 四、实验内容: 1 根据现实生活中的原型自己创建一个简单的决策树。 2 要求用这个决策树能解决实际分类决策问题。 五、实验步骤: 1、验证性实验: (1)算法伪代码 算法Decision_Tree(data,AttributeName) 输入由离散值属性描述的训练样本集

data; 候选属性集合AttributeName。 输出一棵决策树。(1)创建节点N; (2)If samples 都在同一类C中then (3)返回N作为叶节点,以类C标记;(4)If attribute_list为空then (5)返回N作为叶节点,以samples 中最普遍的类标记;//多数表决(6)选择attribute_list 中具有最高信息增益的属性test_attribute; (7)以test_attribute 标记节点N; (8)For each test_attribute 的已知值v //划分samples ; (9)由节点N分出一个对应test_attribute=v的分支; (10令Sv为samples中test_attribute=v 的样本集合;//一个划分块(11)If Sv 为空then (12)加上一个叶节点,以samples中最普遍的类标记; (13)Else 加入一个由Decision_Tree(Sv,attribute_list-test_attribute)返回节点

随机森林实验报告

随机森林实验报告 实验目的 实现随机森林模型并测试。 实验问题 Kaggle第二次作业Non-linear classification 算法分析与设计 一.算法设计背景: 1.随机森林的原子分类器一般使用决策树,决策树又分为拟合树和分类树。这两者的区别在于代价估值函数的不同。 2.根据经验,用拟合树做分类的效果比分类树略好。 3.对于一个N分类问题,它总是可以被分解为N个2分类问题,这样分解的好处是其决策树更加方便构造,更加简单,且更加有利于用拟合树来构建分类树。对于每一个2分类问题,构造的树又叫CART树,它是一颗二叉树。 4.将N个2分类树的结果进行汇总即可以得到多分类的结果。 树构造:

6.随机森林构造: 二.算法思路: 将一个N分类问题转化为N个二分类问题。转化方法是:构造N棵二叉拟合树,这里假设N为26,然后我们给N棵二叉树依次标号为1,2,3...26。1号树的结果对应于该条记录是不是属于第一类,是则输出1,否则输出号树的结果对应于该条记录是不是属于第二类,是则1否则0,依此类推。这样,我们的26棵二叉树的结果就对应了26个下标。 例如对于某条记录,这26个二叉树的结果按序号排列为{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...1,0},那么这条记录的分类应该为25。要将一个26维的0,1序列变回

一个索引,我们只需要找出这个序列中值最大的元素的索引,这个索引即是序列号。 我们将上面的26棵分别对26个索引做是否判断的二分类树视为一个整体,在多线程的环境下,构造多个这样的整体,然后进行求和运算,最后取出每个结果序列中值最大的元素的下标作为分类值,那么久得到了我们想要的结果,随机森林完成。 三.算法流程: 1.读入训练集trainset,测试集testset 2.将训练集分割为输入trainIn,输出trainOut 3.这里假设类别数N为26,将trainOut[记录条数] 映射为 transformTrainOut[训练记录数][26] 4.初始化transformTestOut[测试记录数][26]全部为0 i = 1 : ForestSize: 策树 在这里,我们每一次26分类是由26棵CART共同完成的,CART的cost function采用的是gini系数,CART的最大层数为7,分裂停止条件为当前节点GINI为0或者当前节点所在层数到达了7. 2.随机森林 a.随机森林每次循环的训练集采样为原训练集的. b.对于森林中每一棵决策树每一次分割点的选取,对属性进行了打乱抽样,抽样数为25,即每次分割只在25个属性中寻找最合适的值。并且对于每个选取的属性,我们进行了行采样。即如果这个属性所拥有的属性值数大于30,我们选取其中30个作为分割候选,如果小于30,则全部纳入分割候选。 四.代码详解 1.训练集/测试集的读入 a.在中定义了:

决策树程序实验

决策树程序实验 众所周知,数据库技术从20世纪80年代开始,已经得到广泛的普及和应用。随着数据库容量的膨胀,特别是数据仓库以及web等新型数据源的日益普及,人们面临的主要问题不再是缺乏足够的信息可以使用,而是面对浩瀚的数据海洋如何有效地利用这些数据。 从数据中生成分类器的一个特别有效的方法是生成一个决策树(Decision Tree)。决策树表示方法是应用最广泛的逻辑方法之一,它从一组无次序、无规则的事例中推理出决策树表示形式的分类规则。决策树分类方法采用自顶向下的递归方式,在决策树的内部结点进行属性值的比较并根据不同的属性值判断从该结点向下的分支,在决策树的叶结点得到结论。所以从决策树的根到叶结点的一条路径就对应着一条合取规则,整棵决策树就对应着一组析取表达式规则。 决策树是应用非常广泛的分类方法,目前有多种决策树方法,如ID3、CN2、SLIQ、SPRINT等。 一、问题描述 相关信息 决策树是一个类似于流程图的树结构,其中每个内部结点表示在一个属性上的测试,每个分支代表一个测试输入,而每个树叶结点代表类或类分布。数的最顶层结点是根结点。一棵典型的决策树如图1所示。它表示概念buys_computer,它预测顾客是否可能购买计算机。内部结点用矩形表示,而树叶结点用椭圆表示。为了对未知的样本分类,样本的属性值在决策树上测试。决策树从根到叶结点的一条路径就对应着一条合取规则,因此决策树容易转化成分类规则。 图1 ID3算法: ■决策树中每一个非叶结点对应着一个非类别属性,树枝代表这个属性的值。一个叶结点代表从树根到叶结点之间的路径对应的记录所属的类别属性值。 ■每一个非叶结点都将与属性中具有最大信息量的非类别属性相关联。 ■采用信息增益来选择能够最好地将样本分类的属性。 信息增益基于信息论中熵的概念。ID3总是选择具有最高信息增益(或最大熵压缩)的属性作为当前结点的测试属性。该属性使得对结果划分中的样本分类所需的信息量最小,并反映划分的最小随机性或“不纯性”。 问题重述 1、目标概念为“寿险促销” 2、计算每个属性的信息增益 3、确定根节点的测试属性

ID3算法实验报告

ID3算法实验 08级第一小组介绍: ID3算法可分为主算法和建树算法两种。 (1)ID3主算法。主算法流程如图所示。其中PE、NE分别表示正例和反例集,它们共同组成训练集。PE'、PE''和NE'、NE''分别表示正例集和反例集的子集。 ID3主算法流程 (2)建树算法。采用建树算法建立决策树。首先,对当前子例进行同类归集。其次,计算各集合属性的互信息,选择互信息最大的属性Ak。再次,将在Ak处取值相同的子例归于同一子集,Ak取几个值就几个子集。最后,对既含正例又含反例的子集递归调用建树算法。若子集仅含正例或反例,对应分支标上P或N,返回调用处。 ID3算法采用自顶向下不回溯的策略搜索全部属性空间并建立决策树,算法简单、深度小、分类速度快。但是,ID3算法对于大的属性集执行效率下降快、准确性降低,并且学习能力低下。考虑到本文所涉及到的数据量并很小,下文分类分析采用了该算法。 决策树学习是把实例从根结点排列到某个叶子结点来分类实例,叶子结点即为实例所属的分类。学习到的决策树能再被表示成多个if-then的规则。ID3算法是一种决策树算法。 对下载的ID3算法程序进行阅读和调试后,做了相关实验,以下是相关记录。 1、试验数据 该算法的试验数据有两个:data.dat和data.tag,分别存放训练样例和各个属性列表:

data.dat: data.tag: 其中,训练样例集合的试验数据由课本第3.4。2节给出,分别将其属性使用离散值数据表示,在data.tag文件中可以看到离散值其表示的属性分别对应。 2、运行结果 试验结果,是以if-then形式输出决策树,其运行界面如图:

数据挖掘及决策树

理工大学信息工程与自动化学院学生实验报告 ( 2016 — 2017 学年第学期) 信自楼444 一、上机目的及容 目的: 1.理解数据挖掘的基本概念及其过程; 2.理解数据挖掘与数据仓库、OLAP之间的关系 3.理解基本的数据挖掘技术与方法的工作原理与过程,掌握数据挖掘相关工具的使用。 容: 给定AdventureWorksDW数据仓库,构建“Microsoft 决策树”模型,分析客户群中购买自行车的模式。 要求: 利用实验室和指导教师提供的实验软件,认真完成规定的实验容,真实地记录实验中遇到的 二、实验原理及基本技术路线图(方框原理图或程序流程图) 请描述数据挖掘及决策树的相关基本概念、模型等。 1.数据挖掘:从大量的、不完全的、有噪音的、模糊的、随机的数据中,提取隐含在其中的、 人们事先不知道的、但又潜在有用的信息和知识的过程。

项集的频繁模式 分类与预测分类:提出一个分类函数或者分类模型,该模型能把数据库中的数据项 映射到给定类别中的一个; 预测:利用历史数据建立模型,再运用最新数据作为输入值,获得未来 变化趋势或者评估给定样本可能具有的属性值或值的围 聚类分析根据数据的不同特征,将其划分为不同数据类 偏差分析对差异和极端特例的描述,揭示事物偏离常规的异常现象,其基本思想 是寻找观测结果与参照值之间有意义的差别 3.决策树:是一种预测模型,它代表的是对象属性与对象值之间的一种映射关系。树中每个 节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从 根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输 出,可以建立独立的决策树以处理不同输出。 算法概念 ID3 在实体世界中,每个实体用多个特征来描述。每个特征限于在一 个离散集中取互斥的值 C4.5 对ID3算法进行了改进: 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选 择取值多的属性的不足;在树构造过程中进行剪枝;能够完成对 连续属性的离散化处理;能够对不完整数据进行处理。 三、所用仪器、材料(设备名称、型号、规格等或使用软件) 1台PC及Microsoft SQL Server套件 四、实验方法、步骤(或:程序代码或操作过程) (一)准备 Analysis Services 数据库 1.Analysis Services 项目创建成功

决策树实验指导书-R

决策树实验指导书 实验目的: 1掌握利用R进行决策树的基本步骤 2更深入理解决策树的应用 实验内容: 说明:本实验采用iris数据集,下面中的数据集如无上下文说明,即是指iris iris以鸢尾花的特征作为数据来源,数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性,是在数据挖掘、数据分类中非常常用的测试集、训练集。 四个属性分别为:花萼长度、花萼宽带、花瓣长度、花瓣宽度 三类分别为:setosa, versicolor, virginica(山鸢尾、变色鸢尾和维吉尼亚鸢尾) 1、加载rpart包 ("rpart") 2、构建决策树,并解释rpart中三个参数的含义 = rpart(Species~., iris, method=“class”) 3、画出决策树 plot, uniform=T, branch=0, margin=, main=" Classification Tree\nIris Species by Petal and Sepal Length")iris .

4、添加决策树的标签 text, =T, fancy=T, col="blue") 5、根据命令table(iris$Species)给出的结果,解释决策树的分类结果 6、用决策树进行预测 生成训练集=iris[2*(1:75)-1,] 生成测试集= iris[2*(1:75),] =rpart(Species~., , method=“class”) =predict, [,-5], type="class") 7、查看预测结果并对结果进行分析,计算出该决策树的accuracy(分类正确的样本数除以总样本数) table[,5],

决策树实例计算

计算题 一 1.为生产甲产品,小行星公司设计了两个基本方案:一是建大工厂,二是建小工厂。如果销路好,3年以后考虑扩建。建大工厂需投资300万元,建小工厂需投资160万元,3年后扩建另需投资140万元。扩建后可使用7年,其年度损益值与大工厂相同。每种自然状态的预测概率及年度损益值如下表: 前 3 年 后 7 年 根据上述资料试用决策树法做出决策。 四、计算题(15分)

答:建大厂收益=581-300=281 建小厂收益=447-160=287 所以应选择建小厂方案。 二 山姆公司的生产设备已经落后,需要马上更新。公司有人认为,目前产品销路增长,应在更新设备的同时扩大再生产的规模。但也有人认为,市场形势尚难判断,不如先更新设备,3年后再根据形势变化考虑扩大再生产的规模问题。这样,该公司就面临着两个决策方案。决策分析的有关资料如下: A、现在更新设备,需投资35万元, 3年后扩大生产规模,另需投资40万元。 B、现在更新设备的同时扩大再生产的规模,需投资60万元。 C、现在只更新设备,在销售情况良好时,每年可获利6万元;在销售情况不好时,每年可获利4、5万元。 D、如果现在更新与扩产同时进行,若销售情况好,前3年每年可获利12万元;后7年每年可获利15万元;若销售情况不好,每年只获利3万元。 E、每种自然状态的预测概率如下表

前 3 年 后 7 年 根据上述资料试用决策树法做出决策。 答案:

结点7收益值=0、85×7 × 15+0、15 ×7 ×3=92、4(万元)

结点8收益值=0、85×7 ×6+0、15 ×7 ×4、5=40、4(万元) 结点9收益值=0、1×7 × 15+0、9 ×7 ×3=29、4(万元) 结点10收益值=0、1×7 × 6+0、9 ×7 ×4、5=32、6(万元) 结点1收益值=0、7×[52、4+(3 × 6)]+0、3 ×[32、6+(3 × 4、5)]=63、1(万元) 结点2收益值=0、7×[92、4+(3 × 12)]+0、3 ×[29、4+(3 × 3)]=101、4(万元) 答:用决策树法进行决策应选择更新扩产方案,可获得收益41、4万元。 三 某厂准备生产Y种新产品,对未来的销售前景预测不准,可能出现高需求、中需求、低需求三种自然状态。组织有三个方案可供选择:新建一个车间;扩建原有车间;对原有车间的生产线进行局部改造。三个方案在5年内的经济效益见下表(单位:万元): 0 1 请分别用悲观决策法、乐观决策法、最大最小后悔决策法做出决策。 悲观决策法指当存在几种自然状态的情况下,宁可把情况估计得坏一 些,从中选择一个收益最大的方案,决策稳妥可靠。按此准则,在低需求的自然状态下,5年内新建方案亏损160万,扩建方案保本,改造方案获利80万。改造方案最佳。 乐观决策法: 新建E=(0、7X600)+(1-0、7)X(-160)=372(万元) 扩建E=(0、7X400)+ (1-0、7)X0=280 (万元) 改造E=(0、7X300)+ (1-0、7)X80=234 (万元) 比较结果,新建方案最佳。 最大最小后悔决策,是用后悔值计算表进行计算的: 后悔值计算表

机器学习实验报告

《机器学习》课内实验报告(1) ID算法实现决策树2015 - 2016学年第 2 学期 专业:智能科学与技术 班级:智能1301班 学号:06133029 姓名:张争辉

一、实验目的: 理解ID3算法的基本原理,并且编程实现。 二、实验要求: 使用C/C++/MATLAB实现ID3算法。 输入: 若干行,每行 5 个字符串,表示 Outlook Temperature Humidity Wind Play ball 如上表。 输出: 决策树。 实验结果如下: 输入: Sunny Hot High Weak No Sunny Hot High Strong No Overcast Hot High Weak Yes Rain Mild High Weak Yes Rain Cool Normal Weak Yes Rain Cool Normal Strong No Overcast Cool Normal Strong Yes Sunny Mild High Weak No Sunny Cool Normal Weak Yes Rain Mild Normal Weak Yes Sunny Mild Normal Strong Yes Overcast Mild High Strong Yes Overcast Hot Normal Weak Yes Rain Mild High Strong No 输出: Outlook Rain Wind Strong No Weak Yes Overcast Yes Sunny Humidity

Normal Yes High No 三、具体实现: 实现算法如下: #include #include #include #include using namespace std; #define ROW 14 #define COL 5 #define log2 0.69314718055 typedef struct TNode { char data[15]; char weight[15]; TNode * firstchild,*nextsibling; }*tree; typedef struct LNode { char OutLook[15]; char Temperature[15]; char Humidity[15]; char Wind[15]; char PlayTennis[5]; LNode *next; }*link; typedef struct AttrNode { char attributes[15];//属性 int attr_Num;//属性的个数 AttrNode *next; }*Attributes; char * Examples[ROW][COL] = {//"OverCast","Cool","High","Strong","No", // "Rain","Hot","Normal","Strong","Yes", "Sunny","Hot","High","Weak","No", "Sunny","Hot","High","Strong","No", "OverCast","Hot","High","Weak","Yes",

决策树 实验报告

实验(实习)名称决策树分析 一.实验要求: (1)学习决策树分类学习方法,学习其中C4.5学习算法,了解其他ADtree、Id3等其它分类学习方法。 (2)应用Weka软件,学会导入数据文件,并对数据文件进行预处理。 (3)学会如何选择学习函数并调节学习训练参数以达到最佳学习效果。 (4)学习并应用其他决策树学习算法,可以进行各种算法对照比较。 二.实验操作 (1)在开始程序(或者桌面图标)中找到WEKA3.6.2,单击即可启动WEKA,启动WEKA 时会发现首先出现的一个命令提示符。接着将出现如下Weka GUI Chooser界面。 (2)选择GUI Chooser中的探索者(Explorer)用户界面。点击预处理(Preprocess)功能按钮的,Open file,选择其中的“weather”数据作关联规则的分析。打开“weather.arff”,可以看到“Current relation”、“Attributes”“Selected attribute”三个区域。 (3)点击“Classify”选项卡。单击左上方的Choose按钮,在随后打开的层级式菜单中的tree部分找到J48。 (4)选中J48分类器后,J48以及它的相关默认参数值出现在Choose按钮旁边的条形框中。单击这个条形框会打开J48分类器的对象编辑器,编辑器会显示J48的各个参数的含义。根据实际情况选择适当的参数,探索者通常会合理地设定这些参数的默认值。 三.实验结果:

计算正确率可得: (74+132)/(74+30+64+132)=0.69 四.实验小结: 通过本次试验,我学习了决策树分类方法,以及其中C4.5算法,并了解了其他ADtree、Id3等其它分类方法,应用Weka软件,学会导入数据文件,并对数据文件进行预处理,今后还需努力。 。

相关文档
最新文档