基于CART决策树的西瓜数据集分类实战与调优指南

1次阅读
没有评论

共计 1572 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

为什么选择 CART 决策树

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

基于 CART 决策树的西瓜数据集分类实战与调优指南

新手常踩的三个坑

  • 特征重要性评估误区 :单纯看节点分裂顺序可能误导,实际应通过feature_importances_ 属性计算累积贡献度。例如『脐部』特征看似重要,但可能只是因为恰好被选为根节点。

  • 取值多的特征过拟合 :比如『密度』若保留过多小数位,决策树会创建大量分支导致过拟合。解决方案是设置min_samples_split=5 强制合并相似样本。

  • 连续特征标准化陷阱 :决策树本身不受量纲影响,但可视化时若未对『含糖率』等特征还原原始刻度,会导致分界点难以解释。建议在export_graphviz 时设置 feature_names 为原始字段名。

从零搭建模型的完整流程

  1. 数据准备阶段

    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)

  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')

  3. 信息增益计算原理(对应公式):

    # 计算信息增益比(需先定义熵函数)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)    

延伸思考

  1. 基尼系数 vs 信息增益 :将criterion='gini' 即可切换,两者主要差异在于计算效率(基尼系数不涉及对数运算)

  2. 新增『糖度』特征 :需检查其与现有『含糖率』的相关性(避免多重共线性),并通过clf.feature_importances_ 观察是否值得保留。

正文完
 0
评论(没有评论)