1. 项目概述:从“头歌实训”到决策树实战

最近在“头歌”平台上带学生做机器学习实训,发现很多同学对决策树这个经典算法的理解还停留在“画个树形图”的层面,一到自己动手用 sklearn 实现,就卡在特征选择、参数调优和结果解读上。这其实挺可惜的,因为决策树不仅是理解更复杂集成模型(如随机森林、XGBoost)的基石,其直观的可解释性在业务场景中(比如金融风控初步筛查、营销响应预测)有着不可替代的价值。这个实训项目的核心,就是帮你跨越从“知道概念”到“能跑通、能调优、能解释”的鸿沟。

简单来说,我们将围绕一个具体的机器学习任务,完整走一遍决策树建模的流程。这不仅仅是调用几行 fit predict ,我会带你深入三个关键环节:第一,如何用代码和数学工具(如信息增益、基尼系数)真正理解特征是如何被选择的;第二,面对 sklearn DecisionTreeClassifier 那一堆参数( max_depth , min_samples_split 等),该怎么根据数据和任务目标有的放矢地调整,而不是盲目网格搜索;第三,模型建好后,除了准确率,我们还能从树结构中挖掘出哪些业务洞察?这才是“实训”二字的意义——通过动手,把纸面上的算法变成你工具箱里一件趁手的兵器。无论你是正在完成课程作业的学生,还是希望夯实基础的转行开发者,这篇内容都能提供一条清晰的、可复现的路径。

2. 决策树核心原理与sklearn实现拆解

2.1 决策树是如何“思考”的:从熵与基尼系数说起

很多教程一上来就讲信息增益,但容易让人忽略其本质。你可以把构建决策树的过程,想象成玩一个“20问”游戏:你想猜出一个人是谁(分类目标),每次只能问一个是/否问题(基于一个特征做判断)。一个高手会优先问那些能把可能性人群最大程度分开的问题,比如“是男性吗?”可能就把人群分成了两半,而“他喜欢蓝色吗?”可能区分度就不大。决策树的算法就是在自动化地寻找这些“好问题”。

在数学上,衡量一个节点“混乱程度”的指标主要有两个: 基尼系数 。熵来源于信息论,表示不确定性。对于一个二分类节点,如果两类样本各占50%,它的熵是最高的(1),因为我们完全无法确定一个新样本的类别;如果节点里全是同一类样本,熵就是0。信息增益就是父节点的熵减去子节点熵的加权平均,增益越大,说明用这个特征分割后,纯度提升越多。 sklearn 中默认使用 基尼系数 ,它计算起来更高效,且在实际应用中与熵的效果通常相差无几。基尼系数可以直观理解为:从节点中随机抽两个样本,它们属于不同类别的概率。概率越低,节点越纯。

在代码里, sklearn 为我们封装了这一切。当我们创建 DecisionTreeClassifier(criterion=‘gini’) 时,就已经选择了基尼系数作为分割标准。但理解背后的计算,能帮助你在看特征重要性( feature_importances_ )时,明白为什么某个特征排第一。它不是因为“看起来重要”,而是因为在所有分割点上,用它带来的纯度提升总和最大。

2.2 sklearn的DecisionTreeClassifier:关键参数全景图

sklearn 的决策树实现功能强大,但参数也多,容易让人眼花缭乱。我们不能把它们当成黑盒,得知道每个旋钮拧动会带来什么变化。我把核心参数分为“树形结构控制”、“分割质量控制”和“随机性控制”三类。

第一类:树形结构控制

  • max_depth :树的最大深度。这是防止过拟合最直接、最重要的参数。不设置( None )时,树会一直生长直到所有叶子节点都纯(或满足其他停止条件),极易过拟合。通常从3、5、10这样较小的值开始尝试。
  • min_samples_split :一个节点至少需要多少个样本才能继续分裂。默认是2,意味着即使一个节点里只有两个样本,只要它们类别不同,也会继续分。提高这个值(如设为10或总样本的1%)可以阻止树去学习过于细微的噪声。
  • min_samples_leaf :一个叶子节点至少需要多少个样本。这个参数比 min_samples_split 更严格,因为它直接保证了每个终端叶子的样本量,能生成更平滑的决策边界。我通常优先调整这个和 max_depth

