作业要求 1. 数据预处理 - 加载数据集 加载给定的医疗表格数据集,查看数据的基本信息(如维度、数据类型、缺失值等)。 - 处理缺失值 - 如果数据集中存在缺失值,可以选择删除含有缺失值的样本或使用均值填充(需简单说明选择的理由)。 2. 逻辑回归模型构建与训练 - 构建逻辑回归模型 - 使用Python的Scikit-learn库构建逻辑回归分类模型(`LogisticRegression`)。 - 划分训练集和测试集(建议按80%训练集,20%测试集划分)。 - 超参数调整 - 调整正则化强度`C`(如尝试0.1、1、10等值),观察其对模型性能的影响。 3. 模型评估 - 评估指标 - 使用准确率(Accuracy)和F1值(F1-Score)评估模型在测试集上的性能。 - 绘制混淆矩阵以直观展示分类结果。 4. 实验报告(10分) - 提交要求 - 文件名必须为“学号+姓名”格式(如`20231234_张三.pdf`)。 数据集 本次实验推荐使用Kaggle上的糖尿病数据集(Pima Indians Diabetes Dataset)。该数据集包含了患者的多种医学特征(如血糖水平、血压、BMI等)以及是否患有糖尿病的诊断结果(二分类问题),非常适合用于逻辑回归建模。 数据字段说明: - `Pregnancies`: 怀孕次数 - `Glucose`: 血糖水平 - `BloodPressure`: 血压 - `SkinThickness`: 皮肤厚度 - `Insulin`: 胰岛素水平 - `BMI`: 身体质量指数 - `DiabetesPedigreeFunction`: 糖尿病家族遗传函数 - `Age`: 年龄 - `Outcome`: 是否患有糖尿病(0=否,1=是) 按照实验目的,实验内容,实验环境,实验过程及结果给出我完整过程详细不易报错
时间: 2025-08-16 08:10:08 浏览: 1
<think>嗯,用户想要一个完整的Python代码示例,用逻辑回归模型对糖尿病数据集进行建模,包括数据预处理、模型训练、超参数调整和评估。首先,我需要理清楚整个流程的步骤。
首先,数据加载。用户提到了Pima Indians Diabetes数据集,可能需要确认一下这个数据集的具体列名,因为之前在引用[2]中看到他们给数据集添加了列名,比如['Pregnancies', 'Glucose'等。所以在代码里应该先加载数据并正确命名列,避免后续处理出错。
然后是数据预处理。用户特别提到缺失值处理,引用[2]和[3]里提到了用KNNImputer来处理缺失值。但原数据集可能其实是用0来表示缺失值,比如Glucose为0的情况是不合理的,所以需要将这些0替换为NaN,然后再用KNNImputer填充。这一步需要特别注意,否则直接用原始数据可能会影响模型效果。
接下来是数据拆分。需要用到train_test_split来划分训练集和测试集,确保分层抽样,保持类别分布。引用[5]提到朴素贝叶斯的例子,但这里逻辑回归类似,需要正确划分数据。
模型构建部分,使用逻辑回归,Scikit-learn的LogisticRegression。超参数调整主要是正则化强度C,这里用户要求调整C的值,所以需要用GridSearchCV或RandomizedSearchCV进行参数搜索。正则化类型可能包括L1和L2,不过默认是L2,但需要确认是否在参数网格中包含。
评估指标方面,用户要求准确率和F1分数,还有混淆矩阵。需要从sklearn.metrics导入这些指标,并在测试集上计算。混淆矩阵可以用ConfusionMatrixDisplay来可视化,这样更直观。
代码的易运行性很重要,所以需要确保所有库都已导入,比如pandas, numpy, sklearn的相关模块,以及matplotlib用于绘图。可能还需要检查数据集的文件名是否正确,比如是否叫pima-indians-diabetes.csv,是否需要指定路径。
另外,在预处理步骤中,特征缩放可能影响逻辑回归的表现,尤其是使用正则化时。StandardScaler进行标准化处理是必要的,应该在数据填充缺失值之后进行,避免数据泄漏。也就是说,先处理缺失值,再划分数据集,然后在训练集上拟合scaler,应用到训练和测试集。
在超参数调整时,参数网格的设置可能需要考虑C的范围,比如对数均匀分布,或者预设的几个值。这里用户提到调整C的值,所以用GridSearchCV可能更合适,或者使用RandomizedSearchCV来覆盖更广的范围。
最后,确保代码的每一步都有注释,方便用户理解。并且要处理所有可能的报错点,比如文件路径错误、库未安装等,但用户可能已经安装了基本的数据科学库,如pandas, sklearn等。
另外,引用[3]中提到KNNImputer的使用,所以在代码中正确应用这个方法来填充缺失值是关键。同时,引用[5]中的逻辑回归和贝叶斯的对比可能无关,但确保逻辑回归的参数设置正确,比如max_iter足够大以避免收敛警告。
总结步骤:加载数据→处理0值为NaN→填充缺失值→划分数据集→标准化→调参(C值)→训练模型→评估→绘图。需要按这个顺序编写代码,并测试代码是否可运行。</think>以下是一个基于逻辑回归的完整糖尿病预测建模代码示例,包含数据预处理、模型调优和评估全流程:
```python
# 环境准备
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.impute import KNNImputer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (accuracy_score, f1_score,
confusion_matrix, ConfusionMatrixDisplay)
from sklearn.pipeline import make_pipeline
# 1. 数据加载与探索
# 数据集下载:https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database
df = pd.read_csv('pima-indians-diabetes.csv',
names=['Pregnancies','Glucose','BloodPressure','SkinThickness',
'Insulin','BMI','DiabetesPedigreeFunction','Age','Outcome'])
# 2. 数据预处理
# 将生理指标中的0值替换为NaN(原始数据用0表示缺失值)
cols = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']
df[cols] = df[cols].replace(0, np.nan)
# KNN缺失值填充
imputer = KNNImputer(n_neighbors=5)
df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
# 3. 数据拆分
X = df_imputed.drop('Outcome', axis=1)
y = df_imputed['Outcome']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42)
# 4. 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 5. 模型构建与超参数调优
# 创建管道(标准化+逻辑回归)
pipe = make_pipeline(StandardScaler(),
LogisticRegression(solver='liblinear',
max_iter=1000,
random_state=42))
# 设置参数网格
param_grid = {
'logisticregression__C': np.logspace(-3, 3, 7), # 正则化强度的倒数
'logisticregression__penalty': ['l1', 'l2']
}
# 网格搜索
grid = GridSearchCV(pipe, param_grid, cv=5,
scoring=['accuracy', 'f1'],
refit='f1')
grid.fit(X_train, y_train)
# 6. 模型评估
best_model = grid.best_estimator_
y_pred = best_model.predict(X_test)
# 性能指标
print(f"最佳参数: {grid.best_params_}")
print(f"测试集准确率: {accuracy_score(y_test, y_pred):.3f}")
print(f"测试集F1分数: {f1_score(y_test, y_pred):.3f}")
# 混淆矩阵可视化
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm,
display_labels=best_model.classes_)
disp.plot(cmap='Blues')
plt.title('Confusion Matrix')
plt.show()
```
阅读全文
相关推荐



















