基于随机森林和Xgboost对肥胖风险的多类别预测

在这里插入图片描述

基于随机森林和Xgboost对肥胖风险的多类别预测

作者:i阿极

作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页

????????????如果觉得文章不错或能帮助到你学习,可以点赞????收藏????评论????+关注哦!????????????

????????????如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!????


大家好,我i阿极。喜欢本专栏的小伙伴,请多多支持

专栏案例:机器学习案例
机器学习(一):线性回归之最小二乘法
机器学习(二):线性回归之梯度下降法
机器学习(三):基于线性回归对波士顿房价预测
机器学习(四):基于KNN算法对鸢尾花类别进行分类预测
机器学习(五):基于KNN模型对高炉发电量进行回归预测分析
机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析
机器学习(七):基于多项式贝叶斯对蘑菇毒性分类预测分析
机器学习(八):基于PCA对人脸识别数据降维并建立KNN模型检验
机器学习(十四):基于逻辑回归对超市销售活动预测分析
机器学习(十五):基于神经网络对用户评论情感分析预测
机器学习(十六):线性回归分析女性身高与体重之间的关系
机器学习(十七):基于支持向量机(SVM)进行人脸识别预测
机器学习(十八):基于逻辑回归对优惠券使用情况预测分析
机器学习(十九):基于逻辑回归对某银行客户违约预测分析
机器学习(二十):LightGBM算法原理(附案例实战)
机器学习(二十一):基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测
机器学习(二十二):基于逻辑回归(Logistic Regression)对股票客户流失预测分析

文章目录

  • 基于随机森林和Xgboost对肥胖风险的多类别预测
  • 1、前言
  • 2、数据说明
  • 3、导入所需要的模块
  • 4、导入数据
  • 5、查看数据维度
  • 6、查看数据基本信息
  • 7、描述性统计分析
  • 8、探索性数据可视化分析
  • 9、特征编码
  • 10、划分训练集和测试集
  • 11、模型建立
    • 11.1 随机森林分类模型
    • 11.2 Xgboost分类模型
  • 12、模型检验
  • 总结


1、前言

肥胖风险的多类预测不仅关乎个体的健康福祉,更是对全社会健康管理体系的挑战与机遇。在现代社会,随着工作节奏的加快和生活方式的多样化,肥胖已经成为威胁人类健康的重要因素之一。肥胖不仅与高血压、糖尿病、心血管疾病等多种慢性疾病密切相关,还可能导致心理健康问题,如焦虑、抑郁等。

因此,开展肥胖风险的多类预测研究,对于早期识别高风险人群、制定个性化的干预措施、减少肥胖及相关疾病的发生具有重要意义。传统的肥胖风险评估方法往往依赖于单一的指标,如体重指数(BMI),但这种方法忽略了人体成分的复杂性和多样性,难以全面准确地评估肥胖风险。

近年来,随着人工智能和大数据技术的飞速发展,多类预测方法被广泛应用于肥胖风险预测领域。这些方法能够综合考虑个体的遗传、环境、行为等多个因素,通过机器学习算法建立预测模型,实现对肥胖风险的精准预测。这些模型不仅具有高度的准确性和可靠性,还能够为临床医生和公共卫生专家提供科学的决策支持,帮助他们制定更有效的肥胖预防和管理策略。

未来,随着技术的不断进步和数据的不断积累,肥胖风险的多类预测研究将不断深入。我们期待通过这一领域的探索,为全球肥胖防控事业贡献更多的智慧和力量。

2、数据说明

本次比赛的数据集(训练和测试)是从在肥胖或心血管疾病风险数据集上训练的深度学习模型生成的。特征分布与原始分布接近,但不完全相同。作为本次比赛的一部分,您可以随意使用原始数据集,既可以探索差异,也可以查看在训练中加入原始数据集是否能提高模型性能。

注意:该数据集特别适用于可视化、聚类和通用 EDA。

train.csv - 训练数据集; 是分类目标NObeyesdad
test.csv - 测试数据集;您的目标是预测每行的类NObeyesdad

3、导入所需要的模块

import pandas as pd
import numpy as np
import requests
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder,PowerTransformer
import math  
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

4、导入数据

train = pd.read_csv(r"D:\playground-series-s4e2\train.csv")
test = pd.read_csv(r"D:\playground-series-s4e2\test.csv")
train.head()

部分结果如下图所示:

在这里插入图片描述

5、查看数据维度

train.shape
test.shape

结果如下所示:

(20758, 18)
(13840, 17)

6、查看数据基本信息

train.info()

结果如下所示:
在这里插入图片描述

7、描述性统计分析

train.describe()

结果如下所示:
在这里插入图片描述

8、探索性数据可视化分析

首先,定义了一个名为single_plot_distribution的函数,用于绘制给定数据框(dataframe)中某一列(column_name)的数据分布。函数首先计算该列的唯一值的出现次数(value_counts)。然后,它创建了一个包含两个子图的图形,一个用于显示环形图(pie chart),另一个用于显示条形图(bar chart)

