共计 1572 个字符,预计需要花费 4 分钟才能阅读完成。
为什么选择 CART 决策树
CART 决策树在分类任务中具有天然的可解释性,适合处理像西瓜数据集这样的混合型特征(既有离散的『纹理』『根蒂』,也有连续的『密度』『含糖率』)。其二叉树结构能自动筛选重要特征,且不需要对数据做复杂的预处理(如标准化不是必须步骤)。通过控制树深等参数,我们可以在模型复杂度与泛化能力之间取得平衡。

新手常踩的三个坑
-
特征重要性评估误区 :单纯看节点分裂顺序可能误导,实际应通过
feature_importances_属性计算累积贡献度。例如『脐部』特征看似重要,但可能只是因为恰好被选为根节点。 -
取值多的特征过拟合 :比如『密度』若保留过多小数位,决策树会创建大量分支导致过拟合。解决方案是设置
min_samples_split=5强制合并相似样本。 -
连续特征标准化陷阱 :决策树本身不受量纲影响,但可视化时若未对『含糖率』等特征还原原始刻度,会导致分界点难以解释。建议在
export_graphviz时设置feature_names为原始字段名。
从零搭建模型的完整流程
-
数据准备阶段
from sklearn.datasets import load_iris # 示例用鸢尾花数据集替代(需替换为实际西瓜数据集)from sklearn.tree import DecisionTreeClassifier # 假设已加载西瓜数据集 X, y = load_watermelon(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) -
关键参数调优
# 绘制 max_depth 与准确率关系曲线 depths = range(1, 10) accuracies = [] for d in depths: clf = DecisionTreeClassifier(max_depth=d, criterion='gini') clf.fit(X_train, y_train) accuracies.append(clf.score(X_test, y_test)) plt.plot(depths, accuracies) plt.xlabel('Max Tree Depth') plt.ylabel('Test Accuracy') -
信息增益计算原理(对应公式):
# 计算信息增益比(需先定义熵函数)def entropy(y): _, counts = np.unique(y, return_counts=True) p = counts / len(y) return -np.sum(p * np.log2(p)) # 特征 A 的信息增益 = H(D) - H(D|A) # 具体实现参考 sklearn 源码中的_splitter.py
避坑指南:那些没人告诉你的细节
-
数据泄露检测 :检查训练集 accuracy 是否异常高于测试集(如 98% vs 70%),可能因误用
fit_transform而非分开处理。正确做法:scaler = StandardScaler().fit(X_train) X_test_scaled = scaler.transform(X_test) # 不要对测试集 fit! -
类别不平衡处理 :当『坏瓜』样本仅占 10% 时,设置
class_weight='balanced'让算法自动调整权重。 -
可视化优化:Graphviz 生成的决策树若文字重叠,添加参数:
export_graphviz(..., fontsize=8, proportion=True, # 按节点比例缩放 rounded=True)
延伸思考
-
基尼系数 vs 信息增益 :将
criterion='gini'即可切换,两者主要差异在于计算效率(基尼系数不涉及对数运算) -
新增『糖度』特征 :需检查其与现有『含糖率』的相关性(避免多重共线性),并通过
clf.feature_importances_观察是否值得保留。
