Линейна регресия на TensorFlow с фасет и член на взаимодействие

В този урок ще научите как да проверявате данните и да ги подготвите за създаване на проста задача за линейна регресия.

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

  • Търсете взаимодействие
  • Тествайте модела

в предишен урок, използвахте набора от данни от Бостън, за да оцените средната цена на къща. Бостънският набор от данни има малък размер, само с 506 наблюдения. Този набор от данни се счита за еталон за изпробване на нови алгоритми за линейна регресия.

Наборът от данни се състои от:

Променлив Descriptйон
zn Делът на жилищната земя, зонирана за парцели над 25,000 XNUMX кв. фута.
индус Делът на акра за бизнес без търговия на дребно на град.
NOx концентрация на азотни оксиди
rm среден брой стаи на жилище
възраст делът на жилищата, обитавани от собствениците, построени преди 1940 г
DIS претеглени разстояния до пет центъра по заетостта в Бостън
данък данъчна ставка на пълната стойност на имуществото за 10,000 XNUMX долара
ptratio съотношението ученик/учител по град
медв Средната стойност на жилищата, обитавани от собственици, в хиляди долара
крим ниво на престъпност на глава от населението по градове
Час фиктивна променлива Charles River (1, ако ограничава ривър; 0 в противен случай)
B делът на чернокожите в града

В този урок ще оценим средната цена с помощта на линеен регресор, но фокусът е върху един конкретен процес на машинно обучение: "подготовка на данни."

Моделът обобщава модела в данните. За да заснемете такъв модел, първо трябва да го намерите. Добра практика е да се извърши анализ на данни, преди да се стартира алгоритъм за машинно обучение.

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

Друг начин за подобряване на модела е да се разгледа корелацията между независимата променлива. Обратно към примера, можете да мислите за образованието като за отличен кандидат за прогнозиране на заплатата, но също и на професията. Справедливо е да се каже, че професията зависи от нивото на образование, а именно висшето образование често води до по-добра професия. Ако обобщим тази идея, можем да кажем, че корелацията между зависимата променлива и обяснителната променлива може да бъде увеличена с още една обяснителна променлива.

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

Термин на взаимодействие

Ако погледнете уравнението на заплатите, то става:

Термин на взаимодействие

If Термин на взаимодействие е положителен, тогава това означава, че едно допълнително ниво на образование води до по-високо увеличение на средната стойност на къща за високо ниво на заетост. С други думи, има ефект на взаимодействие между образование и професия.

В този урок ще се опитаме да видим кои променливи могат да бъдат добър кандидат за термини за взаимодействие. Ще тестваме дали добавянето на този вид информация води до по-добро прогнозиране на цената.

Обобщена статистика

Има няколко стъпки, които можете да следвате, преди да преминете към модела. Както бе споменато по-рано, моделът е обобщение на данните. Най-добрата практика е да разберете данните и да направите прогноза. Ако не знаете вашите данни, имате малки шансове да подобрите своя модел.

Като първа стъпка заредете данните като рамка от данни на 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 pd
from sklearn import datasets
import tensorflow as tf
from sklearn.datasets import load_boston
import numpy as np

Библиотеката sklearn включва набора от данни от Бостън. Можете да извикате неговия 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='<U7')

Можете да преименувате колоните.

df.columns = boston.feature_names
df['PRICE'] = boston.target
df.head(2)

Линейна регресия с фасет и член на взаимодействие

Преобразувате променливата CHAS като низова променлива и я обозначавате с да, ако CHAS = 1 и не, ако CHAS = 0

df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})
df['CHAS'].head(5)
0    no
1    no
2    no
3    no
4    no
Name: CHAS, dtype: object

С pandas е лесно да разделите набора от данни. На случаен принцип разделяте набора от данни на 80 процента набор за обучение и 20 процента набор за тестване. Пандите имат вградена функция за разход за разделяне на извадка от рамка на данни.

Първият параметър frac е стойност от 0 до 1. Задавате го на 0.8, за да изберете произволно 80 процента от рамката с данни.

Random_state позволява да се върне една и съща рамка с данни за всички.

### Create train/test set
df_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 разработи инструмент за тази работа, наречен Фасети които помагат да се визуализират данните и да се разделят по всякакви начини. Това е добра отправна точка, за да разберете как е изложен наборът от данни.

Фасетите ви позволяват да откриете къде данните не изглеждат точно така, както си мислите.

С изключение на тяхното уеб приложение, Google улеснява вграждането на инструментариума в a Jupyter тетрадка.

Има две части на Facets:

  • Общ преглед на аспектите
  • Facets Deep Dive

Общ преглед на аспектите

