Lineárna regresia TensorFlow s Facetom a Termín interakcie

Obsah:

Anonim

V tomto tutoriále sa naučíte, ako skontrolovať údaje a pripraviť ich na vytvorenie jednoduchej úlohy s lineárnou regresiou.

Tento výukový program je rozdelený na dve časti:

  • Hľadajte interakciu
  • Vyskúšajte model

V predchádzajúcom tutoriáli ste použili bostonský súbor údajov na odhad strednej ceny domu. Bostonský dátový súbor má malú veľkosť a má iba 506 pozorovaní. Tento súbor údajov sa považuje za referenčný údaj na vyskúšanie nových algoritmov lineárnej regresie.

Súbor údajov pozostáva z:

Variabilné Popis
zn Podiel obytných pozemkov rozdelených na zóny s veľkosťou viac ako 25 000 štvorcových stôp.
priemysel Podiel maloobchodných akrov na jedno mesto.
nox koncentrácia oxidov dusnatých
rm priemerný počet izieb na byt
Vek podiel jednotiek obývaných vlastníkmi postavených pred rokom 1940
dis vážené vzdialenosti do piatich bostonských zamestnaneckých centier
daň sadzba dane z nehnuteľností v plnej hodnote na 10 000 dolárov
ptratio pomer žiakov a učiteľov podľa mesta
medv Stredná hodnota domov obývaných vlastníkmi v tisícoch dolárov
krimpovať miera kriminality na obyvateľa podľa mesta
chas Fiktívna premenná Charles River (1, ak ohraničuje rieku; inak 0)
B podiel černochov v meste

V tomto výučbe odhadneme strednú cenu pomocou lineárneho regresora, ale pozornosť sa zameriava na jeden konkrétny proces strojového učenia: „príprava údajov“.

Model zovšeobecňuje vzor v dátach. Ak chcete takýto vzor zachytiť, musíte ho najskôr nájsť. Dobrým postupom je vykonať analýzu údajov pred spustením ľubovoľného algoritmu strojového učenia.

Výber tých správnych funkcií robí rozdiel v úspechu vášho modelu. Predstavte si, že sa pokúsite odhadnúť mzdu ľudí, ak nezaradíte pohlavie ako kovariát, skončíte so zlým odhadom.

Ďalším spôsobom, ako vylepšiť model, je pozrieť sa na koreláciu medzi nezávislou premennou. Späť k príkladu, o vzdelávaní si môžete myslieť ako o vynikajúcom kandidátovi na predpovedanie miezd, ale aj povolania. Je spravodlivé povedať, že povolanie závisí od úrovne vzdelania, konkrétne vysokoškolské vzdelávanie často vedie k lepšiemu povolaniu. Ak zovšeobecníme túto myšlienku, môžeme povedať, že korelácia medzi závislou premennou a vysvetľujúcou premennou môže byť zväčšená ešte o ďalšiu vysvetľujúcu premennú.

Aby sme zachytili obmedzený vplyv vzdelávania na povolanie, môžeme použiť výraz interakcie.

Ak sa pozriete na mzdovú rovnicu, stane sa:

Ak je kladné, znamená to, že ďalšia úroveň vzdelania prinesie vyššie zvýšenie mediánu hodnoty domu pre vyššiu úroveň zamestnania. Inými slovami, existuje interakčný efekt medzi vzdelaním a zamestnaním.

V tejto príručke sa pokúsime zistiť, ktoré premenné môžu byť dobrým kandidátom na interakčné výrazy. Vyskúšame, či pridanie tohto druhu informácií povedie k lepšej predikcii ceny.

V tomto návode sa naučíte

  • Súhrnná štatistika
  • Prehľad faziet
  • Fazety Deep Dive
  • Nainštalujte Facet
  • Prehľad
  • Graf
  • Fazety Deep Dive
  • TensorFlow
  • Údaje o príprave
  • Základná regresia: Benchmark
  • Vylepšiť model: Termín interakcie

Súhrnná štatistika

