在本文中,我们将学习如何使用Python开发一个机器学习模型,该模型可以根据一些生物测量来预测一个人在锻炼过程中燃烧的卡路里数量。
Python库使我们可以轻松地处理数据,并通过一行代码执行典型和复杂的任务。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
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')
现在,让我们将数据集加载到panda的数据框中,并打印它的前五行。
df = pd.read_csv('calories.csv')
df.head()
df.shape
输出:
(15000, 9)
让我们看看数据集的所有数据类型。
df.info()
df.describe()
EDA是一种使用可视化技术分析数据的方法。它用于发现趋势和模式,或在统计摘要和图形表示的帮助下检查假设。
sb.scatterplot(df['Height'], df['Weight'])
plt.show()
features = ['Age', 'Height', 'Weight', 'Duration']
plt.subplots(figsize=(15, 10))
for i, col in enumerate(features):
plt.subplot(2, 2, i + 1)
x = df.sample(1000)
sb.scatterplot(x[col], x['Calories'])
plt.tight_layout()
plt.show()
正如预期的那样,锻炼的持续时间越长,消耗的卡路里就越多。但除此之外,我们无法观察到燃烧的卡路里与身高或体重特征之间的任何关系。
在这里我们可以观察到一些现实生活中的情况:
features = df.select_dtypes(include='float').columns
plt.subplots(figsize=(15, 10))
for i, col in enumerate(features):
plt.subplot(2, 3, i + 1)
sb.distplot(df[col])
plt.tight_layout()
plt.show()
连续特征的分布遵循接近正态分布,除了一些特征(如Body_Temp和Calories)。
df.replace({'male': 0, 'female': 1},
inplace=True)
df.head()
plt.figure(figsize=(8, 8))
sb.heatmap(df.corr() > 0.9,
annot=True,
cbar=False)
plt.show()
在这里,我们有一个严重的数据泄漏问题,因为有一个功能,是高度相关的目标列,即卡路里。
to_remove = ['Weight', 'Duration']
df.drop(to_remove, axis=1, inplace=True)
现在,我们将分离特征和目标变量,并将它们分成训练和测试数据,我们将使用这些数据来选择在验证数据上表现最好的模型。
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.1,
random_state=22)
X_train.shape, X_val.shape
输出:
((13500, 5), (1500, 5))
现在,让我们对数据进行归一化,以获得稳定和快速的训练。
# Normalizing the features for stable and fast training.
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_val = scaler.transform(X_val)
现在,让我们训练一些最先进的机器学习模型,并将它们与我们的数据进行比较。
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.893463692619434
Validation Error : 18.007896272831253
XGBRegressor() :
Training Error : 10.110870876925963
Validation Error : 10.16210130894184
Lasso() :
Training Error : 17.915089584958036
Validation Error : 17.995033362288662
RandomForestRegressor() :
Training Error : 3.982735208112875
Validation Error : 10.472395222222223
Ridge() :
Training Error : 17.893530494767777
Validation Error : 18.00781790803129
在上述所有模型中,我们已经训练的RandomForestRegressor,XGB模型的性能与验证数据的MAE相同。