Линейная регрессия TensorFlow с помощью Facet & Срок взаимодействия

Содержание:

Anonim

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

Это руководство разделено на две части:

  • Ищите взаимодействие
  • Протестируйте модель

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

Набор данных состоит из:

Переменная Описание
zn Доля земель под жилую застройку зонирована под участки площадью более 25000 кв. Футов.
Инд Доля акров, не относящихся к розничной торговле, на город.
nox концентрация оксидов азота
rm среднее количество комнат в доме
возраст доля домов, построенных до 1940 г., занимаемых владельцами
дис взвешенные расстояния до пяти Бостонских центров занятости
налог полная ставка налога на имущество за 10 000 долларов
ptratio соотношение учеников и учителей по городам
medv Средняя стоимость домов, занимаемых владельцами, в тысячах долларов
кричать уровень преступности на душу населения по городам
час Фиктивная переменная Charles River (1, если ограничивает реку; 0 в противном случае)
B доля черных по городу

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

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

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

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

Чтобы уловить ограниченное влияние образования на профессию, мы можем использовать термин взаимодействия.

Если вы посмотрите на уравнение заработной платы, оно выглядит следующим образом:

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

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

В этом руководстве вы узнаете

  • Сводные статистические данные
  • Обзор фасетов
  • Facets Deep Dive
  • Установить Facet
  • Обзор
  • График
  • Facets Deep Dive
  • TensorFlow
  • Данные подготовки
  • Базовая регрессия: контрольный показатель
  • Усовершенствуйте модель: срок взаимодействия

Сводные статистические данные

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

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

Советы: для этого урока вам необходимо установить matplotlit и seaborn на Python. Вы можете установить пакет Python на лету с помощью Jupyter. Вы не должны этого делать

!conda install -- yes matplotlib

но

import sys!{sys.executable} -m pip install matplotlib # Already installed!{sys.executable} -m pip install seaborn

Обратите внимание, что этот шаг не требуется, если у вас установлены matplotlib и seaborn.

Matplotlib - это библиотека для создания графика на Python. Seaborn - это библиотека статистической визуализации, построенная на основе matplotlib. Он предлагает привлекательные и красивые участки.

Приведенный ниже код импортирует необходимые библиотеки.

import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np

Библиотека sklearn включает набор данных Boston. Вы можете вызвать его API для импорта данных.

boston = load_boston()df = pd.DataFrame(boston.data) 

Имя функции хранится в объекте feature_names в массиве.

boston.feature_names

Выход

array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='

Вы можете переименовать столбцы.

df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)

Вы преобразуете переменную CHAS в строковую переменную и помечаете ее да, если CHAS = 1, и нет, если CHAS = 0.

df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: object

С помощью pandas легко разделить набор данных. Вы случайным образом делите набор данных на 80-процентный обучающий набор и 20-процентный набор для тестирования. Pandas имеет встроенную функцию стоимости для разделения выборки фрейма данных.

Первый параметр frac - это значение от 0 до 1. Вы устанавливаете его на 0,8, чтобы случайным образом выбрать 80 процентов фрейма данных.

Random_state позволяет вернуть один и тот же фрейм данных для всех.

### Create train/test setdf_train=df.sample(frac=0.8,random_state=200)df_test=df.drop(df_train.index)

Вы можете получить форму данных. Должен быть:

  • Набор поездов: 506 * 0,8 = 405
  • Набор тестов: 506 * 0,2 = 101
print(df_train.shape, df_test.shape)

Выход

(405, 14) (101, 14) 
df_test.head(5)

Выход

ПРЕСТУПНОСТЬ ZN ИНДУС ЧАС NOX RM ВОЗРАСТ DIS РАД НАЛОГ PTRATIO B LSTAT ЦЕНА
0 0,00632 18.0 2.31 нет 0,538 6,575 65,2 4,0900 1.0 296,0 15.3 396,90 4,98 24,0
1 0,02731 0,0 7,07 нет 0,469 6,421 78,9 4,9671 2.0 242,0 17,8 396,90 9,14 21,6
3 0,03237 0,0 2,18 нет 0,458 6,998 45,8 6,0622 3.0 222,0 18,7 394,63 2,94 33,4
6 0,08829 12,5 7,87 нет 0,524 6,012 66,6 5,5605 5.0 311,0 15,2 395,60 12,43 22,9
7 0,14455 12,5 7,87 нет 0,524 6,172 96,1 5,9505 5.0 311,0 15,2 396,90 19,15 27,1

Данные беспорядочные; он часто несбалансирован и изобилует выбросами, которые мешают анализу и обучению машинному обучению.

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