Pred pokračovaním v modeli môžete postupovať podľa niekoľkých krokov. Ako už bolo spomenuté vyššie, modelom je zovšeobecnenie údajov. Najlepšie sa hodí porozumieť údajom a urobiť predikciu. Ak nepoznáte svoje údaje, máte malú šancu vylepšiť svoj model.

Ako prvý krok načítajte údaje ako dátový rámec pandy a vytvorte tréningovú sadu a testovaciu sadu.

Tipy: Pre tento tutoriál musíte mať nainštalovaný matplotlit a seaborn v Pythone. Balík Python môžete inštalovať za behu pomocou Jupyteru. Toto by ste nemali robiť

!conda install -- yes matplotlib

ale

import sys!{sys.executable} -m pip install matplotlib # Already installed!{sys.executable} -m pip install seaborn

Upozorňujeme, že tento krok nie je potrebný, ak máte nainštalovaný matplotlib a seaborn.

Matplotlib je knižnica na vytváranie grafov v jazyku Python. Seaborn je štatistická vizualizačná knižnica postavená na matplotlibe. Poskytuje atraktívne a pekné pozemky.

Nasledujúci kód importuje potrebné knižnice.

import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np

Knižnica sklearn obsahuje bostonský súbor údajov. Môžete zavolať jeho API na import údajov.

boston = load_boston()df = pd.DataFrame(boston.data) 

Názov objektu je uložený v objekte feature_names v poli.

boston.feature_names

Výkon

array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='

Stĺpce môžete premenovať.

df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)

Premennú CHAS konvertujete ako reťazcovú premennú a označíte ju áno, ak CHAS = 1 a nie, ak CHAS = 0

df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: object

V prípade pand je jednoduché dataset rozdeliť. Náhodne rozdelíte množinu údajov s 80-percentnou tréningovou sadou a 20-percentnou testovacou sadou. Pandy majú zabudovanú funkciu nákladov na rozdelenie vzorky dátového rámca.

Prvý parameter frac má hodnotu od 0 do 1. Nastavíte ho na 0,8, aby ste náhodne vybrali 80 percent dátového rámca.

Random_state umožňuje mať pre všetkých rovnaký dátový rámec.

### Create train/test setdf_train=df.sample(frac=0.8,random_state=200)df_test=df.drop(df_train.index)

Môžete získať tvar údajov. To by malo byť:

  • Vlaková súprava: 506 * 0,8 = 405
  • Testovacia sada: 506 * 0,2 = 101
print(df_train.shape, df_test.shape)

Výkon

(405, 14) (101, 14) 
df_test.head(5)

Výkon

KRIM ZN INDUS CHAS NOX RM VEK DIS RAD DANE PTRATIO B LSTAT CENA
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

Údaje sú chaotické; je to často nevyvážené a posypané odľahlými hodnotami, ktoré zavrhujú analýzu a školenie strojového učenia.

Prvým krokom k vyčisteniu množiny údajov je pochopenie toho, kde je potrebné vyčistiť. Vyčistenie súboru údajov môže byť zložité, najmä akýmkoľvek zovšeobecniteľným spôsobom

Tím spoločnosti Google Research vyvinul pre túto prácu nástroj nazvaný Facets, ktorý pomáha vizualizovať údaje a rozdeliť ich rôznymi spôsobmi. Toto je dobrý východiskový bod na pochopenie toho, ako je usporiadaný súbor údajov.

Fazety vám umožňujú zistiť, kde údaje celkom nevyzerajú tak, ako si myslíte.

Okrem svojej webovej aplikácie Google uľahčuje vloženie sady nástrojov do notebooku Jupyter.

Fazety majú dve časti:

  • Prehľad faziet
  • Fazety Deep Dive

Prehľad faziet

Prehľad faziet poskytuje prehľad o množine údajov. Prehľad faziet rozdelí stĺpce s údajmi do riadkov s najvýznamnejšími informáciami

  1. percento chýbajúcich pozorovaní
  2. min. a max. hodnoty
  3. štatistické údaje, ako je priemer, medián a štandardná odchýlka.
  4. Pridá tiež stĺpec, ktorý zobrazuje percento hodnôt, ktoré sú nulové, čo je užitočné, keď je väčšina hodnôt nulová.
  5. Je možné vidieť tieto distribúcie v testovacom súbore údajov, ako aj v tréningovej sade pre každú funkciu. To znamená, že môžete dvakrát skontrolovať, či má test podobné rozdelenie ako údaje o tréningu.

