L8 机器学习——糖尿病探索与预测

 本项目的目的主要是对糖尿病进行预测。

一、数据预处理

1.1 数据导入

# Import the libraries
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

# set the plot style
plt.rcParams['savefig.dpi'] = 500 #the resolution of images on the plot
plt.rcParams['figure.dpi'] = 500 #the resolution of the figure in the plot

import warnings
warnings.filterwarnings('ignore')

# Load the data
df = pd.read_excel('./dia.xls')
df.head

print('data shape:', df.shape) 

1.2 数据检查

# Check the missing values
print('数据缺失值---------------------------------')
missing = df.isnull().sum()
print(missing)

# Check the duplicated values
print('数据重复值---------------------------------')
duplicated = df.duplicated().sum()
print('数据的重复值:', duplicated)

二、 数据分析

2.1 数据分布分析 

# Check the data distribution

# Set the font to a Chinese font that is available on your system
plt.rcParams['font.sans-serif'] = ['SimHei']  # For Chinese characters
plt.rcParams['axes.unicode_minus'] = False  # To ensure minus signs are displayed correctly

feature_map = {
    '年龄': '年龄',
    '低密度脂蛋白胆固醇': '高密度脂蛋白胆固醇',
    '低密度脂蛋白胆固醇': '低密度脂蛋白胆固醇',
    '极低密度脂蛋白胆固醇': '极低密度脂蛋白胆固醇',
    '甘油三酯': '甘油三酯',
    '总胆固醇': '总胆固醇',
    '脉搏': '脉搏',
    '舒张压':'舒张压',
    '高血压史':'高血压史',
    '尿素氮':'尿素氮',
    '尿酸':'尿酸',
    '肌酐':'肌酐',
    '体重检查结果':'体重检查结果'
}
# Define the color palette as blue and orange
palette = ["#1f77b4", "#ff7f0e"]  # Blue and Orange from Matplotlib's default color cycle

# Initialize the figure
plt.figure(figsize=(15, 10))

# Iterate through the features and create subplots
for i, (col, col_name) in enumerate(feature_map.items(), 1):
    plt.subplot(3, 4, i)
    # Set the color for the current boxplot using the specified palette
    sns.boxplot(x=df['是否糖尿病'], y=df[col], palette=palette)
    plt.title(f'{col_name}的箱线图', fontsize=14)
    plt.ylabel('数值', fontsize=12)
    plt.grid(axis='y', linestyle='--', alpha=0.7)

# Adjust layout and show the plot
plt.tight_layout()
plt.show()

  • 年龄:有糖尿病的人的年龄分布显著高于没有糖尿病的,表明年龄可能与糖尿病相关。
  • 血压(舒张压):有糖尿病的人的舒张压中位数较高,表明可能存在高血压风险。
  • 胆固醇水平(低密度脂蛋白胆固醇、总胆固醇):有糖尿病的人的低密度脂蛋白胆固醇和总胆固醇分布较高,这与糖尿病患者常见的血脂异常情况一致。
  • 甘油三酯:有糖尿病的人群中有许多离群值,表示有些人甘油三酯水平非常高,这可能是心血管疾病的风险因素。

2.2 相关性分析

# Check the correlation between the features
import plotly
import plotly.express as px

# 删除列 '卡号'
df.drop(columns=['卡号'], inplace=True)
# 计算各列之间的相关系数
df_corr = df.corr()

# 相关矩阵生成函数
def corr_generate(df):
    fig = px.imshow(df,text_auto=True,aspect="auto",color_continuous_scale='RdBu_r')
    fig.show()

# 生成相关矩阵
corr_generate(df_corr)

 

