运行环境:
window10 dev-c++5.11
决策树的实现除了,关于叶结点的类别赋值作弊了以下,其它基本依照CART生成算法实现
阅读本文之前,最好对决策树有一个认知,下文不会提到具体的步骤,建议先百度一下
训练数据集
x1,x2,x3,x4,y
3.6216,8.6661,-2.8073,-0.44699,0
4.5459,8.1674,-2.4586,-1.4621,0
3.866,-2.6383,1.9242,0.10645,0
3.4566,9.5228,-4.0112,-3.5944,1
0.32924,-4.4552,4.5718,-0.9888,1
4.3684,9.6718,-3.9606,-3.1625,1
保存为CSV文件,基于以上数据构造决策树
决策树为一棵二叉树
因此,需要定义一个结构体
struct tree{
int index;// index
double flag;// class
float score;// gini score
double value;// value = data[x][index]
double **left_array;// left array set
double **right_array;// right array set
int left_size;// length(left_array)
int right_size;// length(right_array)
struct tree *left;// left subtree
struct tree *right;// right right subtree
};
数据集拆分,在构造决策树时需要对数据集进行拆分,定义一个结构体
struct gini{
int index;// index
double value;// value = data[x][index]
float score;// gini index
double **left;// left array
double **right;// right array
int left_size;// length(left_array)
int right_size;// length(right_size)
struct gini *next;// 链接下一个
};
数据集拆分时,需要一个单链表来记录满足条件的数组下标
struct node{
int data;
struct node *next;
};
基尼指数的计算问题
Gini(D,A)=|D1||D|Gini(D1)+|D2||D|Gini(D2) G i n i ( D , A ) = | D 1 | | D | G i n i ( D 1 ) + | D 2 | | D | G i n i ( D 2 )
Gini(D1)=1−∑ki