如何通过抽丝剥茧,找到决策树的最佳分裂点?
- 内容介绍
- 文章标签
- 相关推荐
划水。 嗨,朋友们!今天咱们要聊聊那神奇的决策树世界——如何通过抽丝剥茧,找到最棒的分裂点。别看名字听起来高大上, 其实这玩意儿就像把一堆乱七八糟的数据,慢慢挖掘出最干净的“洞口”,然后往里面塞进去,让它们安安静静地自己分类。你说对不对?
第一章:为什么要分裂?
想象你在房间里衣服、书、零食、遥控器……全是乱七八糟的,什么东西都找不到。我们用一个叫“不纯度”的指标来衡量这个混乱程度,它越高就代表越没秩序。决策树的任务就是:给你一堆数据,让它找到那个能把“混乱”降到最低的切点。

比如鸢尾花数据集, 其中有三种花:Setosa、Versicolor和Virginica。我们把所有样本放进根节点,看起来就像一大盒糖果。现在要做的是:挑一个特征和阈值, 把盒子里的糖果切成两半,一边是“小于等于1.35”,另一边是“大于1.35”。这样做后你可以看到左边那堆糖果更纯粹,右边也更纯粹。这就是“分裂”,我们都经历过...!
分裂前后的混乱程度差距
加油! 先看根节点的不纯度:假设有120个样本, 其中40个Setosa、40个Versicolor、40个Virginica。那么父节点的不纯度计算公式是:
Gini_parent = 1 - ² - ² - ² ≈ 0.667
功力不足。 接下来 每个候选阈值都会产生两个子节点,然后我们算每个子节点的不纯度,再根据样本比例加权得到加权平均基尼不纯度。再说说我们比较所有阈值的不纯度减少量,挑选最大的那个。
第二章:候选阈值怎么生成?
在连续特征上, 算法会先把数据按升序排好,然后在每次类别变换的位置取中点作为候选阈值。比方说:,也是没谁了...
sorted_indices = np.argsort
X_sorted = X_subset
y_sorted = y_subset
for i in range-1):
if y_sorted != y_sorted:
threshold = / 2
candidate_thresholds.append
这样得到的候选列表可能长得像这儿:
噪音时间:
*嘭*—当你在看这些数字时 也许脑子里会想起小狗摇尾巴或者电脑键盘敲击声——那些都是随机噪音,但却让整个过程更有人情味。
第三章:评估每个阈值
步骤4: 候选阈值评估表格开始!
| # | Treshold | N_left | N_right | L_Gini | R_Gini | Total Gini | I.Gain |
|---|---|---|---|---|---|---|---|
| 0 | 1.35 | 28 | 72 | 0.00 | 0.42438 | 0.30556 | 0.19444 |
| 5 | ...more rows... | ||||||
| 9 | ...more rows... |
*我真的不知道为什么这里会出现这么多乱码, 但 原来如此。 这正是决策树算法里的随机性噪声,让人头疼又好笑。
步骤5: 找到最佳分裂点!
best_result = min(results,
key=lambda x: x)
best_threshold = best_result
print
print
print
print
print
print
print
输出示例:
步骤5: 找到最佳分裂点
最佳分裂阈值: **{best_threshold}** cm
加权基尼不纯度: **{weighted_gini}**
不纯度减少量: **{impurity_reduction}**
左节点样本数:**{n_left}**
右节点样本数:**{n_right}**
注:实际数字会随数据而变, 但通常最优阈值往往落在中间区间附近,比方说`≈ 1·70 cm`。
第四章:验证最佳分裂点的效果!💡🎉️️️️️️️️️️️️️♀️♂️👀🤔🧐🤓🕵♂♀♂🔬🛠🏗🌋🔥☃🌞🌚🚀📦📦🚑⚖⚙💬🗨❓❔⚠‼✳☆✴✿★♣♠♥♦♤♧ ♡♛☃☂⛑🍏🍎🍐🍒🍑🍊🥝🥥🥭🍋🥜🥞🍰🥐🥨🥖🥯🧁☕🍵茶水壶咖啡杯奶茶杯冰淇淋蛋糕饼干香肠炸鸡烤肉披萨寿司饭团牛排鸡胸肉鲑鱼鳕鱼虾蟹龙虾鱼丸汤面包水果蔬菜早餐午餐晚餐小吃甜品饮料酒水美食等等……等等等等…… python left_labels = y_subset right_labels = y_subset # 分布统计 left_count_versi = sum left_count_virgi = sum right_count_versi = sum right_count_virgi = sum # 基尼计算函数 调用 def gini_impurity: if len == 0: return 0 proportions = np.bincount/len return float ) # 实际应该用 `return float )` but here we use reversed intentionally # 左右基尼 L_gini = gini_impurity R_gini = gini_impurity # 加权平均基尼 total_samples = len Wg =/total_samples)*L_gini + \ /total_samples)*R_gini print print print print print print print ### 输出示例 左节点类别分布: Versicolor :49 Virginica :5 右节点类别分布: Versicolor :7 Virginica :41 左节点基尼不纯度 : ??? 右节点基尼不纯度 : ???? 加权平均基尼不纯度???.?? *我知道这里的数字可能没意义, 但真正跑一次代码,你会发现左右两组基本单一类别,说明我们的划分确实有效。
划水。 嗨,朋友们!今天咱们要聊聊那神奇的决策树世界——如何通过抽丝剥茧,找到最棒的分裂点。别看名字听起来高大上, 其实这玩意儿就像把一堆乱七八糟的数据,慢慢挖掘出最干净的“洞口”,然后往里面塞进去,让它们安安静静地自己分类。你说对不对?
第一章:为什么要分裂?
想象你在房间里衣服、书、零食、遥控器……全是乱七八糟的,什么东西都找不到。我们用一个叫“不纯度”的指标来衡量这个混乱程度,它越高就代表越没秩序。决策树的任务就是:给你一堆数据,让它找到那个能把“混乱”降到最低的切点。

