基于数据可视化学习的卡路里消耗预测分析

打印 上一主题 下一主题

主题 850|帖子 850|积分 2550

数据分析实操聚集:

1、关于房间传感器监测数据集的探索
2、EEMD-LSTM模型择时计谋 — 1.EEMD分解与LSTM模型搭建
3、EEMD-LSTM模型择时计谋 — 2. 量化回测
4、国际超市电商销售数据分析
5、基于问卷观察数据的多元统计数据分析与预测(因子分析、对应分析与逻辑回归)
6、手写文本识别
7、语音情感识别
8、电商会员门店消耗数据分析
9、糖尿病风险预测模型分析与构建
10、基于卷积神经网络(CNN)和ResNet50的水果与蔬菜图像分类系统
11、门生烦闷环境可视化分析及预测
12、人脸心情识别(GUI实时识别)
13、基于LSTM的机场天气分析及模型预测
运动能量消耗数据分析

Background:数据集包含了来自不同用户的多项体征数据,包括性别、年事、身高、体重等基本信息,以及运动持续时间、心率和体温等与身体运动相关的数据。

通过分析这些数据,探索用户在进行身体运动时的热量消耗环境,即目标变量Calories,从而为个性化健身筹划或康健管理提供数据支持。
数据分析
基础统计分析
影响因素分析
构建预测模型
总结:通过数据分析可视化,清晰直观发现 持续时间越长,燃烧的卡路里就越高。心率跳动与燃烧的卡路里呈正相关。持续时间增长会导致心率和体温增长。
Importing Libraries 导入库

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns
  5. from scipy.stats import shapiro, kstest, mannwhitneyu, ttest_ind, levene
  6. from sklearn.preprocessing import LabelEncoder
  7. from sklearn.model_selection import train_test_split
  8. from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
  9. from sklearn.metrics import mean_absolute_error
复制代码
数据准备
  1. data = pd.read_csv("/home/mw/input/02141492/calories.csv")
  2. data.sample(5)
复制代码

  1. data.describe()
复制代码

  1. data.select_dtypes('object').describe()
复制代码
Data Preprocessing 数据预处理

  1. data.shape
  2. data.isnull().sum()
复制代码

  1. data.columns = data.columns.str.lower()
复制代码
  1. # 删除无关特征(如 User_Id)
  2. # data = data.drop(columns=["User_Id"])
  3. del data['user_id']
复制代码
  1. data.plot.box(subplots=True, figsize=(10,5))
  2. plt.tight_layout()
复制代码

身高、体重、心率和体温存在非常值。
Data Distribution 数据分布
  1. import seaborn as sns
  2. print(sns.__version__)
  3. !pip install -U seaborn
  4. import seaborn as sns
  5. print(sns.__version__)
复制代码
ps:由于histplot 函数是在 seaborn 0.11.0 版本中引入的; seaborn 需更新到 0.11.0 以上。
  1. fig, axes = plt.subplots(4,2, figsize=(10,10))
  2. for i, column in enumerate(data.columns):
  3.     row = i // 2
  4.     col = i % 2
  5.     if column in data.select_dtypes(np.number).columns:
  6.         sns.histplot(data[column], ax=axes[row, col])
  7.     else:
  8.         count_values = data[column].value_counts()
  9.         sns.barplot(x=count_values.index, y=count_values.values, ax=axes[row,col])
  10.     axes[row, col].set_title(f'Distribution of {column}')
  11.     axes[row, col].set_ylabel('frequency')
  12. plt.tight_layout()
复制代码

Correlations Analysis 相关性分析

  1. sns.heatmap(data[data.select_dtypes(np.number).columns].corr(), annot=True)
复制代码

1.持续时间越长,燃烧的卡路里就越高。
2.心率越快,燃烧的卡路里就越高。
3.年事和燃烧的卡路里具有较弱的相关性。
4.持续时间增长会导致心率和体温增长。
  1. gender_calories = data.groupby('gender')['calories'].mean()
  2. sns.barplot(x=gender_calories.index, y=gender_calories.values, palette='viridis')
  3. plt.ylabel('average calories')
  4. plt.title('Average Calories per Gender')
复制代码

据观察,男性组的平均卡路里燃烧量略高于女性组。
  1. kstest_res = []
  2. kruskal_test = []
  3. fig, axes = plt.subplots(1,2, figsize=(10,5))
  4. for i, gender in enumerate(data['gender'].unique()):
  5.     to_test = data [ data['gender'] == gender]['calories']
  6.     stats, pvalue =  kstest(to_test, 'norm')
  7.    
  8.     if pvalue > 0.05:
  9.         assumption = 'normal'
  10.     else:
  11.         assumption = 'not normal'
  12.     kstest_res.append([gender, pvalue, assumption])
  13.     kruskal_test.append(to_test)
  14.     sns.histplot(to_test, ax=axes[i], palette='viridis')
  15.     axes[i].set_title(f'Distribution for {gender} calories')
  16.     axes[i].set_ylabel('frequency')
  17.    
  18. kstest_df = pd.DataFrame(kstest_res, columns=['gender','pvalue','assumption'])
  19. kstest_df
复制代码

如图男性和女性卡路里的分布不呈正态。
  1. stats, pvalue = mannwhitneyu(*kruskal_test, alternative='greater')
  2. if pvalue <= 0.05:
  3.     assumption = 'reject H0'
  4. else:
  5.     assumption = 'accept H0'
  6. print('Kruskal pvalue:',pvalue,'\nAssumption:',assumption)
复制代码

