1. 程式人生 > >機器學習實戰(2)-決策樹

機器學習實戰(2)-決策樹

構建決策樹最重要的是分裂屬性的選取,重要的是每個屬性在節點的位置,比如說第一個節點屬性為什麼是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)