机器学习 用python和matlab实现决策树

12 篇文章 0 订阅
2 篇文章 0 订阅

1.认识决策树

决策树的思想来源非常之简单,就是条件分支语句:“如果是,执行哪一步,如果否,执行哪一步”,我们通过一个案例对决策树形成初步认识。下面是一个男的询问他的母亲相亲对象的条件,再决定是否去相亲。

在这里插入图片描述
那么从这幅图我们思考这个问题?为什么这个男的要首先考虑相亲对象的长相,再接着考虑年龄,最后考虑收入。其实这就是决策树算法的关键,相亲对象的长相、年龄和收入都是输入特征,输入特征的排序便是决策树的关键之一。

2.决策树做了什么?举个实例

我们举个具体的实例,来讲决策树到底干了些什么活?下面是银行选择是否贷款的数据,那么依照这些数据我们需要判断ID为16的中年、有工作、有房子、信贷情况好,银行是否决定贷款给这位中年。
在这里插入图片描述

(1)对四个输入特征进行排序

决策树对特征排序我们通常采用信息增益或者基尼指数,两者的效果区别不大,但是从运算效率来说,基尼指数会更棒。本文介绍利用信息增益作为排序的依据。引用信息熵概念,信息熵是什么?可以具体看这篇博客。https://blog.csdn.net/zou_gr/article/details/103519003
计算信息熵:
E n t ( D ) = E [ − log ⁡ p i ] = − ∑ i = 1 n p i log ⁡ p i Ent(D)=E[-\log p_i]=-\sum\limits_{i=1}^n p_i \log p_i Ent(D)=E[logpi]=i=1npilogpi
其中某个特征的样本集合有a1 a2个取值,对应概率为 p i p_i pi ,式中对数一般取2为底。进一步计算信息增益:
G a i n ( D , a ) = E n t ( D ) − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ E n d ( D i ) Gain(D,a)=Ent(D) - \sum\limits_{i=1}^n \frac{|D_i|}{|D|} End(D^i) Gain(D,a)=Ent(D)i=1nDDiEnd(Di)
其中的但用文字很难说明白的了,我们直接拿上面一个例子来计算。
针对是否有工作这个特征,取值有是和否,在是有工作的贷款人有5个银行愿意贷款给他的,0个不愿意贷款的,在没有工作的贷款人有4个银行愿意贷款给他的,6个不愿意贷款的,那么针对是有工作的贷款人而言,能贷到款的概率为1,未能贷到款的概率0,同样的,针对没有工作的贷款人对应概率为2/5和3/5,那么依据信息熵的公式,可以计算 E n t ( 是 否 有 工 作 ) = − 1 3 l o g ( 1 3 ) − − 2 3 l o g ( 2 3 ) Ent(是否有工作 ) = -\frac{1}{3}log(\frac{1}{3})--\frac{2}{3}log(\frac{2}{3}) Ent()=31log(31)32log(32) E n t ( 没 有 工 作 ) = − 2 5 l o g ( 2 5 ) − − 3 5 l o g ( 3 5 ) Ent(没有工作)=-\frac{2}{5}log(\frac{2}{5})--\frac{3}{5}log(\frac{3}{5}) Ent()=52log(52)53log(53) E n t ( 有 工 作 ) = − 1 l o g ( 1 ) − 0 Ent(有工作)=-1log(1)-0 Ent()=1log(1)0,进而计算该特征的信息增益, G a i n ( 是 否 有 工 作 ) = E n t ( 是 否 有 工 作 ) − 5 15 E n t ( 有 工 作 ) − 10 15 E n t ( 没 有 工 作 ) Gain(是否有工作)=Ent(是否有工作)-\frac{5}{15}Ent(有工作)-\frac{10}{15}Ent(没有工作) Gain()=Ent()155Ent()1510Ent() ,同样的可以计算另外三个特征。然后进行排序,选择信息增益最大的为根节点,依次地选择下去。关于根节点、叶节点和中间节点的意思看下图就简洁明了。在这里插入图片描述
上面举了个很小的例子去说明决策树特征是如何排序,我们大概了解一下就行,这些工作都交给计算机工作就行,我们思考一个问题:对一棵决策树,是否无限制地划分下去?划到什么程度才好?那么决策树另一个关键就是剪枝,剪枝的目的就是就是为了防止过拟合。

(2)剪枝

关于剪枝的简要,我们参考黄昌达的黑书:
决策树的剪枝有两种思路; 前剪枝(Pre-Pruning)和后剪枝(Post-Pruning)。
前剪枝是在构造决策树的同时进行剪枝。在决策树的构建过程中 ,如果无法进一步降 低信息娟的情况下,就会停止创建分支。 为了避免过拟合,可以设定一个阔值, 信息熵减 小的数量小于这个阔值,即使还可以继续降低熵脯, 也停止继续创建分支。 这种方法称为前 剪枝。还有一些简单的前剪枝方法,如限制叶子节点的样本个数, 当样本个数小于一定的阈值时, 即不再继续创建分支。
后剪枝是指决策树构造完成后进行剪枝。剪枝的过程是对拥有同样父节点的一组节点 进行检查,判断如果将其合井,信息熵的增加量是否小于某一阀值。如果小于阔值,则这 一组节点可以合并一个节点。后剪枝是目前较普遍的做法。后剪枝的过程是删除一些子树, 然后用子树的根节点代替,来作为新的叶子节点。这个新叶子节点所标识的类别通过大多 数原则来确定, 把这个叶子节点里样本最多的类别,作为这个叶子节点的类别 。 后剪枝算法有很多种,其中常用的一种称为降低错误率剪枝法( Reduced-Error Pruning) 。其思路是,自底向上,从己经构建好的完全决策树中找出一个子树,然后用子 树的根节点代替这棵子树,作为新的叶子节点。 叶子节点所标识的类别通过大多数原则来确定。这样就构建出一个新的简化版的决策树。然后使用交叉验证数据集来测试简化版本的决策树,看看其错误率是不是降低了 。 如果错误率降低了,则可以使用这个简化版的决 策树代替完全决策树,否则还是采用原来的决策树。通过遍历所有的子树,直到针对交叉验证数据集,无法进一步降低错误率为止。

