Прогноз сжигания калорий с использованием машинного обучения
В этой статье мы узнаем, как разработать модель машинного обучения с использованием 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 для проверочных данных.