Je to minimálne to, čo musíte urobiť pred akoukoľvek úlohou strojového učenia. Pomocou tohto nástroja vám tento rozhodujúci krok neunikne a zvýrazňuje niektoré abnormality.

Fazety Deep Dive

Facets Deep Dive je skvelý nástroj. Umožní vám to trochu objasniť vašu množinu údajov a priblížiť ju úplne, aby ste videli jednotlivé údaje. To znamená, že môžete fazetovať údaje podľa riadkov a stĺpcov v rámci ktorejkoľvek z funkcií množiny údajov.

Tieto dva nástroje použijeme s bostonským súborom údajov.

Poznámka : Facets Overview a Facets Deep Dive nemôžete používať súčasne. Pred výmenou nástroja musíte najskôr notebook vyčistiť.

Nainštalujte Facet

Na väčšinu analýz môžete použiť webovú aplikáciu Facet. V tomto tutoriáli uvidíte, ako ho používať v notebooku Jupyter.

Najskôr je potrebné nainštalovať ďalšie rozšírenia. Týmto kódom sa to deje. Nasledujúci kód skopírujete a prilepíte do terminálu vášho zariadenia.

pip install jupyter_contrib_nbextensions 

Hneď potom budete musieť klonovať úložiská v počítači. Máte dve možnosti:

Možnosť 1) Skopírujte a vložte tento kód do terminálu (odporúčané)

Ak nemáte vo svojom počítači nainštalovaný Git, prejdite na túto adresu URL https://git-scm.com/download/win a postupujte podľa pokynov. Po dokončení môžete použiť príkaz git v termináli pre používateľa systému Mac User alebo Anaconda pre používateľa systému Windows

git clone https://github.com/PAIR-code/facets 

Možnosť 2) Prejdite na adresu https://github.com/PAIR-code/facets a stiahnite si úložiská.

Ak vyberiete prvú možnosť, súbor sa skončí v súbore na stiahnutie. Môžete buď nechať súbor stiahnuť, alebo ho pretiahnuť na inú cestu.

Pomocou tohto príkazového riadku môžete skontrolovať, kde sú fazety uložené:

echo `pwd`/`ls facets` 

Teraz, keď ste našli fazety, musíte si ich nainštalovať do Jupyter Notebook. Musíte nastaviť pracovný adresár na cestu, kde sa nachádzajú fazety.

Váš súčasný pracovný adresár a umiestnenie fazetového zipsu by mali byť rovnaké.

Pracovný adresár musíte nasmerovať na Facet:

cd facets

Ak chcete nainštalovať fazety v Jupyteri, máte dve možnosti. Ak ste nainštalovali Jupyter s Condom pre všetkých používateľov, skopírujte tento kód:

môžete použiť jupyter nbextension inštalovať fazety-dist /

jupyter nbextension install facets-dist/

V opačnom prípade použite:

jupyter nbextension install facets-dist/ --user

Dobre, všetko je pripravené. Poďme si otvoriť Facet Overview.

Prehľad

Prehľad na výpočet štatistík používa skript v jazyku Python. Musíte importovať skript s názvom generic_feature_statistics_generator do Jupyteru. Nebojte sa; skript je umiestnený v súboroch faziet.

Musíte nájsť jeho cestu. Ľahko sa to robí. Otvoríte fazety, otvoríte súbor facets_overview a potom python. Skopírujte cestu

Potom sa vráťte späť k Jupyterovi a napíšte nasledujúci kód. Zmeňte cestu '/ Users / Thomas / facets / facets_overview / python' na svoju cestu.

# Add the facets overview python code to the python path# Add timport syssys.path.append('/Users/Thomas/facets/facets_overview/python')

Skript môžete importovať pomocou kódu uvedeného nižšie.

from generic_feature_statistics_generator importGenericFeatureStatisticsGenerator