第二类:分割质量控制

  • criterion :分割质量的衡量标准,可选‘gini’或‘entropy’。如上所述,两者结果通常很接近。‘gini’计算稍快,是默认选项。
  • min_impurity_decrease :分裂需要带来的最小不纯度减少量。一个非常实用的高级参数。如果某个分割带来的信息增益或基尼系数减少量小于这个阈值,即使其他条件都满足,也不会分裂。这可以帮你直接过滤掉那些“收益不大”的分裂。

第三类:随机性控制

  • random_state :固定随机种子,确保每次运行结果一致。对于决策树,即使数据相同,如果特征增益值一样, sklearn 可能会随机选择其中一个特征进行分割。设定 random_state 对实验的可复现性至关重要。
  • max_features :寻找最佳分割时,考虑的最大特征数。可以设为整数、浮点数(比例)或‘sqrt’、‘log2’。这是决策树引入随机性的主要方式之一,也是后续随机森林算法的思想雏形。降低 max_features 可以增加树的多样性,一定程度上减少过拟合,但单棵树的效果可能会下降。

注意 sklearn 的决策树实现使用的是CART算法,它构建的是二叉树(每个节点只有两个分支),这与可以构建多叉树的ID3等算法不同。CART算法既能处理分类也能处理回归任务,应用更广。

2.3 数据准备:不止于标准化

在进入实训案例前,我们必须处理好数据。对于决策树,有一个好消息:它不需要对数值型特征进行标准化或归一化,因为它的决策是基于阈值比较(如“年龄是否大于30?”),而不是距离计算。但这不意味着数据预处理可以跳过。

分类特征编码 :如果数据中有像“学历”(高中、本科、硕士)这样的类别特征,必须将其转换为数值。 sklearn 的决策树可以直接处理经过 OrdinalEncoder (序数编码)或 OneHotEncoder (独热编码)处理后的数值。这里有个关键选择:对于有大小关系的类别(如“低”、“中”、“高”),用序数编码更合适,树可以学习到“大于某个等级”的规则。对于没有内在顺序的类别(如“北京”、“上海”、“广州”),必须使用独热编码,否则模型会错误地赋予类别间数值距离以意义。

缺失值处理 sklearn 的决策树不支持缺失值。常见的处理方式包括直接删除缺失样本、用中位数/众数填充,或者使用更复杂的模型如 xgboost (它内置了缺失值处理机制)。在实训中,我们通常采用简单填充。

训练-测试集划分 :这是评估模型泛化能力、防止过拟合的关键一步。务必使用 train_test_split ,并且通常我会设置 stratify=y ,这在分类问题中尤其重要,它能确保训练集和测试集中各类别的比例与原数据集一致,避免因划分导致的类别分布偏差。

3. 实训案例:鸢尾花分类的完整实现与调优

3.1 环境搭建与数据加载

我们选用经典的鸢尾花数据集。它样本量适中,特征清晰,非常适合用来演示决策树的整个流程。首先,确保你的环境里安装了必要的库。

pip install scikit-learn matplotlib pandas numpy

接下来,在Jupyter Notebook或Python脚本中开始我们的代码。

# 导入必要的库
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree, export_text
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
import matplotlib.pyplot as plt

# 加载数据
iris = load_iris()
X = iris.data  # 特征矩阵:150个样本,4个特征(花萼长宽,花瓣长宽)
y = iris.target # 目标向量:3类鸢尾花(0: setosa, 1: versicolor, 2: virginica)
feature_names = iris.feature_names
target_names = iris.target_names

# 查看数据基本信息
print(f"特征矩阵形状: {X.shape}")
print(f"特征名称: {feature_names}")
print(f"目标类别: {target_names}")
print(f"类别分布: {np.bincount(y)}")

# 划分训练集和测试集 (70%训练,30%测试,并分层抽样)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)
print(f"训练集大小: {X_train.shape}, 测试集大小: {X_test.shape}")

运行这段代码,你会看到数据的基本情况。我们有150个样本,4个数值特征,目标分为3类,每类50个样本。通过 stratify=y ,我们保证了训练集和测试集中每类花的比例都是1/3。

3.2 第一棵决策树:默认参数下的表现

让我们先看看一棵完全自由生长的决策树是什么样子。这能帮助我们理解为什么需要剪枝。

