机器学习项目三:XGBoost人体卡路里消耗预测
更新时间:2026-02-15 12:57:34
-
-
爱情和生活模拟rpg手机版
- 类型:体育竞技
- 大小:87.5mb
- 语言:简体中文
- 评分:
- 查看详情
机器学习项目三:XGBoost人体卡路里消耗预测
随着健康意识的提升,健身爱好者对精准测量力量训练时的能量消耗有了更高需求。为满足这一需求,我们项目搭建了卡路里消耗预测系统。该系统采用了XGBoost回归算法,通过导入相关的数据集进行数据探索、模型训练和实时预测,最终实现了根据个人身体数据实时预测能量消耗的效果。
一、项目背景
1.1 什么是卡里路
相信热爱运动、追求健康的朋友一定对这个名词不陌生! 卡路里(Calorie),简称卡,缩写为cal,其定义为在大气压下,将水提升氏度所需要的热量;卡路里(calorie)是一种热量单位,被广泛使用在营养计量和健身手册上,国际标准的能量单位是焦耳(joule)。
2.2 项目介绍
随着现代生活节奏的加快和健康意识的提升,越来越多的人开始关注并参与到健身活动中来。而在这个过程中,了解自己运动时能量消耗及后劲饮食调整的需求也日益增多。传统的方式需要复杂的程序和技术设备的支持,因此迫切需要一种便捷高效的方法来测量力量训练时的能量消耗以及动作识别。为此,我们团队开发了一套预测人体卡路里消耗的系统,这个系统采用了机器学习中的XGBoost回归算法作为其核心技术之一。用户只需提供基本的身体数据性别、年龄、身高和体重等信息,然后通过锻炼时间、心率及身体温度这些关键因素,就能在实时在线的情况下获得自己的能量消耗量。这不仅大大简化了测量过程,还减轻了额外的设备需求。举个例子来说,在进行力量训练时,人体会释放大量的卡路里以支持肌肉的增长和修复工作。而这项系统能够精准捕捉到这些生理变化,并通过科学的数据模型进行分析,为用户提供一个精确的能量消耗预测。这种实时且准确的能量消耗评估不仅有助于调整运动后的饮食安排,还能帮助运动爱好者更好地了解自己的身体状况,提高训练效果。总的来说,这套系统旨在解决传统方式无法满足的便捷性和准确性问题,提供了前所未有的高效解决方案。无论是健身新手还是专业运动员,在提升训练效率和科学营养方面都能得到显著的帮助和支持。随着科技的发展,相信未来将会有更多的类似系统出现,进一步推动健康生活方式的发展。
二、导入依赖库
In [1]
import numpy as np import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn import metricsfrom sklearn.model_selection import train_test_splitfrom xgboost import XGBRegressor登录后复制 In [2]
#导入数据集calories = pd.read_csv(r"work/calories.csv") calories.head()登录后复制
User_ID Calories 0 14733363 231.0 1 14861698 66.0 2 11179863 26.0 3 16180408 71.0 4 17771927 35.0登录后复制 In [3]
exercise = pd.read_csv("work/exercise.csv") exercise.head()登录后复制
User_ID Gender Age Height Weight Duration Heart_Rate Body_Temp 0 14733363 male 68 190.0 94.0 29.0 105.0 40.8 1 14861698 female 20 166.0 60.0 14.0 94.0 40.3 2 11179863 male 69 179.0 79.0 5.0 88.0 38.7 3 16180408 female 34 179.0 71.0 13.0 100.0 40.5 4 17771927 female 27 154.0 58.0 10.0 81.0 39.8登录后复制 In [4]
# 合并数据集df = pd.concat([exercise,calories.Calories],axis=1) df.head()登录后复制
User_ID Gender Age Height Weight Duration Heart_Rate Body_Temp \ 0 14733363 male 68 190.0 94.0 29.0 105.0 40.8 1 14861698 female 20 166.0 60.0 14.0 94.0 40.3 2 11179863 male 69 179.0 79.0 5.0 88.0 38.7 3 16180408 female 34 179.0 71.0 13.0 100.0 40.5 4 17771927 female 27 154.0 58.0 10.0 81.0 39.8 Calories 0 231.0 1 66.0 2 26.0 3 71.0 4 35.0登录后复制登录后复制 In [5]
df.shape登录后复制
(15000, 9)登录后复制
三、数据探索分析---EDA
3.1 数据描述
In [6]
df.describe()#查看数据的信息登录后复制
User_ID Age Height Weight Duration \ count 1.500000e+04 15000.000000 15000.000000 15000.000000 15000.000000 mean 1.497736e+07 42.789800 174.465133 74.966867 15.530600 std 2.872851e+06 16.980264 14.258114 15.035657 8.319203 min 1.000116e+07 20.000000 123.000000 36.000000 1.000000 25% 1.247419e+07 28.000000 164.000000 63.000000 8.000000 50% 1.499728e+07 39.000000 175.000000 74.000000 16.000000 75% 1.744928e+07 56.000000 185.000000 87.000000 23.000000 max 1.999965e+07 79.000000 222.000000 132.000000 30.000000 Heart_Rate Body_Temp Calories count 15000.000000 15000.000000 15000.000000 mean 95.518533 40.025453 89.539533 std 9.583328 0.779230 62.456978 min 67.000000 37.100000 1.000000 25% 88.000000 39.600000 35.000000 50% 96.000000 40.200000 79.000000 75% 103.000000 40.600000 138.000000 max 128.000000 41.500000 314.000000登录后复制
3.2 判断是否有缺失值
In [7]
df.isnull().sum()登录后复制
User_ID 0 Gender 0 Age 0 Height 0 Weight 0 Duration 0 Heart_Rate 0 Body_Temp 0 Calories 0 dtype: int64登录后复制 In [8]
df.columns登录后复制
Index(['User_ID', 'Gender', 'Age', 'Height', 'Weight', 'Duration', 'Heart_Rate', 'Body_Temp', 'Calories'], dtype='object')登录后复制 In [9]
# 连续变量constant_features = [ 'Age', 'Height', 'Weight', 'Duration', 'Heart_Rate', 'Body_Temp']登录后复制 In [10]
df.head()登录后复制
User_ID Gender Age Height Weight Duration Heart_Rate Body_Temp \ 0 14733363 male 68 190.0 94.0 29.0 105.0 40.8 1 14861698 female 20 166.0 60.0 14.0 94.0 40.3 2 11179863 male 69 179.0 79.0 5.0 88.0 38.7 3 16180408 female 34 179.0 71.0 13.0 100.0 40.5 4 17771927 female 27 154.0 58.0 10.0 81.0 39.8 Calories 0 231.0 1 66.0 2 26.0 3 71.0 4 35.0登录后复制登录后复制
3.3 画出概率密度图
此处采用了两种画法,一种是matplotlib里面的画法,一种是,seaborn里面的画法 In [11]
def kde_plot_array(df): 绘制概率密度图矩阵函数 接受一个dataframe作为输入,然后显示每个字段的概率密度分布。 返回图像的显示函数。 fig, axes = plt.subplots(round(len(df.columns)/ , for i in range(len(df.columns)): ax = axes[i] sns.kdeplot(df[df.columns[i]], shade=True, label=df.columns[i], alpha= ax.legend ax.set_title(df.columns[i]) plt.tight_layout(rect=[) # Adjusts subplot parameters to give specified padding return plt.show
kde_plot_array(df[constant_features])登录后复制
<Figure size 2400x2000 with 6 Axes>登录后复制登录后复制
3.4 查看特征分布
In [13]
sns.countplot(df['Gender']) #此处可以看出男女性别分布,基本一样登录后复制
<matplotlib.axes._subplots.AxesSubplot at 0x7fa7213ee5d0>登录后复制
<Figure size 640x480 with 1 Axes>登录后复制登录后复制 In [14]
def display(df): '''用seaborn的displot函数查看变量分布''' plt.figure(figsize = (24,20)) # subplots_adjust(left = 0,bottom = 0,top = 1.4,right = 1) for num,col in zip(range(len(df.columns)),df.columns): plt.subplot(round(len(df.columns)/2,0),2,num+1) # plt.figure(figsize=(20,12)) # sns.set(font = 'FangSong',font_scale = 1.6) # index = columns # sns.kdeplot(df[col],shade = True,label = col,alpha = 0.7) sns.distplot(df[col]) # plt.legend() plt.title('{}'.format(col)) return plt.show()登录后复制 In [15]
display(df[constant_features])登录后复制
<Figure size 2400x2000 with 6 Axes>登录后复制登录后复制 In [16]
#离散变量编码,此处用labelencoder也可,本文直接用的df的replace函数,更方便df.replace({'Gender':{'male':0,"female":1}}, inplace = True)登录后复制
3.5 创建特征和标签
In [17]
X = df.drop(['User_ID','Calories'],axis=1).values y = df.Calories登录后复制 In [18]
print(X)登录后复制
[[ 0. 68. 190. ... 29. 105. 40.8] [ 1. 20. 166. ... 14. 94. 40.3] [ 0. 69. 179. ... 5. 88. 38.7] ... [ 1. 43. 159. ... 16. 90. 40.1] [ 0. 78. 193. ... 2. 84. 38.3] [ 0. 63. 173. ... 18. 92. 40.5]]登录后复制
3.6划分数据集
In [19]
X_train ,X_test ,y_train ,y_test = train_test_split(X,y,test_size=0.2,random_state=2)登录后复制 In [20]
print(X_train.shape,X_test.shape)print(y_train.shape,y_test.shape)登录后复制
(12000, 7) (3000, 7) (12000,) (3000,)登录后复制
三、模型训练
In [32]
model = XGBRegressor(random_state=42) #本次项目选用XGBoost算法model.fit(X_train,y_train) X_preds = model.predict(X_train)登录后复制
四、模型预测
预测部分直接调佣XGBOOST的预测函数,即可得出预测值,我们可以选用其他 In [22]
preds = model.predict(X_test)登录后复制 In [23]
#查看预测值preds登录后复制
array([127.823784, 226.00154 , 38.66253 , ..., 144.3636 , 22.767195, 89.87375 ], dtype=float32)登录后复制
4.1 可视化预测与真实值
可以看出预测值和真实值十分接近,证明了我们模型的有效性 In [24]
plt.scatter(y_test,preds) plt.xlabel('y_test') plt.ylabel('preds') plt.title('y_test VS preds') plt.show()登录后复制
<Figure size 640x480 with 1 Axes>登录后复制登录后复制
4.1 打印绝对误差
In [25]
mae = metrics.mean_absolute_error(y_test,preds) mae登录后复制
- 4807048829992613登录后复制
4.2 打印均方根误差
In [26]
Rmse = np.sqrt(metrics.mean_squared_error(y_test,preds)) Rmse登录后复制
- 12938076108955登录后复制
4.3 打印均方根误差
可以看出r2score十分接近1,可见模型预测的效果很好 In [27]
preds_R2_score = metrics.r2_score(y_test,preds) preds_R2_score登录后复制
- 9988455491362879登录后复制
五、构建预测系统
基于深度学习的人体能量消耗预测模型研发与应用。在输入特定数据后,系统能准确预测出用户的能量消耗量,并可集成至智能设备,构建高效的能量消耗预测平台。
input_data = (1 , 20 , 166.0 , 60.0 , 14.0 , 94.0 ,40.3)# 转化为numpy数组input_data_as_numpy_array = np.asarray(input_data)# reshape 成array二维input_data_reshaped = input_data_as_numpy_array.reshape(1,-1) prediction = model.predict(input_data_reshaped)print(prediction)print('此人卡路里消耗值为{} '.format(prediction[0]))登录后复制
[64.68266] 此人卡路里消耗值为64.68266296386719登录后复制
项目总结
我们仅使用了XGBoost进行回归分析。未来可以探索更多回归方法或利用神经网络技术,持续优化模型以提升预测准确性。
以上就是机器学习项目三:XGBoost人体卡路里消耗预测的详细内容,更多请关注其它相关文章!