V oknách sa stáva rovnaký kód

import syssys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator

Na výpočet štatistík funkcií musíte použiť funkciu GenericFeatureStatisticsGenerator () a objekt ProtoFromDataFrames. Dátový rámec môžete preniesť do slovníka. Napríklad, ak chceme vytvoriť súhrnnú štatistiku pre vlakovú súpravu, môžeme informácie uložiť do slovníka a použiť ich v objekte „ProtoFromDataFrames“

  • 'name': 'train', 'table': df_train 

Názov je názov zobrazenia tabuľky a na výpočet súhrnu použijete názov tabuľky, ktorú chcete. Vo vašom príklade je tabuľka obsahujúca údaje 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")

Nakoniec iba skopírujete a prilepíte nižšie uvedený kód. Kód pochádza priamo z GitHubu. Mali by ste byť schopní vidieť toto:

# 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))

Graf

Po skontrolovaní údajov a ich distribúcie môžete vykresliť korelačnú maticu. Korelačná matica počíta Pearsonov koeficient. Tento koeficient je viazaný medzi -1 a 1, pričom kladná hodnota označuje pozitívnu koreláciu a záporná hodnota negatívnu koreláciu.

Zaujíma vás, ktoré premenné môžu byť dobrým kandidátom na interakčné výrazy.

## 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})

Výkon

png

Z matice môžete vidieť:

  • LSTAT
  • RM

Silne korelujú s cenou PRICE. Ďalšou vzrušujúcou vlastnosťou je silná pozitívna korelácia medzi NOX a INDUS, čo znamená, že tieto dve premenné sa pohybujú rovnakým smerom. Okrem toho existujú aj korelácie s cenou. DIS tiež vysoko koreluje s IND a NOX.

Máte nejaký prvý náznak, že IND a NOX môžu byť dobrými kandidátmi na odpočúvací termín a na DIS by mohlo byť tiež zaujímavé zamerať sa.

Vynesením párovej mriežky môžete ísť trochu hlbšie. Detailnejšie ilustruje korelačnú mapu, ktorú ste predtým vykreslili.

Párová mriežka, ktorú sme vytvorili, je nasledovná:

  • Horná časť: Bodový graf s čiarou
  • Uhlopriečka: graf hustoty jadra
  • Spodná časť: Mnohorozmerný graf hustoty jadra

Vyberiete zameranie na štyri nezávislé premenné. Voľba zodpovedá premenným so silnou koreláciou s PRICE

  • INDUS
  • NOX
  • RM
  • LSTAT

navyše CENA.

Všimnite si , že štandardná chyba je štandardne pridaná k bodovému grafu.

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)

Výkon

Začnime hornou časťou:

  • Cena negatívne koreluje s INDUS, NOX a LSTAT; pozitívne koreluje s RM.
  • Pri LSTAT a PRICE je mierne nelineárnosť
  • Cena sa rovná 50 ako čiara. Z popisu množiny údajov sa cena PRICE skrátila na hodnotu 50.

Diagonálne

  • Zdá sa, že NOX má dva zhluky, jeden okolo 0,5 a jeden okolo 0,85.

Ak sa chcete dozvedieť viac, môžete sa pozrieť na spodnú časť. Multivariačná hustota jadra je zaujímavá v tom zmysle, že farbí väčšinu bodov. Rozdiel oproti bodovému grafu vykresľuje hustotu pravdepodobnosti, aj keď v danej množine údajov pre danú súradnicu nemá zmysel. Ak je farba silnejšia, znamená to, že okolo tejto oblasti je vysoká koncentrácia bodu.

Ak skontrolujete viacrozmernú hustotu pre INDUS a NOX, môžete vidieť pozitívnu koreláciu a dva klastre. Ak je podiel priemyslu nad 18, koncentrácia oxidov dusnatých je nad 0,6.

Môžete uvažovať o pridaní interakcie medzi INDUS a NOX v lineárnom vzťahu.

