机器学习 之 决策树

决策树是一种机器学习的方法。决策树的生成算法有ID3, C4.5和C5.0等。
在这里插入图片描述
就是这么一个东西,但这种东西是自动生成的,如何生成这个,就是各种算法了。

这是有监督学习。监管学习就是给出一堆样本,每个样本都有一组属性和一个分类结果,也就是分类结果已知,非监督学习就是分类未知。

所以决策树的生成主要分以下两步:

  1. 节点的分裂:一般当一个节点所代表的属性无法给出判断时(毕竟最后是要分类的,如果能区分的话,那就到此为止了),则选择将这一节点分成2个子节点(如不是二叉树的情况会分成n个子节点)
  2. 阈值的确定:选择适当的阈值使得分类错误率最小 (Training Error)(例如两个分类,甭管是什么阙值,都会有错误,这是一定可能存在的(例如作业正确率小于10%,但他仍然是一个好学生),因此确定阙值是很重要的)。

比较常用的决策树有信息增益(ID3 算法)、信息增益率(C4.5 算法)以及基尼指数(Cart 算法)(Classification And Regression Tree),CART的分类效果一般优于其他决策树。

ID3: 由增熵(Entropy)原理来决定哪个节点需要分裂,哪个做父节点。对于一组数据,熵越小说明分类结果越好。熵定义如下:
E n t r o p y = − ∑ i = 1 n [ p ( x i ) ∗ l o g 2 ( P ( x i ) ] Entropy=- \sum^n_{i=1} [p(x_i) * log_2(P(x_i) ] Entropyi=1n[p(xi)log2(P(xi)]

其中 p ( x i ) p(x_i) p(xi) x i x_i xi出现的概率(在训练集中占据的比例)。假如是2分类问题,当A类和B类各占50%的时候,
E n t r o p y = − ( 0.5 ∗ l o g 2 ( 0.5 ) + 0.5 ∗ l o g 2 ( 0.5 ) ) = 1 Entropy = - (0.5*log_2( 0.5)+0.5*log_2( 0.5))= 1 Entropy=0.5log2(0.5)+0.5log2(0.5))=1

因为概率只在0~1之间,因此log必然为负数,且越来越趋近于0,或者说,加上一个符号就是递减的,再乘以对应的权值,可以想象,当熵值最大时,肯定是一半一半的(为1)。当只有A类,或只有B类的时候,只有当只有某一类的时候,它是最小的为0。
E n t r o p y = − ( 1 ∗ l o g 2 ( 1 ) + 0 ) = 0 Entropy= - (1*log_2( 1)+0)=0 Entropy=1log2(1+0=0

所以当Entropy最大为1的时候,是分类效果最差的状态,当它最小为0的时候,是完全分类的状态。因为熵等于零是我们想要的状态,一般实际情况下,熵介于0和1之间。熵的不断最小化,实际上就是提高分类正确率的过程。

例如:

  1. 分数小于70为【不是好学生】:分错1个
  2. 出勤率大于70为【好学生】:分错3个
  3. 问题回答次数大于9为【好学生】:分错2个
  4. 作业提交率大于80%为【好学生】:分错2个

然后这里有信息增益公式:
G a i n ( D , a ) = E n t r o p y ( D ) − ∑ i = 1 k D i D E n t r o p y ( D i ) Gain(D,a)=Entropy(D)-\sum^k_{i=1}\frac{D_i}{D}Entropy(D_i) Gain(D,a)=Entropy(D)i=1kDDiEntropy(Di)

谁的增益大选谁。每次都要计算。直到分裂完所有条件。

ID3有一个问题,有些属性可能对分类任务没有太大作用,但是他们仍然可能会被选为最优属性(倾向于选择取值多的属性(论域比较广,就会被划分成很多份导致样本减少导致纯度上升))。
还存在一个问题,那就是越细小的分割分类错误率越小,所以ID3会越分越细(最后的样本会越来越少,这样会使分错的一些数据直达最后),如果条件很多,分到最后可能就一两个样本了,分割太细了,训练数据的分类可以达到0错误率,但是因为新的数据和训练数据不同,所以面对新的数据分错率反倒上升了。因为这时候误差将影响很大,这就是所说的过度学习(Overfitting)。

所以为了避免分割太细,C4.5对ID3进行了改进,C4.5中,优化项要除以分割太细的代价,这个比值叫做信息增益率(信息增益率/属性熵)(信息增益率上升,样本少的属性熵也会上升,所以整体的信息增益率并不大),显然分割太细分母增加,信息增益率会降低。除此之外,其他的原理和ID3相同(用信息增益率代替了信息增益)。

构造决策树后,采用悲观剪枝(PEP)。

CART(分类回归树)是一个二叉树,也是回归树,同时也是分类树,CART的构成简单明了。

CART只能将一个父节点分为2个子节点。CART用GINI指数来决定如何分裂,
GINI指数:总体内包含的类别越杂乱,GINI指数就越大(跟熵的概念很相似)。

a. 比如出勤率大于70%这个条件将训练数据分成两组:大于70%里面有两类:【好学生】和【不是好学生】,而小于等于70%里也有两类:【好学生】和【不是好学生】。
b. 如果用分数小于70分来分:则小于70分只有【不是好学生】一类,而大于等于70分有【好学生】和【不是好学生】两类。

比较a和b,发现b的凌乱程度比a要小,即GINI指数b比a小,所以选择b的方案。以此为例,将所有条件列出来,选择GINI指数最小的方案,这个和熵的概念很类似。

CART还是一个回归树,回归解析用来决定分布是否终止。理想地说每一个叶节点里都只有一个类别时分类应该停止,但是很多数据并不容易完全划分,或者完全划分需要很多次分裂,必然造成很长的运行时间,所以CART可以对每个叶节点里的数据分析其均值方差,当方差小于一定值可以终止分裂,以换取计算成本的降低。

CART和ID3一样,存在偏向细小分割,即过度学习(过度拟合的问题),为了解决这一问题,对特别长的树进行剪枝处理,直接剪掉。

以上的决策树训练的时候,一般会采取Cross-Validation法:比如一共有10组数据:

第一次. 1到9做训练数据, 10做测试数据

第二次. 2到10做训练数据,1做测试数据

第三次. 1,3到10做训练数据,2做测试数据,以此类推

做10次,然后大平均错误率。这样称为 10 folds Cross-Validation。

比如 3 folds Cross-Validation 指的是数据分3份,2份做训练,1份做测试。

决策树是常用的机器学习算法之一,通过对数据的分类和特征值计算来完成对未知数据的预测。本文将介绍使用Python实现决策树算法的相关步骤。 首先,需要导入决策树算法工具包,使用以下代码: ```python from sklearn import tree ``` 然后,导入训练数据和测试数据,并进行预处理。为了方便起见,在本文中采用生成随机数的方式来生成样本数据,使用以下代码: ```python from sklearn.datasets import make_classification X, y = make_classification(n_samples=100, n_features=4, n_classes=2, n_informative=2, n_redundant=0, random_state=0, shuffle=False) ``` 接下来,使用生成的样本数据进行模型训练。这里使用scikit-learn中的DecisionTreeClassifier()函数。 ```python clf = tree.DecisionTreeClassifier() clf = clf.fit(X, y) ``` 训练后,调用predict()方法进行对测试数据的预测,使用以下代码: ```python y_pred = clf.predict(X) ``` 最后,评估模型的准确率,使用以下代码: ```python from sklearn.metrics import accuracy_score print(accuracy_score(y, y_pred)) ``` 这就是使用Python实现决策树算法的基本过程。决策树可以根据数据中的不同特征进行分类,是一个简单且常用的分类算法。决策树算法也可用于回归问题,例如预测一个数的大小。与其他机器学习算法相比,决策树具有易于理解和可解释的优点,同时还可以处理非线性的分类问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值