У цьому підручнику ви дізнаєтеся, як перевірити дані та підготувати їх до створення простого завдання лінійної регресії.
Цей підручник розділений на дві частини:
- Шукайте взаємодії
- Перевірте модель
У попередньому підручнику ви використовували бостонський набір даних для оцінки середньої ціни будинку. Набір даних у Бостоні має невеликий розмір, лише 506 спостережень. Цей набір даних розглядається як еталон для випробування нових алгоритмів лінійної регресії.
Набір даних складається з:
Змінна | Опис |
zn | Частка житлових земель, районованих для ділянок понад 25000 кв.ф. |
indus | Частка нероздрібних ділових акрів на місто. |
нокс | концентрація оксидів азоту |
rm | середня кількість кімнат на житло |
вік | частка одиниць, зайнятих власниками, побудованих до 1940 року |
дис | зважені відстані до п'яти центрів зайнятості в Бостоні |
податковий | повна ставка податку на майно на 10000 доларів |
ptratio | співвідношення учнів і вчителів за містом |
медв | Середня вартість будинків, зайнятих власниками, у тисячах доларів |
злочинний | рівень злочинності на душу населення за містом |
час | Фіктивна змінна річки Чарльз (1, якщо межа річки; 0 - інакше) |
B | частка чорношкірих у місті |
У цьому посібнику ми оцінимо медіанну ціну за допомогою лінійного регресора, але основна увага приділяється одному конкретному процесу машинного навчання: "підготовці даних".
Модель узагальнює шаблон у даних. Щоб схопити такий візерунок, спочатку його потрібно знайти. Хорошою практикою є проведення аналізу даних перед запуском будь-якого алгоритму машинного навчання.
Правильний вибір особливостей впливає на успіх вашої моделі. Уявіть, що ви намагаєтесь оцінити заробітну плату людей, якщо ви не включаєте стать як коваріант, ви отримуєте погану оцінку.
Іншим способом вдосконалення моделі є розгляд кореляції між незалежною змінною. Повертаючись до прикладу, ви можете вважати освіту чудовим кандидатом для прогнозування заробітної плати, а також роду занять. Справедливо сказати, що професія залежить від рівня освіти, а саме вища освіта часто призводить до кращої професії. Якщо узагальнити цю ідею, можна сказати, що кореляція між залежною змінною та пояснювальною змінною може бути збільшена ще однією пояснювальною змінною.
Щоб відобразити обмежений вплив освіти на професію, ми можемо використовувати термін взаємодії.
Якщо поглянути на рівняння заробітної плати, воно стає:
Якщо це позитивне значення, то це означає, що додатковий рівень освіти призводить до більш високого зростання середньої вартості будинку для високого рівня зайнятості. Іншими словами, існує ефект взаємодії між освітою та професією.
У цьому підручнику ми спробуємо з’ясувати, які змінні можуть бути хорошим кандидатом на умови взаємодії. Ми перевіримо, чи додавання такого роду інформації призводить до кращого прогнозування ціни.
У цьому підручнику ви дізнаєтесь
- Зведена статистика
- Огляд граней
- Фасети Глибоке занурення
- Встановіть грань
- Огляд
- Графік
- Фасети Глибоке занурення
- 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 включає набір даних Бостона. Ви можете викликати його API, щоб імпортувати дані.
boston = load_boston()df = pd.DataFrame(boston.data)
Ім'я об'єкта зберігається в об'єкті імена_назви в масиві.
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З пандами просто розділити набір даних. Ви випадковим чином поділяєте набір даних на 80 відсотків навчальних наборів та 20 відсотків набору тестувань. Панди мають вбудовану функцію витрат для розділення вибірки кадру даних.
Перший параметр 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)Вихідні дані
ЗЛОЧИН ЗН ІНДУС ЧАС NOX RM ВІК DIS РАД ПОДАТК ПТРАТІО 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 полегшує вбудовування інструментарію в блокнот Jupyter.
Фасети мають дві частини:
- Огляд граней
- Фасети Глибоке занурення
Огляд граней
Огляд аспектів дає огляд набору даних. Огляд граней розбиває стовпці даних на рядки сучасної інформації, що відображається
- відсоток відсутніх спостережень
- мінімальне та максимальне значення
- статистичні дані, такі як середнє, медіана та стандартне відхилення.
- Він також додає стовпець, який показує відсоток значень, які дорівнюють нулю, що корисно, коли більшість значень є нулями.
- Можна побачити ці розподіли на тестовому наборі даних, а також навчальний набір для кожної функції. Це означає, що ви можете ще раз перевірити, чи має тест подібний розподіл до навчальних даних.
Це принаймні мінімум, який потрібно зробити перед будь-яким завданням машинного навчання. За допомогою цього інструменту ви не пропустите цей важливий крок, і він підкреслює деякі відхилення.
Фасети Глибоке занурення
Facets Deep Dive - це крутий інструмент. Це дозволяє мати певну чіткість у наборі даних і масштабувати повністю, щоб побачити окремий фрагмент даних. Це означає, що ви можете гранувати дані за рядками та стовпцями за будь-якою з функцій набору даних.
Ми будемо використовувати ці два інструменти з набором даних Бостона.
Примітка : Ви не можете одночасно користуватися оглядом граней та глибоким зануренням фасет. Спочатку потрібно очистити блокнот, щоб змінити інструмент.
Встановіть грань
Ви можете використовувати веб-програму 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 і завантажте сховища.
Якщо ви вибрали перший варіант, файл потрапляє у файл завантаження. Ви можете дозволити завантаження файлу або перетягнути його на інший шлях.
Ви можете перевірити, де зберігаються грані, за допомогою цього командного рядка:
echo `pwd`/`ls facets`Тепер, коли ви знайшли Грані, вам потрібно встановити її в блокнот Jupyter. Вам потрібно встановити робочий каталог на шлях, де розташовані фасети.
Ваш поточний робочий каталог та місцезнаходження Facets zip повинні бути однаковими.
Вам потрібно вказати робочий каталог на Facet:
cd facetsЩоб встановити грані в Jupyter, у вас є два варіанти. Якщо ви встановили Jupyter з Conda для всіх користувачів, скопіюйте цей код:
можна використовувати jupyter nbextension встановити facets-dist /
jupyter nbextension install facets-dist/В іншому випадку використовуйте:
jupyter nbextension install facets-dist/ --userДобре, все готово. Давайте відкриємо Огляд граней.
Огляд
Огляд використовує скрипт Python для обчислення статистичних даних. Вам потрібно імпортувати скрипт, який називається generic_feature_statistics_generator, до Jupyter. Не хвилюйся; сценарій знаходиться у файлах фасет.
Вам потрібно знайти його шлях. Це легко зробити. Ви відкриваєте грані, відкриваєте файл facets_overview, а потім python. Скопіюйте шлях
Після цього поверніться до Юпітера і напишіть наступний код. Змініть шлях '/ 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_trainName - це назва відображуваної таблиці, і ви використовуєте назву таблиці, для якої потрібно обчислити підсумок. У вашому прикладі таблицею, що містить дані, є 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
Тісно співвідносяться з PRICE. Ще однією захоплюючою особливістю є сильна позитивна кореляція між 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. Інтерфейс розділений на чотири основні розділи. Центральною областю в центрі є масштабоване відображення даних. У верхній частині панелі є спадне меню, де ви можете змінити розташування даних для керування фасетуванням, позиціонуванням та кольором. Праворуч є детальний огляд певного рядка даних. Це означає, що ви можете натиснути будь-яку крапку даних у центральній візуалізації, щоб побачити детальну інформацію про цю конкретну точку даних.
На етапі візуалізації даних ви зацікавлені шукати попарну кореляцію між незалежною змінною ціни будинку. Однак він включає принаймні три змінні, і 3D-графіки складні в роботі.
Одним із способів вирішення цієї проблеми є створення категоріальної змінної. Тобто ми можемо створити 2D-графік на колір точки. Ви можете розділити змінну 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")Фасети Глибоке занурення
Щоб відкрити 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.
- Виберіть Дисплей і виберіть DIS. Це забарвить крапки в квартилі ціни будинку
тут темні кольори означають, що відстань до першого центру роботи далека.
Поки що це знову показує те, що ви знаєте, нижчий темп галузі, вища ціна. Тепер ви можете подивитися на розподіл за INDUX, за NOX.
- Виберіть фасетування Y і оберіть NOX.
Тепер ви бачите, що в будинку далеко від першого центру зайнятості є найнижча частка у галузі, а отже і найнижча концентрація оксиду. Якщо ви вирішите відобразити тип за допомогою Q_PRICE і збільшити лівий нижній кут, ви зможете побачити, який тип ціни це.
Ви маєте ще один натяк на те, що взаємодія між IND, NOX та DIS може бути добрими кандидатами для вдосконалення моделі.
TensorFlow
У цьому розділі ви оціните лінійний класифікатор за допомогою API оцінювачів TensorFlow. Ви будете діяти наступним чином:
- Підготуйте дані
- Оцініть базову модель: Відсутність взаємодії
- Оцініть модель взаємодії
Пам’ятайте, що мета машинного навчання - мінімізувати помилку. У цьому випадку виграє модель із найнижчою середньоквадратичною похибкою. Оцінювач TensorFlow автоматично обчислює цю метрику.
Дані підготовки
У більшості випадків вам потрібно перетворити ваші дані. Ось чому огляд граней зачаровує. За підсумковою статистикою ви побачили, що є викиди. Ці значення впливають на оцінки, оскільки вони не схожі на сукупність, яку ви аналізуєте. Випадки зазвичай упереджували результати. Наприклад, позитивний відхилення має тенденцію завищувати коефіцієнт.
Хорошим рішенням для вирішення цієї проблеми є стандартизація змінної. Стандартизація означає стандартне відхилення одиниці і значення нуля. Процес стандартизації включає два етапи. Перш за все, він віднімає середнє значення змінної. По-друге, воно ділиться на дисперсію так, що розподіл має одиничну дисперсію
Бібліотека 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. Просто додавши дві нові змінні, ви змогли зменшити втрату. Це означає, що ви можете зробити кращий прогноз, ніж у порівняльній моделі.