比如鸢尾花数据集, 其中有三种花:Setosa、Versicolor和Virginica。我们把所有样本放进根节点,看起来就像一大盒糖果。现在要做的是:挑一个特征和阈值, 把盒子里的糖果切成两半,一边是“小于等于1.35”,另一边是“大于1.35”。这样做后你可以看到左边那堆糖果更纯粹,右边也更纯粹。这就是“分裂”,我们都经历过...!
分裂前后的混乱程度差距
加油! 先看根节点的不纯度:假设有120个样本, 其中40个Setosa、40个Versicolor、40个Virginica。那么父节点的不纯度计算公式是:
Gini_parent = 1 - ² - ² - ² ≈ 0.667
功力不足。 接下来 每个候选阈值都会产生两个子节点,然后我们算每个子节点的不纯度,再根据样本比例加权得到加权平均基尼不纯度。再说说我们比较所有阈值的不纯度减少量,挑选最大的那个。
第二章:候选阈值怎么生成?
在连续特征上, 算法会先把数据按升序排好,然后在每次类别变换的位置取中点作为候选阈值。比方说:,也是没谁了...
sorted_indices = np.argsort
X_sorted = X_subset
y_sorted = y_subset
for i in range-1):
if y_sorted != y_sorted:
threshold = / 2
candidate_thresholds.append
这样得到的候选列表可能长得像这儿:
噪音时间:
*嘭*—当你在看这些数字时 也许脑子里会想起小狗摇尾巴或者电脑键盘敲击声——那些都是随机噪音,但却让整个过程更有人情味。
第三章:评估每个阈值
步骤4: 候选阈值评估表格开始!
| # | Treshold | N_left | N_right | L_Gini | R_Gini | Total Gini | I.Gain |
|---|---|---|---|---|---|---|---|
| 0 | 1.35 | 28 | 72 | 0.00 | 0.42438 | 0.30556 | 0.19444 |
| 5 | ...more rows... | ||||||
| 9 | ...more rows... |
*我真的不知道为什么这里会出现这么多乱码, 但 原来如此。 这正是决策树算法里的随机性噪声,让人头疼又好笑。
步骤5: 找到最佳分裂点!
best_result = min(results,
key=lambda x: x)
best_threshold = best_result
print
print
print
print
print
print
print
输出示例:
步骤5: 找到最佳分裂点
最佳分裂阈值: **{best_threshold}** cm
加权基尼不纯度: **{weighted_gini}**
不纯度减少量: **{impurity_reduction}**
左节点样本数:**{n_left}**
右节点样本数:**{n_right}**
注:实际数字会随数据而变, 但通常最优阈值往往落在中间区间附近,比方说`≈ 1·70 cm`。

