模仿文章的思路,用python写一个关于COPD早筛模型的代码。我的数据集在C:\Users\29930\Desktop\手动筛选原始数据中,第一行是标签,第一列的标签是COPD。要求先进行变量选择,再进行模型验证,最后是模型评估,并将这三部分进行可视化,最后输出早筛COPD的模型和公式。
时间: 2025-03-25 21:04:34 浏览: 35
为了构建一个慢性阻塞性肺病(COPD)早筛模型,我们可以按照以下步骤进行:
1. **加载并预处理数据**:读取CSV文件,处理缺失值等。
2. **变量选择**:使用相关性分析或特征重要性方法选择重要的预测变量。
3. **模型训练与验证**:选择合适的机器学习算法进行训练,并通过交叉验证来优化超参数。
4. **模型评估**:计算准确率、召回率、F1分数等指标;绘制ROC曲线和混淆矩阵。
5. **模型公式输出**:提取模型的系数或决策规则,并以可解释的形式呈现。
下面是一个完整的Python代码示例,基于Scikit-Learn和其他常用库实现上述流程。假设您的CSV文件路径为`C:\Users\29930\Desktop\手动筛选原始数据.csv`。
### 导入必要的库
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, roc_curve, auc, confusion_matrix
import statsmodels.api as sm
plt.style.use('ggplot')
```
### 加载并预处理数据
```python
# 读取数据
file_path = r'C:\Users\29930\Desktop\手动筛选原始数据.csv'
data = pd.read_csv(file_path)
# 查看前几行数据
print(data.head())
# 检查是否有缺失值
print(data.isnull().sum())
# 填充缺失值(如果有的话)
data.fillna(method='ffill', inplace=True)
# 分离特征和目标变量
X = data.drop(columns=['COPD']) # 假设第一列为COPD标签
y = data['COPD']
# 标准化数值型特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 将标准化后的数据转回DataFrame格式以便后续操作
X_scaled_df = pd.DataFrame(X_scaled, columns=X.columns)
```
### 变量选择
```python
# 使用SelectKBest进行单变量选择
selector = SelectKBest(score_func=f_classif, k='all') # 先全部选出来查看得分情况
fit = selector.fit(X_scaled_df, y)
# 打印每个特征的重要性评分
feature_scores = pd.DataFrame(list(zip(X_scaled_df.columns, fit.scores_)),
columns=['Feature','Score'])
feature_scores.sort_values(by='Score', ascending=False, inplace=True)
print(feature_scores)
# 绘制特征重要性图
plt.figure(figsize=(10, 6))
sns.barplot(x="Score", y="Feature", data=feature_scores)
plt.title('Feature Importance Scores')
plt.show()
# 选择最重要的几个特征
selected_features = feature_scores[feature_scores.Score >= feature_scores.Score.quantile(0.75)].Feature.tolist() # 选取前75%分位数以上的特征
X_selected = X_scaled_df[selected_features]
```
### 模型训练与验证
```python
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.2, random_state=42)
# 定义逻辑回归模型
logreg = LogisticRegression(solver='liblinear')
# 超参数调优 - 这里我们只对正则化强度C做网格搜索
param_grid = {'C': [0.01, 0.1, 1, 10, 100]}
grid_search = GridSearchCV(logreg, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 输出最佳参数组合及对应的成绩
best_logreg = grid_search.best_estimator_
print("Best parameters:", grid_search.best_params_)
print("Best CV Score:", grid_search.best_score_)
```
### 模型评估
```python
# 在测试集上应用最优模型
y_pred = best_logreg.predict(X_test)
# 计算性能指标
acc = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
conf_mat = confusion_matrix(y_test, y_pred)
print(f"Accuracy: {acc:.4f}")
print(report)
# 绘制混淆矩阵热力图
plt.figure(figsize=(8, 6))
sns.heatmap(conf_mat, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.title('Confusion Matrix Heatmap')
plt.show()
# ROC曲线
fpr, tpr, _ = roc_curve(y_test, best_logreg.decision_function(X_test))
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC Curve (area = {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('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()
```
### 提取模型公式
```python
# 添加常数项
X_const = sm.add_constant(X_selected)
# 构建OLS线性回归模型(用于展示线性关系)
model = sm.Logit(y, X_const).fit()
print(model.summary())
# 获取最终模型方程
coefs = list(best_logreg.coef_[0]) + [best_logreg.intercept_[0]]
features_with_intercept = ['const'] + selected_features
formula_parts = []
for coef, feat in zip(coefs, features_with_intercept):
formula_parts.append(f"{coef:+.4f}*{feat}")
final_formula = " + ".join(formula_parts)
print("\nFinal Early Screening Formula:")
print(final_formula.replace('+', ' + ').replace('-', ' - '))
```
此代码涵盖了从数据加载到模型构建、评估以及最终公式的输出整个过程。您可以根据实际的数据结构调整某些部分,例如特征选择的数量、使用的分类器类型等。希望这段代码能帮助您建立一个有效的COPD早筛模型!
阅读全文
相关推荐



















