Прогнозирование топливной эффективности с использованием Tensorflow в Python

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

В этой статье мы узнаем, как построить модель прогнозирования эффективности использования топлива с помощью TensorFlow API. Набор данных, который мы будем использовать, содержит такие функции, как расстояние, пройденное двигателем, количество цилиндров в автомобиле и другие важные функции.

Импорт библиотек

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

Python3




import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
 
import tensorflow as tf
from tensorflow import keras
from keras import layers
 
import warnings
warnings.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_split
features = df.drop(["mpg", "car name"], axis=1)
target = df["mpg"].values
 
X_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.AUTOTUNE
 
train_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()

Выход: