共计 2156 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
医疗数据分类任务往往面临两个核心挑战:

- 特征选择困难:医疗数据集通常包含大量临床指标(如本例的 30 个细胞核特征),哪些特征真正影响诊断结果?
- 模型可解释性要求高:医生需要理解模型的决策依据,” 黑箱 ” 模型很难获得临床信任。
决策树因其天然的可视化能力和特征重要性排序,成为医疗分类任务的理想选择。
技术选型对比
- 决策树:
- 优势:自动特征选择、可视化决策路径、无需数据标准化
- 劣势:容易过拟合
- 逻辑回归:
- 优势:输出概率值、训练速度快
- 劣势:无法自动处理特征相关性
- 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 |
思考延伸
- 如何将模型预测结果与患者的其他临床数据(如年龄、病史)结合使用?
- 当新增超声检查特征时,决策树结构会如何变化?
- 在医疗诊断系统中,如何设计医生反馈机制来持续优化模型?
通过这个实战项目,我们验证了决策树在医疗分类任务中的独特价值。下次遇到需要解释模型决策过程的场景,不妨优先考虑这颗会 ” 说话 ” 的树。
正文完