Команда Google Research разработала инструмент для этой работы под названием Facets, который помогает визуализировать данные и нарезать их всевозможными способами. Это хорошая отправная точка для понимания того, как устроен набор данных.

Фасеты позволяют найти, где данные выглядят не совсем так, как вы думаете.

За исключением своего веб-приложения, Google упрощает встраивание набора инструментов в блокнот Jupyter.

Facets состоит из двух частей:

  • Обзор фасетов
  • Facets Deep Dive

Обзор фасетов

Обзор фасетов дает обзор набора данных. Обзор фасетов разбивает столбцы данных на строки с важной информацией, отображающей

  1. процент отсутствующих наблюдений
  2. мин. и макс. значения
  3. статистика, такая как среднее значение, медиана и стандартное отклонение.
  4. Он также добавляет столбец, который показывает процент значений, равных нулю, что полезно, когда большинство значений равны нулю.
  5. Эти распределения можно увидеть в тестовом наборе данных, а также в обучающем наборе для каждой функции. Это означает, что вы можете дважды проверить, что тест имеет такое же распределение, что и данные обучения.

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

Facets Deep Dive

Facets Deep Dive - отличный инструмент. Это позволяет получить некоторую ясность в вашем наборе данных и полностью увеличить масштаб, чтобы увидеть отдельные фрагменты данных. Это означает, что вы можете фасетировать данные по строкам и столбцам по любой из функций набора данных.

Мы будем использовать эти два инструмента с набором данных Boston.

Примечание . Вы не можете использовать Facets Overview и Facets Deep Dive одновременно. Чтобы сменить инструмент, сначала необходимо очистить записную книжку.

Установить Facet

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

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

pip install jupyter_contrib_nbextensions 

Сразу после этого вам нужно клонировать репозитории на вашем компьютере. У вас есть два варианта:

Вариант 1) Скопируйте и вставьте этот код в терминал (рекомендуется)

Если на вашем компьютере не установлен Git, перейдите по этому URL-адресу https://git-scm.com/download/win и следуйте инструкциям. Как только вы закончите, вы можете использовать команду git в терминале для пользователя Mac или приглашение Anaconda для пользователя Windows.

git clone https://github.com/PAIR-code/facets 

Вариант 2) Перейдите на https://github.com/PAIR-code/facets и загрузите репозитории.

Если вы выберете первый вариант, файл окажется в вашем загружаемом файле. Вы можете либо разрешить загрузку файла, либо перетащить его на другой путь.

Вы можете проверить, где хранятся Facets, с помощью этой командной строки:

echo `pwd`/`ls facets` 

Теперь, когда вы нашли Facets, вам нужно установить его в Jupyter Notebook. Вам необходимо указать в качестве рабочего каталога путь, по которому расположены фасеты.

Ваш текущий рабочий каталог и расположение ZIP-файла Facets должны быть такими же.

Вам нужно указать рабочий каталог на Facet:

cd facets

Чтобы установить Facets в Jupyter, у вас есть два варианта. Если вы установили Jupyter с Conda для всех пользователей, скопируйте этот код:

можно использовать jupyter nbextension install facets-dist /

jupyter nbextension install facets-dist/

В противном случае используйте:

jupyter nbextension install facets-dist/ --user

Хорошо, все готово. Давайте откроем Обзор фасетов.

Обзор

Обзор использует скрипт Python для вычисления статистики. Вам необходимо импортировать скрипт с именем generic_feature_statistics_generator в Jupyter. Не волнуйтесь; сценарий находится в файлах фасетов.

Вам нужно найти его путь. Это легко сделать. Вы открываете фасеты, открываете файл facets_overview, а затем python. Скопируйте путь

После этого вернитесь в Jupyter и напишите следующий код. Измените путь '/ Users / Thomas / facets / facets_overview / python' на свой путь.

# Add the facets overview python code to the python path# Add timport syssys.path.append('/Users/Thomas/facets/facets_overview/python')

Вы можете импортировать скрипт с приведенным ниже кодом.

from generic_feature_statistics_generator importGenericFeatureStatisticsGenerator

В окнах тот же код становится

import syssys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator

Чтобы вычислить статистику признаков, вам нужно использовать функцию GenericFeatureStatisticsGenerator (), и вы используете объект ProtoFromDataFrames. Вы можете передать фрейм данных в словаре. Например, если мы хотим создать сводную статистику для набора поездов, мы можем сохранить информацию в словаре и использовать ее в объекте ProtoFromDataFrames.

  • 'name': 'train', 'table': df_train 

