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: objectV 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
- percento chýbajúcich pozorovaní
- min. a max. hodnoty
- štatistické údaje, ako je priemer, medián a štandardná odchýlka.
- Pridá tiež stĺpec, ktorý zobrazuje percento hodnôt, ktoré sú nulové, čo je užitočné, keď je väčšina hodnôt nulová.
- 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_nbextensionsHneď 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/facetsMož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 facetsAk 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/ --userDobre, 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 importGenericFeatureStatisticsGeneratorV 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 GenericFeatureStatisticsGeneratorNa 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_trainNá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_scalePomocou 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, testUloží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.