前言
逻辑回归是一种常用的分类算法,尤其在医学数据分析中常用于预测二分类的结果(如疾病的有无)。它通过估计因变量(通常是二进制变量)与自变量之间的关系来建模。不管你是什么专业,什么科室,大量的数据都可以使用逻辑回归来分析。熟练的掌握逻辑回归的分析代码,可以极大地提高科研的效率,年底的论文任务不也就更好完成了吗?
相比简单线性回归,逻辑回归的优势在于其专为分类任务设计,能处理二分类问题且输出概率值,从而更适合预测分类问题中目标变量的分布。简单线性回归则倾向于在分类问题中生成不合理的预测值(如概率大于1或小于0),逻辑回归通过sigmoid函数有效避免了这一点。本文的更新将演示逻辑回归的完整套路,特别是对医学数据进行建模、分析、和可视化。
1. 数据准备
我们将使用一个模拟的数据集,其中包括患者的年龄、性别、血压、胆固醇水平等变量,以及他们是否患有某种疾病的二分类结果。
# 导入必要的库
import pandas as pd
import numpy as np
# 生成模拟数据
np.random.seed(42)
data = pd.DataFrame({
'Age': np.random.randint(20, 80, 100),
'Sex': np.random.choice(['Male', 'Female'], 100),
'BloodPressure': np.random.randint(80, 180, 100),
'Cholesterol': np.random.randint(150, 300, 100),
'Disease': np.random.choice([0, 1], 100)
})
# 数据预览
print(data.head())
## Age Sex BloodPressure Cholesterol Disease
## 0 58 Female 94 296 0
## 1 71 Male 122 297 1
## 2 48 Female 108 245 0
## 3 34 Male 115 201 1
## 4 62 Female 92 277 0
2. 数据预处理
在开始建模之前,需要对数据进行处理,包括:编码分类变量、标准化数值变量。
from sklearn.preprocessing import StandardScaler, LabelEncoder
# 对分类变量进行编码
data['Sex'] = LabelEncoder().fit_transform(data['Sex'])
# 标准化数值变量
scaler = StandardScaler()
data[['Age', 'BloodPressure', 'Cholesterol']] = scaler.fit_transform(data[['Age', 'BloodPressure', 'Cholesterol']])
# 数据预览
print(data.head())
## Age Sex BloodPressure Cholesterol Disease
## 0 0.469313 0 -1.237971 1.502561 0
## 1 1.193906 1 -0.274034 1.524831 1
## 2 -0.088066 0 -0.756003 0.366788 0
## 3 -0.868396 1 -0.515018 -0.613095 1
## 4 0.692265 0 -1.306824 1.079430 0
3. 逻辑回归建模
我们将分割数据集为训练集和测试集,并使用逻辑回归进行建模。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
# 分割数据集
X = data[['Age', 'Sex', 'BloodPressure', 'Cholesterol']]
y = data['Disease']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 逻辑回归建模
model = LogisticRegression()
model.fit(X_train, y_train)
# 模型预测
y_pred = model.predict(X_test)
# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
## Accuracy: 0.6
print(classification_report(y_test, y_pred))
## precision recall f1-score support
##
## 0 0.50 0.38 0.43 8
## 1 0.64 0.75 0.69 12
##
## accuracy 0.60 20
## macro avg 0.57 0.56 0.56 20
## weighted avg 0.59 0.60 0.59 20
4. 可视化
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
# 计算ROC曲线和AUC
y_pred_prob = model.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_pred_prob)
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label=f'ROC Curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], 'r--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.show()