机器学习项目三:XGBoost人体卡路里消耗预测
一、项目背景
1.1 什么是卡里路
相信健身热爱运动,减肥的的朋友对这个名词一定不陌生!
卡路里(Calorie),简称卡,缩写为cal,其定义为在1个大气压下,将1克水提升1摄氏度所需要的热量;卡路里(calorie)是一种热量单位,被广泛使用在营养计量和健身手册上,国际标准的能量单位是焦耳(joule)
2.2 项目介绍
如今,随着健康生活的理念越来越深入人心,越来越多的健身爱好者希望能够测量出参加力量训练时候的卡路里的消耗及之后的饮食调节,然而,传统的获取运动过程中人体的能量消耗不仅程序繁琐,且还需要额外的设备,因此我们急切需要找到一种能够方便并有效的检测力量训练时的卡路里的消耗和动作识别的方法,我们在获取用户的一系列身体数据后,就能实时在线的预测出人体消耗的能量
日常健身过程中,尤其是力量训练时,人体将消耗大量的卡路里。
为了有助于训练后的营养补充和膳食搭配,为人体能力代谢,特别是喜欢运动的人群做出实时的能量消耗预测,提供一个快速,准确的人体卡路里消耗预测!
为此我们搭建了一个预测人体消耗卡路里的系统!该系统使用机器学习XGBoost回归算法,可以根据用户的性别、年龄、身高、体重、锻炼持续时间、心率,身体温度这几项数据就可以实时在线的评估一个人的能量消耗。
二、导入依赖库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import metrics
from sklearn.model_selection import train_test_split
from xgboost import XGBRegressor
#导入数据集
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 |
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 |
# 合并数据集
df = pd.concat([exercise,calories.Calories],axis=1)
df.head()
User_ID | Gender | Age | Height | Weight | Duration | Heart_Rate | Body_Temp | Calories | |
---|---|---|---|---|---|---|---|---|---|
0 | 14733363 | male | 68 | 190.0 | 94.0 | 29.0 | 105.0 | 40.8 | 231.0 |
1 | 14861698 | female | 20 | 166.0 | 60.0 | 14.0 | 94.0 | 40.3 | 66.0 |
2 | 11179863 | male | 69 | 179.0 | 79.0 | 5.0 | 88.0 | 38.7 | 26.0 |
3 | 16180408 | female | 34 | 179.0 | 71.0 | 13.0 | 100.0 | 40.5 | 71.0 |
4 | 17771927 | female | 27 | 154.0 | 58.0 | 10.0 | 81.0 | 39.8 | 35.0 |
df.shape
(15000, 9)
三、数据探索分析—EDA
3.1 数据描述
df.describe()#查看数据的信息
User_ID | Age | Height | Weight | Duration | Heart_Rate | Body_Temp | Calories | |
---|---|---|---|---|---|---|---|---|
count | 1.500000e+04 | 15000.000000 | 15000.000000 | 15000.000000 | 15000.000000 | 15000.000000 | 15000.000000 | 15000.000000 |
mean | 1.497736e+07 | 42.789800 | 174.465133 | 74.966867 | 15.530600 | 95.518533 | 40.025453 | 89.539533 |
std | 2.872851e+06 | 16.980264 | 14.258114 | 15.035657 | 8.319203 | 9.583328 | 0.779230 | 62.456978 |
min | 1.000116e+07 | 20.000000 | 123.000000 | 36.000000 | 1.000000 | 67.000000 | 37.100000 | 1.000000 |
25% | 1.247419e+07 | 28.000000 | 164.000000 | 63.000000 | 8.000000 | 88.000000 | 39.600000 | 35.000000 |
50% | 1.499728e+07 | 39.000000 | 175.000000 | 74.000000 | 16.000000 | 96.000000 | 40.200000 | 79.000000 |
75% | 1.744928e+07 | 56.000000 | 185.000000 | 87.000000 | 23.000000 | 103.000000 | 40.600000 | 138.000000 |
max | 1.999965e+07 | 79.000000 | 222.000000 | 132.000000 | 30.000000 | 128.000000 | 41.500000 | 314.000000 |
3.2 判断是否有缺失值
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
df.columns
Index(['User_ID', 'Gender', 'Age', 'Height', 'Weight', 'Duration','Heart_Rate', 'Body_Temp', 'Calories'],dtype='object')
# 连续变量
constant_features = [ 'Age', 'Height', 'Weight', 'Duration','Heart_Rate', 'Body_Temp']
df.head()
User_ID | Gender | Age | Height | Weight | Duration | Heart_Rate | Body_Temp | Calories | |
---|---|---|---|---|---|---|---|---|---|
0 | 14733363 | male | 68 | 190.0 | 94.0 | 29.0 | 105.0 | 40.8 | 231.0 |
1 | 14861698 | female | 20 | 166.0 | 60.0 | 14.0 | 94.0 | 40.3 | 66.0 |
2 | 11179863 | male | 69 | 179.0 | 79.0 | 5.0 | 88.0 | 38.7 | 26.0 |
3 | 16180408 | female | 34 | 179.0 | 71.0 | 13.0 | 100.0 | 40.5 | 71.0 |
4 | 17771927 | female | 27 | 154.0 | 58.0 | 10.0 | 81.0 | 39.8 | 35.0 |
3.3 画出概率密度图
此处采用了两种画法,一种是matplotlib里面的画法,一种是,seaborn里面的画法
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 = columnssns.kdeplot(df[col],shade = True,label = col,alpha = 0.7)plt.legend()plt.title('{}'.format(col))return plt.show()
kde_plot_array(df[constant_features])
3.4 查看特征分布
sns.countplot(df['Gender']) #此处可以看出男女性别分布,基本一样
<matplotlib.axes._subplots.AxesSubplot at 0x7fa7213ee5d0>
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()
display(df[constant_features])
#离散变量编码,此处用labelencoder也可,本文直接用的df的replace函数,更方便
df.replace({'Gender':{'male':0,"female":1}}, inplace = True)
3.5 创建特征和标签
X = df.drop(['User_ID','Calories'],axis=1).values
y = df.Calories
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划分数据集
X_train ,X_test ,y_train ,y_test = train_test_split(X,y,test_size=0.2,random_state=2)
print(X_train.shape,X_test.shape)
print(y_train.shape,y_test.shape)
(12000, 7) (3000, 7)
(12000,) (3000,)
三、模型训练
model = XGBRegressor(random_state=42) #本次项目选用XGBoost算法
model.fit(X_train,y_train)
X_preds = model.predict(X_train)
四、模型预测
预测部分直接调佣XGBOOST的预测函数,即可得出预测值,我们可以选用其他
preds = model.predict(X_test)
#查看预测值
preds
array([127.823784, 226.00154 , 38.66253 , ..., 144.3636 , 22.767195,89.87375 ], dtype=float32)
4.1 可视化预测与真实值
可以看出预测值和真实值十分接近,证明了我们模型的有效性
plt.scatter(y_test,preds)
plt.xlabel('y_test')
plt.ylabel('preds')
plt.title('y_test VS preds')
plt.show()
4.1 打印绝对误差
mae = metrics.mean_absolute_error(y_test,preds)
mae
1.4807048829992613
4.2 打印均方根误差
Rmse = np.sqrt(metrics.mean_squared_error(y_test,preds))
Rmse
2.12938076108955
4.3 打印均方根误差
可以看出r2——score十分接近1,可见模型预测的效果很好
preds_R2_score = metrics.r2_score(y_test,preds)
preds_R2_score
0.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)diction)print('此人卡路里消耗值为{} '.format(prediction[0]))
[64.68266]
此人卡路里消耗值为64.68266296386719
项目总结
本项目只采用了XGBoost回归算法,后续还可尝试更多的回归算法,或者是深度学习神经网络算法,不断对模型调优,提高预测精度
作者简介
武汉科技大研二学生,研究方向,计算机视觉,机器视觉,生物医学大数据
此文章为搬运
原项目链接
机器学习项目三:XGBoost人体卡路里消耗预测相关推荐
- 【机器学习】三大树模型实战乳腺癌预测分类
公众号:尤而小屋 作者:Peter 编辑:Peter 今天给大家带来一篇新的UCI数据集建模的文章. 本文从数据的探索分析出发,经过特征工程和样本均衡性处理,使用决策树.随机森林.梯度提升树对一份女性 ...
- matlab与机器学习(三)以辛烷值含量预测为例BP神经网络(含代码解析)
在BP神经网络中,单个样本有个输入,有个输出,在输入层和输出层之间通常还有若干个隐含层.实际上,1989 Robert Hecht-Nielsen证明了对于任何闭区间内的一个连续函数都可以用一个隐含层 ...
- 三万字机器学习项目整理(基础到进阶)
如果你是学生.计算机领域的工作者,我强烈建议你学习.掌握机器学习,我不敢说它是最简单的(机器学习的确很简单),但是掌握机器学习一定是性价比最高的. 本文用浅显易懂的语言精准概括了机器学习的相关知识,内 ...
- 0.0 目录-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...
- 机器学习训练营-基于XGBoost的分类预测学习笔记
文章目录 前言 一.学习知识点概要 二.学习内容 1 XGBoost的应用及优缺点 1.1 XGBoost的应用 1.2 XGBoost的优缺点 2 基于天气数据集的XGBoost分类实战 2.1 目 ...
- 2.11 总结-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 2.10 是否要使用端到端的深度学习 回到目录 1.1 计算机视觉 总计 习题 为了帮助你练习机器学习的策略,本周我们将介绍另一个场景,并询问你将如何行动.我们认为这个在机器 ...
- 2.2 清除标注错误的数据-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 2.1 误差分析 回到目录 2.3 快速搭建你的第一个系统,并进行迭代 清除标注错误的数据 (Cleaning Up Incorrectly Labeled Data) 你的 ...
- 胡笨笨硕士期间项目心得之项目三气象知识图谱的构建及区域积水地区预测
项目三气象知识图谱的构建及区域积水地区预测: 奈天昏地暗,斗转星移.风骤紧,缥缈风头云乱.用知识图谱构建气象知识图谱,在结合具体地点地势做到即使预警,将技术及时的落地才是王道. 项目需求分析 我拿到手 ...
- 机器学习项目实战(五) 住房价格预测
机器学习项目实战系列 住房价格预测 目录 机器学习项目实战系列 住房价格预测 一.概述 二.分析数据 1.数据导入 2.基础统计运算 3.特征观察 4.建立模型 5.分析模型表现 (1)学习曲 ...
最新文章
- 恍然大悟之原、反、补
- java whois_Java如何实现简单的whois查询
- python-mysql的安装和基本操作
- echart横轴文字显示省略号_echarts X轴显示不全 有省略
- 代币转账_手把手教你从源代码开始搭建多节点以太坊私链(五)部署智能合约及代币发行...
- Visual Studio 2013开发 mini-filter driver step by step (4) - 获取文件名
- Mozilla Prism v0.9 For Windows/Linux/Mac
- 完美图解教程 Linux环境VNC服务安装、配置与使用
- 华为P50系列相机全球首发新技术:告别偏色做到真实原色捕捉
- 敏捷开发中史诗故事与用户故事的颗粒度
- mysql 主从特性_mysql 5.6 新特性 主从推延
- cv python 画直线_Python进阶之Matplotlib入门(一)
- 安卓内录声音软件scr_高清录屏大师app下载-高清录屏大师app安卓版下载v3.0.0.23 - 非凡软件站...
- NanoPi NEO3上手日记第一天——把玩&刷固件
- 太实用了,这几个Python数据可视化案例
- Arcgis报错 ERROR 999999的解决方法汇总
- flea-jersey使用之Flea RESTful接口介绍
- 修行等级对比 鸿蒙,普及下:修行等级,武道九境(简化了很多)
- android 上网流程 ppp,Android/Linux ppp拨号流程
- 网络基础知识之IP与子网掩码和网络地址