Рубрики
Без рубрики

Модели глубокого обучения в Keras – Exploratory Data Analysis (EDA)

В этой статье мы выполним первый шаг в проектах машинного обучения – Исследовательский анализ данных (EDA) для проведения корреляционной проверки определенных переменных с помощью Keras и Matplotlib.

Автор оригинала: Ammar Alyousfi.

Модели глубокого обучения в Keras – Exploratory Data Analysis (EDA)

Вступление

Глубокое обучение-одно из самых интересных и перспективных направлений искусственного интеллекта (ИИ) и машинного обучения в настоящее время. Благодаря огромным достижениям в области технологий и алгоритмов в последние годы глубокое обучение открыло дверь в новую эру приложений искусственного интеллекта.

Во многих из этих приложений алгоритмы глубокого обучения работали наравне с человеческими экспертами, а иногда превосходили их .

Python стал основным языком машинного обучения, и многие из самых популярных и мощных библиотек глубокого обучения и фреймворков , таких как TensorFlow , Keras и PyTorch , построены на Python.

В этой статье мы проведем Исследовательский анализ данных (EDA) на наборе данных перед предварительной обработкой данных и, наконец, построим модель глубокого обучения в Keras и оценим ее.

Почему Керас?

Keras-это API глубокого обучения, построенный поверх TensorFlow. TensorFlow-это сквозная платформа машинного обучения, которая позволяет разработчикам создавать и развертывать модели машинного обучения. TensorFlow был разработан и использован компанией Google, хотя и выпущен под лицензией с открытым исходным кодом в 2015 году.

Keras предоставляет высокоуровневый API для TensorFlow. Это позволяет очень легко создавать различные типы моделей машинного обучения, используя преимущества инфраструктуры Tensorflow и масштабируемости.

Он позволяет определять, компилировать, обучать и оценивать модели глубокого обучения, используя простой и лаконичный синтаксис, как мы увидим далее в этой серии.

Keras очень мощный; это самый используемый инструмент машинного обучения top Kaggle чемпионами в различных соревнованиях, проводимых на Kaggle.

Прогнозирование цен на жилье с помощью глубокого обучения

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

В первой статье серии мы будем импортировать пакеты и данные и выполнять некоторый Исследовательский анализ данных (EDA), чтобы ознакомиться с набором данных, с которым мы работаем.

Импорт необходимых пакетов

На этом предварительном этапе мы импортируем пакеты, необходимые для следующих шагов:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

Мы импортируем tensorflow , который включает в себя Keras и некоторые другие полезные инструменты. Для краткости кода мы импортируем keras и слои отдельно, поэтому вместо tf.keras.слои.Плотные мы можем писать слоями.Плотный .

Мы также импортируем pandas и numpy , которые чрезвычайно полезны и широко используются для хранения и обработки данных, а также для манипулирования ими.

А для визуализации и изучения данных мы импортируем plt из пакета matplotlib и seaborn . Matplotlib-это фундаментальная библиотека для визуализации, в то время как Seaborn значительно упрощает работу с ней.

Загрузка данных

В этом уроке мы будем работать с набором данных, который сообщает о продажах жилых единиц в период с 2006 по 2010 год в городе Эймс, расположенном в штате Айова, США.

Для каждой продажи набор данных описывает множество характеристик жилой единицы и перечисляет цену продажи этой единицы. Эта цена продажи будет целевой переменной, которую мы хотим предсказать, используя различные характеристики единицы.

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

Вы можете прочитать больше о наборе данных на этой странице в Kaggle .

Чтобы загрузить точный файл набора данных, который мы будем использовать в этом уроке, посетите его страницу Kaggle и нажмите на кнопку загрузить. Это позволит загрузить CSV-файл, содержащий данные.

Мы переименуем этот файл в Ames Housing.csv и загрузим его в вашу программу с помощью функции Pandas’ read_csv() :

df = pd.read_csv('AmesHousing.csv')

Загруженный набор данных содержит 2930 строк (записей) и 82 столбца (характеристик). Вот усеченное представление только нескольких строк и столбцов:

Заказ PID Подкласс MS MS Зонирование Фасад участка Площадь Участка Улица
0 1 526301100 20 RL 141 31770 Мостить
1 2 526350040 20 ОВ 80 11622 Мостить
2 3 526351010 20 RL 81 14267 Мостить

Как мы уже говорили ранее, каждая строка описывает продажу жилого объекта, указывая множество характеристик объекта и его цену продажи. И, опять же, чтобы получить больше информации о значении каждой переменной в этом наборе данных, пожалуйста, посетите эту страницу на Kaggle .

Прежде чем продолжить, мы удалим некоторые объекты (столбцы) из набора данных, поскольку они не предоставляют никакой полезной информации режиму. Эти функции являются Order и PID :

df.drop(['Order', 'PID'], axis=1, inplace=True)

