機器學習監督演算法之決策樹與隨機森林

2021-10-05 11:18:53 字數 3850 閱讀 7739

2 決策樹演算法的應用

3 模型拓展

首先對資料進行處理,利用歸納演算法生成可讀的規則和決策樹,然後使用決策對新資料進行分析。其本質是監督學習的分類演算法

決策樹演算法似乎經歷過許多變化,派生出許多類別,但由於我水平有限,只是列幾個,並不深知他們的區別。

id3,c4.5,cart

這個帖子對我受益匪淺,講清了決策樹演算法的原理,當然了,實際上我們也用不到,不過如果從0寫決策樹演算法的話,顯然是必須的了。

絕大部分情況適用於分類的,但是其也具有擬合的功能。決策樹對雜訊資料有很好的健壯性,可以處理多個維度的資料,即使維度非常多也完全可以勝任(比如幾十個維度)。並且不需要過多的訓練資料(有時只需幾十個),就可以得到準確率較高的決策樹。

特徵選擇

決策樹的生成

決策樹的剪枝

目前我知道的matlab寫決策樹有兩個方便的封裝函式。

一種是matlab自帶的classificationtree.fit()函式,也是下方使用的函式。

另一種是matlab自帶的treebagger()函式,treebagger()函式的語法可以參考下面這個**。【注意,這個**說是隨機森林演算法,實際上只是通過設定特殊引數實現的偽隨機森林。

似乎這兩個函式是不同的,但是由於不知道原理,因此也說不清楚區別,總之想用決策樹的時候還是可以找到相關**資料的,並且語法非常簡單。

下面是matlab**,**是打比賽的時候改的是可以執行的,只需要匯入新的資料集就可以了(如果我手動換行沒出現問題的話)。

%% i. 清空環境變數 

clear clc warning off

%% ii. 匯入資料

data=xlsread('dataj1.xlsx');

%% % 1. 隨機產生訓練集/測試集

a = randperm(22); train = data(a(1:15),:);

test = data(a(16:end),:);

%% % 2. 訓練資料

p_train = train(:,2:end);

t_train = train(:,1);

%% % 3. 測試資料 p_test = test(:,2:end);

t_test = test(:,1);

%% 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 == 0));

rate_b = count_b / 15;

rate_m = count_m / 15;

total_b = length(find(data(:,2) == 1));

total_m = length(find(data(:,2) == 0));

number_b = length(find(t_test == 1));

number_m = length(find(t_test == 0));

number_b_sim = length(find(t_sim == 1 & t_test == 1));

number_m_sim = length(find(t_sim == 0 & t_test == 0));

disp([' 病毒總數:' num2str(22)...

' 大流行:' 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:n

t = 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))

%% 最終結果

answer=predict(ctree,[2175874 147376 108 9 7 8 8 7])

隨機森林演算法,是由決策樹派生的演算法,在表現上僅次於梯度提公升(gbm)演算法,是機器學習領域的比較常用的方法。其表現在擬合速度、最終精度的方面都高於決策樹。

二者具體區別見下面的**

機器學習 決策樹 隨機森林演算法

決策樹api from sklearn.tree import decisiontreeclassifier import pandas as pd 字典特徵抽取 from sklearn.feature extraction import dictvectorizer from sklearn.m...

機器學習之 決策樹 隨機森林

一 決策樹 選擇特徵來分割 分割方法 id3 c4.5 cart 1.id3 資訊增益來選擇最優分割 id3偏向取值較多的屬性,例如id列 2.c4.5 資訊增益率選擇最優分割 資訊增益 iv 屬性a的特徵個數越多,iv越大。資訊增益率又會偏向較少的特徵。c4.5先找出資訊增益高於平均水平的屬性,再...

機器學習筆記 監督學習之決策樹

0機器學習中分類和 演算法的評估 1決策樹 判定樹 的概念 決策樹是乙個類似於流程圖的樹結構 可以是二叉樹或多叉樹 其中,每個內部結點表示在乙個屬性上的測試,每個分支代表乙個屬性輸出,而每個樹葉結點代表類或類分布。樹的最頂層是根結點。機器學習中分類方法中的乙個重要演算法。2.熵 entropy 概念...