В този урок ще научите как да проверите данните и да ги подготвите, за да създадете проста задача за линейна регресия.
Този урок е разделен на две части:
- Потърсете взаимодействие
- Тествайте модела
В предишния урок сте използвали набора от данни в Бостън, за да изчислите средната цена на къща. Наборът от данни в Бостън има малък размер, само с 506 наблюдения. Този набор от данни се счита за еталон за изпробване на нови алгоритми за линейна регресия.
Наборът от данни се състои от:
Променлива | Описание |
zn | Делът на жилищните земи, районирани за парцели над 25 000 кв. Фута. |
indus | Делът на бизнес акра за продажба на дребно на град. |
нокс | концентрация на азотни оксиди |
rm | среден брой стаи на жилище |
възраст | делът на заетите от собствениците единици, построени преди 1940 г. |
дис | претеглени разстояния до пет центъра за заетост в Бостън |
данък | пълна стойност на данъка върху имуществото на 10 000 долара |
ptratio | съотношението ученици-учители по град |
medv | Средната стойност на обитаваните от собствениците домове в хиляди долари |
престъпна | процент на престъпност на глава от населението по градове |
час | Фиктивна променлива на река Чарлз (1, ако граничи с река; 0 в противен случай) |
Б. | делът на чернокожите от града |
В този урок ще изчислим средната цена, използвайки линеен регресор, но фокусът е върху един конкретен процес на машинно обучение: „подготовка на данните“.
Моделът обобщава модела в данните. За да заснемете такъв модел, първо трябва да го намерите. Добра практика е да извършите анализ на данни, преди да стартирате какъвто и да е алгоритъм за машинно обучение.
Изборът на правилните характеристики прави разликата в успеха на вашия модел. Представете си, че се опитвате да изчислите заплатата на хората, ако не включите пола като ковариант, в крайна сметка получавате лоша оценка.
Друг начин за подобряване на модела е да се разгледа корелацията между независимата променлива. Връщайки се към примера, можете да мислите за образованието като отличен кандидат за предсказване на заплатата, но също и на професията. Справедливо е да се каже, че професията зависи от нивото на образование, а именно висшето образование често води до по-добро занимание. Ако обобщим тази идея, можем да кажем, че корелацията между зависимата променлива и обяснителната променлива може да бъде увеличена от още една обяснителна променлива.
За да уловим ограничения ефект на образованието върху професията, можем да използваме термин за взаимодействие.
Ако погледнете уравнението на заплатата, то става:
Ако е положително, това означава, че допълнителното ниво на образование води до по-голямо увеличение на средната стойност на една къща за високо ниво на професия. С други думи, има ефект на взаимодействие между образованието и професията.
В този урок ще се опитаме да видим кои променливи могат да бъдат добър кандидат за термини за взаимодействие. Ще тестваме дали добавянето на този вид информация води до по-добро прогнозиране на цените.
В този урок ще научите
- Обобщена статистика
- Преглед на фасетите
- Фасети дълбоко гмуркане
- Инсталирайте Facet
- Общ преглед
- Графика
- Фасети дълбоко гмуркане
- 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)
Името на характеристиката се съхранява в обекта feature_names в масив.
boston.feature_names
Изход
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='Можете да преименувате колоните.
df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)
Преобразувате променливата CHAS като низова променлива и я маркирате с да, ако CHAS = 1 и не, ако CHAS = 0
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: objectС пандите е лесно да разделите набора от данни. Разделяте произволно набора от данни с 80 процента набор за обучение и 20 процента набор за тестване. Pandas имат вградена функция за разходи за разделяне на извадка от рамка за данни.
Първият параметър frac е стойност от 0 до 1. Вие го задавате на 0,8, за да изберете произволно 80 процента от рамката с данни.
Random_state позволява да се върне една и съща рамка от данни за всички.
### Create train/test setdf_train=df.sample(frac=0.8,random_state=200)df_test=df.drop(df_train.index)Можете да получите формата на данните. Трябва да бъде:
- Комплект влакове: 506 * 0,8 = 405
- Тестов комплект: 506 * 0,2 = 101
print(df_train.shape, df_test.shape)Изход
(405, 14) (101, 14)df_test.head(5)Изход
ПРЕСТЪПЛЕНИЕ ZN ИНДУС ЧАС NOX RM ВЪЗРАСТ DIS РАД ДАНЪК PTRATIO Б. LSTAT ЦЕНА 0 0,00632 18,0 2.31 не 0,538 6.575 65.2 4.0900 1.0 296,0 15.3 396,90 4.98 24,0 1 0,02731 0,0 7.07 не 0,469 6.421 78.9 4.9671 2.0 242,0 17.8 396,90 9.14 21.6 3 0,03237 0,0 2.18 не 0,458 6.998 45.8 6.0622 3.0 222,0 18.7 394,63 2.94 33.4 6 0,08829 12.5 7,87 не 0,524 6.012 66.6 5.5605 5.0 311,0 15.2 395.60 12.43 22.9 7 0,14455 12.5 7,87 не 0,524 6.172 96.1 5.9505 5.0 311,0 15.2 396,90 19.15 27.1 Данните са разхвърляни; често е неправилно балансиран и поръсен с извънредни ценности, които отхвърлят анализа и обучението по машинно обучение.
Първата стъпка за почистване на набора от данни е разбирането къде се нуждае от почистване. Почистването на набор от данни може да бъде сложно да се направи, особено по някакъв обобщаващ начин
Екипът на Google Research разработи инструмент за тази работа, наречен Фасети, който помага да се визуализират данните и да се нарязва по всякакви начини. Това е добра отправна точка, за да разберете как е изложен набора от данни.
Фасетите ви позволяват да намерите къде данните не изглеждат точно така, както мислите.
Освен тяхното уеб приложение, Google улеснява вграждането на инструментариума в тетрадка Jupyter.
Фасетите имат две части:
- Преглед на фасетите
- Фасети дълбоко гмуркане
Преглед на фасетите
Прегледът на фасетите дава преглед на набора от данни. Преглед на фасетите разделя колоните на данните на редове с видима информация, която се показва
- процентът на липсващите наблюдения
- мин. и макс. стойности
- статистика като средната стойност, медианата и стандартното отклонение.
- Той също така добавя колона, която показва процента на стойностите, които са нули, което е полезно, когато повечето от стойностите са нули.
- Възможно е да видите тези разпределения в тестовия набор от данни, както и учебния набор за всяка функция. Това означава, че можете да проверите отново дали тестът има подобно разпределение на данните за обучение.
Това е поне минимумът, който трябва да направите преди каквато и да е задача за машинно обучение. С този инструмент не пропускате тази важна стъпка и тя подчертава някои аномалии.
Фасети дълбоко гмуркане
Facets Deep Dive е страхотен инструмент. Тя позволява да имате известна яснота на набора от данни и да приближите докрай, за да видите отделна част от данните. Това означава, че можете да фасетирате данните по ред и колона във всяка от характеристиките на набора от данни.
Ще използваме тези два инструмента с набора от данни в Бостън.
Забележка : Не можете да използвате Преглед на фасети и Фасети дълбоко гмуркане едновременно. Първо трябва да изчистите бележника, за да смените инструмента.
Инсталирайте Facet
Можете да използвате уеб приложението Facet за по-голямата част от анализа. В този урок ще видите как да го използвате в тетрадка Jupyter.
На първо място, трябва да инсталирате nbextensions. Това се прави с този код. Копирате и поставяте следния код в терминала на вашето устройство.
pip install jupyter_contrib_nbextensionsВеднага след това трябва да клонирате хранилищата във вашия компютър. Имате два избора:
Вариант 1) Копирайте и поставете този код в терминала (препоръчително)
Ако нямате инсталиран Git на машината си, моля, отидете на този URL адрес https://git-scm.com/download/win и следвайте инструкциите. След като приключите, можете да използвате командата git в терминала за потребител на Mac или подкана Anaconda за потребител на Windows
git clone https://github.com/PAIR-code/facetsВариант 2) Отидете на https://github.com/PAIR-code/facets и изтеглете хранилищата.
Ако изберете първата опция, файлът попада във вашия файл за изтегляне. Можете или да позволите на файла да се изтегли, или да го плъзнете по друг път.
Можете да проверите къде се съхраняват аспектите с този команден ред:
echo `pwd`/`ls facets`След като вече сте намерили Фасети, трябва да го инсталирате в Jupyter Notebook. Трябва да зададете работната директория на пътя, където се намират фасетите.
Настоящата ви работна директория и местоположението на Facets zip трябва да са еднакви.
Трябва да насочите работната директория към Facet:
cd facetsЗа да инсталирате Фасети в Jupyter, имате две възможности. Ако сте инсталирали Jupyter с Conda за всички потребители, копирайте този код:
може да използва jupyter nbextension инсталиране на facets-dist /
jupyter nbextension install facets-dist/В противен случай използвайте:
jupyter nbextension install facets-dist/ --userДобре, всичко е готово. Нека отворим Преглед на аспектите.
Общ преглед
Overview използва 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; положително корелира с RM.
- Има леко нелинейност с LSTAT и ЦЕНА
- Има като права линия, когато цената е равна на 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.
- Изберете Display и изберете 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.
Време е да обобщим тази идея и да видим дали можете да подобрите модела, предвиден от модела.
Трябва да добавите две нови колони към всеки набор от данни: train + test. За това създавате една функция за изчисляване на термина за взаимодействие и друга за изчисляване на термина за тройно взаимодействие. Всяка функция създава една колона. След като новите променливи са създадени, можете да ги свържете към набора от данни за обучение и набора от тестове.
На първо място, трябва да създадете нова променлива за взаимодействие между 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. Само като добавите две нови променливи, успяхте да намалите загубата. Това означава, че можете да направите по-добра прогноза, отколкото с бенчмарк модела.