经典的决策树包括ID3、C4.5、和CART,其中ID3和C4.5算法只有树的生成,容易造成过拟合。C4.5是ID3的改进版,用信息增益比选择特征。
决策树算法包括三部分,特征选择、树的生成和树的剪枝。
CART是应用广泛的决策树学习方法,中文名叫分类与回归树,英文名是classification and regression tree,既可以用于分类也可以用于回归。现在基于李航同学的《统计学习方法》CART的写了一段代码。代码的部分如下,以后还会修改
#include <vector>
using namespace std;
struct data{
int id;
vector<int> feature;
int classtype;
};
class Dataset{
public:
//得到类别数量
int getAllTypeNum(){
int max = all[0].classtype;
for(int i=1;i<all.size();i++){
if(all[i].classtype>max){
max = all[i].classtype;
}
}
max = max + 1;
}
//求各个类别样本数目
vector<int> getTypeNum(){
int num = getAllTypeNum();
vector<int> typeNum(num);
int index = 0;
for(int i=0;i<all.size();i++){
index = all[i].classtype;
typeNum[index]++;
}
return typeNum;
}
//得到基尼指数
float get_gini(){
vector<int> typeNum = getTypeNum();
int num = getAllTypeNum();
float gini = 0;
for(int i=0;i<num;i++){
gini = gini + (typeNum[i]/num)*(typeNum[i]/num);
}
gini = 1 - gini;
return gini;
}
//样本集合D根据特征特征A是否取某个可能值划分为两部分
void partition_D(){
}
//特征A条件下集合D的基尼指数
float Gini_D_A(int A,int value){
}
//计算各特征的基尼指数
private:
vector<data> all;
float gini;//基尼指数
float allTypeNum;//分类的类别数量
vector<int> typeNum;//各个类别的数目
protected:
}
int main(){
return 0;
}