从热力图中我们可以观察到以下几点:

  • 高度正相关

    • 极低密度脂蛋白胆固醇与甘油三酯:相关系数接近 0.90,表示这两个变量之间存在很强的正相关关系。这可能意味着在这个数据集中,当甘油三酯水平升高时,极低密度脂蛋白胆固醇的水平也会显著升高。
    • 低密度脂蛋白胆固醇与总胆固醇:相关系数约为 0.74,这也表示出明显的正相关。这是合理的,因为低密度脂蛋白胆固醇(LDL)是总胆固醇的一部分,通常总胆固醇升高时,LDL 也会上升。
  • 负相关

    • 性别与高密度脂蛋白胆固醇(HDL):相关系数为 -0.49,表示性别与 HDL 水平之间存在中等程度的负相关关系。这可能意味着在这个数据集中,男性和女性在 HDL 水平上存在差异。
    • 体重检查结果与高密度脂蛋白胆固醇(HDL):相关系数为 -0.37,表明体重增加时,HDL 水平可能会下降,这与医学上已知的体重与 HDL 反向关系一致。
  • 弱相关或无相关

    • 脉搏与其他多数变量:脉搏与其他变量之间的相关性普遍较弱(相关系数接近 0),这意味着脉搏与这些变量之间没有明显的线性关系。
    • 尿酸与多个变量:尿酸与年龄、总胆固醇等变量之间有中等相关性,但与大多数其他变量的相关性较弱。

三、随机森林模型

 3.1 数据集构建

# '高密度脂蛋白胆固醇'字段与糖尿病负相关,故而在 X 中去掉该字段
X = df.drop(['是否糖尿病','高密度脂蛋白胆固醇'],axis=1)
y = df['是否糖尿病']

train_X, test_X, train_y, test_y = train_test_split(X, y, 
                                                    test_size=0.2,
                                                    random_state=1)

print('训练集数据量:', train_X.shape)
print('测试集数据量:', test_X.shape)

3.2 定义模型 

# Random Forest Classifier
rf_clf = RandomForestClassifier(random_state=15)
rf_clf.fit(train_X, train_y)

四、模型评估

4.1 性能评估 

# Predict the test set
pred_y_ef = rf_clf.predict(test_X)
class_report_rf = classification_report(test_y, pred_y_ef)
print(class_report_rf)

4.2 相关性分析 

# Plot the feature importance
feature_importances = rf_clf.feature_importances_
features_rf = pd.DataFrame({'特征': X.columns, '重要度': feature_importances})
features_rf.sort_values(by='重要度', ascending=False, inplace=True)
plt.figure(figsize=(6, 5))
sns.barplot(x='重要度', y='特征', data=features_rf)
plt.xlabel('重要度')
plt.ylabel('特征')
plt.title('随机森林特征图')
plt.show()

  • 年龄: 这个特征在图中具有最高的重要性值,接近 0.16。这表明年龄在预测目标变量(如是否患有糖尿病)时,起到了关键作用。通常,年龄与许多健康状况密切相关,这也可能是该特征在模型中如此重要的原因。
  • 甘油三酯: 这个特征的重要性紧随年龄之后,表明甘油三酯水平对模型的预测也有较大贡献。甘油三酯是血脂的一种,通常与心血管健康和代谢疾病密切相关。
  • 舒张压: 舒张压的特征重要性排在第三位,显示出血压在模型中的显著作用。高血压往往与多种慢性病(包括糖尿病)相关,因此该特征的重要性较高是合理的。

五、总结

1. 线性回归模型(Linear Regression)

核心:

  • 线性回归是一种用于预测连续变量的统计方法,假设输入特征与输出变量之间存在线性关系。模型的目标是找到一条最佳拟合线,使得预测值与实际值之间的误差最小。

可以解决的问题:

  • 线性回归主要用于解决回归问题,比如预测房价、销售额、温度等连续值。

优势:

  • 简单易理解:线性回归模型简单、直观,易于解释模型输出,特别是系数的意义。
  • 计算效率高:由于模型简单,训练和预测速度快,适合处理大规模数据。
  • 易扩展:可以通过添加多项式特征或使用正则化(如Lasso、Ridge)来处理更复杂的关系。

劣势:

  • 线性假设:模型假设特征与目标变量之间的关系是线性的,这在现实中往往不成立。
  • 易受异常值影响:线性回归对异常值非常敏感,异常值可能会显著影响模型的表现。
  • 不能处理非线性问题:线性回归难以处理复杂的非线性关系。

2. 逻辑回归模型(Logistic Regression)

核心:

  • 逻辑回归是一种用于分类的模型,特别适用于二分类问题。它通过学习特征与目标变量之间的关系来预测某个事件发生的概率,并将概率值转换为二分类输出(如0和1)。

可以解决的问题:

  • 逻辑回归主要用于二分类问题,如垃圾邮件检测、疾病预测(如糖尿病或心脏病)等。

