一个强大的分类算法模型,决策树!!

文摘   2024-10-18 15:36   北京  

大家好,今天和大家聊一个非常基础且重要的算法模型:决策树!~

简单理解,决策树是一种分类回归的机器学习算法,结构上像一棵倒挂的树,用于做出决策或预测。它通过一系列“是/否”问题把数据逐步划分成不同类别。每个分支都代表了一个决策步骤,直到最终分到一个叶节点,给出分类结果。

想象一下,你要帮朋友找合适的餐厅吃饭。他可能会问你一连串问题,比如:

  1. 预算问题:这家餐厅贵不贵?(贵/不贵)
  2. 饮食偏好问题:喜欢中餐还是西餐?(中餐/西餐)
  3. 距离问题:离家近吗?(近/远)

你回答这些问题后,他根据你的回答逐步缩小了选择范围,最后选定了一家餐厅。这就是决策树的工作方式。

举个具体的例子

假设我们想要预测一个人是否会购买某款手机,决策树会一步步问类似下面的问题:

1. 年龄问题:这个人是不是年轻人?(是/否)

  • 如果是年轻人,接下来就问:

2. 收入问题:收入高吗?(高/低)

  • 如果收入高,则预测购买手机。
  • 如果收入低,预测不会购买。

如果不是年轻人,可能会直接预测不购买手机。

决策树的特点:

  • 易于理解和解释:像聊天一样的流程,每一步都有明确的理由,适合小白理解。
  • 能够处理分类和回归问题:虽然决策树常用于分类,但也可以用于预测数值(回归)。
  • 对数据不敏感:不需要像其他算法那样对数据进行标准化。

缺点:

  • 容易过拟合:当决策树过于复杂,可能会过度拟合训练数据,导致在新数据上的表现不佳。
  • 不适合处理过于复杂的数据:如果数据特征太多,单棵决策树可能不够强大。

总结来说,决策树就像一个智能的问答流程,通过逐步筛选特征,最后给出预测。适合入门理解,也很直观!

有了上述的解释,咱们从决策树的原理和案例分别和大家聊聊~

重要原理

熵 (Entropy) 公式

熵是衡量数据不确定性的指标。熵越高,系统越混乱。熵的公式如下:

其中, 表示第  类的概率。对于一个包含  个类别的集合 ,我们通过计算每个类别的概率,然后带入熵公式得到不确定性的大小。

信息增益 (Information Gain)

在构建决策树时,每次选择的特征应该尽可能减少不确定性。信息增益反映了某个特征能够带来的熵的减少。信息增益公式:

其中, 是原始数据集的熵, 是我们划分数据的某个特征, 是特征A的所有可能取值,而  是通过特征A取值划分后的子集。

基尼指数 (Gini Index)

决策树中还可以用基尼指数来衡量划分的纯度,公式如下:

其中  表示第  类的概率。

完整案例

我们将使用虚拟数据集,来分类人们是否会购买某个产品。数据集包含特征如年龄、收入和居住区域等。我们将通过计算熵和信息增益来构建决策树。

Python 实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 生成虚拟数据集
np.random.seed(42)
data = {
    'Age': np.random.randint(1870100),
    'Income': np.random.choice(['High''Medium''Low'], 100),
    'Area': np.random.choice(['Urban''Rural'], 100),
    'Purchased': np.random.choice([01], 100)
}
df = pd.DataFrame(data)

# 计算熵的函数
def entropy(y):
    values, counts = np.unique(y, return_counts=True)
    prob = counts / len(y)
    return -np.sum(prob * np.log2(prob))

# 计算信息增益的函数
def info_gain(df, feature, target):
    # 计算初始熵
    base_entropy = entropy(df[target])
    
    # 按照特征的每个值进行划分
    values = df[feature].unique()
    weighted_entropy = 0
    for value in values:
        subset = df[df[feature] == value]
        weight = len(subset) / len(df)
        weighted_entropy += weight * entropy(subset[target])
    
    # 信息增益 = 初始熵 - 加权熵
    gain = base_entropy - weighted_entropy
    return gain

# 计算信息增益来选择最佳分割特征
features = ['Age''Income''Area']
target = 'Purchased'

gains = {feature: info_gain(df, feature, target) for feature in features}
best_feature = max(gains, key=gains.get)

# 打印出最佳特征
print(f"最佳分割特征是: {best_feature}")

# 数据可视化

# 1. 年龄和购买行为的关系
plt.figure(figsize=(86))
sns.histplot(data=df, x='Age', hue='Purchased', multiple='stack', palette='bright')
plt.title('Age Distribution vs Purchase')
plt.xlabel('Age')
plt.ylabel('Count')
plt.show()

# 2. 收入和购买行为的关系
plt.figure(figsize=(86))
sns.countplot(data=df, x='Income', hue='Purchased', palette='bright')
plt.title('Income Level vs Purchase')
plt.xlabel('Income')
plt.ylabel('Count')
plt.show()

# 3. 地区和购买行为的关系
plt.figure(figsize=(86))
sns.countplot(data=df, x='Area', hue='Purchased', palette='bright')
plt.title('Area vs Purchase')
plt.xlabel('Area')
plt.ylabel('Count')
plt.show()

# 4. 选择的最佳特征的柱状图
plt.figure(figsize=(86))
sns.barplot(x=list(gains.keys()), y=list(gains.values()), palette='bright')
plt.title('Information Gain of Features')
plt.xlabel('Feature')
plt.ylabel('Information Gain')
plt.show()

1. 年龄与购买行为的关系图:这个图形展示了不同年龄段人群中购买和不购买的比例,通过这张图我们可以观察到不同年龄段在购买决策中的表现差异。

2. 收入水平与购买行为的关系图:通过这个柱状图,我们能够比较不同收入水平的人群中,购买行为的差异。

3. 居住区域与购买行为的关系图:此图显示了在不同区域(如城市和农村)中,购买产品的比例差异。

4. 特征的信息增益柱状图:展示了每个特征的信息增益大小,能够直观地看出哪个特征对分类决策最有贡献。

整个这段代码实现了一个简单的决策树分类过程。咱们通过熵和信息增益的计算,手动选择了最优特征来分割数据集,并且通过四个不同的图形对数据进行了可视化分析,上面也详细的解释了其中的原因。

最后

通过这个案例,给大家展现了这种从零实现 GBDT 的过程能帮助你更好地理解梯度提升决策树的核心原理。
最近准备了16大块的内容,124个算法问题的总结,完整的机器学习小册,免费领取~
另外,今天给大家准备了关于「深度学习」的论文合集,往期核心论文汇总,分享给大家。
点击名片,回复「深度学习论文」即可~
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~

机器学习和人工智能AI
让我们一起期待 AI 带给我们的每一场变革!推送最新行业内最新最前沿人工智能技术!
 最新文章