机器学习:基于线性回归、岭回归、xgboost回归、Lasso回归、随机森林回归预测卡路里消耗

烘焙

前言

系列专栏:机器学习:高级应用与实践【项目实战100+】【2024】✨︎
在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学习模型、处理非结构化数据以及指导复杂的模型,如卷积神经网络、门控循环单元、大型语言模型和强化学习模型

机器学习算法是一种通过训练模型对给定数据进行预测的方法。在预测卡路里消耗这个问题上,可以尝试使用以下几种机器学习算法:

  1. 线性回归:线性回归是一种基本的机器学习算法,用于建立连续变量和一个或多个自变量之间的线性关系模型。在预测卡路里消耗这个问题上,可以使用线性回归模型来建立卡路里消耗与其他相关变量(如运动时间、体重等)之间的线性关系。

  2. 岭回归:岭回归是一种回归算法,用于解决多重共线性问题。它通过对模型添加一个正则化项来降低参数的方差。在预测卡路里消耗这个问题上,岭回归可以用来减少参数的过拟合,提高预测的准确性。

  3. xgboost回归:xgboost是一种集成学习算法,属于梯度提升树模型。它通过迭代地训练一系列的决策树模型,并将它们组合成一个强大的模型。在预测卡路里消耗这个问题上,xgboost回归可以用来处理非线性关系,提高预测的准确性。

  4. Lasso回归:Lasso回归是一种基于L1正则化的线性回归算法,用于特征选择和参数稀疏化。在预测卡路里消耗这个问题上,Lasso回归可以用来筛选出对卡路里消耗影响较大的特征,提高模型的解释性和预测准确性。

  5. 随机森林回归:随机森林是一种集成学习算法,由多个决策树组成。它通过随机选择特征和样本进行训练,最终将多个决策树的预测结果进行平均或投票来得到最终结果。在预测卡路里消耗这个问题上,随机森林回归可以用来处理非线性关系和特征选择,提高预测的准确性。

1. 相关库和数据集

1.1 相关库介绍

Python 库使我们能够非常轻松地处理数据并使用一行代码执行典型和复杂的任务。

  • Pandas – 该库有助于以 2D 数组格式加载数据框,并具有多种功能,可一次性执行分析任务。
  • Numpy – Numpy 数组速度非常快,可以在很短的时间内执行大型计算。
  • Matplotlib/Seaborn – 此库用于绘制可视化效果,用于展现数据之间的相互关系。
  • Sklearn – 包含多个库,这些库具有预实现的功能,用于执行从数据预处理到模型开发和评估的任务。
  • XGBoost – 这包含 eXtreme Gradient Boosting 机器学习算法,这是帮助我们实现高精度预测的算法之一。
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns
from sklearn.model_selection import train_test_split 
from sklearn.preprocessing import LabelEncoder, StandardScaler 
from sklearn import metrics 
from sklearn.svm import SVC 
from xgboost import XGBRegressor 
from sklearn.linear_model import LinearRegression, Lasso, Ridge 
from sklearn.ensemble import RandomForestRegressor 

import warnings 
warnings.filterwarnings('ignore')

1.2 数据集介绍

1.2.1 加载数据

现在让我们将数据集加载到 pandas 的数据框中并打印其前五行。

df = pd.read_csv('calories.csv') 
df.head()

数据描述
现在让我们检查数据集的大小。

df.shape
(15000, 9)

1.2.2 数据信息