优势:

  • 解释性强:逻辑回归模型输出的回归系数可以解释每个特征对输出类别的影响,尤其是特征与目标变量之间的关联强度。
  • 计算效率高:与线性回归类似,逻辑回归计算效率高,适合大规模数据集。
  • 概率输出:模型可以提供预测为某一类别的概率,便于进一步的风险评估。

劣势:

  • 线性边界:逻辑回归假设数据在特征空间中可线性分割,难以处理复杂的非线性分类问题。
  • 易受异常值影响:虽然较线性回归稍好,但逻辑回归对异常值仍然较为敏感。
  • 不能处理多分类问题:需要扩展为多分类逻辑回归(如One-vs-Rest)才能处理多分类问题。

3. K-邻近算法(K-Nearest Neighbors, KNN)

核心:

  • KNN 是一种基于实例的学习算法,通过查找与输入实例最接近的K个邻居来进行分类或回归。该算法不显式地构建模型,而是直接利用训练数据进行预测。

可以解决的问题:

  • KNN可以用于分类问题(如手写数字识别)和回归问题(如房价预测)。

优势:

  • 简单直观:KNN算法易于理解和实现,无需复杂的训练过程。
  • 无需假设数据分布:KNN不对数据的分布做任何假设,因此在数据分布复杂的情况下表现良好。
  • 灵活性强:可以通过调整K值来控制模型的复杂度。

劣势:

  • 计算复杂度高:KNN需要在预测时计算每个测试样本与所有训练样本的距离,对于大数据集,计算成本非常高。
  • 存储需求大:KNN需要存储全部训练数据,导致内存消耗大。
  • 对噪声敏感:KNN对噪声数据(如异常值)敏感,容易导致错误分类。

4. 决策树(Decision Tree)

核心:

  • 决策树是一种树形结构的模型,通过一系列的“如果...则...”规则对数据进行划分,最终将数据分类到叶子节点。每个节点基于特征的某个阈值进行数据分割,目的是最大化每次分割后的信息增益或最小化不纯度。

可以解决的问题:

  • 决策树可以解决分类问题(如客户细分)和回归问题(如房价预测)。

优势:

  • 易于理解和解释:决策树模型直观,易于解释模型的决策过程。
  • 无需数据预处理:不需要对数据进行标准化或归一化,也不需要处理缺失值。
  • 能处理非线性关系:决策树能处理特征与目标变量之间的复杂非线性关系。

劣势:

  • 易过拟合:决策树容易生成过于复杂的树结构,从而对训练数据过拟合,导致泛化能力差。
  • 不稳定性:小的输入数据变化可能导致完全不同的树结构,模型稳定性差。
  • 偏差较高:单一决策树模型通常偏差较高,可能导致预测不准确。

5. 随机森林(Random Forest)

核心:

  • 随机森林是一种集成学习方法,通过构建多个决策树,并对每棵树的预测结果进行投票或平均来得到最终预测结果。随机森林通过引入随机性(如样本采样、特征选择)来增加模型的鲁棒性。

可以解决的问题:

  • 随机森林可以用于分类问题(如图像识别)和回归问题(如价格预测)。

优势:

  • 高准确性:由于集成了多个决策树,随机森林通常比单一决策树模型具有更高的准确性和更好的泛化能力。
  • 抗过拟合:随机森林通过多棵树的投票或平均来减少单一决策树的过拟合风险。
  • 鲁棒性强:对噪声和异常值不敏感,具有很好的鲁棒性。

劣势:

  • 计算资源消耗大:构建多个决策树需要较高的计算成本,训练时间较长。
  • 模型复杂性高:由于模型是由多个决策树组成,难以像单一决策树那样直观地解释。
  • 内存消耗大:随机森林需要存储多个决策树,内存需求较大。

每种模型都有其独特的适用场景和局限性。在选择合适的模型时,需要根据具体问题的性质(如是否线性、数据规模、模型解释性要求等)来进行选择。简单的模型如线性回归和逻辑回归适用于初步分析或特征较少的情况,而复杂的模型如随机森林适用于需要高准确性且不介意计算资源消耗的场景。KNN适用于小规模数据集和需要高灵活性的场景,而决策树和随机森林则在处理非线性关系时具有显著优势。

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值