3.决策树的优缺点

优点:容易理解和解释,使用简单。
缺点:单个决策树最主要的问题就是不稳定,训练数据的小变化非常敏感。

4.利用python和matlab实现决策树

我们利用决策树对著名的乳腺癌数据进行分类。

(1)python

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X = cancer.data
y = cancer.target
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()     #选择决策树
clf.fit(X_train, y_train)          #对训练集进行训练
train_score = clf.score(X_train, y_train)      #查看训练集的分数
test_score = clf.score(X_test, y_test)         #查看测试集的分数
print('train score: {0}; test score: {1}'.format(train_score, test_score))    #输出分数
#利用网格搜索寻找最优参数
from sklearn.model_selection import GridSearchCV
max_depth=np.linspace(1, 101, 101)  #最深深度
min_samples_split=np.arange(2,20,1)  #结点的最小样本数量
min_samples_leaf = np.arange(1,20,1)  #叶子节点最少的样本数
param_grid = {'max_depth':max_depth,'min_samples_split':min_samples_split,'min_samples_leaf':min_samples_leaf}
clf = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5)
clf.fit(X_train, y_train)
print("best param: {0}\nbest score: {1}".format(clf.best_params_,
                                                clf.best_score_))

(2)matlab

% 读取数据,此数据也可从python数据集导出
X_train = csvread('X_train.csv');
y_train = csvread('y_train.csv');
X_test = csvread('X_test.csv');
y_test = csvread('y_test.csv');
% 创建决策树分类器
ctree = ClassificationTree.fit(X_train,y_train);
% 查看决策树视图
view(ctree);
view(ctree,'mode','graph');
tr_acc = 1-resubLoss(ctree)         %查看决策树在训练集的错误率: 0.9780
loss_acc = 1-kfoldLoss(crossval(ctree))   %交叉验证准确率0.9231
% 仿真测试
te_pre = predict(ctree,X_test);
% 测试集结果分析
te_sim_0 = length(find(te_pre == 0 & y_test == 0));
te_sim_1 = length(find(te_pre == 1 & y_test == 1));
acc = (te_sim_0 + te_sim_1) / 114
%for循环找最优参数,并可视化观察
leafs = logspace(1,2,10);
N = numel(leafs);
err = zeros(N,1);
for n = 1:N
    t = ClassificationTree.fit(X_train,y_train,'crossval','on','minleaf',leafs(n));
    err(n) = kfoldLoss(t);
end
plot(leafs,err);
xlabel('叶子节点含有的最小样本数');
ylabel('交叉验证误差');
title('叶子节点含有的最小样本数对决策树性能的影响')
%%  设置minleaf为10,产生优化决策树
ctree1 = ClassificationTree.fit(X_train,y_train,'minleaf',10);
view(ctree1,'mode','graph')
tr_acc1 =1-resubLoss(ctree1)   %在训练集的准确率0.9538
loss_acc1 = 1-kfoldLoss(crossval(ctree1))  %交叉验证准确率0.9231
%计算ctree1在test中的准确率:0.9211
te_pre = predict(ctree1,X_test);
te_sim_0 = length(find(te_pre == 0 & y_test == 0));
te_sim_1 = length(find(te_pre == 1 & y_test == 1));
acc1 = (te_sim_0 + te_sim_1) / 114    

5.总结

总结而言,决策树的关键无非就是特征排序和剪枝,仅仅用决策树是在实际应用是不够,结合着集成学习的Bagging, Boosting, Stacking会更加地棒。

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
乳腺癌决策树MATLAB是一种应用于乳腺癌诊断的决策树分类器,具体的应用研究和实现源码可以在引用中找到。优点方面,决策树分类器容易理解和解释,并且使用简单,能够帮助医生和研究人员做出准确的诊断。然而,决策树分类器的一个主要缺点是它的不稳定性,对训练数据的小变化非常敏感。 关于决策树的剪枝,有两种常见的思路:前剪枝(Pre-Pruning)和后剪枝(Post-Pruning)。前剪枝是在构造决策树的同时进行剪枝,在决策树构建过程中,如果无法进一步降低信息增益的情况下,就会停止创建支。为了避免过拟合,可以设定一个阈值,当信息熵减小的数量小于这个阈值时,即使还可以继续降低熵的情况下,也停止继续创建支。后剪枝是指决策树构造完成后进行剪枝,剪枝的过程是对拥有相同父节点的一组节点进行检查,判断如果将它们合并,信息增益的增加量是否小于某一阈值。如果是,则这组节点可以合并为一个节点。后剪枝是目前较普遍的做法,通过删除一些子树,并用子树的根节点代替,来作为新的叶子节点,从而构建出一个新的简化版决策树。 综上所述,乳腺癌决策树MATLAB是一种应用于乳腺癌诊断的决策树分类器,通过决策树的构建和剪枝等方法,可以帮助医生和研究人员进行乳腺癌的诊断和预测。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [决策树分类器在乳腺癌诊断中的应用研究_决策树分类器_乳腺癌诊断_matlab](https://download.csdn.net/download/m0_53407570/85119374)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [机器学习pythonmatlab实现决策树](https://blog.csdn.net/zou_gr/article/details/103812739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值