Facets Overview дава общ преглед на набора от данни. Обзорът на аспектите разделя колоните с данни на редове с показваща се важна информация

  1. процентът на липсващото наблюдение
  2. минимални и максимални стойности
  3. статистика като средна стойност, медиана и стандартно отклонение.
  4. Той също така добавя колона, която показва процента на стойностите, които са нули, което е полезно, когато повечето от стойностите са нули.
  5. Възможно е да видите тези разпределения в тестовия набор от данни, както и в набора за обучение за всяка функция. Това означава, че можете да проверите отново дали тестът има подобно разпределение на данните за обучението.

Това е поне минимумът, който трябва да направите преди всяка задача за машинно обучение. С този инструмент не пропускате тази важна стъпка и той подчертава някои аномалии.

Facets Deep Dive

Facets Deep Dive е готин инструмент. Това позволява да имате известна яснота върху вашия набор от данни и да увеличите мащаба докрай, за да видите отделна част от данните. Това означава, че можете да фасетирате данните по ред и колона във всяка от характеристиките на набора от данни.

Ще използваме тези два инструмента с набора от данни от Бостън.

Забележка: Не можете да използвате Facets Overview и Facets Deep Dive едновременно. Първо трябва да изчистите бележника, за да смените инструмента.

Инсталирайте Facet

Можете да използвате уеб приложението Facet за по-голямата част от анализа. В този урок ще видите как да го използвате в рамките на a 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 и изтеглете хранилищата.

Инсталирайте Facet

Ако изберете първата опция, файлът се озовава във вашия файл за изтегляне. Можете или да оставите файла да се изтегли, или да го плъзнете към друг път.

Можете да проверите къде се съхраняват Facets с този команден ред:

echo `pwd`/`ls facets`

Сега, след като сте намерили Facets, трябва да го инсталирате Jupyter Бележник. Трябва да зададете работната директория на пътя, където се намират фасетите.

Вашата настояща работна директория и местоположението на Facets zip трябва да са същите.

Инсталирайте Facet

Трябва да насочите работната директория към Facet:

cd facets

За да инсталирате Facets в Jupyter, имате две възможности. Ако сте инсталирали Jupyter с Conda за всички потребители, копирайте този код:

може да използва jupyter nbextension инсталирате facets-dist/

jupyter nbextension install facets-dist/

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

jupyter nbextension install facets-dist/ --user

Добре, готови сте. Нека отворим Facet Overview.

Overview

Прегледът използва a Python скрипт за изчисляване на статистиката. Трябва да импортирате скрипта, наречен generic_feature_statistics_generator Jupyter. Не се притеснявайте; скриптът се намира във фасетните файлове.

Трябва да намерите пътя му. Прави се лесно. Отваряте facets, отваряте файла facets_overview и след това python. Копирайте пътя

Общ аспект

След това се върнете към Jupyterи напишете следния код. Променете пътя '/Users/Thomas/facets/facets_overview/python' на вашия път.

# Add the facets overview python code to the python path# Add t 
import sys
sys.path.append('/Users/Thomas/facets/facets_overview/python')

Можете да импортирате скрипта с кода по-долу.

from generic_feature_statistics_generator import 
GenericFeatureStatisticsGenerator

В windows става същият код

import sys
sys.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 overview
import base64

gfsg = 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# Displ 
from IPython.core.display import display, HTML

HTML_TEMPLATE = """<link rel="import" href="/bg/nbextensions/facets-dist/facets-jupyter.html" >
        <facets-overview id="elem"></facets-overview>
        <script>
          document.querySelector("#elem").protoInput = "{protostr}";
        </script>"""
html = HTML_TEMPLATE.format(protostr=protostr)
display(HTML(html))

Крива

След като проверите данните и тяхното разпределение, можете да начертаете корелационна матрица. Корелационната матрица изчислява коефициента на Pearson. Този коефициент е свързан между -1 и 1, като положителната стойност показва положителна корелация, а отрицателната стойност - отрицателна корелация.

Интересувате се да видите кои променливи могат да бъдат добър кандидат за условия на взаимодействие.

## Choose important feature and further check with Dive
%matplotlib inline  
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="ticks")
# Compute the correlation matrix
corr = df.corr('pearson')
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))

# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)

# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,
            square=True, linewidths=.5, cbar_kws={"shrink": .5})

Продукция

<matplotlib.axes._subplots.AxesSubplot at 0x1a184d6518>

PNG

Фасетна графика

От матрицата можете да видите:

  • LSTAT
  • RM

Те са силно свързани с ЦЕНАТА. Друга вълнуваща характеристика е силната положителна корелация между NOX и INDUS, което означава, че тези две променливи се движат в една и съща посока. Освен това има и корелация с ЦЕНАТА. DIS също е силно свързан с IND и NOX.

Имате някакъв първи намек, че IND и NOX могат да бъдат добри кандидати за термина за прихващане и DIS също може да е интересно да се съсредоточите върху.

Можете да отидете малко по-дълбоко, като начертаете мрежа за двойки. Той ще илюстрира по-подробно корелационната карта, която начертахте преди.

