У овом упутству ћете научити како проверити податке и припремити их за стварање једноставног задатка линеарне регресије.
Овај водич је подељен у два дела:
- Потражите интеракцију
- Тестирајте модел
У претходном упутству користили сте скуп података из Бостона за процену средње цене куће. Подаци из Бостона имају малу величину, са само 506 посматрања. Овај скуп података се сматра референтном тачком за испробавање нових алгоритама линеарне регресије.
Скуп података састоји се од:
Променљива | Опис |
зн | Проценат стамбеног земљишта зонираног за парцеле веће од 25.000 квадратних метара. |
индус | Удео не-малопродајних хектара по граду. |
нок | концентрација азотних оксида |
рм | просечан број соба по стану |
старост | удео јединица које заузимају власници изграђених пре 1940 |
дис | пондерисана растојања до пет бостонских центара за запошљавање |
порез | пуна вредност стопе пореза на имовину по 10.000 долара |
птратио | однос ученика и наставника према граду |
медв | Средња вредност домова у којима живе власници у хиљадама долара |
крим | стопа криминала по становнику по граду |
цхас | Лажна променљива Цхарлес Ривер (1 ако ограничава реку; 0 у супротном) |
Б. | удео црнаца у граду |
У овом упутству ћемо проценити средњу цену помоћу линеарног регресора, али фокус је на једном одређеном процесу машинског учења: „припрема података“.
Модел генералише образац у подацима. Да бисте ухватили такав образац, прво га морате пронаћи. Добра пракса је извршити анализу података пре покретања било ког алгоритма машинског учења.
Избор правих карактеристика чини велику разлику у успеху вашег модела. Замислите да покушавате да процените плату људи, ако не уврстите пол као коваријанту, на крају ћете добити лошу процену.
Други начин за побољшање модела је сагледавање корелације између независне променљиве. Да се вратимо на пример, образовање можете сматрати одличним кандидатом за предвиђање зараде, али и занимања. Поштено је рећи да занимање зависи од нивоа образовања, наиме високо образовање често доводи до бољег занимања. Ако генерализујемо ову идеју, можемо рећи да корелација између зависне променљиве и објашњене променљиве може да се увећа за још једну променљиву за објашњење.
Да бисмо ухватили ограничени ефекат образовања на занимање, можемо користити термин интеракције.
Ако погледате једначину надница, она постаје:
Ако је позитивно, онда то подразумева да додатни ниво образовања доноси већи пораст средње вредности куће за висок ниво занимања. Другим речима, постоји ефекат интеракције између образовања и занимања.
У овом упутству ћемо покушати да видимо које променљиве могу бити добар кандидат за појмове интеракције. Тестираћемо да ли додавање ове врсте информација доводи до бољег предвиђања цена.
У овом упутству ћете научити
- Збирна статистика
- Преглед аспеката
- Фацетс Дееп Диве
- Инсталирајте Фацет
- Преглед
- Графикон
- Фацетс Дееп Диве
- ТенсорФлов
- Подаци о припреми
- Основна регресија: Репер
- Побољшати модел: појам интеракције
Збирна статистика
Постоји неколико корака које можете следити пре него што наставите са моделом. Као што је раније поменуто, модел представља уопштавање података. Најбоља пракса је разумевање података и предвиђање. Ако не знате своје податке, имате мале шансе да побољшате свој модел.
Као први корак, учитајте податке као оквир података панде и направите скуп обуке и сет за тестирање.
Савети: За ово упутство, морате да инсталирате матплотлит и сеаборн у Питхон. Пакет Питхон можете да инсталирате у лету са Јупитером. Не би то требао радити
!conda install -- yes matplotlib
али
import sys!{sys.executable} -m pip install matplotlib # Already installed!{sys.executable} -m pip install seaborn
Имајте на уму да овај корак није потребан ако сте инсталирали матплотлиб и сеаборн.
Матплотлиб је библиотека за креирање графа у Питхону. Сеаборн је библиотека за статистичку визуализацију изграђена на врху матплотлиб-а. Пружа атрактивне и лепе парцеле.
Код испод увози потребне библиотеке.
import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np
Библиотека склеарн укључује скуп података из Бостона. Можете да позовете његов АПИ за увоз података.
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)
Конвертујете променљиву ЦХАС као променљиву у низу и означите је са да ако је ЦХАС = 1 и не ако је ЦХАС = 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 процената скупа тестирања. Панде имају уграђену функцију трошкова за поделу узорка оквира података.
Први параметар фрац је вредност од 0 до 1. Подесили сте га на 0,8 да бисте насумично одабрали 80 процената оквира података.
Рандом_стате омогућава враћање истог оквира података за све.
### 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)Оутпут
ЗЛОЧИН ЗН ИНДУС ЦХАС НОКС РМ ДОБА ДИС РАД ПОРЕЗ ПТРАТИО Б. ЛСТАТ ЦЕНА 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 Подаци су неуредни; често је неуравнотежен и посут страним вредностима које одбацују анализу и обуку за машинско учење.
Први корак ка чишћењу скупа података је разумевање где му је потребно чишћење. Чишћење скупа података може бити незгодно, нарочито на било који начин који се уопштава
Гоогле истраживачки тим развио је алатку за овај посао названу Фасете која помаже у визуализацији података и њиховом резању на све начине. Ово је добра полазна основа за разумевање начина постављања скупа података.
Фасете вам омогућавају да пронађете где подаци не изгледају баш онако како размишљате.
Осим њихове веб апликације, Гоогле олакшава уградњу алата у Јупитер бележницу.
Постоје два дела аспеката:
- Преглед аспеката
- Фацетс Дееп Диве
Преглед аспеката
Преглед фасета даје преглед скупа података. Преглед аспеката дели колоне података у редове истакнутих информација које се приказују
- проценат пропуштених посматрања
- мин и мак вредности
- статистика попут средње вредности, средње вредности и стандардне девијације.
- Такође додаје колону која приказује проценат вредности које су нуле, што је корисно када је већина вредности нула.
- Ове дистрибуције је могуће видети на скупу података за тестирање, као и сет обуке за сваку функцију. То значи да можете поново проверити да ли тест има сличну дистрибуцију као подаци о обуци.
Ово је најмање минимум који треба обавити пре било ког задатка машинског учења. Помоћу овог алата не пропуштате овај кључни корак и истичу неке абнормалности.
Фацетс Дееп Диве
Фацетс Дееп Диве је супер алат. Омогућава вам мало прегледности вашег скупа података и зумирање до краја да бисте видели појединачни податак. То значи да можете фасетирати податке редом и колоном преко било које од карактеристика скупа података.
Користићемо ова два алата са бостонским низом података.
Напомена : Не можете истовремено користити Преглед фасета и Дееп Диве. Прво треба да очистите свеску да бисте променили алат.
Инсталирајте Фацет
Већи део анализе можете да користите веб апликацију Фацет. У овом упутству ћете видети како се користи у Јупитер бележници.
Пре свега, морате инсталирати нбектенсионс. Готово је са овим кодом. Копирајте и залепите следећи код у терминал уређаја.
pip install jupyter_contrib_nbextensionsОдмах након тога, морате да клонирате спремишта на рачунару. Имате два избора:
Опција 1) Копирајте и залепите овај код у терминал (препоручује се)
Ако на вашем рачунару није инсталиран Гит, идите на ову УРЛ адресу хттпс://гит-сцм.цом/довнлоад/вин и следите упутства. Када завршите, можете да користите команду гит у терминалу за Мац кориснике или упит Анацонда за Виндовс кориснике
git clone https://github.com/PAIR-code/facetsОпција 2) Идите на хттпс://гитхуб.цом/ПАИР-цоде/фацетс и преузмите спремишта.
Ако одаберете прву опцију, датотека ће завршити у вашој датотеци за преузимање. Можете пустити датотеку да се преузме или је превући на другу путању.
Овом командном линијом можете проверити где се чувају фасете:
echo `pwd`/`ls facets`Сад кад сте лоцирали Фасете, морате га инсталирати у Јупитер Нотебоок. Морате подесити радни директоријум на путању на којој се налазе фасете.
Садашњи радни директоријум и локација зип-а Фацетс требају бити исти.
Морате усмерити радни директоријум на Фацет:
cd facetsДа бисте инсталирали фацете у Јупитер, имате две могућности. Ако сте инсталирали Јупитер са Цондом за све кориснике, копирајте овај код:
може користити јупитер нбектенсион инсталирати фацетс-дист /
jupyter nbextension install facets-dist/У супротном користите:
jupyter nbextension install facets-dist/ --userУ реду, све сте спремни. Отворимо Преглед аспеката.
Преглед
Преглед користи Питхон скрипту за израчунавање статистике. У Јупитер морате да увезете скрипту која се зове генериц_феатуре_статистицс_генератор. Не брините; скрипта се налази у фасет фајловима.
Морате да пронађете његов пут. То је лако учинити. Отворите фасете, отворите датотеку фацетс_овервиев, а затим питхон. Копирајте путању
После тога, вратите се Јупитеру и напишите следећи код. Промените путању '/ Усерс / Тхомас / фацетс / фацетс_овервиев / питхон' на вашу путању.
# 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Да бисте израчунали статистику карактеристика, потребно је да користите функцију ГенерицФеатуреСтатистицсГенератор () и користите објекат ПротоФромДатаФрамес. Оквир података можете проследити у речник. На пример, ако желимо да креирамо збирну статистику за гарнитуру возова, можемо податке сачувати у речнику и користити у објекту `ПротоФромДатаФрамес`
'name': 'train', 'table': 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")На крају, само копирајте и налепите код испод. Код долази директно са ГитХуб-а. Требали бисте бити у могућности да видите ово:
# 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})Оутпут
пнг
Из матрице можете видети:
- ЛСТАТ
- РМ
Снажно су повезани са ПРИЦЕ. Још једна узбудљива карактеристика је снажна позитивна корелација између НОКС и ИНДУС-а, што значи да се те две променљиве крећу у истом смеру. Поред тога, постоје и корелације са ЦЕНОМ. ДИС је такође у високој корелацији са ИНД и НОКС.
Имате први наговештај да ИНД и НОКС могу бити добри кандидати за термин пресретања и ДИС би такође могао бити занимљив за фокусирање.
Можете ући мало дубље цртајући парну мрежу. Детаљније ће илустровати мапу корелације коју сте претходно исцртали.
Мрежа парова коју смо саставили је следећа:
- Горњи део: Расејана парцела са уклопљеном линијом
- Дијагонала: Графикон густине зрна
- Доњи део: Мултиваријантна парцела густине зрна
Ви бирате фокус на четири независне променљиве. Избор одговара променљивим са јаком корелацијом са ПРИЦЕ
- ИНДУС
- НОКС
- РМ
- ЛСТАТ
штавише, ЦЕНА.
Имајте на уму да се стандардна грешка подразумевано додаје на табелу расејања.
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)Оутпут
Почнимо са горњим делом:
- Цена је у негативној корелацији са ИНДУС-ом, НОКС-ом и ЛСТАТ-ом; позитивно у корелацији са РМ.
- Постоји мало нелинеарност са ЛСТАТ-ом и ЦЕНОМ
- Постоји једна равна линија када је цена једнака 50. Из описа скупа података ПРИЦЕ је скраћен у вредности 50
Дијагонално
- Чини се да НОКС има два кластера, један око 0,5 и један око 0,85.
Да бисте проверили више о томе, можете погледати доњи део. Мултиваријатна густина зрна је занимљива у одређеном смислу и боји тамо где је већина тачака. Разлика са дијаграмом расејања црта густину вероватноће, иако у скупу података нема тачке за дату координату. Када је боја јача, то указује на високу концентрацију тачке око овог подручја.
Ако проверите мултиваријантну густину за ИНДУС и НОКС, можете видети позитивну корелацију и два кластера. Када је удео индустрије изнад 18, концентрација азотних оксида је изнад 0,6.
Можете размишљати о додавању интеракције између ИНДУС-а и НОКС-а у линеарном односу.
Коначно, можете да користите друге алате које је створио Гоогле, Фацетс Дееп Диве. Интерфејс је подељен у четири главна дела. Централно подручје у центру је приказ података који се може зумирати. На врху панела налази се падајући мени у којем можете променити распоред података да бисте контролисали фасетирање, позиционирање и боју. Са десне стране налази се детаљан приказ одређеног реда података. То значи да можете кликнути на било коју тачку података у визуализацији центра да бисте видели детаље о тој одређеној тачки података.
Током корака визуелизације података, заинтересовани сте за тражење упарене корелације између независне променљиве цене куће. Међутим, укључује најмање три променљиве, а 3Д графички прикази су сложени за рад.
Један од начина за решавање овог проблема је стварање категоричке променљиве. Односно, можемо створити 2Д цртеж у боји тачке. Варијаблу ПРИЦЕ можете поделити у четири категорије, при чему је свака категорија квартил (тј. 0,25, 0,5, 0,75). Ову нову променљиву називате К_ПРИЦЕ.
## 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")
Фацетс Дееп Диве
Да бисте отворили Дееп Диве, потребно је да трансформишете податке у јсон формат. Панде као објекат за то. То_јсон можете да користите након скупа података Пандас.
Први ред кода обрађује величину скупа података.
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')Доле наведени код долази од Гоогле ГитХуб-а. Након покретања кода, требали бисте бити у могућности да видите ово:
# 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)) Занима вас да ли постоји веза између индустријске стопе, концентрације оксида, удаљености од центра за посао и цене куће.
За то прво поделите податке према индустријском опсегу и бојама са квартилом цена:
- Изаберите фасетирање Кс и одаберите ИНДУС.
- Изаберите Дисплаи и ДИС. Обојиће тачке квартилом цене куће
овде тамније боје значе да је удаљеност до првог радног места далеко.
До сада, то поново показује оно што знате, нижа стопа у индустрији, већа цена. Сада можете погледати рашчламбу према ИНДУКС-у, према НОКС-у.
- Изаберите фасетирање И и одаберите НОКС.
Сада можете видети да кућа далеко од првог центра за запошљавање има најмањи удео у индустрији, а самим тим и најнижу концентрацију оксида. Ако одлучите да прикажете тип са К_ПРИЦЕ и зумирате доњи леви угао, можете видети о којој се цени ради.
Имате још један наговештај да интеракција између ИНД, НОКС и ДИС може бити добар кандидат за побољшање модела.
ТенсорФлов
У овом одељку ћете проценити линеарни класификатор помоћу АПИ-ја за процену ТенсорФлов. Наставићете како следи:
- Припремите податке
- Процените референтни модел: Нема интеракције
- Процените модел са интеракцијом
Запамтите, циљ машинског учења је минимизирање грешке. У овом случају победиће модел са најмањом средњом квадратном грешком. Процењивач ТенсорФлов аутоматски израчунава ову метрику.
Подаци о припреми
У већини случајева морате трансформисати податке. Због тога је Преглед аспеката фасцинантан. Из резиме статистике показали сте да постоје одступања. Те вредности утичу на процене јер не изгледају као популација коју анализирате. Оутлиери су обично пристрасни резултатима. На пример, позитивни одступајући тежи да прецени коефицијент.
Добро решење за решавање овог проблема је стандардизација променљиве. Стандардизација значи стандардно одступање јединице и средство нуле. Процес стандардизације укључује два корака. Пре свега, одузима средњу вредност променљиве. Друго, дели се варијансом тако да дистрибуција има јединствену варијансу
Библиотека склеарн је корисна за стандардизацију променљивих. У ту сврху можете користити претпрераду модула са скалом објекта.
Можете да користите доњу функцију за скалирање скупа података. Имајте на уму да не скалирате колону ознака и категоричке променљиве.
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)Основна регресија: Репер
Пре свега, тренирате и тестирате модел без интеракције. Сврха је видети метрику перформанси модела.
Начин да се обучи модел је управо онакав какав је водич за АПИ високог нивоа . Користићете ТенсорФлов процењивач ЛинеарРегрессор.
Подсећања ради, треба да изаберете:
- карактеристике које треба ставити у модел
- трансформишу особине
- конструисати линеарни регресор
- конструисати функцију инпут_фн
- обучи модел
- тестирати модел
За обуку модела користите све променљиве у скупу података. Укупно постоје елевантне континуиране променљиве и једна категоричка променљива
## 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'])]Модел креирате помоћу линеарРегрессор-а. Модел чувате у фасцикли траин_Бостон
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} Свака колона у подацима о возу или испитивању претвара се у тензор са функцијом гет_инпут_фн
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. Ово је показатељ који треба победити у следећем одељку
Побољшати модел: појам интеракције
Током првог дела водича видели сте занимљив однос између променљивих. Различите технике визуелизације откриле су да су ИНДУС и НОС повезани заједно и окрећу се како би се повећао ефекат на цену. Не само да интеракција између ИНДУС-а и НОС-а утиче на цену, већ је и овај ефекат јачи када комуницира са ДИС-ом.
Време је да генерализујемо ову идеју и видимо да ли можете побољшати модел предвиђен моделом.
У сваки скуп скупова података морате додати две нове колоне: воз + тест. За то креирате једну функцију за израчунавање термина интеракције, а другу за израчунавање члана троструке интеракције. Свака функција даје један ступац. Након што се креирају нове променљиве, можете их повезати у скуп података за обуку и тестни скуп података.
Пре свега, треба да направите нову променљиву за интеракцију између ИНДУС-а и НОКС-а.
Функција у наставку враћа два оквира података, обуку и тест, уз интеракцију између вар_1 и вар_2, у вашем случају ИНДУС и НОКС.
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 = 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. Само додавањем две нове променљиве, успели сте да смањите губитак. То значи да можете направити боље предвиђање него са референтним моделом.