Na záver môžete použiť druhé nástroje vytvorené spoločnosťou Google, Facets Deep Dive. Rozhranie je rozdelené do štyroch hlavných častí. Stredná oblasť v strede je zväčšiteľné zobrazenie údajov. V hornej časti panela sa nachádza rozbaľovacia ponuka, kde môžete zmeniť usporiadanie údajov tak, aby ovládali fazetovanie, umiestňovanie a farbu. Vpravo je podrobný pohľad na konkrétny riadok údajov. Znamená to, že môžete kliknúť na ľubovoľnú bodku údajov vo vizualizácii centra a zobraziť podrobnosti o konkrétnom dátovom bode.

Počas kroku vizualizácie údajov vás zaujíma hľadanie párovej korelácie medzi nezávislou premennou a cenou domu. Zahŕňa však najmenej tri premenné a s 3D grafmi sa pracuje komplikovane.

Jedným zo spôsobov riešenia tohto problému je vytvorenie kategorickej premennej. To znamená, že môžeme vytvoriť 2D graf a vyfarbiť bodku. Premennú CENA môžete rozdeliť do štyroch kategórií, pričom každá kategória je kvartil (tj. 0,25, 0,5, 0,75). Túto novú premennú nazývate 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")

Fazety Deep Dive

Ak chcete otvoriť program Deep Dive, musíte údaje transformovať do formátu JSON. Pandy ako objekt na to. Môžete použiť to_json po datasete Pandas.

Prvý riadok kódu spracováva veľkosť množiny údajov.

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')

Kód uvedený nižšie pochádza z Google GitHub. Po spustení kódu by ste mali vidieť toto:

# 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))

Zaujíma vás, či existuje súvislosť medzi rýchlosťou odvetvia, koncentráciou oxidov, vzdialenosťou od ústredia práce a cenou domu.

Za týmto účelom najskôr rozdelíte údaje podľa odvetvového rozsahu a farieb pomocou cenového kvartilu:

  • Vyberte fazetovanie X a zvoľte INDUS.
  • Vyberte Displej a zvoľte DIS. Zafarbuje bodky kvartilom ceny domu

tu tmavšie farby znamenajú, že vzdialenosť od prvého centra práce je ďaleko.

Zatiaľ to opäť ukazuje, čo viete, nižšia miera odvetvia, vyššia cena. Teraz sa môžete pozrieť na rozdelenie podľa INDUXU, podľa NOX.

  • Vyberte fazetovanie Y a zvoľte NOX.

Teraz vidíte, že dom ďaleko od prvého úradu práce má najnižší podiel v priemysle, a teda aj najnižšiu koncentráciu oxidov. Ak sa rozhodnete zobraziť typ s Q_PRICE a priblížiť ľavý dolný roh, uvidíte, o aký typ ceny ide.

Máte ďalší náznak, že interakcia medzi IND, NOX a DIS môže byť dobrým kandidátom na vylepšenie modelu.

TensorFlow

V tejto časti budete odhadovať lineárny klasifikátor pomocou API odhadov TensorFlow. Budete postupovať nasledovne:

  • Pripravte údaje
  • Odhadnite referenčný model: Žiadna interakcia
  • Odhadnite model s interakciou

Pamätajte, že cieľom strojového učenia je minimalizácia chyby. V takom prípade zvíťazí model s najmenšou strednou druhou chybou. Odhadovač TensorFlow túto metriku automaticky počíta.

Údaje o príprave

Vo väčšine prípadov musíte svoje údaje transformovať. Preto je Facets Overview fascinujúci. Zo súhrnnej štatistiky ste videli, že existujú mimoriadne hodnoty. Tieto hodnoty ovplyvňujú odhady, pretože nevyzerajú ako populácia, ktorú analyzujete. Odľahlé hodnoty zvyčajne ovplyvnili výsledky. Napríklad pozitívna odľahlá hodnota má tendenciu nadhodnocovať koeficient.

Dobrým riešením na riešenie tohto problému je štandardizácia premennej. Štandardizácia znamená štandardnú odchýlku jedna a nulu. Proces štandardizácie zahŕňa dva kroky. Najskôr odčíta strednú hodnotu premennej. Po druhé, vydelí sa odchýlkou, takže distribúcia má jednotkovú odchýlku

