MATLAB机器学习系列-9:决策树和随机森林的原理及其例子代码实现
決策樹
原理
- 決策樹通過把樣本實例從根節點排列到某個葉子節點來對其進
行分類。樹上的每個非葉子節點代表對一個屬性取值的測試,
其分支就代表測試的每個結果;而樹上的每個葉子節點均代表
一個分類的類別,樹的最高層節點是根節點。 - 簡單地說,決策樹就是一個類似流程圖的樹形結構,采用自頂
向下的遞歸方式,從樹的根節點開始,在它的內部節點上進行
屬性值的測試比較,然后按照給定實例的屬性值確定對應的分
支,最后在決策樹的葉子節點得到結論。這個過程在以新的節
點為根的子樹上重復。
ID3
熵:描述的不確定性因素(等于樣本種類數越多)越大,熵值就越大。如果不確定性因素太小(如只有一個類別)則熵等于0。
信息增益:=原始熵-根據某個屬性確定得到的新的熵。
信息增益越大,則表明這個屬性包括的信息越多。
原始熵是不考慮任何屬性,直接計算正力負例的熵(以二分類為例),
然后根據某一屬性,計算這個屬性下有哪些正例負例,再計算一次熵。兩者相減即得到信息增益。
C4.5
信息增益算法有一個缺陷,會傾向于選擇屬性值較多的屬性。如果樣本中有姓名這個屬性,因為人的名字不同,信息增益可能會根據名字來分類,這時不科學的。
CART
基尼指數是另外一種數據的不純度的度量方法,其定義如下:
其中的m仍然表示數據集D中類別C的個數,Pi表示D中任意一個記錄屬于Ci的概率,計算時Pi=(D中屬于Ci類的集合的記錄個數/|D|)。如果所有的記錄都屬于同一個類中,則P1=1,Gini(D)=0,此時不純度最低。在CART(Classification and Regression Tree)算法中利用基尼指數構造二叉決策樹,對每個屬性都會枚舉其屬性的非空真子集,以屬性R分裂后的基尼系數為:
D1為D的一個非空真子集,D2為D1在D的補集,即D1+D2=D,對于屬性R來說,有多個真子集,即GiniR(D)有多個值,但我們選取最小的那么值作為R的基尼指數。最后:
Gini?增量最大的屬性作為最佳分裂屬性。
決策樹算法優缺點
優點
- 決策樹易于理解和實現。 人們在通過解釋后都有能力去理解決策樹所表達的意義。
- 對于決策樹,數據的準備往往是簡單或者是不必要的。其他的技術往往要求先把數據歸一化,比如去掉多余的或者空白的屬性。
- 能夠同時處理數據型和常規型屬性。 其他的技術往往要求數據屬性的單一。
- 是一個白盒模型。如果給定一個觀察的模型,那么根據所產生的決策樹很容易推出相應的邏輯表達式。
缺點
- 對于各類別樣本數量不一致的數據,在決策樹當中信息增益的結果偏向于那些具有更多數值的特征。
- 決策樹內部節點的判別具有明確性,這種明確性可能會帶來誤導。
隨機森林
決策樹代碼
決策樹-乳腺癌診斷
在這里插入代碼片 %% I. 清空環境變量 clear all clc warning off%% II. 導入數據 load data.mat%% % 1. 隨機產生訓練集/測試集 a = randperm(569); Train = data(a(1:500),:); Test = data(a(501:end),:);%% % 2. 訓練數據 P_train = Train(:,3:end); T_train = Train(:,2);%% % 3. 測試數據 P_test = Test(:,3:end); T_test = Test(:,2);%% III. 創建決策樹分類器 ctree = ClassificationTree.fit(P_train,T_train);%% % 1. 查看決策樹視圖 view(ctree); view(ctree,'mode','graph');%% IV. 仿真測試 T_sim = predict(ctree,P_test);%% V. 結果分析 count_B = length(find(T_train == 1)); count_M = length(find(T_train == 2)); rate_B = count_B / 500; rate_M = count_M / 500; total_B = length(find(data(:,2) == 1)); total_M = length(find(data(:,2) == 2)); number_B = length(find(T_test == 1)); number_M = length(find(T_test == 2)); number_B_sim = length(find(T_sim == 1 & T_test == 1)); number_M_sim = length(find(T_sim == 2 & T_test == 2)); disp(['病例總數:' num2str(569)...' 良性:' num2str(total_B)...' 惡性:' num2str(total_M)]); disp(['訓練集病例總數:' num2str(500)...' 良性:' num2str(count_B)...' 惡性:' num2str(count_M)]); disp(['測試集病例總數:' num2str(69)...' 良性:' num2str(number_B)...' 惡性:' num2str(number_M)]); disp(['良性乳腺腫瘤確診:' num2str(number_B_sim)...' 誤診:' num2str(number_B - number_B_sim)...' 確診率p1=' num2str(number_B_sim/number_B*100) '%']); disp(['惡性乳腺腫瘤確診:' num2str(number_M_sim)...' 誤診:' num2str(number_M - number_M_sim)...' 確診率p2=' num2str(number_M_sim/number_M*100) '%']);%% VI. 葉子節點含有的最小樣本數對決策樹性能的影響 leafs = logspace(1,2,10);N = numel(leafs);err = zeros(N,1); for n = 1:Nt = ClassificationTree.fit(P_train,T_train,'crossval','on','minleaf',leafs(n));err(n) = kfoldLoss(t); end plot(leafs,err); xlabel('葉子節點含有的最小樣本數'); ylabel('交叉驗證誤差'); title('葉子節點含有的最小樣本數對決策樹性能的影響')%% VII. 設置minleaf為13,產生優化決策樹 OptimalTree = ClassificationTree.fit(P_train,T_train,'minleaf',13); view(OptimalTree,'mode','graph')%% % 1. 計算優化后決策樹的重采樣誤差和交叉驗證誤差 resubOpt = resubLoss(OptimalTree) lossOpt = kfoldLoss(crossval(OptimalTree))%% % 2. 計算優化前決策樹的重采樣誤差和交叉驗證誤差 resubDefault = resubLoss(ctree) lossDefault = kfoldLoss(crossval(ctree))%% VIII. 剪枝 [~,~,~,bestlevel] = cvLoss(ctree,'subtrees','all','treesize','min') cptree = prune(ctree,'Level',bestlevel); view(cptree,'mode','graph')%% % 1. 計算剪枝后決策樹的重采樣誤差和交叉驗證誤差 resubPrune = resubLoss(cptree) lossPrune = kfoldLoss(crossval(cptree))隨機森林代碼
%% I. 清空環境變量 clear all clc warning off%% II. 導入數據 load data.mat%% % 1. 隨機產生訓練集/測試集 a = randperm(569); Train = data(a(1:500),:); Test = data(a(501:end),:);%% % 2. 訓練數據 P_train = Train(:,3:end); T_train = Train(:,2);%% % 3. 測試數據 P_test = Test(:,3:end); T_test = Test(:,2);%% III. 創建隨機森林分類器 model = classRF_train(P_train,T_train);%% IV. 仿真測試 [T_sim,votes] = classRF_predict(P_test,model);%% V. 結果分析 count_B = length(find(T_train == 1)); count_M = length(find(T_train == 2)); total_B = length(find(data(:,2) == 1)); total_M = length(find(data(:,2) == 2)); number_B = length(find(T_test == 1)); number_M = length(find(T_test == 2)); number_B_sim = length(find(T_sim == 1 & T_test == 1)); number_M_sim = length(find(T_sim == 2 & T_test == 2)); disp(['病例總數:' num2str(569)...' 良性:' num2str(total_B)...' 惡性:' num2str(total_M)]); disp(['訓練集病例總數:' num2str(500)...' 良性:' num2str(count_B)...' 惡性:' num2str(count_M)]); disp(['測試集病例總數:' num2str(69)...' 良性:' num2str(number_B)...' 惡性:' num2str(number_M)]); disp(['良性乳腺腫瘤確診:' num2str(number_B_sim)...' 誤診:' num2str(number_B - number_B_sim)...' 確診率p1=' num2str(number_B_sim/number_B*100) '%']); disp(['惡性乳腺腫瘤確診:' num2str(number_M_sim)...' 誤診:' num2str(number_M - number_M_sim)...' 確診率p2=' num2str(number_M_sim/number_M*100) '%']);%% VI. 繪圖 figureindex = find(T_sim ~= T_test); plot(votes(index,1),votes(index,2),'r*') hold onindex = find(T_sim == T_test); plot(votes(index,1),votes(index,2),'bo') hold onlegend('錯誤分類樣本','正確分類樣本')plot(0:500,500:-1:0,'r-.') hold onplot(0:500,0:500,'r-.') hold online([100 400 400 100 100],[100 100 400 400 100])xlabel('輸出為類別1的決策樹棵數') ylabel('輸出為類別2的決策樹棵數') title('隨機森林分類器性能分析')%% VII. 隨機森林中決策樹棵數對性能的影響 Accuracy = zeros(1,20); for i = 50:50:1000i%每種情況,運行100次,取平均值accuracy = zeros(1,100);for k = 1:100% 創建隨機森林model = classRF_train(P_train,T_train,i);% 仿真測試T_sim = classRF_predict(P_test,model);accuracy(k) = length(find(T_sim == T_test)) / length(T_test);endAccuracy(i/50) = mean(accuracy); end%% % 1. 繪圖 figure plot(50:50:1000,Accuracy) xlabel('隨機森林中決策樹棵數') ylabel('分類正確率') title('隨機森林中決策樹棵數對性能的影響')代碼和數據百度云
鏈接:https://pan.baidu.com/s/1rGGk-t55BcgaRg3tDGAqzQ 提取碼:egs5 復制這段內容后打開百度網盤手機App,操作更方便哦作者:電氣工程的計算機萌新-余登武
總結
以上是生活随笔為你收集整理的MATLAB机器学习系列-9:决策树和随机森林的原理及其例子代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇中面签后多久到账
- 下一篇: Keras .ImageDataGene