决策树实战:基于Breast Cancer Wisconsin数据集的分类模型构建与优化

1次阅读
没有评论

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

image.webp

背景与痛点

医疗数据分类任务往往面临两个核心挑战:

决策树实战:基于 Breast Cancer Wisconsin 数据集的分类模型构建与优化

  1. 特征选择困难:医疗数据集通常包含大量临床指标(如本例的 30 个细胞核特征),哪些特征真正影响诊断结果?
  2. 模型可解释性要求高:医生需要理解模型的决策依据,” 黑箱 ” 模型很难获得临床信任。

决策树因其天然的可视化能力和特征重要性排序,成为医疗分类任务的理想选择。

技术选型对比

  • 决策树
  • 优势:自动特征选择、可视化决策路径、无需数据标准化
  • 劣势:容易过拟合
  • 逻辑回归
  • 优势:输出概率值、训练速度快
  • 劣势:无法自动处理特征相关性
  • SVM
  • 优势:高维空间表现好
  • 劣势:参数调优复杂、可解释性差

对于需要出具诊断建议书的场景,决策树的 .feature_importances_ 属性和可视化能力完胜。

核心实现步骤

1. 数据加载与预处理

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

# 加载数据集
cancer = load_breast_cancer()
X, y = cancer.data, cancer.target

# 训练测试集拆分(保持类别比例)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)

2. 构建基线模型

from sklearn.tree import DecisionTreeClassifier

# 初始化决策树(关键参数说明)clf = DecisionTreeClassifier(
    criterion='gini',  # 分裂标准
    max_depth=3,       # 控制树深度防过拟合
    min_samples_leaf=5 # 叶节点最小样本数
)

clf.fit(X_train, y_train)
print("训练集准确率:", clf.score(X_train, y_train))
print("测试集准确率:", clf.score(X_test, y_test))

3. 可视化决策树

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

plt.figure(figsize=(12,8))
plot_tree(
    clf, 
    feature_names=cancer.feature_names,
    class_names=cancer.target_names,
    filled=True,
    rounded=True
)
plt.show()

模型优化实战

网格搜索调参

from sklearn.model_selection import GridSearchCV

param_grid = {'max_depth': [3, 5, 7],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 5]
}

grid_search = GridSearchCV(DecisionTreeClassifier(),
    param_grid,
    cv=5,
    scoring='f1'
)
grid_search.fit(X_train, y_train)

print("最佳参数:", grid_search.best_params_)

学习曲线诊断

from sklearn.model_selection import learning_curve
import numpy as np

train_sizes, train_scores, test_scores = learning_curve(
    grid_search.best_estimator_,
    X_train,
    y_train,
    cv=5,
    scoring='accuracy'
)

plt.plot(train_sizes, np.mean(train_scores, axis=1), label='训练集')
plt.plot(train_sizes, np.mean(test_scores, axis=1), label='验证集')
plt.legend()
plt.show()

避坑指南

类别不平衡处理

当良性 / 恶性样本比例悬殊时:

  • 使用 class_weight='balanced' 参数
  • 采用 SMOTE 过采样技术

可解释性增强

  • 输出特征重要性排序:
    import pandas as pd
    
    feat_imp = pd.Series(
        clf.feature_importances_,
        index=cancer.feature_names
    ).sort_values(ascending=False)
  • 生成决策规则报告

内存优化建议

  • 设置 max_depth 限制树深度
  • 使用 export_text() 替代图形化输出

评估指标对比

模型版本 准确率 召回率 F1-score
基线模型 0.912 0.915 0.913
调优后模型 0.939 0.941 0.940

思考延伸

  1. 如何将模型预测结果与患者的其他临床数据(如年龄、病史)结合使用?
  2. 当新增超声检查特征时,决策树结构会如何变化?
  3. 在医疗诊断系统中,如何设计医生反馈机制来持续优化模型?

通过这个实战项目,我们验证了决策树在医疗分类任务中的独特价值。下次遇到需要解释模型决策过程的场景,不妨优先考虑这颗会 ” 说话 ” 的树。

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