共计 2055 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:医疗数据的分类挑战
医疗领域的数据分析常面临两大核心问题:

- 高维特征空间 :乳腺癌 Wisconsin 数据集包含 30 个特征(如细胞半径、纹理、周长等),需要有效筛选关键特征
- 样本不平衡 :恶性与良性样本比例约为 37:63,可能影响模型对少数类的识别能力
传统逻辑回归等线性模型难以捕捉特征间复杂关系,而深度学习又面临数据量不足的问题,这正是决策树算法的优势场景。
技术方案选型对比
| 算法 | 优势 | 医疗数据局限性 |
|---|---|---|
| 决策树 | 可解释性强,自动特征选择 | 容易过拟合 |
| 随机森林 | 缓解过拟合,更高准确率 | 黑箱特性,临床解释成本高 |
| SVM | 高维空间表现好 | 参数敏感,训练耗时长 |
决策树因其可视化诊断路径的能力,成为医疗合规性要求下的优先选择。
核心实现流程
1. 数据预处理
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 加载数据集
df = pd.read_csv('data.csv')
labels = df['diagnosis'].map({'M':1, 'B':0}) # 恶性标记为 1
# 处理缺失值(Wisconsin 数据集已完整,此处演示通用流程)data = df.drop(['id','diagnosis'], axis=1)
data.fillna(data.median(), inplace=True)
# 标准化(决策树虽不需要,但为后续对比实验准备)scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
2. 决策树建模
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.model_selection import train_test_split
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, stratify=labels, random_state=42)
# 基尼系数与信息熵对比实验
for criterion in ['gini', 'entropy']:
clf = DecisionTreeClassifier(
criterion=criterion,
max_depth=3, # 初始控制树深度
min_samples_split=10,
class_weight='balanced'
)
clf.fit(X_train, y_train)
print(f'{criterion} 准则测试集准确率: {clf.score(X_test, y_test):.2f}')
3. 可视化分析
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plot_tree(clf,
feature_names=data.columns,
class_names=['Benign','Malignant'],
filled=True,
rounded=True)
plt.savefig('tree_visualization.png')
# 特征重要性
pd.Series(clf.feature_importances_,
index=data.columns).sort_values().plot.barh()
关键优化策略
防止过拟合
- 预剪枝 :通过参数控制树生长
optimal_tree = DecisionTreeClassifier( max_depth=4, min_samples_leaf=5, ccp_alpha=0.01 # 代价复杂度剪枝 ) - 后剪枝 :使用 cost_complexity_pruning_path
path = clf.cost_complexity_pruning_path(X_train, y_train) ccp_alphas = path.ccp_alphas
类别不平衡处理
- 调整 class_weight 参数
- SMOTE 过采样技术
- 更改评估指标(F1-score 代替准确率)
生产部署建议
- 临床验证 :
- 与医生合作标注关键决策节点
- 使用 LIME 生成局部解释
- API 部署 :
from fastapi import FastAPI import joblib app = FastAPI() model = joblib.load('model.pkl') @app.post('/predict') async def predict(features: dict): df = pd.DataFrame([features]) proba = model.predict_proba(df)[0] return {'malignant_prob': float(proba[1])}
实践资源
- Kaggle 数据集
- 思考题:如何设计临床审计日志记录模型预测过程?
通过本案例可见,决策树在保持 90%+ 准确率的同时,能提供清晰的诊断依据路径。后续可探索通过组合多个浅层树(如 GBDT)进一步提升模型稳定性。
正文完
