机器学习项目三:XGBoost人体卡路里消耗预测
随着健康理念深入人心,为满足健身爱好者测量力量训练卡路里消耗的需求,项目搭建了卡路里消耗预测系统。该系统基于XGBoost回归算法,通过导入相关数据集,经数据探索分析、模型训练与预测,最终实现根据用户身体数据实时预测能量消耗。

一、项目背景
1.1 什么是卡里路
相信健身热爱运动,减肥的的朋友对这个名词一定不陌生! 卡路里(Calorie),简称卡,缩写为cal,其定义为在1个大气压下,将1克水提升1摄氏度所需要的热量;卡路里(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 Calories0 14733363 231.01 14861698 66.02 11179863 26.03 16180408 71.04 17771927 35.0登录后复制 In [3]
exercise = pd.read_csv("work/exercise.csv")exercise.head()登录后复制 User_ID Gender Age Height Weight Duration Heart_Rate Body_Temp0 14733363 male 68 190.0 94.0 29.0 105.0 40.81 14861698 female 20 166.0 60.0 14.0 94.0 40.32 11179863 male 69 179.0 79.0 5.0 88.0 38.73 16180408 female 34 179.0 71.0 13.0 100.0 40.54 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 0Gender 0Age 0Height 0Weight 0Duration 0Heart_Rate 0Body_Temp 0Calories 0dtype: 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): """ 绘制概率密度图矩阵函数 df:要绘制图像的dataframe 绘制各个字段的概率密度分布,最终返回图像的show() """ 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) # sns.set(font = 'FangSong',font_scale = 1.6) # index = columns sns.kdeplot(df[col],shade = True,label = col,alpha = 0.7) plt.legend() plt.title('{}'.format(col)) return plt.show()登录后复制 In [12]kde_plot_array(df[constant_features])登录后复制
登录后复制登录后复制
3.4 查看特征分布
In [13]sns.countplot(df['Gender']) #此处可以看出男女性别分布,基本一样登录后复制
登录后复制
登录后复制登录后复制 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])登录后复制
登录后复制登录后复制 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).valuesy = 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()登录后复制 登录后复制登录后复制
4.1 打印绝对误差
In [25]mae = metrics.mean_absolute_error(y_test,preds)mae登录后复制
1.4807048829992613登录后复制
4.2 打印均方根误差
In [26]Rmse = np.sqrt(metrics.mean_squared_error(y_test,preds))Rmse登录后复制
2.12938076108955登录后复制
4.3 打印均方根误差
可以看出r2——score十分接近1,可见模型预测的效果很好
In [27]preds_R2_score = metrics.r2_score(y_test,preds)preds_R2_score登录后复制
0.9988455491362879登录后复制
五、构建预测系统
即用户输入对应的数据,即可根据输入预测出人体消耗的卡路里值,还可以部署到设备中,开发一套能量消耗预测系统
In [33]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回归算法,后续还可尝试更多的回归算法,或者是深度学习神经网络算法,不断对模型调优,提高预测精度
相关攻略
4月5日消息,据“上海交通大学”公众号消息,日前,米哈游联合创始人、总裁、董事长、上海交通大学2005级信息工程专业本科、2009级通信与信息系统专业硕士校友刘伟,代表米哈游创始团队蔡浩宇、罗宇皓,
据彭博社近日报道称,尽管2026年Alphabet、亚马逊、Meta和微软等科技巨头都要投入超过6,500亿美元扩展人工智能(AI),但关键电气元件可用性成为主要障碍,近50%将因电力基础设施短缺和
4月6日消息,最近两年AI发展速度越来越快,AI取代大量工作导致人类失业的说法甚嚣尘上,然而事实可能不是这样。著名风投机构创始人a16z联合创始人Marc Andreessen也是AI圈的大佬,他日
4月6日消息,今日,红果短剧发布《关于持续治理AI短剧素材违规使用行为的公告》(以下简称《公告》)。《公告》显示,今年一季度,平台已累计下架违反平台治理规范的漫剧1718部。其中,针对近期AI短剧素
4月4日消息,发布仅1天的阿里千问新模型Qwen3 6-Plus,冲上全球知名大模型API调用平台OpenRouter的日榜榜首,成为当下最受企业和开发者热捧的大模型。OpenRouter最新数据显
热门专题
热门推荐
加密货币行业翘首以盼的监管里程碑,终于有了实质性进展。美国证券交易委员会(SEC)主席保罗·阿特金斯(Paul Atkins)近日证实,那份允许加密项目在早期获得注册豁免权的“安全港”框架提案,已经正式送抵白宫,进入了最终审查阶段。 在范德堡大学与区块链协会联合举办的数字资产峰会上,阿特金斯透露了这
微策略Strategy报告:第一季录得144 6亿美元浮亏 再斥资约3 3亿美元买进4871枚比特币 市场震荡的威力有多大?看看Strategy的最新季报就明白了。根据其最新向美国证管会(SEC)提交的8-K报告,受市场剧烈波动影响,这家公司所持的比特币在第一季度录得了一笔惊人的数字——144 6亿
稳定币巨头Tether的动向,向来是加密世界的风向标。这不,它向Web3基础设施的版图扩张,又迈出了关键一步。公司执行长Paolo Ardoino在社交平台X上透露,其工程团队正在全力“烹制”一个新项目——去中心化搜索引擎 “Hypersearch”。这个消息一出,立刻引发了行业的广泛猜想。 采用D
基地位于Coinbase旗下以太坊Layer2网络Base的Seamless Protocol,日前正式宣告了服务的终结。这个曾经吸引了超过20万用户的原生DeFi借贷协议,在运营不到三年后,终究没能跑赢时间。它主打的核心产品是Integrated Leverage Markets(ILMs)——一
PAAL代币揭秘:深度解析Web3社区治理的核心钥匙 在去中心化自治组织的浪潮中,谁真正掌握了项目的话语权?PAAL代币提供了一套系统化的答案。它不仅是生态内流转的价值媒介,更是开启链上治理大门的核心凭证。通过持有并质押PAAL代币,用户能够对协议升级、资金分配乃至战略方向等关键事务投出决定性的一票