Knižnica sklearn je užitočná pri štandardizácii premenných. Na tento účel môžete použiť predspracovanie modulu s mierkou objektov.

Pomocou nasledujúcej funkcie môžete škálovať množinu údajov. Upozorňujeme, že nemeníte mierku stĺpca štítku a kategorických premenných.

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

Pomocou tejto funkcie môžete zostaviť zmenšený vlak / testovaciu súpravu.

df_train_scale = standardize_data(df_train)df_test_scale = standardize_data(df_test) 

Základná regresia: Benchmark

Najskôr trénujete a testujete model bez interakcie. Účelom je vidieť metriku výkonu modelu.

Spôsob, ako trénovať model, je presne ako tutoriál o rozhraní API na vysokej úrovni . Použijete odhadovač TensorFlow LinearRegressor.

Pripomíname, že je potrebné zvoliť:

  • funkcie, ktoré má model obsahovať
  • transformovať funkcie
  • zostrojiť lineárny regresor
  • zostrojiť funkciu input_fn
  • trénovať model
  • otestovať model

Na trénovanie modelu použijete všetky premenné v množine údajov. Celkovo existuje jedenásť spojitých premenných a jedna kategorická premenná

## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']CATE_FEATURES = ['CHAS']

Funkcie prevádzate do číselného alebo kategorického stĺpca

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 vytvoríte pomocou linearRegressor. Model uložíte do priečinka train_Boston

model = tf.estimator.LinearRegressor(model_dir="train_Boston",feature_columns=categorical_features + continuous_features)

Výkon

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}

Každý stĺpec vo vlaku alebo údaje o teste sa prevádzajú na tenzor pomocou funkcie 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 odhadujete na základe údajov o vlaku.

model.train(input_fn=get_input_fn(df_train_scale,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)

Výkon

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.

Nakoniec odhadnete výkony modelu na testovacej súprave

model.evaluate(input_fn=get_input_fn(df_test_scale,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)

Výkon

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}

Strata modelu je 1650. Toto je metrika, ktorú treba poraziť v nasledujúcej časti

Vylepšiť model: Termín interakcie

Počas prvej časti tutoriálu ste videli zaujímavý vzťah medzi premennými. Rôzne vizualizačné techniky odhalili, že INDUS a NOS sú navzájom spojené a otáčajú sa, aby sa zväčšil vplyv na cenu. Na cenu nemá vplyv iba interakcia medzi INDUS a NOS, ale tento efekt je silnejší aj pri interakcii s DIS.

Je čas zovšeobecniť túto myšlienku a zistiť, či môžete vylepšiť predpovedaný model.

Do každej množiny súborov údajov musíte pridať dva nové stĺpce: vlak + test. Za týmto účelom vytvoríte jednu funkciu na výpočet termínu interakcie a ďalšiu na výpočet termínu trojitej interakcie. Každá funkcia vytvára jeden stĺpec. Po vytvorení nových premenných ich môžete zreťaziť do množiny výcvikových údajov a množiny údajov na testovanie.

Najskôr je potrebné vytvoriť novú premennú pre interakciu medzi INDUS a NOX.

Nasledujúca funkcia vráti dva dátové rámce, trénovať a testovať, s interakciou medzi var_1 a var_2, vo vašom prípade INDUS a 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

Uložíte dva nové stĺpce

interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')interation_ind_ns_train.shape(325,)

Po druhé, vytvoríte druhú funkciu na výpočet termínu trojitej interakcie.

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')

Teraz, keď máte všetky potrebné stĺpce, ich môžete pridať na školenie a testovanie množiny údajov. Pomenujete tieto dva nové dátové rámce:

  • 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)

Výkon

Toto je to; môžete odhadnúť nový model s podmienkami interakcie a zistiť, aká je metrika výkonnosti.

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)

Výkon

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}

KÓD

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)

Výkon

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)

Výkon

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}

Nová strata je 1515. Iba pridaním dvoch nových premenných sa vám podarilo stratu znížiť. Znamená to, že môžete urobiť lepšiu predpoveď ako s referenčným modelom.