p值表明,男性燃烧的卡路里并不显着高于女性。
Feature Engineering 特征工程

  1. encoder = LabelEncoder()
  2. model_data = data.copy()
  3. model_data['gender'] = encoder.fit_transform(model_data['gender'])
  4. model_data.sample(5)
复制代码
Predictive Modelling 预测建模

练习和测试
  1. x = model_data[['gender', 'age', 'height', 'weight', 'duration', 'heart_rate',
  2.                 'body_temp']]
  3. y = model_data['calories']
  4. x_train, x_test, y_train, y_test = train_test_split(x, y,
  5.                                                     train_size=0.7,
  6.                                                     random_state=42)
复制代码
  1. sns.scatterplot(x=x_train['heart_rate'],
  2.                 y=y_train,
  3.                 color=sns.color_palette('viridis')[4])
  4. sns.scatterplot(x=x_test['heart_rate'],
  5.                 y=y_test,
  6.                 color=sns.color_palette('viridis')[2])
复制代码

Random Forest Regressor 随机森林回归

  1. rf_model = RandomForestRegressor(n_estimators=1000,
  2.                                  max_depth=15,
  3.                                  max_features=3,
  4.                                  oob_score=True,
  5.                                  random_state=42)
  6. rf_model.fit(x_train, y_train)
  7. rf_predicted = rf_model.predict(x_test)
  8. rf_score = rf_model.score(x_test, y_test)
  9. rf_mae = mean_absolute_error(y_test, rf_predicted)
  10. rf_oob = rf_model.oob_score_
  11. rf_df
  12. = pd.DataFrame({'model':['Random Forest'],
  13.                       'r2_score':[rf_score],
  14.                       'rf_mae':[rf_mae],
  15.                       'oob_score':[rf_oob]})
复制代码
  1. sns.scatterplot(x=x_test['heart_rate'],
  2.                 y=y_test,
  3.                 color=sns.color_palette('viridis')[4])
  4. sns.lineplot(x=x_test['heart_rate'],
  5.              y=rf_predicted,
  6.              color=sns.color_palette('viridis')[2])
复制代码

Key Indicators 关键指标
  1. import pandas as pd
  2. import seaborn as sns
  3. import matplotlib.pyplot as plt
  4. rf_fi = pd.DataFrame({'feature':x.columns,
  5.                       'importances':rf_model.feature_importances_})
  6. # 对 DataFrame 按照 'importances' 排序
  7. rf_fi_sorted = rf_fi.sort_values(by='importances', ascending=False)
  8. # 使用 seaborn 绘制条形图
  9. sns.barplot(data=rf_fi_sorted, x='importances', y='feature', palette='viridis')
  10. # 显示图表
  11. plt.show()
复制代码

持续时间对预测燃烧的卡路里影响最大。
Model Performance 模型性能
  1. rf_df
复制代码

  1. # 检查缺失值
  2. print(data.isnull().sum())
  3. # 如果有缺失值,可以选择填充或删除
  4. data = data.dropna()  # 删除缺失值
  5. # 分离特征和目标变量
  6. X = data.drop(columns=["calories"])
  7. y = data["calories"]
复制代码

  1. # 标准化特征
  2. from sklearn.preprocessing import StandardScaler
  3. scaler = StandardScaler()
  4. X_scaled = scaler.fit_transform(x)
复制代码
构建 XGBoost 模型

用 XGBoost 构建预测模型,并通过交叉验证评估模型性能
  1. from xgboost import XGBRegressor
  2. from sklearn.model_selection import train_test_split, cross_val_score
  3. # 划分训练集和测试集
  4. X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
  5. # 初始化 XGBoost 模型
  6. model = XGBRegressor(
  7.     n_estimators=100,  # 树的数量
  8.     learning_rate=0.1,  # 学习率
  9.     max_depth=4,  # 树的最大深度
  10.     random_state=42
  11. )
  12. # 训练模型
  13. model.fit(X_train, y_train)
  14. # 交叉验证评估
  15. cv_scores = cross_val_score(model, X_train, y_train, cv=5, scoring="neg_mean_squared_error")
  16. print("Cross-Validation RMSE:", np.sqrt(-cv_scores).mean())
复制代码

模型评估
评估模型在测试集上的性能,并绘制预测结果与实际值的对比图。

  1. # 预测测试集
  2. y_pred = model.predict(X_test)
  3. # 计算评估指标
  4. from sklearn.metrics import mean_squared_error, r2_score
  5. mse = mean_squared_error(y_test, y_pred)
  6. r2 = r2_score(y_test, y_pred)
  7. print("MSE:", mse)
  8. print("R²:", r2)
  9. # 绘制预测结果与实际值的对比图
  10. plt.scatter(y_test, y_pred, alpha=0.5)
  11. plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color="red", linestyle="--")
  12. plt.xlabel("Actual Calories")
  13. plt.ylabel("Predicted Calories")
  14. plt.title("Actual vs Predicted Calories")
  15. plt.show()
复制代码

特征重要性分析

分析特征对模型预测的贡献程度,帮助明确哪些因素对热量消耗的影响最大
  1. # 获取特征重要性
  2. feature_importances = model.feature_importances_
  3. feature_names = x.columns
  4. # 绘制特征重要性条形图
  5. sns.barplot(x=feature_importances, y=feature_names, palette="viridis")
  6. plt.xlabel("Importance")
  7. plt.ylabel("Features")
  8. plt.title("Feature Importances")
  9. plt.show()
复制代码

持续时间对预测燃烧的卡路里影响最大。
  1. # 若需要完整数据集以及代码请点击以下链接
  2. https://mbd.pub/o/bread/mbd-aJWUlJ9u
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表