# 1. 使用默认参数创建决策树
clf_default = DecisionTreeClassifier(random_state=42)
clf_default.fit(X_train, y_train)

# 2. 在训练集和测试集上评估
y_train_pred = clf_default.predict(X_train)
y_test_pred = clf_default.predict(X_test)

print("=== 默认参数决策树性能 ===")
print(f"训练集准确率: {accuracy_score(y_train, y_train_pred):.4f}")
print(f"测试集准确率: {accuracy_score(y_test, y_test_pred):.4f}")
print("\n测试集分类报告:")
print(classification_report(y_test, y_test_pred, target_names=target_names))

# 3. 可视化这棵树(限制深度以便查看)
plt.figure(figsize=(20, 10))
plot_tree(clf_default,
          feature_names=feature_names,
          class_names=target_names,
          filled=True, # 填充颜色表示类别
          rounded=True,
          fontsize=10)
plt.title("Decision Tree (Default Parameters)", fontsize=16)
plt.show()

# 4. 输出文本形式的树规则(深度较浅时便于理解)
tree_rules = export_text(clf_default, feature_names=feature_names)
print("决策树规则(前几层):")
print(tree_rules[:500]) # 打印前500个字符预览

执行后,你很可能会发现一个典型现象: 训练集准确率是100%,但测试集准确率可能只有93%左右 。这就是过拟合的直观体现——模型把训练数据的所有细节(包括噪声)都学得太好了,以至于在新数据上表现下降。

观察生成的树图,你会发现它非常庞大,有很多很深的分支。这就是默认参数下,树会一直分裂直到每个叶子节点都“纯”(只包含一类样本)的结果。

3.3 关键参数调优实战:寻找泛化能力最佳的树

现在,我们开始调参。目标是找到一组参数,让测试集准确率最高,同时模型又不过于复杂。我们将重点调整 max_depth min_samples_leaf

# 探索 max_depth 的影响
max_depths = range(1, 11)
train_acc = []
test_acc = []

for depth in max_depths:
    clf = DecisionTreeClassifier(max_depth=depth, random_state=42)
    clf.fit(X_train, y_train)
    train_acc.append(accuracy_score(y_train, clf.predict(X_train)))
    test_acc.append(accuracy_score(y_test, clf.predict(X_test)))

# 绘制准确率随深度变化曲线
plt.figure(figsize=(10, 6))
plt.plot(max_depths, train_acc, ‘bo-‘, label=‘Training Accuracy‘)
plt.plot(max_depths, test_acc, ‘rs-‘, label=‘Testing Accuracy‘)
plt.xlabel(‘Max Depth of Tree‘)
plt.ylabel(‘Accuracy‘)
plt.title(‘Accuracy vs. Max Depth‘)
plt.legend()
plt.grid(True)
plt.show()

# 找到测试集准确率最高的深度
best_depth_idx = np.argmax(test_acc)
best_depth = max_depths[best_depth_idx]
print(f"最佳树深度: {best_depth}, 对应测试准确率: {test_acc[best_depth_idx]:.4f}")

通过这个循环,你能清晰地看到:随着树深度增加,训练准确率一路攀升至100%,但测试准确率会先升后降。那个拐点,就是我们要找的、泛化能力最好的深度。对于鸢尾花数据,这个值通常在3到5之间。

接下来,我们结合 min_samples_leaf 进行更精细的调整。我们可以使用网格搜索,但为了理解过程,我们先手动尝试几组组合。

# 手动组合调参示例
param_grid = {
    ‘max_depth‘: [3, 4, 5, None],
    ‘min_samples_leaf‘: [1, 2, 4, 8]
}

results = []
for depth in param_grid[‘max_depth‘]:
    for min_leaf in param_grid[‘min_samples_leaf‘]:
        clf = DecisionTreeClassifier(max_depth=depth,
                                     min_samples_leaf=min_leaf,
                                     random_state=42)
        clf.fit(X_train, y_train)
        test_acc = accuracy_score(y_test, clf.predict(X_test))
        # 同时记录树的叶子节点数,衡量复杂度
        n_leaves = clf.get_n_leaves()
        results.append({
            ‘max_depth‘: depth,
            ‘min_samples_leaf‘: min_leaf,
            ‘test_accuracy‘: test_acc,
            ‘n_leaves‘: n_leaves
        })

