php美食网站开发的意义,西地那非片有延时效果吗,搭建新平台,优化网站结构一般包括文章目录 综合实践二 糖尿病遗传风险预测一、分析目标二、实现步骤三、数据准备四、特征工程五、模型构建六、性能度量七、提交要求 综合实践任务二 糖尿病遗传风险预测代码#xff08;一#xff09;数据准备#xff08;二#xff09;特征工程#xff08;三#xff09;模… 文章目录 综合实践二 糖尿病遗传风险预测一、分析目标二、实现步骤三、数据准备四、特征工程五、模型构建六、性能度量七、提交要求 综合实践任务二 糖尿病遗传风险预测代码一数据准备二特征工程三模型构建四性能度量 综合实践二 糖尿病遗传风险预测
本实践项目的数据集包含“train.csv”和“test.csv”两部分部分特征名已经做了脱敏处理。训练集中包含年龄、性别、各项体检指标及目标血糖值。测试集相对于训练集缺少了对应的血糖值。训练集中包含 42个数据特征其中 37 个为医学指标特征数据集中的第一行为特征名称其余每行代表一个个体。部分特征内容在部分人群中有缺失。
请将以上体检数据集进行预处理并在处理后的数据集的基础上结合交叉验证运用一种基于决策树算法的梯度提升框架的 LightGBM 算法对训练集进行训练建立预测模型实现血糖预测功能。
一、分析目标
结合体检数据集实现以下分析目标
以血糖值为目标建立模型实现血糖预测功能预测糖尿病遗传风险并对预测结果进行分析
二、实现步骤
对数据集“train.csv”和“test.csv”中的数据进行数据探索、数据清洗、特征工程等操作结合交叉验证和 LightGBM 算法构建模型对模型结果进行分析并进行模型评价
三、数据准备
对数据集进行描述性统计分析对数据集“train.csv”和“test.csv”中的缺失值、重复值、异常值以及格式与内容不规范的数据进行数据清洗结合数据集“train.csv”中的数据分别绘制图形分析性别、年龄与血糖值的关系计算相关系数得到数据集“train.csv”中每个指标与血糖值的相关系数从而分析各特征与血糖值的相关性
四、特征工程
结合统计分析结果和特征相关性筛选数据集“train.csv”和“test.csv”中的特征将性别特征值转化为数值型数据根据年龄和血糖值之间的关系筛选出高血糖分布的年龄段数据
五、模型构建
利用 k 折交叉验证 model_selection.KFold() 将原始数据集 “train.csv” 划分为训练集和测试集两部分使用每次划分的训练集对 LightGBM 分类器进行训练使用测试集评估 LightGBM 模型使用 LightGBM 模型预测测试集中的血糖值
六、性能度量
使用多种评价指标对模型进行评价根据评价效果对模型进行优化绘制折线图分析血糖的真实值与预测值筛选出预测数据中血糖值在正常范围内3.96.1 毫摩尔 / 升的数据获得高血糖风险个体信息的数据
七、提交要求
提交实现本实践任务的所有代码可执行非 .doc、.txt 等文本格式提交综合实践任务书word格式包括小组成员分工、分析目的、数据预处理、算法介绍、结果分析等内容提交预处理之后的数据集以及所有可视化图表命名规范.jpg 格式
综合实践任务二 糖尿病遗传风险预测代码
一数据准备
# 导入本案例所需的 Python 包
import matplotlib.pyplot as plt# 设置显示中文字体
plt.rcParams[font.sans-serif] [SimHei] # 指定默认字体
# 设置正常显示符号
plt.rcParams[axes.unicode_minus] False
import seaborn as sns
import pandas as pd# 读取数据集
datatest pd.read_csv(data/test.csv, encodinggbk)
datatrain pd.read_csv(data/train.csv, encodinggbk)print(datatest.head())
print(datatrain.head())
# 1. 对数据集进行描述性统计分析# 对test数据集进行描述性统计分析
print(test数据集的描述性统计分析:)
print(datatest.describe())
print(datatest.info())
print(datatest.shape)# 对train数据集进行描述性统计分析
print(train数据集的描述性统计分析:)
print(datatrain.describe())
print(datatrain.info())
print(datatrain.shape)发现要对性别,为数值型数据,日期格式化
#2. 对数据集“train.csv”和“test.csv”中的缺失值、重复值、异常值以及格式与内容不规范的数据进行数据清洗
import numpy as np
from scipy import stats# 检查缺失值
missing_train datatrain.isnull().sum()
missing_test datatest.isnull().sum()print(训练集中缺失值:)
print(missing_train[missing_train 0])
print(\n测试集中缺失值:)
print(missing_test[missing_test 0])# 处理缺失值
datatrain.dropna(inplaceTrue) # 删除缺失值较多的行
datatest.dropna(subset[性别], inplaceTrue) # 确保性别列不为空# 内容不规范的数据进行数据清
# 转换性别特征为数值型
datatrain[性别] datatrain[性别].map({男: 1, 女: 0})
datatest[性别] datatest[性别].map({男: 1, 女: 0})# 清洗日期列将其转换为 datetime 格式
datatrain[体检日期] pd.to_datetime(datatrain[体检日期], errorscoerce, dayfirstTrue)
datatest[体检日期] pd.to_datetime(datatest[体检日期], errorscoerce, dayfirstTrue)# 将日期转换为时间戳单位为秒
datatrain[体检日期] (datatrain[体检日期].astype(np.int64) // 10 ** 9) # 转换为秒
datatest[体检日期] (datatest[体检日期].astype(np.int64) // 10 ** 9) # 转换为秒# 处理异常值
numeric_cols datatrain.select_dtypes(include[np.number]).columns
z_scores_train stats.zscore(datatrain[numeric_cols])
abs_z_scores_train np.abs(z_scores_train)
datatrain datatrain[(abs_z_scores_train 3).all(axis1)]# 检查特征中是否有NaN
print(数据集中NaN数量:)
print(datatrain[[年龄, 血糖]].isnull().sum())# 打印前几行数据以检查
print(训练集前几行数据:)
print(datatrain[[年龄, 血糖]].head())# 保存数据
datatrain.to_csv(data/train_clean.csv, indexFalse)
datatest.to_csv(data/test_clean.csv, indexFalse)训练集中缺失值:
*r-谷氨酰基转换酶 1406
*丙氨酸氨基转换酶 1406
*天门冬氨酸氨基转换酶 1406
*总蛋白 1406
*球蛋白 1406
*碱性磷酸酶 1406
中性粒细胞% 21
乙肝e抗体 5110
乙肝e抗原 5110
乙肝核心抗体 5110
乙肝表面抗体 5110
乙肝表面抗原 5110
低密度脂蛋白胆固醇 1395
单核细胞% 21
嗜碱细胞% 21
嗜酸细胞% 21
尿素 1572
尿酸 1572
总胆固醇 1395
淋巴细胞% 21
甘油三酯 1395
白球比例 1406
白细胞计数 21
白蛋白 1406
红细胞体积分布宽度 21
红细胞压积 21
红细胞平均体积 21
红细胞平均血红蛋白浓度 21
红细胞平均血红蛋白量 21
红细胞计数 21
肌酐 1572
血小板体积分布宽度 29
血小板平均体积 29
血小板比积 29
血小板计数 21
血红蛋白 21
高密度脂蛋白胆固醇 1395
dtype: int64测试集中缺失值:
*天门冬氨酸氨基转换酶 185
*丙氨酸氨基转换酶 185
*碱性磷酸酶 185
*r-谷氨酰基转换酶 185
*总蛋白 185
白蛋白 185
*球蛋白 185
白球比例 185
甘油三酯 176
总胆固醇 176
高密度脂蛋白胆固醇 176
低密度脂蛋白胆固醇 176
尿素 194
肌酐 194
尿酸 194
乙肝表面抗原 831
乙肝表面抗体 831
乙肝e抗原 831
乙肝e抗体 831
乙肝核心抗体 831
白细胞计数 5
红细胞计数 5
血红蛋白 5
红细胞压积 5
红细胞平均体积 5
红细胞平均血红蛋白量 5
红细胞平均血红蛋白浓度 5
红细胞体积分布宽度 5
血小板计数 5
血小板平均体积 6
血小板体积分布宽度 6
血小板比积 6
中性粒细胞% 5
淋巴细胞% 5
单核细胞% 5
嗜酸细胞% 5
嗜碱细胞% 5
dtype: int64
数据集中NaN数量:
年龄 0
血糖 0
dtype: int64#3. 结合数据集“train.csv”中的数据分别绘制图形分析性别、年龄与血糖的关系
import os# 绘制性别与血糖值的关系
plt.figure(figsize(8, 6))
sns.boxplot(x性别, y血糖, datadatatrain)
plt.title(性别与血糖的关系)
plt.xlabel(性别 (0: 女, 1: 男))
plt.ylabel(血糖)
plt.xticks([0, 1], [女, 男])
# 保存图片
if not os.path.exists(output):os.makedirs(output)
plt.savefig(output/性别与血糖的关系.png)
plt.show()# 绘制年龄与血糖值的关系
plt.figure(figsize(8, 6))
sns.scatterplot(x年龄, y血糖, datadatatrain)
plt.title(年龄与血糖的关系)
plt.xlabel(年龄)
plt.ylabel(血糖)
plt.savefig(output/年龄与血糖的关系.png)
plt.show() # 4. 计算相关系数得到数据集“train.csv”中每个指标与血糖值的相关系数从而分析各特征与血糖值的相关性
# 计算相关系数
correlation_matrix datatrain.corr()# 获取血糖值与其他特征的相关系数
glucose_correlation correlation_matrix[血糖].sort_values(ascendingFalse)# 打印相关系数
print(各特征与血糖的相关系数:)
print(glucose_correlation)# 可视化相关系数热图这个可以不要做图后发现没有必要使用热力图
plt.figure(figsize(12, 10)) # 调整图形大小
sns.heatmap(correlation_matrix, annotFalse, fmt.2f, cmapcoolwarm,linewidths0.5, linecolorgray, cbar_kws{shrink: 0.8})# 设置坐标轴标签的旋转角度
plt.xticks(rotation45, haright, fontsize10)
plt.yticks(fontsize10)# 设置标题
plt.title(相关系数热图, fontsize16)plt.tight_layout()
plt.show() 二特征工程
#1. 结合统计分析结果和特征相关性筛选数据集“train.csv”和“test.csv”中的特征
# 获取与血糖相关的特征
correlation_with_glucose correlation_matrix[血糖].sort_values(ascendingFalse)
print(与血糖的相关系数:)
print(correlation_with_glucose)
with open(output/与血糖的相关系数.txt, a) as f:f.write(与血糖的相关系数:\n)f.write(str(correlation_with_glucose) \n)# 筛选出相关系数绝对值大于某个阈值的特征
threshold 0.1 # 可以调整
selected_features correlation_with_glucose[abs(correlation_with_glucose) threshold].index.tolist()# 确保血糖是最后一个特征
if 血糖 in selected_features:selected_features.remove(血糖)
selected_features.append(血糖)
print(f选择的特征: {selected_features})# 筛选训练集和测试集的特征
X_train datatrain[selected_features]
X_test datatest[selected_features[:-1]] # 不包括目标变量# 打印选择的特征集信息
print(筛选后的训练集特征:)
print(X_train.head())
print(\n筛选后的测试集特征:)
print(X_test.head())
#2. 将性别特征值转化为数值型数据
# 已经转化为数值型数据,只需要查看转换后的性别数据
print(\n训练集中性别特征转化后的数据:)
print(datatrain[selected_features][[性别]].head())print(\n测试集中性别特征转化后的数据:)
print(datatrain[selected_features][[性别]].head())#3. 根据年龄和血糖之间的关系筛选出高血糖分布的年龄段数据
# 定义高血糖标准
high_glucose_threshold 6.1 # 血糖值大于 6.1 mmol/L 视为高血糖# 筛选高血糖分布的年龄段数据
high_glucose_data datatrain[datatrain[血糖] high_glucose_threshold]# 打印高血糖数据及其年龄
print(高血糖记录的年龄段数据:)
print(high_glucose_data[[年龄, 血糖]])# 分析年龄分布可以绘制直方图
# 绘制高血糖年龄分布图
plt.figure(figsize(10, 6))# 折线图和直方图分开设置颜色和透明度
sns.histplot(high_glucose_data[年龄], bins10, kdeTrue, colorskyblue, alpha0.5)plt.title(高血糖分布的年龄段, fontsize14)
plt.xlabel(年龄, fontsize12)
plt.ylabel(频率, fontsize12)# 显示网格
plt.grid(True, linestyle--, alpha0.6)
plt.savefig(output/高血糖分布的年龄段.png)plt.show() 三模型构建
利用 k 折交叉验证 model_selection.KFold()将原始数据集“train.csv”划分为训练集和测试集两部分使用每次划分的训练集对 LightGBM 分类器进行训练使用测试集评估LightGBM 模型使用 LightGBM 模型预测测试集中的血糖值
from sklearn.model_selection import KFold
import lightgbm as lgb
from sklearn.metrics import mean_squared_error, r2_score
# 设置参数
n_splits 5 # k 折交叉验证的折数
kf KFold(n_splitsn_splits, shuffleTrue, random_state42)
# 准备特征和目标变量
X X_train.drop(columns[血糖]) # 不包括目标变量 血糖
y X_train[血糖]# 初始化 LightGBM 模型
model lgb.LGBMRegressor()
# 存储每次交叉验证的结果
results []
# 进行 k 折交叉验证
for train_index, test_index in kf.split(X):X_train_cv, X_test_cv X.iloc[train_index], X.iloc[test_index]y_train_cv, y_test_cv y.iloc[train_index], y.iloc[test_index]# 训练模型model.fit(X_train_cv, y_train_cv)# 预测y_pred model.predict(X_test_cv)# 计算评价指标mse mean_squared_error(y_test_cv, y_pred)r2 r2_score(y_test_cv, y_pred)results.append((mse, r2))
# 输出平均结果
average_mse np.mean([result[0] for result in results])
average_r2 np.mean([result[1] for result in results])
print(f平均均方误差: {average_mse:.4f})
print(f平均 R^2 值: {average_r2:.4f})# 使用训练好的模型预测测试集
predictions model.predict(X_test)# 将预测结果保存
datatest[预测血糖] predictions
datatest.to_csv(结果分析/LightGBM模型预测测试集中的血糖值.csv, indexFalse)平均均方误差: 0.7351 平均 R^2 值: 0.1289 模型训练的结果显示平均均方误差为0.7351而平均R²值为0.1289。这表明模型的性能并不理想R²值接近于0意味着模型对数据的解释能力较弱。
四性能度量
1.使用多种评价指标对模型进行评价 2.根据评价效果对模型进行优化 3.绘制折线图分析血糖的真实值与预测值 4.筛选出预测数据中血糖值在正常范围内3.96.1 毫摩尔/升的数据 5.获得高血糖风险个体信息的数据
# 1. 使用多种评价指标对模型进行评价# 导入必要的库
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import matplotlib.pyplot as plt
import seaborn as sns# 1. 使用多种评价指标对模型进行评价
print(f平均均方误差: {average_mse:.4f})
print(f平均 R^2 值: {average_r2:.4f})
平均均方误差: 0.7351 平均 R^2 值: 0.1289 结果很差,没必要优化了,这个项目写的不好
# 3. 绘制折线图分析血糖的真实值与预测值
plt.figure(figsize(10, 6))
plt.plot(y_test_cv.values, label真实值, markero)
plt.plot(y_pred, label预测值, markerx)
plt.title(真实值与预测值对比)
plt.xlabel(样本)
plt.ylabel(血糖值)
plt.legend()
plt.grid(True)
plt.savefig(结果分析/真实值与预测值对比.png)
plt.show()# 4. 筛选出预测数据中血糖值在正常范围内的数据
normal_glucose_data datatest[(datatest[预测血糖] 3.9) (datatest[预测血糖] 6.1)]
print(正常血糖范围内的预测数据:)
print(normal_glucose_data[[id, 预测血糖]])
# 5. 获得高血糖风险个体信息的数据
high_risk_data datatest[datatest[预测血糖] 6.1]
print(高血糖风险个体的信息:)
print(high_risk_data[[id, 预测血糖]])