大家好,今天和大家聊一个非常基础且重要的算法模型:决策树!~
简单理解,决策树是一种分类和回归的机器学习算法,结构上像一棵倒挂的树,用于做出决策或预测。它通过一系列“是/否”问题把数据逐步划分成不同类别。每个分支都代表了一个决策步骤,直到最终分到一个叶节点,给出分类结果。
想象一下,你要帮朋友找合适的餐厅吃饭。他可能会问你一连串问题,比如:
预算问题:这家餐厅贵不贵?(贵/不贵) 饮食偏好问题:喜欢中餐还是西餐?(中餐/西餐) 距离问题:离家近吗?(近/远)
你回答这些问题后,他根据你的回答逐步缩小了选择范围,最后选定了一家餐厅。这就是决策树的工作方式。
举个具体的例子:
假设我们想要预测一个人是否会购买某款手机,决策树会一步步问类似下面的问题:
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(18, 70, 100),
'Income': np.random.choice(['High', 'Medium', 'Low'], 100),
'Area': np.random.choice(['Urban', 'Rural'], 100),
'Purchased': np.random.choice([0, 1], 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=(8, 6))
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=(8, 6))
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=(8, 6))
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=(8, 6))
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. 特征的信息增益柱状图:展示了每个特征的信息增益大小,能够直观地看出哪个特征对分类决策最有贡献。
整个这段代码实现了一个简单的决策树分类过程。咱们通过熵和信息增益的计算,手动选择了最优特征来分割数据集,并且通过四个不同的图形对数据进行了可视化分析,上面也详细的解释了其中的原因。