Исследовательский анализ данных (EDA)

Исследовательский анализ данных (EDA) помогает нам лучше понять данные и выявить в них закономерности. Наиболее важной переменной для изучения в данных является целевая переменная: Цена продажи .

Модель машинного обучения так же хороша, как и обучающие данные – вы хотите понять ее, если хотите понять свою модель. Первым шагом в построении любой модели должно быть хорошее исследование данных.

Поскольку конечная цель-предсказание стоимости дома, мы сосредоточимся на переменной Цена продажи и переменных, которые имеют высокую корреляцию с ней.

Распределение Продажной Цены

Во-первых, давайте посмотрим на распределение Продажной цены . Гистограммы-отличный и простой способ взглянуть на распределение переменных. Давайте используем Matplotlib для построения гистограммы, которая отображает распределение цены продажи :

fig, ax = plt.subplots(figsize=(14,8))
sns.distplot(df['SalePrice'], kde=False, ax=ax)

На рисунке ниже показана результирующая гистограмма после применения некоторого форматирования для улучшения внешнего вида:

гистограмма цены продажи

Мы также можем посмотреть на Цену продажи распределение, используя различные типы участков. Например, давайте сделаем swarm plot of SalePrice :

fig, ax = plt.subplots(figsize=(14,8))
sns.swarmplot(df['SalePrice'], color='#2f4b7c', alpha=0.8, ax=ax)

Это привело бы к:

цена продажи роевого участка

Глядя на гистограмму и график роя выше, мы видим, что для большинства единиц цена продажи колеблется от 100 000 до 200 000 долларов. Если мы сгенерируем описание переменной Sale Price с помощью функции Pandas’ describe() :

print(df['SalePrice'].describe().apply(lambda x: '{:,.1f}'.format(x)))

Мы получим:

count      2,930.0
mean     180,796.1
std       79,886.7
min       12,789.0
25%      129,500.0
50%      160,000.0
75%      213,500.0
max      755,000.0
Name: SalePrice, dtype: object

Отсюда мы знаем, что:

  • Средняя цена продажи составляет 180 796 долларов
  • Минимальная цена продажи составляет $12 789
  • Максимальная цена продажи составляет $755 000

Корреляция с Ценой продажи

Теперь давайте посмотрим, как предикторные переменные в наших данных коррелируют с целевой Ценой продажи . Мы рассчитаем эти значения корреляции с помощью метода Пирсона, а затем визуализируем корреляции с помощью тепловой карты :

fig, ax = plt.subplots(figsize=(10,14))
saleprice_corr = df.corr()[['SalePrice']].sort_values(
  by='SalePrice', ascending=False)
sns.heatmap(saleprice_corr, annot=True, ax=ax) 

А вот тепловая карта, которая показывает, как предикторные переменные коррелируют с Ценой продажи .

Более светлые цвета на карте указывают на более высокие положительные корреляционные значения, а более темные цвета указывают на более низкие положительные корреляционные значения, а иногда и отрицательные корреляционные значения:

корреляционная тепловая карта

Очевидно, что переменная Цена продажи имеет корреляцию 1:1 с самой собой. Однако есть некоторые другие переменные, которые сильно коррелируют с Ценой продажи, из которых мы можем сделать некоторые выводы.

Например, мы видим, что Цена продажи сильно коррелирует с переменной Общее качество , которая описывает общее качество материала и отделки дома. Мы также видим высокую корреляцию с Gr Liv Area , которая определяет надземную жилую площадь объекта.

Изучение различных степеней корреляции

Теперь, когда у нас есть некоторые переменные, которые сильно коррелируют с Ценой продажи, давайте рассмотрим корреляции более глубоко.

Некоторые переменные сильно коррелируют с Ценой продажи , а некоторые-нет. Проверяя их, мы можем сделать выводы о том, что является приоритетным, когда люди покупают недвижимость.

Высокая Корреляция

Во – первых, давайте рассмотрим две переменные, которые имеют высокую положительную корреляцию с Продажной ценой , а именно Общее качество , которое имеет значение корреляции 0.8 и Gr Liv Area которая имеет значение корреляции 0.71 .

Общее качество представляет собой общее качество материала и отделки дома. Давайте рассмотрим их отношения дальше, построив точечную диаграмму с помощью Matplotlib:

fig, ax = plt.subplots(figsize=(14,8))
ax.scatter(x=df['Overall Qual'], y=df['SalePrice'], color="#388e3c", 
           edgecolors="#000000", linewidths=0.1, alpha=0.7);
plt.show()

Вот результирующая точечная диаграмма:

график рассеяния с высокой корреляцией

Мы можем ясно видеть, что по мере повышения общего качества цена продажи дома также имеет тенденцию к росту. Рост не совсем линейный, но если мы проведем линию тренда, он будет относительно близок к линейному.

