一、前言
決策樹其實就是一種分類模型,那爲什麼起這個名字啊?因爲他分類的時候,也就是決策的時候畫出來的模型很像一顆倒着生長的數。一枝一枝的往下生長。
我們常見的分類都是線性分類,比如初中時候的數學題,畫幾個線性方程,看看所給的數例如點A(50,50) 在那個範圍類,諸如此類。
但是千變萬化的世界內,事物並不是具有規則,也不是用方程式能解決了得,所以決策樹應勢而生。
決策樹主要有兩種算法去分類,ID3算法和C4.5算法。前者以信息增益爲判斷標準,後者以信息增益率爲判斷標準。(不要慌,雖然是專用名詞,不礙理解該算法)。
說到這還得提一個名詞“熵”,他指的是系統的凌亂程度。
二、實例
現在以相親的例子開講決策樹的來龍去脈:
圖示表達了相親時的基本過程,可以大致認爲是一棵決策樹,將其量化之後,便可以進行分類。
橙色節點:葉子結點表示決策結果。
綠色節點:表示判斷條件。
屬性值:表示判斷條件選擇的閾值,去選擇那一個趨向。
(此次模型純屬瞎搞,如有得罪還請見諒#微笑臉#)
下面我們將模型量化,讓機器去判斷一下相親時 是見還是不見。
首先利用rand函數隨機生成的前五列的屬性值,然後一開始想自己判斷出結果,但是陳SIR說EXCEL可以直接寫函數出結果的啊,所以又先學得到EXCEL的IF函數,感覺到了學無止境,哈哈,待會兒再出一篇EXCEL的IF函數的博文。
現在書歸正傳,現在先把這部分結果的部分數據展示出來。
注:財富數值1爲有錢;人品數值1爲好;工作數值1爲生意人; 外貌數值1爲帥;結果數值1爲見。 |
%% 清空環境變量
clear all
clc
%% 導入數據
load dating.mat
%% 隨機產生訓練集/測試集
a = randperm(49);
Train = dating(a(1:40),:);
Test = dating(a(41:end),:);
%% 訓練數據
Ptrain = Train(:,1:end-1);
Ttrain = Train(:,end);
%% 測試數據
P_test = Test(:,1:end-1);
T_test = Test(:,end);
%% 創建決策樹分類器
ctree = ClassificationTree.fit(Ptrain,Ttrain);
%% 查看決策樹視圖
view(ctree,'mode','graph');
%% IV. 仿真測試
T_pre = predict(ctree,P_test);
%% 結果分析
numberD = length(find(T_test == 1));
numberND = length(find(T_test == 0));
numberD_pre = length(find(T_pre == 1 & T_test == 1));
numberND_pre = length(find(T_pre == 0 & T_test == 0));
disp(['見(去約會):' num2str(numberD_pre)...
'誤判個數:' num2str(numberD - numberD_pre)]);
disp(['不見(不去約會):' num2str(numberND_pre)...
'誤判個數:' num2str(numberND - numberND_pre)]);
結果如下:
是不是和上圖我分析的很一致啊,證明此次建模成功!
再來看看預測結果:
誤判個數爲:0。那這個可把我牛逼壞了,插會腰。。。