``` # 1. 环境准备 import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix, accuracy_score import matplotlib.pyplot as plt import seaborn as sns # 2. 数据加载与预处理 data_path = r'C:\Users\29930\Desktop\手动筛选原始数据.csv' # 假设数据为CSV格式 df = pd.read_csv(data_path) # 检查数据 print(f"数据维度: {df.shape}") print("前5行数据:") print(df.head()) # 分割特征和标签 X = df.drop('COPD', axis=1) # 假设标签列为'label' y = df['COPD'] # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 3. 构建随机森林模型 rf_model = RandomForestClassifier(n_estimators=100, random_state=42) rf_model.fit(X_train, y_train) # 4. 模型评估 y_pred = rf_model.predict(X_test) print(f"\n准确率: {accuracy_score(y_test, y_pred):.2f}") print("\n分类报告:") print(classification_report(y_test, y_pred)) # 5. 特征重要性提取 feature_importance = rf_model.feature_importances_ features = X.columns importance_df = pd.DataFrame({'特征': features, '重要性': feature_importance}) importance_df = importance_df.sort_values('重要性', ascending=False) print("\n特征重要性排序:") print(importance_df) # 新增代码 ============================================== # 6. 筛选前10重要特征并创建新数据集 top10_features = importance_df.head(10)['特征'].tolist() X_top10 = X[top10_features] # 创建仅包含前10特征的新数据集 # 7. 构建评分系统 # 7.1 特征归一化处理(消除量纲影响) from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() X_top10_scaled = scaler.fit_transform(X_top10) print(inX_top10) # 7.2 计算特征权重(将重要性转换为百分比) top10_weights = importance_df.head(10)['重要性'].values total_importance = top10_weights.sum() normalized_weights = (top10_weights / total_importance) * 100 # 权重总和归一化为100 # 7.3 创建评分系统函数 def calculate_score(row): """计算每个样本的COPD风险评分""" weighted_sum = 0 for i, feature in enumerate(top10_features): # 每个特征值乘以其归一化后的权重 weighted_sum += row[feature] * normalized_weights[i] return weighted_sum # 7.4 应用评分系统 score_df = pd.DataFrame(X_top10_scaled, columns=top10_features) score_df['COPD_Score'] = score_df.apply(calculate_score, axis=1) # 7.5 将评分映射到0-100范围 final_scaler = MinMaxScaler(feature_range=(0, 100)) score_df['COPD_Score'] = final_scaler.fit_transform(score_df[['COPD_Score']]) # 8. 保存新数据集和评分结果 score_df.to_csv(r'C:\Users\29930\Desktop\COPD_风险评分数据集.csv', index=False) # 9. 验证评分系统效果 # 合并原始标签用于验证 validation_df = pd.concat([score_df, y.reset_index(drop=True)], axis=1) # 计算评分与COPD的相关性 correlation = validation_df['COPD_Score'].corr(validation_df['COPD']) print(f"\n评分与COPD的皮尔逊相关系数: {correlation:.3f}") # 可视化验证 plt.figure(figsize=(10, 6)) sns.boxplot(x='COPD', y='COPD_Score', data=validation_df) plt.title('COPD评分分布验证') plt.xlabel('是否患病') plt.ylabel('风险评分') plt.savefig(r'C:\Users\29930\Desktop\评分验证图.png', dpi=300, bbox_inches='tight') plt.show()```增加可视化评分与COPD相关性的代码
时间: 2025-07-10 17:43:41 浏览: 15
<think>嗯,用户给了一段Python代码,是关于用随机森林模型构建COPD风险评分系统,并希望增加可视化评分与COPD相关性的代码。首先,我需要仔细阅读现有代码,看看已经做了什么,然后确定用户需要补充的部分在哪里。
从代码结构看,用户已经完成了数据加载、预处理、模型训练、评估、特征重要性提取,并且创建了评分系统,最后保存了结果。在第九步验证部分,用户计算了皮尔逊相关系数,并用箱线图展示了评分分布。现在用户想增加更多可视化评分与COPD相关性的代码。
首先,我需要理解现有的验证部分。他们用了箱线图,这可以比较患病和未患病组的评分分布差异。用户可能希望更全面地展示评分与COPD的关系,可能需要其他的图表,比如分布图、ROC曲线,或者散点图加上趋势线。
接下来,用户的需求是“增加可视化评分与COPD相关性的代码”。现有的可视化是箱线图,可能需要补充其他类型的图表。考虑到评分是连续变量,而COPD是二分类变量,除了箱线图,可以考虑:
1. 分布图(如KDE图或直方图),按COPD分组显示评分的分布情况。
2. ROC曲线,评估评分作为分类器的性能,计算AUC值。
3. 散点图结合趋势线,但COPD是二元的,可能不太直观,但可以用抖动点或分箱处理。
4. 相关系数热力图,但这里只有一个相关系数,可能不太适用,不过可以结合其他指标。
然后,我需要检查现有代码中的可视化部分是否有遗漏或可以改进的地方。例如,用户已经使用了sns.boxplot,可能可以添加其他图形类型。另外,用户可能希望展示评分在不同阈值下的分类效果,或者评分的概率分布如何区分两类。
在代码实现上,需要注意数据准备。例如,验证_df已经包含了COPD_Score和COPD列,所以可以直接用这个DataFrame来生成新的图表。需要确保新增的代码不会与现有代码冲突,比如变量名重复或图像重叠显示的问题。
可能的步骤:
1. 绘制ROC曲线,计算AUC,这需要用到sklearn的roc_curve和roc_auc_score。
2. 绘制概率密度图(KDE),分COPD组显示评分分布。
3. 使用分箱法,比如将评分分成几个区间,计算每个区间的COPD患病率,绘制折线图或柱状图。
4. 添加更详细的统计检验结果,比如t-test的p值,增强可视化的信息量。
现在,我需要具体考虑如何将这些可视化添加到现有代码中。例如,在第九步的验证部分,用户已经有一个箱线图,可以继续添加其他图形,并确保每个图表都有适当的标题、标签,并且保存为图片文件。
同时,要注意代码的正确性。比如,在计算ROC曲线时,需要将COPD_Score作为预测概率,但这里评分已经是0-100的连续值,可以直接使用。ROC曲线需要真标签和预测分数,所以可以直接用validation_df['COPD']和validation_df['COPD_Score']。
另外,用户可能希望这些图表保存到桌面,因此需要注意文件路径是否正确,避免覆盖已有的评分验证图.png。
最后,需要测试新增的代码是否能够无缝集成到原有流程中,确保没有语法错误,比如变量名拼写错误,或未导入必要的库(如从sklearn.metrics导入roc_curve, auc等)。
总结,用户的需求是增强可视化部分,展示评分与COPD的相关性,因此需要添加多种图表来全面展示这种关系,同时确保代码正确且输出清晰。</think>我将为您补充3种可视化评分与COPD相关性的代码实现,并解释其原理:
```python
# 新增可视化代码 ==============================================
# 9.1 概率密度曲线(展示评分分布差异)
plt.figure(figsize=(10, 6))
sns.kdeplot(data=validation_df, x='COPD_Score', hue='COPD', fill=True, alpha=0.5)
plt.title('COPD风险评分概率密度分布')
plt.xlabel('风险评分')
plt.ylabel('密度')
plt.legend(title='是否患病', labels=['健康', '患病'])
plt.savefig(r'C:\Users\29930\Desktop\评分密度分布.png', dpi=300, bbox_inches='tight')
plt.show()
# 9.2 ROC曲线(评估评分诊断能力)
from sklearn.metrics import roc_curve, auc
fpr, tpr, thresholds = roc_curve(validation_df['COPD'], validation_df['COPD_Score'])
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8, 8))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC曲线 (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.title('风险评分的ROC曲线')
plt.legend(loc="lower right")
plt.savefig(r'C:\Users\29930\Desktop\ROC曲线.png', dpi=300, bbox_inches='tight')
plt.show()
# 9.3 评分分箱验证(展示评分与患病率关系)
validation_df['Score_Bin'] = pd.qcut(validation_df['COPD_Score'], q=10, duplicates='drop')
bin_analysis = validation_df.groupby('Score_Bin')['COPD'].agg(['mean', 'count']).reset_index()
plt.figure(figsize=(10, 6))
sns.lineplot(data=bin_analysis, x=bin_analysis.index, y='mean', marker='o')
plt.xticks(range(len(bin_analysis)), [str(x) for x in bin_analysis['Score_Bin']], rotation=45)
plt.title('风险评分分箱验证(十分位法)')
plt.xlabel('评分区间')
plt.ylabel('COPD患病率')
plt.grid(True)
plt.savefig(r'C:\Users\29930\Desktop\评分分箱验证.png', dpi=300, bbox_inches='tight')
plt.show()
```
各可视化方法的原理说明(使用中文排版和数学公式):
1. **概率密度曲线**
- 使用核密度估计(KDE)展示评分分布
- 理想状态:两个分布应有明显分离
- 分离度可用Bhattacharyya系数度量:
$$ BC = \int \sqrt{p(x)q(x)}dx $$
其中$p(x)$和$q(x)$分别是患病/健康组的概率密度函数
2. **ROC曲线**
- 横轴假阳性率(FPR),纵轴真阳性率(TPR):
$$ FPR = \frac{FP}{FP+TN}, \quad TPR = \frac{TP}{TP+FN} $$
- AUC面积解释:
- 0.9-1.0:优秀
- 0.8-0.9:良好
- 0.7-0.8:中等
3. **评分分箱验证**
- 使用十分位法(Decile)分箱
- 计算每个评分区间的实际患病率:
$$ \text{患病率} = \frac{\text{该区间患病例数}}{\text{区间总人数}} $$
- 理想趋势:评分越高,患病率应单调上升
补充建议:
1. 可添加统计检验(如t检验)验证组间差异:
$$ t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}} $$
2. 建议检查评分系统的线性假设:
$$ \text{logit}(p) = \beta_0 + \beta_1 \cdot \text{Score} $$
通过逻辑回归验证评分与患病率的线性关系
阅读全文
相关推荐









