Прогноз сжигания калорий с использованием машинного обучения
В этой статье мы узнаем, как разработать модель машинного обучения с использованием Python, которая может предсказать количество калорий, сожженных человеком во время тренировки, на основе некоторых биологических показателей.
Импорт библиотек и набора данных
Библиотеки Python упрощают нам обработку данных и выполнение типичных и сложных задач с помощью одной строки кода.
- Pandas — эта библиотека помогает загружать фрейм данных в формате 2D-массива и имеет несколько функций для выполнения задач анализа за один раз.
- Массивы Numpy очень быстрые и могут выполнять большие вычисления за очень короткое время.
- Matplotlib/Seaborn — эта библиотека используется для рисования визуализаций.
- Sklearn — этот модуль содержит несколько библиотек с предварительно реализованными функциями для выполнения задач от предварительной обработки данных до разработки и оценки модели.
- XGBoost — содержит алгоритм машинного обучения eXtreme Gradient Boosting, который является одним из алгоритмов, помогающих нам достигать высокой точности прогнозов.
Python3
| importnumpy as npimportpandas as pdimportmatplotlib.pyplot as pltimportseaborn as sbfromsklearn.model_selection importtrain_test_splitfromsklearn.preprocessing importLabelEncoder, StandardScalerfromsklearn importmetricsfromsklearn.svm importSVCfromxgboost importXGBRegressorfromsklearn.linear_model importLinearRegression, Lasso, Ridgefromsklearn.ensemble importRandomForestRegressor importwarningswarnings.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))fori, col inenumerate(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))fori, col inenumerate(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
| fromsklearn.metrics importmean_absolute_error as maemodels =[LinearRegression(), XGBRegressor(),          Lasso(), RandomForestRegressor(), Ridge()] fori inrange(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 для проверочных данных.