Имя - это имя отображаемой таблицы, и вы используете имя таблицы, для которой хотите вычислить сводку. В вашем примере таблица, содержащая данные, df_train

# Calculate the feature statistics proto from the datasets and stringify it for use in facets overviewimport base64gfsg = GenericFeatureStatisticsGenerator()proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train},{'name': 'test', 'table': df_test}])#proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}])protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")

Наконец, вы просто скопируете и вставите приведенный ниже код. Код взят прямо с GitHub. Вы должны увидеть это:

# Display the facets overview visualization for this data# Displfrom IPython.core.display import display, HTMLHTML_TEMPLATE = """
"""html = HTML_TEMPLATE.format(protostr=protostr)display(HTML(html))

График

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

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

## Choose important feature and further check with Dive%matplotlib inlineimport matplotlib.pyplot as pltimport seaborn as snssns.set(style="ticks")# Compute the correlation matrixcorr = df.corr('pearson')# Generate a mask for the upper trianglemask = np.zeros_like(corr, dtype=np.bool)mask[np.triu_indices_from(mask)] = True# Set up the matplotlib figuref, ax = plt.subplots(figsize=(11, 9))# Generate a custom diverging colormapcmap = sns.diverging_palette(220, 10, as_cmap=True)# Draw the heatmap with the mask and correct aspect ratiosns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,square=True, linewidths=.5, cbar_kws={"shrink": .5})

Выход

PNG

Из матрицы вы можете увидеть:

  • LSTAT
  • RM

Сильно коррелируют с ЦЕНА. Еще одна интересная особенность - сильная положительная корреляция между NOX и INDUS, что означает, что эти две переменные движутся в одном направлении. Кроме того, есть еще и ЦЕНА. DIS также сильно коррелирует с IND и NOX.

У вас есть первый намек на то, что IND и NOX могут быть хорошими кандидатами на роль перехвата, и DIS также может быть интересным, чтобы сосредоточиться.

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

Сетка пар мы составим следующим образом:

  • Верхняя часть: диаграмма рассеяния с подогнанной линией
  • Диагональ: график плотности ядра
  • Нижняя часть: многомерный график плотности ядра

Вы выбираете фокус на четырех независимых переменных. Выбор соответствует переменным с сильной корреляцией с PRICE.

  • ИНДУС
  • NOX
  • RM
  • LSTAT

кроме того, ЦЕНА.

Обратите внимание, что стандартная ошибка добавляется по умолчанию к диаграмме рассеяния.

attributes = ["PRICE", "INDUS", "NOX", "RM", "LSTAT"]g = sns.PairGrid(df[attributes])g = g.map_upper(sns.regplot, color="g")g = g.map_lower(sns.kdeplot,cmap="Reds", shade=True, shade_lowest=False)g = g.map_diag(sns.kdeplot)

Выход

Начнем с верхней части:

  • Цена отрицательно коррелирует с INDUS, NOX и LSTAT; положительно коррелировал с РМ.
  • Есть небольшая нелинейность с LSTAT и PRICE.
  • Когда цена равна 50, это похоже на прямую линию. Из описания набора данных PRICE была усечена до значения 50.

Диагональ

  • NOX, кажется, состоит из двух кластеров: около 0,5 и около 0,85.

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

Если вы проверите многомерную плотность для INDUS и NOX, вы увидите положительную корреляцию и два кластера. Когда доля промышленности превышает 18, концентрация оксидов азота превышает 0,6.

Вы можете подумать о добавлении взаимодействия между INDUS и NOX в линейной зависимости.

Наконец, вы можете использовать второй инструмент, созданный Google, Facets Deep Dive. Интерфейс разделен на четыре основных раздела. Центральная область в центре - это масштабируемое отображение данных. В верхней части панели есть раскрывающееся меню, в котором вы можете изменить расположение данных, чтобы управлять фасеткой, позиционированием и цветом. Справа есть подробный вид определенной строки данных. Это означает, что вы можете щелкнуть любую точку данных в центральной визуализации, чтобы просмотреть подробную информацию об этой конкретной точке данных.

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

Один из способов решить эту проблему - создать категориальную переменную. То есть мы можем создать двухмерный график, раскрасив точку. Вы можете разделить переменную PRICE на четыре категории, каждая из которых представляет собой квартиль (т. Е. 0,25, 0,5, 0,75). Вы называете эту новую переменную Q_PRICE.

## Check non linearity with important featuresdf['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])## Show non linearity between RM and LSTATax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")

Facets Deep Dive

Чтобы открыть Deep Dive, вам необходимо преобразовать данные в формат json. Панды как объект для этого. Вы можете использовать to_json после набора данных Pandas.

Первая строка кода обрабатывает размер набора данных.

df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])sprite_size = 32 if len(df.index)>50000 else 64jsonstr = df.to_json(orient='records')

Код ниже взят из Google GitHub. После запуска кода вы должны увидеть это:

# Display thde Dive visualization for this datafrom IPython.core.display import display, HTML# Create Facets templateHTML_TEMPLATE = """
"""# Load the json dataset and the sprite_size into the templatehtml = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)# Display the templatedisplay(HTML(html))

Вам интересно узнать, существует ли связь между отраслевым уровнем, концентрацией оксидов, расстоянием до центра занятости и ценой на дом.

Для этого вы сначала разделите данные по отраслевому диапазону и цвету с квартилем цен:

  • Выберите фасетирование X и выберите INDUS.
  • Выберите Display и выберите DIS. Он закрасит точки квартилем цены дома.

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

Пока что это снова показывает то, что вы знаете: более низкий отраслевой показатель, более высокая цена. Теперь вы можете посмотреть разбивку по INDUX и NOX.

  • Выберите фасетирование Y и выберите NOX.

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

У вас есть еще один намек на то, что взаимодействие между IND, NOX и DIS может быть хорошим кандидатом для улучшения модели.

TensorFlow

В этом разделе вы оцените линейный классификатор с помощью API оценщиков TensorFlow. Вы поступите следующим образом:

  • Подготовьте данные
  • Оцените эталонную модель: без взаимодействия
  • Оцените модель с помощью взаимодействия

Помните, что цель машинного обучения - минимизировать ошибку. В этом случае выиграет модель с наименьшей среднеквадратичной ошибкой. Оценщик TensorFlow автоматически вычисляет эту метрику.

Данные подготовки

В большинстве случаев вам необходимо преобразовать ваши данные. Вот почему Facets Overview завораживает. Из сводной статистики вы увидели выбросы. Эти значения влияют на оценки, потому что они не похожи на популяцию, которую вы анализируете. Выбросы обычно искажали результаты. Например, положительный выброс имеет тенденцию переоценивать коэффициент.

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

Библиотека sklearn полезна для стандартизации переменных. Для этого можно использовать модуль предварительной обработки с масштабированием объекта.

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

from sklearn import preprocessingdef standardize_data(df):X_scaled = preprocessing.scale(df[['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']])X_scaled_df = pd.DataFrame(X_scaled, columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'])df_scale = pd.concat([X_scaled_df,df['CHAS'],df['PRICE']],axis=1, join='inner')return df_scale

Вы можете использовать эту функцию для создания масштабированного набора поездов / тестов.

df_train_scale = standardize_data(df_train)df_test_scale = standardize_data(df_test) 

Базовая регрессия: контрольный показатель

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

Способ обучения модели точно такой же, как в руководстве по высокоуровневому API . Вы будете использовать оценщик TensorFlow LinearRegressor.

Напоминаем, что вам нужно выбрать:

  • особенности, которые нужно добавить в модель
  • преобразовать черты
  • построить линейный регрессор
  • построить функцию input_fn
  • обучить модель
  • протестировать модель

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

## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']CATE_FEATURES = ['CHAS']

Вы преобразовываете функции в числовой или категориальный столбец.

continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]#categorical_features = tf.feature_column.categorical_column_with_hash_bucket(CATE_FEATURES, hash_bucket_size=1000)categorical_features = [tf.feature_column.categorical_column_with_vocabulary_list('CHAS', ['yes','no'])]

Вы создаете модель с помощью linearRegressor. Вы храните модель в папке train_Boston

model = tf.estimator.LinearRegressor(model_dir="train_Boston",feature_columns=categorical_features + continuous_features)

Выход

INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'train_Boston', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': , '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

Каждый столбец в данных поезда или теста преобразуется в тензор с функцией get_input_fn

FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'CHAS']LABEL= 'PRICE'def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):return tf.estimator.inputs.pandas_input_fn(x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),y = pd.Series(data_set[LABEL].values),batch_size=n_batch,num_epochs=num_epochs,shuffle=shuffle)

Вы оцениваете модель по данным поезда.

model.train(input_fn=get_input_fn(df_train_scale,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)

Выход

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Create CheckpointSaverHook.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Saving checkpoints for 1 into train_Boston/model.ckpt.INFO:tensorflow:loss = 56417.703, step = 1INFO:tensorflow:global_step/sec: 144.457INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)INFO:tensorflow:global_step/sec: 258.392INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)INFO:tensorflow:global_step/sec: 227.998INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)INFO:tensorflow:global_step/sec: 210.739INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)INFO:tensorflow:global_step/sec: 234.237INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)INFO:tensorflow:global_step/sec: 238.1INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)INFO:tensorflow:global_step/sec: 237.934INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)INFO:tensorflow:global_step/sec: 220.687INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)INFO:tensorflow:global_step/sec: 232.702INFO:tensorflow:loss = 24049.678, step = 901 (0.432 sec)INFO:tensorflow:Saving checkpoints for 1000 into train_Boston/model.ckpt.INFO:tensorflow:Loss for final step: 23228.568.

Наконец, вы оцениваете характеристики модели на тестовом наборе.

model.evaluate(input_fn=get_input_fn(df_test_scale,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)

Выход

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-29-02:40:43INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43INFO:tensorflow:Saving dict for global step 1000: average_loss = 86.89361, global_step = 1000, loss = 1650.9785{'average_loss': 86.89361, 'global_step': 1000, 'loss': 1650.9785}

Убыток модели - 1650. Это показатель, который нужно превзойти в следующем разделе.

Усовершенствуйте модель: срок взаимодействия

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

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

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

Прежде всего, вам нужно создать новую переменную для взаимодействия между INDUS и NOX.

Функция ниже возвращает два кадра данных, обучающий и тестовый, с взаимодействием между var_1 и var_2, в вашем случае INDUS и NOX.

def interaction_term(var_1, var_2, name):t_train = df_train_scale[var_1]*df_train_scale[var_2]train = t_train.rename(name)t_test = df_test_scale[var_1]*df_test_scale[var_2]test = t_test.rename(name)return train, test

Вы сохраняете две новые колонки

interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')interation_ind_ns_train.shape(325,)

Во-вторых, вы создаете вторую функцию для вычисления члена тройного взаимодействия.

def triple_interaction_term(var_1, var_2,var_3, name):t_train = df_train_scale[var_1]*df_train_scale[var_2]*df_train_scale[var_3]train = t_train.rename(name)t_test = df_test_scale[var_1]*df_test_scale[var_2]*df_test_scale[var_3]test = t_test.rename(name)return train, testinteration_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')

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

  • df_train_new
  • df_test_new
df_train_new = pd.concat([df_train_scale,interation_ind_ns_train,interation_ind_ns_dis_train],axis=1, join='inner')df_test_new = pd.concat([df_test_scale,interation_ind_ns_test,interation_ind_ns_dis_test],axis=1, join='inner')df_train_new.head(5)

Выход

Вот и все; вы можете оценить новую модель с помощью условий взаимодействия и посмотреть, какова метрика производительности.

CONTI_FEATURES_NEW = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS']### Define categorical listcontinuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]model = tf.estimator.LinearRegressor(model_dir="train_Boston_1",feature_columns= categorical_features + continuous_features_new)

Выход

INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'train_Boston_1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': , '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

КОД

FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS','CHAS']LABEL= 'PRICE'def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):return tf.estimator.inputs.pandas_input_fn(x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),y = pd.Series(data_set[LABEL].values),batch_size=n_batch,num_epochs=num_epochs,shuffle=shuffle)
model.train(input_fn=get_input_fn(df_train_new,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)

Выход

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Create CheckpointSaverHook.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Saving checkpoints for 1 into train_Boston_1/model.ckpt.INFO:tensorflow:loss = 56417.703, step = 1INFO:tensorflow:global_step/sec: 124.844INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)INFO:tensorflow:global_step/sec: 182.704INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)INFO:tensorflow:global_step/sec: 208.189INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)INFO:tensorflow:global_step/sec: 213.855INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)INFO:tensorflow:global_step/sec: 209.758INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)INFO:tensorflow:global_step/sec: 196.618INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)INFO:tensorflow:global_step/sec: 196.472INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)INFO:tensorflow:global_step/sec: 172.82INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)INFO:tensorflow:global_step/sec: 168.916INFO:tensorflow:loss = 19878.56, step = 901 (0.592 sec)INFO:tensorflow:Saving checkpoints for 1000 into train_Boston_1/model.ckpt.INFO:tensorflow:Loss for final step: 19598.387.
model.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)

Выход

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-29-02:41:14INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14INFO:tensorflow:Saving dict for global step 1000: average_loss = 79.78876, global_step = 1000, loss = 1515.9863{'average_loss': 79.78876, 'global_step': 1000, 'loss': 1515.9863}

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