Решетката за двойки е съставена, както следва:

  • Горна част: Точкова диаграма с напасната линия
  • Диагонал: Диаграма на плътността на ядрото
  • Долна част: Многовариантна диаграма на плътността на ядрото

Вие избирате фокуса върху четири независими променливи. Изборът съответства на променливите със силна корелация с ЦЕНАТА

  • ИНДУС
  • 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; положително корелира с RM.
  • Има лека нелинейност с LSTAT и PRICE
  • Има като права линия, когато цената е равна на 50. От описанието на набора от данни PRICE е съкратено на стойност 50

Диагонал

  • NOX изглежда има два клъстера, един около 0.5 и един около 0.85.

За да проверите повече за това, можете да погледнете долната част. Многовариантната плътност на ядрото е интересна в известен смисъл, че оцветява там, където са повечето точки. Разликата с диаграмата на разсейване чертае плътност на вероятността, въпреки че няма точка в набора от данни за дадена координата. Когато цветът е по-силен, това показва висока концентрация на точки около тази област.

Ако проверите многовариантната плътност за INDUS и NOX, можете да видите положителната корелация и двата клъстера. Когато делът на индустрията е над 18, концентрацията на азотни оксиди е над 0.6.

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

И накрая, можете да използвате втория инструмент, създаден от Google, Facets Deep Dive. Интерфейсът е разделен на четири основни секции. Централната зона в центъра е мащабируем дисплей на данните. В горната част на панела има падащо меню, където можете да промените подреждането на данните, за да контролирате фасетирането, позиционирането и цвета. Вдясно има подробен изглед на конкретен ред от данни. Това означава, че можете да щракнете върху всяка точка от данни в централната визуализация, за да видите подробностите за тази конкретна точка от данни.

По време на стъпката за визуализация на данните вие ​​се интересувате от търсенето на двойната корелация между независимата променлива на цената на къщата. Той обаче включва най-малко три променливи, а 3D графиките са сложни за работа.

Един от начините за справяне с този проблем е създаването на категорична променлива. Това означава, че можем да създадем 2D графика, като оцветим точката. Можете да разделите променливата PRICE на четири категории, като всяка категория е квартил (т.е. 0.25, 0.5, 0.75). Вие наричате тази нова променлива Q_PRICE.

## Check non linearity with important features
df['Q_PRICE'] =  pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])
## Show non linearity between RM and LSTAT
ax = 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 64
jsonstr = df.to_json(orient='records')

Кодът по-долу идва от Google GitHub. След като стартирате кода, трябва да можете да видите това:

Facets Deep Dive

# Display thde Dive visualization for this data
from IPython.core.display import display, HTML

# Create Facets template  
HTML_TEMPLATE = """<link rel="import" href="/bg/nbextensions/facets-dist/facets-jupyter.html">
        <facets-dive sprite-image-width="{sprite_size}" sprite-image-height="{sprite_size}" id="elem" height="600"></facets-dive>
        <script>
          document.querySelector("#elem").data = {jsonstr};
        </script>"""

# Load the json dataset and the sprite_size into the template
html = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)

# Display the template
display(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 preprocessing
def 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 list
CONTI_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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a19e76ac8>, '_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 = 1
INFO:tensorflow:global_step/sec: 144.457
INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)
INFO:tensorflow:global_step/sec: 258.392
INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)
INFO:tensorflow:global_step/sec: 227.998
INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)
INFO:tensorflow:global_step/sec: 210.739
INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)
INFO:tensorflow:global_step/sec: 234.237
INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)
INFO:tensorflow:global_step/sec: 238.1
INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)
INFO:tensorflow:global_step/sec: 237.934
INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)
INFO:tensorflow:global_step/sec: 220.687
INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)
INFO:tensorflow:global_step/sec: 232.702
INFO: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.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a19e76320>

Най-накрая оценявате представянето на модела в тестовия комплект

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:43
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43
INFO: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, test
interation_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 list
continuous_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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a1a5d5860>, '_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 = 1
INFO:tensorflow:global_step/sec: 124.844
INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)
INFO:tensorflow:global_step/sec: 182.704
INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)
INFO:tensorflow:global_step/sec: 208.189
INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)
INFO:tensorflow:global_step/sec: 213.855
INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)
INFO:tensorflow:global_step/sec: 209.758
INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)
INFO:tensorflow:global_step/sec: 196.618
INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)
INFO:tensorflow:global_step/sec: 196.472
INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)
INFO:tensorflow:global_step/sec: 172.82
INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)
INFO:tensorflow:global_step/sec: 168.916
INFO: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.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1a5d5e10>
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:14
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14
INFO: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. Само чрез добавяне на две нови променливи успяхте да намалите загубата. Това означава, че можете да направите по-добра прогноза, отколкото с модела за сравнение.