# 将结果转为DataFrame便于分析
df_results = pd.DataFrame(results)
print(df_results.sort_values(by=‘test_accuracy‘, ascending=False).head())

通过这个表格,你不仅能找到准确率最高的参数组合,还能看到模型复杂度(叶子节点数)的变化。通常,我们希望在保证准确率的前提下,选择模型更简单(叶子节点更少)的那个,因为这样的模型更稳健,可解释性也更强。

3.4 模型可视化与特征重要性解读

确定了一组较优参数后(例如 max_depth=3, min_samples_leaf=2 ),我们重新训练模型,并深入解读它。

# 使用优化后的参数训练最终模型
clf_final = DecisionTreeClassifier(max_depth=3, min_samples_leaf=2, random_state=42)
clf_final.fit(X_train, y_train)

# 可视化最终的树
plt.figure(figsize=(15, 8))
plot_tree(clf_final,
          feature_names=feature_names,
          class_names=target_names,
          filled=True,
          rounded=True,
          fontsize=12)
plt.title("Optimized Decision Tree (max_depth=3, min_samples_leaf=2)", fontsize=16)
plt.show()

# 分析特征重要性
importances = clf_final.feature_importances_
indices = np.argsort(importances)[::-1] # 按重要性降序排列

print("特征重要性排序:")
for i, idx in enumerate(indices):
    print(f"{i+1}. {feature_names[idx]}: {importances[idx]:.4f}")

# 绘制特征重要性条形图
plt.figure(figsize=(10, 6))
plt.bar(range(X.shape[1]), importances[indices], align=‘center‘)
plt.xticks(range(X.shape[1]), [feature_names[i] for i in indices])
plt.xlabel(‘Feature‘)
plt.ylabel(‘Importance‘)
plt.title(‘Decision Tree Feature Importances‘)
plt.tight_layout()
plt.show()

现在,这棵树清晰可辨。根节点(第一个判断)通常是“花瓣长度 (petal length) <= 某个值”。这直接印证了特征重要性的输出——花瓣长度和花瓣宽度往往是区分鸢尾花最重要的两个特征。你可以沿着树的路径,清晰地解读出模型是如何做决策的:例如,如果花瓣长度小于等于2.45厘米,它直接判定为山鸢尾(setosa);否则,再根据花瓣宽度等特征进一步判断是变色鸢尾(versicolor)还是维吉尼亚鸢尾(virginica)。

这种可解释性是线性模型和神经网络难以比拟的。在业务场景中,你可以直接把这条规则翻译成业务语言:“在我们的客户中,如果交易频率低于每周2次,则初步划为低活跃度用户”,这对于向非技术人员解释模型逻辑非常有价值。

4. 决策树实战中的常见陷阱与进阶技巧

4.1 过拟合与欠拟合:诊断与应对

过拟合是决策树最常见的问题。除了我们上面用到的 max_depth min_samples_leaf ,还有几个信号和工具可以帮助诊断和缓解:

诊断信号

  1. 训练精度远高于测试精度 :这是最明显的标志。
  2. 树结构异常复杂 :可视化后看到大量只包含几个样本的叶子节点,分支非常深。
  3. 特征重要性过于分散 :很多不重要的特征也获得了非零的重要性分数(在噪声数据上尤为明显)。

应对策略(剪枝技术)

  • 预剪枝 :在树生长过程中就提前停止。 sklearn 主要通过参数控制,如 max_depth , min_samples_split , min_samples_leaf , min_impurity_decrease 。这是我们最常用的方法。
  • 后剪枝 :让树充分生长,然后自底向上剪掉一些子树,用叶子节点替代。 sklearn 的CART实现 不直接支持 成本复杂度后剪枝( ccp_alpha 参数可用于此目的,但使用相对复杂)。一个实用的替代方法是:用 clf.cost_complexity_pruning_path 获取剪枝路径,然后通过交叉验证选择最优的 ccp_alpha 值。这对于小数据集特别有效。
# 使用成本复杂度剪枝路径示例(进阶)
clf_full = DecisionTreeClassifier(random_state=42)
path = clf_full.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities

