一、前言
决策树其实就是一种分类模型,那为什么起这个名字啊?因为他分类的时候,也就是决策的时候画出来的模型很像一颗倒着生长的数。一枝一枝的往下生长。
我们常见的分类都是线性分类,比如初中时候的数学题,画几个线性方程,看看所给的数例如点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。那这个可把我牛逼坏了,插会腰。。。