Прогноз сжигания калорий с использованием машинного обучения

Опубликовано: 13 Февраля, 2023

В этой статье мы узнаем, как разработать модель машинного обучения с использованием Python, которая может предсказать количество калорий, сожженных человеком во время тренировки, на основе некоторых биологических показателей.

Импорт библиотек и набора данных

Библиотеки Python упрощают нам обработку данных и выполнение типичных и сложных задач с помощью одной строки кода.

  • Pandas — эта библиотека помогает загружать фрейм данных в формате 2D-массива и имеет несколько функций для выполнения задач анализа за один раз.
  • Массивы Numpy очень быстрые и могут выполнять большие вычисления за очень короткое время.
  • Matplotlib/Seaborn — эта библиотека используется для рисования визуализаций.
  • Sklearn — этот модуль содержит несколько библиотек с предварительно реализованными функциями для выполнения задач от предварительной обработки данных до разработки и оценки модели.
  • XGBoost — содержит алгоритм машинного обучения eXtreme Gradient Boosting, который является одним из алгоритмов, помогающих нам достигать высокой точности прогнозов.

Python3




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")

Теперь давайте загрузим набор данных во фрейм данных панды и напечатаем его первые пять строк.

Python3




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

Выход:

Теперь давайте проверим размер набора данных.

Python3




df.shape

Выход:

(15000, 9)

Давайте проверим, какой столбец набора данных содержит данные какого типа.

Python3




df.info()

Выход:

Теперь мы проверим описательные статистические меры данных.

Python3




df.describe()

Выход:

Исследовательский анализ данных

EDA — это подход к анализу данных с использованием визуальных методов. Он используется для обнаружения тенденций и закономерностей или для проверки предположений с помощью статистических сводок и графических представлений.

Python3




sb.scatterplot(df["Height"], df["Weight"])
plt.show()

Выход:

Итак, у нас есть своего рода линейная зависимость между этими двумя характеристиками, что совершенно очевидно.

Python3




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()

Выход:

Как и ожидалось, чем выше продолжительность тренировки, тем выше будут сожженные калории. Но кроме этого, мы не можем наблюдать никакой такой связи между сожженными калориями и особенностями роста или веса.

Здесь мы можем наблюдать некоторые наблюдения из реальной жизни:

  • Средний рост мальчиков выше девочек.
  • Также вес девочек меньше, чем у мальчиков.
  • При одинаковой средней продолжительности тренировки калорий сжигается у мужчин больше, чем у женщин.

Python3




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.

Python3




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

Выход:

Python3




plt.figure(figsize=(8, 8))
sb.heatmap(df.corr() > 0.9,
           annot=True,
           cbar=False)
plt.show()

Выход:

Здесь у нас есть серьезная проблема утечки данных, поскольку есть функция, которая сильно коррелирует с целевым столбцом, которым являются калории.

Python3




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

Обучение модели

Теперь мы разделим функции и целевые переменные и разделим их на данные обучения и тестирования, с помощью которых мы выберем модель, которая лучше всего работает на данных проверки.

Python3




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))

Теперь давайте нормализуем данные, чтобы получить стабильное и быстрое обучение.

Python3




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

Теперь давайте обучим некоторые современные модели машинного обучения и сравним их, которые лучше соответствуют нашим данным.

Python3




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 для проверочных данных.