# 为每个alpha训练一个剪枝后的树
clfs = []
for ccp_alpha in ccp_alphas:
    clf = DecisionTreeClassifier(random_state=42, ccp_alpha=ccp_alpha)
    clf.fit(X_train, y_train)
    clfs.append(clf)

# 通常,随着alpha增大,树节点数减少,测试准确率先升后降
# 需要通过交叉验证找到最佳的alpha

欠拟合 则相反,表现为训练和测试精度都很低。这通常是因为模型太简单( max_depth 设得太小),无法捕捉数据中的基本模式。解决办法就是放宽限制,增加模型复杂度。

4.2 处理类别不平衡与成本敏感学习

真实数据中,各类别的样本数往往相差很大。例如在欺诈检测中,正常交易远多于欺诈交易。标准的决策树追求整体准确率,可能会忽略少数类。

应对方法

  1. 调整类别权重 sklearn DecisionTreeClassifier 有一个 class_weight 参数。可以设为 ‘balanced‘ ,让算法自动根据类别频率调整权重,少数类分类错误的代价会更高。你也可以传递一个字典,如 {0: 1, 1: 5} ,明确指定每个类别的权重。
    clf = DecisionTreeClassifier(class_weight=‘balanced‘, random_state=42)
    
  2. 使用不同的评估指标 :不要只看准确率。对于不平衡数据,应关注 精确率 召回率 F1-score ,尤其是少数类的召回率。 classification_report 函数非常好用。
  3. 重采样数据 :通过过采样少数类(如SMOTE算法)或欠采样多数类,使训练数据分布更平衡。但这会改变数据分布,需谨慎评估。

4.3 决策树用于回归任务

决策树不仅可以分类,还可以做回归(预测连续值)。 sklearn 中使用 DecisionTreeRegressor 。其原理与分类树类似,但衡量节点“不纯度”的指标从基尼系数/熵变成了 均方误差 平均绝对误差 。分裂的目标是使得子节点的目标值方差最小化。

一个关键区别在于 预测方式 :分类树的叶子节点输出的是类别或概率;回归树的叶子节点输出的是该节点内所有训练样本目标值的 平均值

from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import load_diabetes
from sklearn.metrics import mean_squared_error, r2_score

# 加载回归数据集
diabetes = load_diabetes()
X_reg, y_reg = diabetes.data, diabetes.target
X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.3, random_state=42)

# 训练回归树
reg = DecisionTreeRegressor(max_depth=4, random_state=42)
reg.fit(X_train_reg, y_train_reg)
y_pred_reg = reg.predict(X_test_reg)

print(f"回归树 R^2 分数: {r2_score(y_test_reg, y_pred_reg):.4f}")
print(f"回归树 均方误差: {mean_squared_error(y_test_reg, y_pred_reg):.4f}")

回归树同样容易过拟合,需要通过 max_depth min_samples_leaf 等参数严格控制树的大小。

4.4 从单棵树到森林:决策树的进阶之路

单棵决策树虽然直观,但稳定性较差(数据微小变动可能导致树结构巨变),且容易过拟合。因此,在实际工业应用中,直接使用单棵决策树的情况较少,更多的是以其为基学习器,构建集成模型:

  1. 随机森林 :通过 Bootstrap抽样 构建多棵不同的训练子集,并训练多棵决策树。在每棵树分裂时,只随机考虑一部分特征。最后通过投票(分类)或平均(回归)得到最终结果。这大大提升了模型的稳定性和泛化能力。在 sklearn 中,只需将 DecisionTreeClassifier 替换为 RandomForestClassifier ,大部分参数是共通的。
  2. 梯度提升树 :如XGBoost、LightGBM、CatBoost。这些模型以决策树为弱学习器,采用加法模型与前向分步算法,每一棵树都在学习之前所有树组合的残差。它们通常具有更高的预测精度,是当前结构化数据竞赛和业务中的主流选择。

理解单棵决策树,是掌握这些强大集成模型的基础。当你清楚一棵树是如何生长、如何剪枝、如何计算重要性后,你就能更好地理解森林是如何工作的,以及如何调优森林中的每一棵树。

5. 实训项目扩展与思考

5.1 项目作业常见问题排查指南

在带领实训或自己练习时,你可能会遇到以下问题及解决方法:

问题现象 可能原因 排查步骤与解决方案
模型准确率始终为0或极低 1. 数据标签弄反(X和y搞错)。
2. 特征量纲差异巨大,且未处理(虽然树不要求标准化,但某些实现或极端情况可能受影响)。
3. 数据本身没有区分度。
1. 检查 X_train.shape y_train.shape 是否匹配,打印前几行数据确认。
2. 检查特征数值范围,可尝试进行简单的缩放观察效果。
3. 使用简单的可视化(如用前两个特征做散点图并着色)查看数据是否可分。
训练集准确率100%,测试集很低 典型的过拟合。 1. 可视化决策树,查看其深度和复杂度。
2. 逐步增加 max_depth min_samples_leaf 等参数的值,观察测试集准确率变化曲线。
3. 使用交叉验证选择泛化能力最好的参数。
feature_importances_ 全为0或某个特征为1 1. 数据中可能存在某个特征完美分割了数据(如ID号)。
2. 当 max_depth=1 时,只有一个特征被使用。
1. 检查数据,移除无意义的特征(如ID、常数特征)。
2. 检查树的结构,确认是否只进行了一次分裂。
预测速度非常慢 树过于庞大(深度太深,叶子节点太多)。 1. 使用 clf.get_n_leaves() clf.get_depth() 查看树规模。
2. 应用更严格的预剪枝参数。
3. 考虑使用更高效的模型(如随机森林在大量树时,单棵可以更浅)。
对新数据预测结果全部一样 1. 模型严重欠拟合。
2. 新数据的特征分布与训练数据差异极大,导致所有样本都落入同一个叶子节点。
1. 检查模型在训练集上的表现,如果也很差,则需减少剪枝强度(如增大 max_depth )。
2. 检查新数据的特征值,确保其与训练数据处于相似的范围和分布。

5.2 超越鸢尾花:寻找你的实战数据集

掌握基础后,要寻找更复杂、更贴近现实的数据集进行练习:

  1. UCI机器学习仓库 :宝藏网站,包含数百个不同领域的数据集。尝试“葡萄酒分类”、“乳腺癌诊断”、“波士顿房价预测”等经典数据集。
  2. Kaggle入门竞赛 :如“泰坦尼克号生存预测”、“房价预测”。这些项目有完整的背景、数据和社区讨论,是极佳的练手场。
  3. 自定义业务数据 :如果你有感兴趣的方向,可以尝试爬取或整理一些数据。例如,分析社交媒体上某类话题的情感倾向(分类),或者预测某个产品的月度销量(回归)。

5.3 决策树的优势、局限与适用场景总结

经过这一轮实训,你应该对决策树有了立体的认识。最后,我们来系统性地总结一下,方便你在未来项目中做出合适的选择:

优势

  • 极其直观,易于解释 :白盒模型,规则可以翻译成 if-else 语句,易于向业务方展示。
  • 无需大量数据预处理 :对缺失值不敏感(但sklearn要求处理),不受量纲影响,能直接处理混合类型特征(需编码)。
  • 可以捕捉非线性关系 :不需要像线性模型那样手动构造交互项。
  • 计算复杂度相对较低 :预测速度快。

局限

  • 非常容易过拟合 :必须通过剪枝、集成等方法来控制。
  • 不稳定 :训练数据的微小变化可能导致生成完全不同的树。
  • 有偏性 :倾向于选择那些具有更多类别或更多层级的特征。对连续特征,寻找最佳分割点是贪心算法,可能找不到全局最优。
  • 外推能力差 :无法预测训练数据范围之外的值。对于回归问题,预测值是叶子节点内样本的平均值,因此预测结果总是有界的。

适用场景

  • 需要模型解释性的场景 :如金融信贷初步审核、医疗辅助诊断、商业规则挖掘。
  • 探索性数据分析 :快速了解哪些特征可能与目标相关。
  • 作为复杂集成模型的基学习器 :这是它当前最主要、最强大的应用场景。

决策树就像机器学习领域的“螺丝刀”,简单、直接、不可或缺。虽然单独使用时力量有限,但一旦你理解了它的拧动原理,你就能组装出“电动螺丝刀”(随机森林)甚至“全自动装配线”(梯度提升树)。这次从头歌实训出发的旅程,目的就是让你亲手把这把螺丝刀用得趁手,为后续更复杂的学习打下坚实的、可复现的基础。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