Теперь давайте посмотрим, как Gr Liv Area и Sale Price соотносятся друг с другом с помощью другого точечного графика:

fig, ax = plt.subplots(figsize=(14,8))
ax.scatter(x=df['Gr Liv Area'], y=df['SalePrice'], color="#388e3c", 
           edgecolors="#000000", linewidths=0.1, alpha=0.7);
plt.show()

Вот результирующая точечная диаграмма:

график рассеяния с высокой корреляцией

Опять же, мы можем ясно видеть высокую положительную корреляцию между Gr Liv Area и Sale Price на этом точечном графике. Они, как правило, увеличиваются друг с другом, с несколькими выбросами.

Умеренная корреляция

Далее рассмотрим переменные, которые имеют умеренную положительную корреляцию с Ценой продажи . Мы рассмотрим Lot Frontage , который имеет значение корреляции 0.36 и Полная ванна которая имеет значение корреляции 0.55 .

Фасад участка представляет собой длину участка перед домом, вплоть до улицы. И Полная ванна представляет собой количество полных ванных комнат над землей.

Аналогично тому , что мы сделали с Total Qual и Gr Liv Area , мы построим две точечные диаграммы, чтобы визуализировать отношения между этими переменными и SalePrice .

Начнем с Фасада участка :

fig, ax = plt.subplots(figsize=(14,8))
ax.scatter(x=df['Lot Frontage'], y=df['SalePrice'], color="orange", 
           edgecolors="#000000", linewidths=0.5, alpha=0.5);
plt.show()
умеренная корреляционная точечная диаграмма

Здесь вы можете увидеть гораздо более слабую корреляцию. Даже с более крупными участками перед зданиями цена не сильно повышается. Между ними существует положительная корреляция, но она, по-видимому, не так важна для покупателей, как некоторые другие переменные.

Затем давайте покажем диаграмму рассеяния для Полной ванны :

fig, ax = plt.subplots(figsize=(14,8))
ax.scatter(x=df['Full Bath'], y=df['SalePrice'], color="orange", 
           edgecolors="#000000", linewidths=0.5, alpha=0.5);
plt.show()
умеренная корреляционная точечная диаграмма

Здесь вы также можете увидеть положительную корреляцию, которая не так уж слаба, но и не слишком сильна. Большая часть домов с двумя полноценными ванными комнатами имеет точно такую же цену, как и дома с одной ванной комнатой. Количество ванных комнат действительно влияет на цену, но не слишком сильно.

Низкая Корреляция

Наконец, давайте рассмотрим переменные, которые имеют низкую положительную корреляцию с Ценой продажи и сравним их с тем, что мы видели до сих пор. Мы рассмотрим YrS old , который имеет значение корреляции -0.031 и Bsmt Unf SF который имеет значение корреляции 0.18 .

YrS old представляет год, в котором был продан дом. И Bsmt Unf SF представляет собой незаконченную площадь подвала в квадратных футах.

Давайте начнем с YrS old :

fig, ax = plt.subplots(figsize=(14,8))
ax.scatter(x=df['Yr Sold'], y=df['SalePrice'], color="#b71c1c", 
           edgecolors="#000000", linewidths=0.1, alpha=0.5);
ax.xaxis.set_major_formatter(
  ticker.FuncFormatter(func=lambda x,y: int(x)))
plt.show()
график рассеяния с низкой корреляцией

Корреляция здесь настолько слаба, что вполне можно предположить, что между этими двумя переменными в принципе нет никакой корреляции. Можно с уверенностью предположить, что цены на недвижимость не сильно изменились в период с 2006 по 2010 год.

Давайте также сделаем сюжет для Bsmt Unf SF :

fig, ax = plt.subplots(figsize=(14,8))
ax.scatter(x=df['Bsmt Unf SF'], y=df['SalePrice'], color="#b71c1c", 
           edgecolors="#000000", linewidths=0.1, alpha=0.5);
plt.show()
график рассеяния с низкой корреляцией

Здесь мы видим, что некоторые свойства с более низкой Bsmt Unf SF продаются по цене выше, чем те, которые имеют высокую стоимость. С другой стороны, это может быть связано с чистой случайностью, и между ними нет очевидной корреляции.

Можно с уверенностью предположить, что Bsmt Unf SF не имеет большого отношения к Цене продажи .

Вывод

В этой статье мы сделали первые шаги в большинстве проектов машинного обучения. Мы начали с загрузки и загрузки интересующего нас набора данных.

Затем мы провели исследовательский анализ данных, чтобы получить хорошее представление о том, с чем мы имеем дело. Модель машинного обучения так же хороша, как и обучающие данные – вы хотите понять ее, если хотите понять свою модель.

Наконец, мы выбрали несколько переменных и проверили их корреляцию с основной переменной, которую мы рассматриваем, – переменной SalePrice .