西瓜书第四章(决策树)
一、决策树学习的目的
决策树学习的目的是为了产生一棵泛化能力强(机器学习的重要目的),即处理未见示例能力强的决策树,其基本流程遵循简 单且直观的 “分而治之” (divide-and-conquer) 策略
二、决策树的原理
1.决策树的组成
一棵决策树包含一个根结点、若干个内部结点和若干个叶结点;
例如:
2. 决策过程:
- if…else…else…
构建决策树的过程(以上面图表为例)
如果性别为“男”,则进入左子节点。
如果性别为“女”,则进入右子节点。
叶节点:
左子节点(性别为“男”):所有样本的“是否喜欢运动”都是“是”,形成一个叶节点;否”,形成一个叶节点。
右子节点(性别为“女”):所有样本的“是否喜欢运动”都是“是”,形成一个叶节点;“否”,形成一个叶节点。
补充:
分枝:特征/属性的取值
非叶节点: 特征/属性
叶节点:决策/标签/类别/概念
conjunction 和Disjunction 可解释性强(决策树)
3.节点的选择
基本原则:
简洁—>impurity(混杂度)
使用简洁的具有较少节点的树
划分依据(如何衡量混杂度):
信息熵 (Entropy):
衡量系统中不确定性或混乱程度。正态分布 – 具有最大的熵值
计算公式: H ( S ) = − ∑ i = 1 c p i log 2 ( p i ) H(S) = -\sum_{i=1}^{c} p_i \log_2(p_i) H(S)=−i=1∑cpilog2(pi)
( p i ) 是类别 ( i ) 出现的概率, ( c ) 是类别的总数。 ( p_i ) 是类别 ( i ) 出现的概率,( c ) 是类别的总数。 (pi)是类别(i)出现的概率,(c)是类别的总数。
举例计算:
- eg.有三个事件分别是a,b,c
当P(a)的概率确定了,假如是1,则发生a的事件是不是确定了,那么纯度就是最高的。
如果三个事件的概率的都是1/3,这个时候,我们是不是不能确定是哪一个事件,所以这个时候纯度最低
基尼混杂度 (Gini Impurity):
衡量数据集的纯度,值越小表示纯度越高。
计算公式: G ( S ) = 1 − ∑ i = 1 c p i 2 = ∑ i = ! j c ( p i ) ( p j ) G(S) = 1 - \sum_{i=1}^{c} p_i^2 = \sum_{i=!j}^{c} (p_i )(p_j) G(S)=1−i=1∑cpi2=i=!j∑c(pi)(pj)
错分类混杂度 (Misclassification Rate):
衡量分类错误的比例。
计算公式: R ( S ) = 1 − max ( p i ) R(S) = 1 - \max(p_i) R(S)=1−max(pi)
其中 ( max ( p i ) ) 是最大类别的概率。 其中 ( \max(p_i) ) 是最大类别的概率。 其中(max(pi))是最大类别的概率。
度量混杂度的变化ΔI(N) — 信息增益(IG)
4.停止分裂的条件(2个):
1. 完全相同的输出类别
例子:假设我们正在构建一个决策树来预测一个人是否喜欢运动。
如果在一个结点中,所有的样本都是“喜欢运动”的人,那么这个结点就不再需要进一步划分了,因为它已经达到了纯度。(所以我们划分下一个节点)
def is_pure(samples):
labels = [sample['label'] for sample in samples]
return len(set(labels)) == 1
2.完全相同的输入特征
例子:假设我们有三个属性:年龄、性别和职业。
如果在一个结点中,所有样本的年龄、性别和职业都相同,或者我们已经用完了所有可用的属性,但是有两个结果,比如是yes ,no,
def no_more_attributes(attributes, samples):
if not attributes:
return True
for attr in attributes:
values = [sample[attr] for sample in samples]
if len(set(values)) > 1:
return False
return True
排除方式
- noise:噪声混入,看数据量
—大(数据清洗)
—小(保留) - feature
5.代码–基于对率回归(Logistic Regression)进行划分选择的决策树算法
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import LabelEncoder
# 数据预处理
data = {
'年龄': [25, 35, 45, 20, 30, 50],
'收入': ['30K', '50K', '70K', '20K', '40K', '60K'],
'教育程度': [</