让我们检查数据集的哪一列包含哪种类型的数据。

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15000 entries, 0 to 14999
Data columns (total 9 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   User_ID     15000 non-null  int64  
 1   Gender      15000 non-null  object 
 2   Age         15000 non-null  int64  
 3   Height      15000 non-null  int64  
 4   Weight      15000 non-null  int64  
 5   Duration    15000 non-null  int64  
 6   Heart_Rate  15000 non-null  int64  
 7   Body_Temp   15000 non-null  float64
 8   Calories    15000 non-null  int64  
dtypes: float64(1), int64(7), object(1)
memory usage: 1.0+ MB

1.2.3 数据描述

现在我们将检查数据的描述性统计度量。

# Describe `df`
df.describe()

描述统计

2. 探索性数据分析

EDA是一种使用视觉技术分析数据的方法。它用于发现趋势和模式,或借助统计摘要和图形表示来检查假设。

sns.set()
sns.scatterplot(x= df['Height'], y= df['Weight']) 
plt.show()

高度宽度

2.1 特征相关性

features = ['Age', 'Height', 'Weight', 'Duration'] 

plt.subplots(figsize=(15, 10)) 
for i, col in enumerate(features): 
	plt.subplot(2, 2, i + 1) 
	df_sample = df.sample(1000) 
	sns.scatterplot(x=df_sample[col], y=df_sample['Calories']) 
plt.tight_layout() 
plt.show()

在这里插入图片描述
正如预期的那样,锻炼时间越长,消耗的卡路里就越多。但除此之外,我们无法观察到卡路里消耗量与身高或体重特征之间的任何关系。

在这里,我们可以观察到一些现实生活中的现象:

  • 男生的平均身高高于女生。
  • 此外,女生的体重也低于男生。
  • 同样的平均锻炼时间,男性消耗的卡路里高于女性。

2.2 正态分布检验

features = ['Age', 'Height', 'Weight', 'Duration', 'Heart_Rate', 'Body_Temp'] 

plt.subplots(figsize=(15, 10)) 
for i, col in enumerate(features): 
	plt.subplot(2, 3, i + 1) 
	sns.distplot(df[col]) 
plt.tight_layout() 
plt.show() 

特征分布图
除了一些特征,如体温和卡路里,连续特征的分布接近正态分布。

df.replace({'male': 0, 'female': 1}, 
		inplace=True) 
df.head() 

替代

plt.figure(figsize=(7, 6)) 
sns.heatmap(df.corr() > 0.9, annot=True, cbar=True, cmap='Purples')

相关性
这里存在一个严重的数据泄漏问题,因为有一个特征与目标列高度相关,而目标列是卡路里。

to_remove = ['Weight', 'Duration'] 
df.drop(to_remove, axis=1, inplace=True) 

3. 构建机器学习模型

3.1 数据准备(拆分为训练集和测试集)

features = df.drop(['User_ID', 'Calories'], axis=1) 
target = df['Calories'].values 

X_train, X_val,\
	Y_train, Y_val = train_test_split(features, target, 
									test_size=0.2, 
									random_state=22) 
X_train.shape, X_val.shape 

3.2 特征缩放

((12000, 5), (3000, 5))

现在,让我们对数据进行归一化处理,以获得稳定而快速的训练。

# Normalizing the features for stable and fast training. 
scaler = StandardScaler() 
X_train = scaler.fit_transform(X_train) 
X_val = scaler.transform(X_val) 

3.3 模型构建(LR、XGBoost、Lasso、RF、Ridge)

现在,让我们来训练一些最先进的机器学习模型,比较一下哪种模型更适合我们的数据。

from sklearn.metrics import mean_absolute_error as mae 
models = [LinearRegression(), XGBRegressor(), 
		Lasso(), RandomForestRegressor(), Ridge()] 

for i in range(5): 
	models[i].fit(X_train, Y_train) 

	print(f'{models[i]} : ') 

	train_preds = models[i].predict(X_train) 
	print('Training Error : ', mae(Y_train, train_preds)) 

	val_preds = models[i].predict(X_val) 
	print('Validation Error : ', mae(Y_val, val_preds)) 
	print()
LinearRegression() : 
Training Error :  17.947279968371927
Validation Error :  17.73761909957277

XGBRegressor(base_score=None, booster=None, callbacks=None,
             colsample_bylevel=None, colsample_bynode=None,
             colsample_bytree=None, device=None, early_stopping_rounds=None,
             enable_categorical=False, eval_metric=None, feature_types=None,
             gamma=None, grow_policy=None, importance_type=None,
             interaction_constraints=None, learning_rate=None, max_bin=None,
             max_cat_threshold=None, max_cat_to_onehot=None,
             max_delta_step=None, max_depth=None, max_leaves=None,
             min_child_weight=None, missing=nan, monotone_constraints=None,
             multi_strategy=None, n_estimators=None, n_jobs=None,
             num_parallel_tree=None, random_state=None, ...) : 
Training Error :  7.674381575814138
Validation Error :  10.473695445229609

Lasso() : 
Training Error :  17.971518133905626
Validation Error :  17.74093199010133

RandomForestRegressor() : 
Training Error :  3.980961875
Validation Error :  10.59801680952381

Ridge() : 
Training Error :  17.947362544638118
Validation Error :  17.737595699188827

在上述所有模型中,我们对 RandomForestRegressor 和 XGB 模型进行了训练,它们在验证数据上的 MAE 相同,性能也相同。

  • 31
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矩阵猫咪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值