Прогнозирование топливной эффективности с использованием Tensorflow в Python
В этой статье мы узнаем, как построить модель прогнозирования эффективности использования топлива с помощью TensorFlow API. Набор данных, который мы будем использовать, содержит такие функции, как расстояние, пройденное двигателем, количество цилиндров в автомобиле и другие важные функции.
Импорт библиотек
- Pandas — эта библиотека помогает загружать фрейм данных в формате 2D-массива и имеет несколько функций для выполнения задач анализа за один раз.
- Массивы Numpy очень быстрые и могут выполнять большие вычисления за очень короткое время.
- Matplotlib — эта библиотека используется для рисования визуализаций.
- Sklearn — этот модуль содержит несколько библиотек с предварительно реализованными функциями для выполнения задач от предварительной обработки данных до разработки и оценки моделей.
- OpenCV — это библиотека с открытым исходным кодом, в основном предназначенная для обработки и обработки изображений.
- Tensorflow — это библиотека с открытым исходным кодом, которая используется для машинного обучения и искусственного интеллекта и предоставляет ряд функций для реализации сложных функций с помощью одной строки кода.
Python3
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sbimport tensorflow as tffrom tensorflow import kerasfrom keras import layersimport warningswarnings.filterwarnings("ignore") |
Набор данных можно скачать отсюда.
Python3
df = pd.read_csv("auto-mpg.csv")df.head() |
Выход:
Давайте проверим форму данных.
Python3
df.shape |
Выход:
(398, 9)
Теперь проверьте типы данных столбцов.
Python3
df.info() |
Выход:
Здесь мы можем наблюдать одно несоответствие: мощность указана в объектном типе данных, тогда как она должна быть в числовом типе данных.
Python3
df.describe() |
Выход:
Исследовательский анализ данных
В соответствии с частью df.info() сначала мы рассмотрим столбец лошадиных сил, а затем перейдем к части анализа.
Python3
df["horsepower"].unique() |
Выход:
Здесь мы можем заметить, что вместо нуля они были заменены строкой '?' из-за этого данные этого столбца были предоставлены в типе данных объекта.
Python3
print(df.shape)df = df[df["horsepower"] != "?"]print(df.shape) |
Выход:
(398, 9) (392, 9)
Итак, таких рядов со знаком вопроса было 6.
Python3
df["horsepower"] = df["horsepower"].astype(int)df.isnull().sum() |
Выход:
mpg 0 cylinders 0 displacement 0 horsepower 0 weight 0 acceleration 0 model year 0 origin 0 car name 0 dtype: int64
Python3
df.nunique() |
Выход:
mpg 127 cylinders 5 displacement 81 horsepower 93 weight 346 acceleration 95 model year 13 origin 3 car name 301 dtype: int64
Python3
plt.subplots(figsize=(15, 5))for i, col in enumerate(["cylinders", "origin"]): plt.subplot(1, 2, i+1) x = df.groupby(col).mean()["mpg"] x.plot.bar() plt.xticks(rotation=0)plt.tight_layout()plt.show() |
Выход:
Здесь мы можем заметить, что значения миль на галлон самые высокие для начала координат 3.
Python3
plt.figure(figsize=(8, 8))sb.heatmap(df.corr() > 0.9, annot=True, cbar=False)plt.show() |
Выход:
Если мы удалим признак смещения, то проблема высокой коллинеарности будет снята.
Python3
df.drop("displacement", axis=1, inplace=True) |
Конвейер ввода данных
Python3
from sklearn.model_selection import train_test_splitfeatures = df.drop(["mpg", "car name"], axis=1)target = df["mpg"].valuesX_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 |
Выход:
((313, 6), (79, 6))
Python3
AUTO = tf.data.experimental.AUTOTUNEtrain_ds = ( tf.data.Dataset .from_tensor_slices((X_train, Y_train)) .batch(32) .prefetch(AUTO))val_ds = ( tf.data.Dataset .from_tensor_slices((X_val, Y_val)) .batch(32) .prefetch(AUTO)) |
Архитектура модели
Мы реализуем модель с использованием Sequential API Keras, которая будет содержать следующие части:
- У нас будет два полносвязных слоя.
- Мы включили несколько слоев BatchNormalization, чтобы обеспечить стабильное и быстрое обучение, и слой Dropout перед последним слоем, чтобы избежать любой возможности переобучения.
- Последний слой — это выходной слой.
Python3
model = keras.Sequential([ layers.Dense(256, activation="relu", input_shape=[6]), layers.BatchNormalization(), layers.Dense(256, activation="relu"), layers.Dropout(0.3), layers.BatchNormalization(), layers.Dense(1, activation="relu")]) |
При составлении модели мы предоставляем эти три основных параметра:
- оптимизатор — это метод, который помогает оптимизировать функцию стоимости с помощью градиентного спуска.
- потеря — функция потерь, с помощью которой мы отслеживаем, улучшается ли модель с обучением или нет.
- Метрики — это помогает оценить модель, предсказывая данные обучения и проверки.
Python3
model.compile( loss="mae", optimizer="adam", metrics=["mape"]) |
Напечатаем сводку по архитектуре модели:
Python3
model.summary() |
Выход:
Обучение модели
Теперь мы будем обучать нашу модель, используя конвейер обучения и проверки.
Python3
history = model.fit(train_ds, epochs=50, validation_data=val_ds) |
Выход:
Epoch 45/50 10/10 [==============================] - 0s 14ms/step - loss: 2.8792 - mape: 12.5425 - val_loss: 5.3991 - val_mape: 28.6586 Epoch 46/50 10/10 [==============================] - 0s 8ms/step - loss: 2.9184 - mape: 12.7887 - val_loss: 4.1896 - val_mape: 21.4064 Epoch 47/50 10/10 [==============================] - 0s 9ms/step - loss: 2.8153 - mape: 12.3451 - val_loss: 4.3392 - val_mape: 22.3319 Epoch 48/50 10/10 [==============================] - 0s 9ms/step - loss: 2.7146 - mape: 11.7684 - val_loss: 3.6178 - val_mape: 17.7676 Epoch 49/50 10/10 [==============================] - 0s 10ms/step - loss: 2.7631 - mape: 12.1744 - val_loss: 6.4673 - val_mape: 33.2410 Epoch 50/50 10/10 [==============================] - 0s 10ms/step - loss: 2.6819 - mape: 11.8024 - val_loss: 6.0304 - val_mape: 31.6198
Python3
history_df = pd.DataFrame(history.history)history_df.head() |
Выход:
Python3
history_df.loc[:, ["loss", "val_loss"]].plot()history_df.loc[:, ["mape", "val_mape"]].plot()plt.show() |