Прогнозирование топливной эффективности с использованием Tensorflow в Python
В этой статье мы узнаем, как построить модель прогнозирования эффективности использования топлива с помощью 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() |
Выход:
Python3
history_df.loc[:, [ "loss" , "val_loss" ]].plot() history_df.loc[:, [ "mape" , "val_mape" ]].plot() plt.show() |