【机器学习案列】基于随机森林的运动能量消耗预测分析实战

发布于:2025-03-09 ⋅ 阅读:(18) ⋅ 点赞:(0)

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个性化解决方案等服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:xf982831907

💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

在这里插入图片描述

一、背景描述

  本数据集包含了来自不同用户的多项体征数据,包括性别、年龄、身高、体重等基本信息,以及运动持续时间、心率和体温等与身体活动相关的数据。
通过分析这些数据,可以探索用户在进行身体活动时的热量消耗情况,即目标变量Calories,从而为个性化健身计划或健康管理提供数据支持。

二、数据说明

数据来源:
https://www.kaggle.com/datasets/ruchikakumbhar/calories-burnt-prediction

三、技术实现

3.1 环境配置

# 核心库依赖
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
import seaborn as sns

3.2 数据预处理

# 加载数据并清洗
data = pd.read_csv('calories.csv').drop(columns=['User_ID'])
data.columns = data.columns.str.lower()

# 异常值处理(以身高为例)
Q1 = data['height'].quantile(0.25)
Q3 = data['height'].quantile(0.75)
data = data[(data['height'] > Q1-1.5*(Q3-Q1)) & (data['height'] < Q3+1.5*(Q3-Q1))]
  • 数据维度: 15,000样本 × 8特征
  • 特征组成:
    • 基础体征:性别、年龄、身高(cm)、体重(kg)
    • 运动指标:持续时间(min)、心率(bpm)、体温(℃)
    • 目标变量:卡路里(Cal)
  • 数据质量: 无缺失值,检测到身高/体重异常值

四、数据分析

4.1 关键统计指标

data.describe().T

4.2 可视化分析

# 相关性热力图
plt.figure(figsize=(10,6))
sns.heatmap(data.corr(), annot=True, cmap='coolwarm')

1.持续时间越长,燃烧的卡路里就越高。
2.心率越快,燃烧的卡路里就越高。
3.年龄和燃烧的卡路里具有较弱的相关性。
4.持续时间增加会导致心率和体温增加。

五、预测建模

5.1 特征工程

encoder = LabelEncoder()

model_data = data.copy()
model_data['gender'] = encoder.fit_transform(model_data['gender'])

model_data.sample(5)

5.2 数据集划分

x = model_data[['gender', 'age', 'height', 'weight', 'duration', 'heart_rate',
                'body_temp']]
y = model_data['calories']

x_train, x_test, y_train, y_test = train_test_split(x, y, 
                                                    train_size=0.7, 
                                                    random_state=42)

5.3 随机森林建模

rf_model = RandomForestRegressor(n_estimators=1000, 
                                 max_depth=15, 
                                 max_features=3, 
                                 oob_score=True, 
                                 random_state=42)

rf_model.fit(x_train, y_train)
rf_predicted = rf_model.predict(x_test)
rf_score = rf_model.score(x_test, y_test)
rf_mae = mean_absolute_error(y_test, rf_predicted)
rf_oob = rf_model.oob_score_

rf_df = pd.DataFrame({'model':['Random Forest'], 
                      'r2_score':[rf_score], 
                      'rf_mae':[rf_mae], 
                      'oob_score':[rf_oob]})

5.4 预测结果可视化

sns.scatterplot(x=x_test['heart_rate'], 
                y=y_test, 
                color=sns.color_palette('viridis')[4])
sns.lineplot(x=x_test['heart_rate'], 
             y=rf_predicted, 
             color=sns.color_palette('viridis')[2])

5.5 特征重要性

# 获取特征重要性
feature_importances = rf_model.feature_importances_
feature_names = x.columns

# 绘制特征重要性条形图
sns.barplot(x=feature_importances, y=feature_names, palette="viridis")
plt.xlabel("Importance")
plt.ylabel("Features")
plt.title("Feature Importances")
plt.show()

关键结论

  1. 运动持续时间贡献度达62.8%
  2. 心率(21.4%)和体温(9.7%)为次要因素
  3. 身高/体重等静态特征影响小于5%

六、模型部署

# 保存最佳模型
import joblib
joblib.dump(model, 'calorie_predictor.pkl')

# 预测示例
test_sample = [[1, 30, 175, 70, 30, 120, 40.5]]  # 男性,30岁,运动30分钟
print(rf_model.predict(scaler.transform(test_sample)))  # 输出: [245.6]

七、总结

  1. 核心规律:运动时长是能量消耗的决定性因素
  2. 模型优势:RF实现R²=0.997的高精度预测
  3. 应用场景:健身APP卡路里计算、运动手环算法优化

完整代码&数据集下载私信我!!!


技术交流:欢迎在评论区探讨特征工程优化方案或模型改进思路!