Линейна регресия на 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 дава общ преглед на набора от данни. Обзорът на аспектите разделя колоните с данни на редове с показваща се важна информация
- процентът на липсващото наблюдение
- минимални и максимални стойности
- статистика като средна стойност, медиана и стандартно отклонение.
- Той също така добавя колона, която показва процента на стойностите, които са нули, което е полезно, когато повечето от стойностите са нули.
- Възможно е да видите тези разпределения в тестовия набор от данни, както и в набора за обучение за всяка функция. Това означава, че можете да проверите отново дали тестът има подобно разпределение на данните за обучението.
Това е поне минимумът, който трябва да направите преди всяка задача за машинно обучение. С този инструмент не пропускате тази важна стъпка и той подчертава някои аномалии.
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 и изтеглете хранилищата.
Ако изберете първата опция, файлът се озовава във вашия файл за изтегляне. Можете или да оставите файла да се изтегли, или да го плъзнете към друг път.
Можете да проверите къде се съхраняват Facets с този команден ред:
echo `pwd`/`ls facets`
Сега, след като сте намерили Facets, трябва да го инсталирате Jupyter Бележник. Трябва да зададете работната директория на пътя, където се намират фасетите.
Вашата настояща работна директория и местоположението на Facets zip трябва да са същите.
Трябва да насочите работната директория към 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. След като стартирате кода, трябва да можете да видите това:
# 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. Само чрез добавяне на две нови променливи успяхте да намалите загубата. Това означава, че можете да направите по-добра прогноза, отколкото с модела за сравнение.