#绘制单个饼图和条形图的函数
def single_plot_distribution(column_name, dataframe):
    # 获取指定列的值计数
    value_counts = dataframe[column_name].value_counts()

    # 用两个子画面设置图形
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5), gridspec_kw={'width_ratios': [1, 1]}) 

    # 环形图
    palette = ["#00B1D2FF", "#FDDB27FF"]
    color_palette = sns.color_palette(palette)
    pie_colors = palette[0:3]
    ax1.pie(value_counts, autopct='%0.001f%%', startangle=90, pctdistance=0.85, colors=pie_colors, labels=None)
    centre_circle = plt.Circle((0,0),0.70,fc='white')
    ax1.add_artist(centre_circle)
    ax1.set_title(f'Distribution of {column_name}', fontsize=16)

    # 条形图
    bar_colors = palette[0:3]
    sns.barplot(x=value_counts.index, y=value_counts.values, ax=ax2, palette=bar_colors,) 
    ax2.set_title(f'Count of {column_name}', fontsize=16)
    ax2.set_xlabel(column_name, fontsize=14)
    ax2.set_ylabel('Count', fontsize=14)

    # 旋转x轴标签以提高可读性
    ax2.tick_params(axis='x', rotation=45)

    # 显示绘图
    plt.tight_layout()
    plt.show()

由于源码中图过多,这里就举一个例子

single_plot_distribution('NObeyesdad',train)

在这里插入图片描述

定义了一个名为advanced_scatter_plot的函数,用于绘制带有颜色区分的散点图。函数接受四个参数:x_column(x轴的数据列名)、y_column(y轴的数据列名)、target_column(用于区分不同颜色的目标列名)和dataframe(包含数据的DataFrame)。函数首先设置图形大小,然后定义颜色调色板。接着,使用seaborn库的scatterplot函数绘制散点图,其中点的颜色由target_column决定。函数还设置了图表的标题、轴标签和图例,并添加了网格线。最后,使用plt.show()显示图表。

def advanced_scatter_plot(x_column, y_column, target_column, dataframe):
    plt.figure(figsize=(15, 6))
    palette = ["#00B1D2FF", "#FDDB27FF"]
    color_palette = sns.color_palette(palette)
    sns.scatterplot(x=x_column, y=y_column, hue=target_column, data=dataframe, palette=palette[0:3])
    plt.title(f'Scatter Plot of {x_column} vs {y_column} Hue by {target_column}', fontsize=16)
    plt.xlabel(x_column, fontsize=14)
    plt.ylabel(y_column, fontsize=14)
    plt.legend(title=target_column)
    plt.grid(True)
    plt.show()

由于源码中图过多,这里就举一个例子

advanced_scatter_plot('Age', 'Weight', 'Gender', train)#在男女当中,显示年龄与体重的关系

在这里插入图片描述

9、特征编码

label_encoder = LabelEncoder()
train['NObeyesdad'] = label_encoder.fit_transform(train['NObeyesdad'])

train = pd.get_dummies(train)
test = pd.get_dummies(test)

10、划分训练集和测试集

X = train.drop(['id', 'NObeyesdad'], axis=1)
y = train['NObeyesdad']

X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
#将训练集和测试集划分为8:2

11、模型建立

11.1 随机森林分类模型

model_RF = RandomForestClassifier(n_estimators=100, random_state=42)
model_RF.fit(X_train, y_train)
val_preds_RF = model_RF.predict(X_val)
accuracy_RF = accuracy_score(y_val, val_preds_RF)
print(f"Validation Accuracy: {accuracy_RF}")#模型准确率
# Validation Accuracy: 0.8872832369942196

11.2 Xgboost分类模型

from xgboost import XGBClassifier  
  
# 初始化XGBoost分类器  
model_XGB = XGBClassifier(n_estimators=100, random_state=42)  
  
# 使用训练数据拟合模型  
model_XGB.fit(X_train, y_train)
val_preds_XGB = model_XGB.predict(X_val)
accuracy_XGB = accuracy_score(y_val, val_preds_XGB)
print(f"Validation Accuracy: {accuracy_XGB}")#模型准确率
#Validation Accuracy: 0.9019749518304432

12、模型检验

一开始有导入文件名为test的数据集,将训练好的模型进行检验。

if 'CALC_Always' in test.columns:
    test.drop('CALC_Always', axis=1, inplace=True)
test_preds_RF = model_RF.predict(test.drop('id', axis=1))
test_preds_XGB = model_XGB.predict(test.drop('id', axis=1))
#输出热力图结果
conf_matrix_RF = pd.crosstab(y_val, val_preds_RF, rownames=['Actual'], colnames=['Predicted'])  
conf_matrix_XGB = pd.crosstab(y_val, val_preds_XGB, rownames=['Actual'], colnames=['Predicted'])  
print(conf_matrix_RF)
print('\n')
print(conf_matrix_XGB)

在这里插入图片描述


总结

此项目适合毕设和课设学习等等。由于图过多,本文就显示一个例子,如果需要数据集或源码(每个代码详解)可在博主首页的“资源”下载。

????文章下方有交流学习区!一起学习进步!????????????
????首发****博客,创作不易,如果觉得文章不错,可以点赞????收藏????评论????
????你的支持和鼓励是我创作的动力❗❗❗

上一篇:Android 版本号名称及SDK对应关系


下一篇:排序算法-计数排序