Вступление
Глубокое обучение - одна из самых интересных и перспективных областей искусственного интеллекта (ИИ) и машинного обучения в настоящее время. Благодаря значительным достижениям в области технологий и алгоритмов в последние годы глубокое обучение открыло дверь в новую эру приложений искусственного интеллекта.
Во многих из этих приложений алгоритмы глубокого обучения работают наравне с экспертами-людьми, а иногда и превосходят их .
Python стал идти к языку для машинного обучения и многие из наиболее популярных и мощных глубоких библиотек обучения и структур , такие как TensorFlow , Keras и PyTorch встроены в Python.
В этой статье мы проведем исследовательский анализ данных (EDA) для набора данных перед предварительной обработкой данных и, наконец, построим модель глубокого обучения в Keras и оценим ее.
Почему Керас?
Keras - это API глубокого обучения, построенный на основе TensorFlow. TensorFlow - это комплексная платформа машинного обучения, которая позволяет разработчикам создавать и развертывать модели машинного обучения. TensorFlow был разработан и используется Google; хотя он был выпущен под лицензией с открытым исходным кодом в 2015 году.
Keras предоставляет высокоуровневый API для TensorFlow. Это позволяет очень легко создавать различные типы моделей машинного обучения, используя преимущества инфраструктуры и масштабируемости TensorFlow.
Он позволяет определять, компилировать, обучать и оценивать модели глубокого обучения, используя простой и лаконичный синтаксис, как мы увидим позже в этой серии.
Керас очень мощный; это наиболее часто используемый инструмент машинного обучения ведущими чемпионами 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
и
layers
отдельно, поэтому вместо tf.keras.layers.Dense
мы можем
писать layers.Dense
.
Мы также импортируем pandas
и numpy
которые чрезвычайно полезны и
широко используются для хранения и обработки данных, а также для
управления ими.
И для визуализации и изучения данных, мы импортируем plt
из
matplotlib
пакета и seaborn
. Matplotlib - это фундаментальная
библиотека для визуализации, а Seaborn значительно упрощает работу с
ней.
Загрузка данных
В этом руководстве мы будем работать с набором данных, который сообщает о продажах жилых единиц в период с 2006 по 2010 год в городе Эймс, который находится в штате Айова, США.
Для каждой продажи набор данных описывает многие характеристики жилой единицы и перечисляет продажную цену этой единицы. Эта продажная цена будет целевой переменной, которую мы хотим спрогнозировать, используя различные характеристики единицы.
Набор данных на самом деле содержит множество данных о характеристиках каждого объекта, включая площадь объекта, год постройки объекта, размер гаража, количество кухонь, количество ванных комнат, количество спален, стиль крыши. , тип электросети, класс здания и многое другое.
Вы можете узнать больше о наборе данных на этой странице в Kaggle .
Чтобы загрузить точный файл набора данных, который мы будем использовать в этом руководстве, посетите его страницу Kaggle и нажмите кнопку загрузки. Будет загружен файл CSV, содержащий данные.
Мы переименуем этот файл в AmesHousing.csv
и загрузим его в нашу
программу с помощью функции read_csv()
df = pd.read_csv('AmesHousing.csv')
Загруженный набор данных содержит 2930 строк (записей) и 82 столбца (характеристики). Вот усеченное изображение всего нескольких строк и столбцов:
Заказ PID Подкласс MS Зонирование MS Lot Frontage Площадь участка улица
0 1 526301100 20 RL 141 31770 Проложить 1 2 526350040 20 RH 80 11622 Проложить 2 3 526351010 20 RL 81 год 14267 Проложить
Как мы уже говорили ранее, каждая строка описывает продажу жилой единицы, указывая многие характеристики единицы и ее продажную цену. И, опять же, чтобы получить дополнительную информацию о значении каждой переменной в этом наборе данных, посетите эту страницу на Kaggle .
Прежде чем продолжить, мы удалим некоторые функции (столбцы) из набора
данных, поскольку они не предоставляют никакой полезной информации для
режима. Это функции Order
и PID
:
df.drop(['Order', 'PID'], axis=1, inplace=True)
Исследовательский анализ данных (EDA)
Исследовательский анализ данных (EDA) помогает нам лучше понимать
данные и выявлять в них закономерности. Самая важная переменная для
изучения в данных - целевая переменная: SalePrice
.
Модель машинного обучения так же хороша, как и данные обучения - вы хотите понять ее, если хотите понять свою модель. Первым шагом в построении любой модели должно быть хорошее исследование данных.
Поскольку конечной целью является прогнозирование стоимости дома, мы
сосредоточимся на SalePrice
и переменных, которые имеют высокую
корреляцию с ней.
Распределение продажной цены
Во-первых, давайте посмотрим на распределение SalePrice
. Гистограммы
-
отличный и простой способ взглянуть на распределения переменных. Давайте воспользуемся Matplotlib для построения гистограммы, которая отображает распределение
SalePrice
:fig, ax = plt.subplots(figsize=(14,8)) sns.distplot(df[‘SalePrice’], kde=False, ax=ax)
На изображении ниже показана гистограмма, полученная после применения некоторого форматирования для улучшения внешнего вида:
{.ezlazyload}
Мы также можем посмотреть на SalePrice
используя различные типы
графиков. Например, давайте сделаем ройный
график
SalePrice
:
fig, ax = plt.subplots(figsize=(14,8))
sns.swarmplot(df['SalePrice'], color='#2f4b7c', alpha=0.8, ax=ax)
Это приведет к:
{.ezlazyload}
Глядя на гистограмму и график роя выше, мы видим, что для большинства
единиц цена продажи колеблется от 100 000 до 200 000 долларов. Если мы
сгенерируем описание SalePrice
с помощью функции 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 долларов США.
Корреляция с продажной ценой
Теперь давайте посмотрим, как переменные-предикторы в наших данных
соотносятся с
целевой SalePrice
. Мы рассчитаем эти значения корреляции с помощью
метода Пирсона, а затем визуализируем корреляции с помощью тепловой
карты :
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)
А вот тепловая карта, которая показывает, как переменные-предикторы
коррелируют с SalePrice
.
Более светлые цвета на карте указывают на более высокие значения положительной корреляции, а более темные цвета обозначают более низкие значения положительной корреляции, а иногда и отрицательные значения корреляции:
{.ezlazyload}
Очевидно, что SalePrice
имеет корреляцию 1: 1 сама с собой. Тем не
менее, есть некоторые другие переменные, которые сильно коррелируют с
SalePrice
, из которых мы можем сделать некоторые выводы.
Например, мы можем видеть , что SalePrice
сильно коррелирует с
Overall Qual
переменной , которая описывает общее качество материалов
и отделки дома. Мы также можем видеть высокую корреляцию с Gr Liv Area
которая определяет надземную жилую площадь квартиры.
Изучение различных степеней корреляции
Теперь, когда у нас есть некоторые переменные, которые сильно
коррелируют с SalePrice
, давайте рассмотрим корреляции более глубоко.
Некоторые переменные сильно коррелированы с SalePrice
, а некоторые
нет. Проверяя их, мы можем сделать выводы о том, что является
приоритетным при покупке недвижимости.
Высокая корреляция
Во-первых, давайте рассмотрим две переменные, которые имеют высокую
положительную корреляцию с SalePrice
а именно: Overall Qual
которое
имеет значение корреляции 0.8
и Gr Liv Area
имеющее значение
корреляции 0.71
.
Overall Qual
качество представляет собой общее качество материалов и
отделки дома. Давайте исследуем их отношения дальше, построив график
рассеяния с помощью 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()
Вот итоговый график рассеяния:
{.ezlazyload}
Мы ясно видим, что с повышением общего качества цена продажи дома также имеет тенденцию к увеличению. Увеличение не совсем линейное, но если бы мы нарисовали линию тренда, она была бы относительно близкой к линейной.
Теперь давайте посмотрим, как Gr Liv Area
и SalePrice
соотносятся
друг с другом с помощью другого графика разброса:
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()
Вот итоговый график рассеяния:
{.ezlazyload}
Опять же, мы можем ясно видеть высокую положительную корреляцию между
Gr Liv Area
и SalePrice
на этом графике разброса. Они имеют
тенденцию увеличиваться друг с другом, с некоторыми отклонениями.
Умеренная корреляция
Затем давайте посмотрим на переменные, которые имеют умеренную
положительную корреляцию с SalePrice
. Мы рассмотрим Lot Frontage
который имеет значение корреляции 0.36
и Full Bath
которое имеет
значение корреляции 0.55
.
Lot Frontage
представляет собой длину участка перед домом, вплоть до
улицы. А Full Bath
представляет собой количество полностью
оборудованных ванных комнат над землей.
Подобно тому, что мы сделали с Overall Qual
и Gr Liv Area
, мы
построим две диаграммы разброса, чтобы визуализировать отношения между
этими переменными и SalePrice
.
Начнем с Lot Frontage
:
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()
{.ezlazyload}
Здесь вы можете увидеть гораздо более слабую корреляцию. Даже с большими участками перед объектами цена не сильно возрастает. Между ними существует положительная корреляция, но для покупателей она не так важна, как некоторые другие переменные.
Затем давайте покажем диаграмму рассеяния для Full Bath
:
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()
{.ezlazyload}
Здесь вы также можете увидеть положительную корреляцию, которая не такая уж слабая, но и не слишком сильная. Хорошая часть домов с двумя полностью оборудованными ванными комнатами имеет ту же цену, что и дома только с одной ванной комнатой. Количество ванных комнат влияет на цену, но не слишком сильно.
Низкая корреляция
Наконец, давайте посмотрим на переменные, которые имеют низкую
положительную корреляцию с SalePrice
и сравним их с тем, что мы видели
до сих пор. Мы рассмотрим Yr Sold
который имеет значение корреляции
-0.031
и Bsmt Unf SF
который имеет значение корреляции 0.18
.
Yr Sold
представляет год , в котором был продан дом. А Bsmt Unf SF
представляет собой недостроенную площадь подвала в квадратных футах.
Начнем с года Yr Sold
:
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()
{.ezlazyload}
Корреляция здесь настолько слабая, что можно с уверенностью предположить, что корреляции между этими двумя переменными практически нет. Можно с уверенностью предположить, что цены на недвижимость не сильно изменились с 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()
{.ezlazyload}
Здесь мы видим, что некоторые объекты недвижимости с более низким
Bsmt Unf SF
продаются по более высокой цене. Опять же, это может быть
чистой случайностью, и между ними нет явной корреляции.
Можно с уверенностью предположить, что Bsmt Unf SF
не имеет большого
отношения к SalePrice
.
Заключение
В этой статье мы сделали первые шаги в большинстве проектов машинного обучения. Мы начали с загрузки и загрузки интересующего нас набора данных.
Затем мы выполнили исследовательский анализ данных, чтобы лучше понять, с чем мы имеем дело. Модель машинного обучения так же хороша, как и данные обучения - вы хотите понять ее, если хотите понять свою модель.
Наконец, мы выбрали несколько переменных и проверили их корреляцию с
основной переменной, на которую мы обращаем внимание - переменной
SalePrice