构建决策树最重要的是分裂属性的选取,重要的是每个属性在节点的位置,比如说第一个节点属性为什么是A而不是B。分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集更加的纯,所谓的纯是指尽量让一个分裂子集中待分类项属于同一类别。判断纯的方法有ID3,C4.5,CART算法。
其实这个纯就是指用一个度量值表示根据这个属性划分的目标类别确定性大小。
ID3是用信息增益(信息不确定性减少的程度)来表示这个纯。而ID3算法跟每个属性的样本数有关,样本数多的对应的属性的信息增益比较大,所以采用C4.5中选用信息增益率来进行最优属性节点的划分。
摘自https://zhuanlan.zhihu.com/p/26703300。
信息熵:所有可能事件发生前对产生信息量的期望,可以表示事情的复杂程度,一件事情越复杂,产生的情况越多,期望事情发生后带来的信息量也就越大。猜不透^_^。
例子: 上浮或有蹼进行分类,代码不具有通用型,只供理解用。
clc,clear; %原始数据 dataSet = [1,1,1; 1,1,1; 1,0,0; 0,1,0; 0,1,0;]; %计算信息熵 liveradio = 2 /5; dieradio = 3 /5; entroy = -1.0 * (liveradio *log2(liveradio) + dieradio * log2(dieradio)); %计算条件熵 %浮鱼熵 floatEntroy = -1.0*( 2 /3 *log2(2/3) + 1/3 *log2(1/3)); noFloatEntroy = -1.0 *( 0 /2 * log2(0/2) + 2/2 *log2(2/2)); %浮鱼条件熵 floatTEntroy = 3/5 * floatEntroy + 2/5 * noFloatEntroy; %浮鱼信息熵增益 floatEntroyGain = entroy - floatTEntroy; %蹼 webEntroy = -1*(2 /4 * log2(2/4) + 2 /4 * log2(2/4)); noWebEntroy = -1 *( 0/1 *log2(0/1) + 1/1 *log2(1/1)); %蹼条件熵 webTEntroy = 4/5 * webEntroy + 1/5 * noWebEntroy; %蹼信息熵增益 webEntroyGain = entroy - webTEntroy; %返回最好的特征列 if(floatEntroyGain > webEntroyGain) bestFeature = 0; else bestFeature =1; end %测试数据 testData = [1,1,1; 1,0,2; 0,0,3; 0,1,4; 1,1,5; 1,0,6; 0,0,7; 0,1,8]; %构建决策树 leftDataindex = find(testData(:,bestFeature) == 1); leftData = testData(leftDataindex,:); leftData(:,bestFeature) =[]; %去除那一列 leftData2index = find(leftData(:,1) ==1); leftData2 = leftData(leftData2index,2); rightData2index = find(leftData(:,1) ==0); rightData2 = leftData(rightData2index,2); rightDataindex = find(testData(:,bestFeature) == 0); rleftData = testData(rightDataindex,:); rleftData(:,bestFeature) =[]; %去除那一列 rleftData2index = find(rleftData(:,1) ==1); rleftData2 = rleftData(rleftData2index,2); rrightData2index = find(rleftData(:,1) ==0); rrightData2 = rleftData(rrightData2index,2); disp(leftData2) disp(rightData2) disp(rleftData2) disp(rrightData2)