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 概念...