V tej vadnici boste izvedeli, kako preveriti podatke in jih pripraviti, da ustvarite preprosto nalogo linearne regresije.
Ta vadnica je razdeljena na dva dela:
- Poiščite interakcijo
- Preizkusite model
V prejšnji vadnici ste uporabili nabor podatkov iz Bostona za oceno mediane cene hiše. Nabor podatkov iz Bostona je majhen in ima le 506 opazovanj. Ta nabor podatkov se šteje kot merilo za preizkušanje novih algoritmov linearne regresije.
Nabor podatkov je sestavljen iz:
Spremenljiv | Opis |
zn | Delež stanovanjskih zemljišč, opredeljenih za parcele nad 25.000 kvadratnih metrov. |
indus | Delež neprodajnih poslovnih hektarjev na mesto. |
nox | koncentracija dušikovih oksidov |
rm | povprečno število sob na stanovanje |
starost | delež lastniških enot, zgrajenih pred 1940 |
dis | tehtane razdalje do petih bostonskih zaposlitvenih centrov |
davek | stopnja davka na nepremičnine v polni vrednosti na 10.000 dolarjev |
ptratio | razmerje med učenci in učitelji po mestu |
medv | Mediana vrednosti lastniških domov v tisočih dolarjev |
kriminala | stopnja kriminala na prebivalca po mestih |
chas | Preskusna spremenljivka reke Charles (1, če omejuje reko; 0 sicer) |
B | delež črncev v mestu |
V tej vadnici bomo povprečno ceno ocenili z uporabo linearnega regresorja, vendar je poudarek na določenem postopku strojnega učenja: "priprava podatkov".
Model posploši vzorec v podatkih. Če želite zajeti tak vzorec, ga morate najprej najti. Dobra praksa je, da pred izvajanjem katerega koli algoritma strojnega učenja opravite analizo podatkov.
Izbira pravih funkcij naredi velik vpliv na uspeh vašega modela. Predstavljajte si, da poskušate oceniti plačo ljudi, če spola ne vključite kot kovariate, boste na koncu dobili slabo oceno.
Drug način za izboljšanje modela je pogled na korelacijo med neodvisno spremenljivko. Če se vrnemo k primeru, lahko o izobraževanju razmišljate kot o odličnem kandidatu za napovedovanje plače, pa tudi poklica. Pošteno je reči, da je poklic odvisen od stopnje izobrazbe, visokošolsko izobraževanje namreč pogosto vodi do boljšega poklica. Če posplošimo to idejo, lahko rečemo, da je povezavo med odvisno spremenljivko in razlagalno spremenljivko mogoče povečati še z eno razlagalno spremenljivko.
Da bi zajeli omejen učinek izobraževanja na poklic, lahko uporabimo izraz interakcije.
Če pogledate enačbo plače, postane:
Če je pozitivno, to pomeni, da dodatna stopnja izobrazbe povzroči višje povečanje mediane vrednosti hiše za visoko stopnjo zasedenosti. Z drugimi besedami, obstaja učinek interakcije med izobraževanjem in poklicem.
V tej vadnici bomo poskusili ugotoviti, katere spremenljivke so lahko dober kandidat za izraze interakcije. Preizkusili bomo, ali dodajanje tovrstnih informacij vodi k boljši napovedi cen.
V tej vadnici boste izvedeli
- Povzetek statistike
- Pregled faset
- Faseti globoko potapljanje
- Namestite Facet
- Pregled
- Graf
- Faseti globoko potapljanje
- TensorFlow
- Podatki o pripravi
- Osnovna regresija: Benchmark
- Izboljšajte model: Pojem interakcije
Povzetek statistike
Preden nadaljujete z modelom, lahko sledite nekaj korakom. Kot smo že omenili, je model posploševanje podatkov. Najboljša praksa je razumevanje podatkov in napovedovanje. Če ne poznate svojih podatkov, imate majhne možnosti za izboljšanje svojega modela.
Kot prvi korak naložite podatke kot podatkovni okvir pandas in ustvarite vadbeni in preskusni niz.
Namigi: Za to vadnico morate v Pythonu namestiti matplotlit in seaborn. Paket Python lahko z Jupyterjem sproti namestite. Tega ne bi smel početi
!conda install -- yes matplotlib
ampak
import sys!{sys.executable} -m pip install matplotlib # Already installed!{sys.executable} -m pip install seaborn
Upoštevajte, da ta korak ni potreben, če imate nameščene matplotlib in seaborn.
Matplotlib je knjižnica za ustvarjanje grafa v Pythonu. Seaborn je statistična knjižnica za vizualizacijo, zgrajena na vrhu matplotlib. Ponuja privlačne in lepe parcele.
Spodnja koda uvozi potrebne knjižnice.
import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np
Knjižnica sklearn vključuje nabor podatkov iz Bostona. Za uvoz podatkov lahko pokličete njegov API.
boston = load_boston()df = pd.DataFrame(boston.data)
Imena lastnosti so shranjena v objektu feature_names v polju.
boston.feature_names
Izhod
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='Stolpce lahko preimenujete.
df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)
Spremenljivko CHAS pretvorite v spremenljivko v nizu in jo označite z da, če je CHAS = 1, in ne, če je CHAS = 0
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: objectPri pandah je nabor podatkov enostavno razdeliti. Nabor podatkov naključno razdelite z 80-odstotnim naborom vadbe in 20-odstotnim naborom testiranja. Pande imajo vgrajeno funkcijo stroškov za razdelitev vzorca podatkovnega okvira.
Prvi parameter frac je vrednost od 0 do 1. Nastavite ga na 0,8, da naključno izberete 80 odstotkov podatkovnega okvira.
Random_state omogoča vrnitev istega podatkovnega okvira za vse.
### Create train/test setdf_train=df.sample(frac=0.8,random_state=200)df_test=df.drop(df_train.index)Dobite lahko obliko podatkov. Mora biti:
- Komplet vlakov: 506 * 0,8 = 405
- Testni komplet: 506 * 0,2 = 101
print(df_train.shape, df_test.shape)Izhod
(405, 14) (101, 14)df_test.head(5)Izhod
KRIMINAL ZN INDUS ČAS NOX RM STAROST DIS RAD DAVEK PTRATIO B LSTAT CENA 0 0,00632 18,0 2.31 št 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 št 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 št 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 št 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 št 0,524 6.172 96.1 5.9505 5.0 311,0 15.2 396,90 19.15 27.1 Podatki so neurejeni; pogosto je neuravnoteženo in posuto z nenavadnimi vrednotami, ki zavržejo analizo in usposabljanje za strojno učenje.
Prvi korak k čiščenju nabora podatkov je razumevanje, kje ga je treba očistiti. Čiščenje nabora podatkov je lahko težavno, zlasti na kakršen koli način, ki ga je mogoče posplošiti
Skupina Google Research je za to delo razvila orodje, imenovano Facets (Faceti), ki pomaga vizualizirati podatke in jih razrezati na vse mogoče načine. To je dobro izhodišče za razumevanje postavitve nabora podatkov.
Fasete vam omogočajo, da ugotovite, kje podatki niso videti tako, kot razmišljate.
Google poleg njihove spletne aplikacije olajša vdelavo orodja v Jupyterjev zvezek.
Faseta ima dva dela:
- Pregled faset
- Faseti globoko potapljanje
Pregled faset
Pregled faset daje pregled nabora podatkov. Pregled faset stolpce podatkov razdeli v vrstice vidnih informacij, ki se prikažejo
- odstotek manjkajočega opazovanja
- vrednosti min in max
- statistike, kot so povprečje, mediana in standardni odklon.
- Doda tudi stolpec, ki prikazuje odstotek vrednosti, ki so ničle, kar je koristno, če je večina vrednosti nič.
- Te porazdelitve je mogoče videti na testnem naboru podatkov in naboru usposabljanja za vsako funkcijo. To pomeni, da lahko dvakrat preverite, ali ima test podobno porazdelitev kot podatki o vadbi.
To je vsaj minimalno, kar morate storiti pred katero koli nalogo strojnega učenja. S tem orodjem tega ključnega koraka ne zamudite in poudarja nekatere nepravilnosti.
Faseti globoko potapljanje
Facets Deep Dive je kul orodje. Omogoča nekaj jasnosti nabora podatkov in povečavo do konca, da si ogledate posamezen del podatkov. To pomeni, da lahko podatke fasetirate po vrsticah in stolpcih v kateri koli funkciji nabora podatkov.
Ta dva orodja bomo uporabili z naborom podatkov iz Bostona.
Opomba : Ne morete hkrati uporabljati Faceset Overview in Faceset Deep Dive. Najprej morate očistiti zvezek, da spremenite orodje.
Namestite Facet
Za večino analiz lahko uporabite spletno aplikacijo Facet. V tej vadnici boste videli, kako jo uporabljati v Jupyterjevem zvezku.
Najprej morate namestiti razširitve nbextensions. To je storjeno s to kodo. Naslednjo kodo kopirate in prilepite v terminal naprave.
pip install jupyter_contrib_nbextensionsTakoj zatem morate klonirati skladišča v računalniku. Na voljo imate dve možnosti:
Možnost 1) Kopirajte in prilepite to kodo v terminal (priporočeno)
Če na vaši napravi ni nameščen Git, pojdite na ta URL https://git-scm.com/download/win in sledite navodilom. Ko končate, lahko uporabite ukaz git v terminalu za uporabnika Mac ali poziv Anaconda za uporabnika sistema Windows
git clone https://github.com/PAIR-code/facets2. možnost) Pojdite na https://github.com/PAIR-code/facets in prenesite repozitorije.
Če izberete prvo možnost, se datoteka konča v datoteki za prenos. Datoteko lahko prenesete ali jo povlečete na drugo pot.
S to ukazno vrstico lahko preverite, kje so shranjene fasete:
echo `pwd`/`ls facets`Zdaj, ko ste našli Facete, ga morate namestiti v Jupyter Notebook. Delovni imenik morate nastaviti na pot, kjer so fasete.
Trenutni delovni imenik in lokacija zipke Facets morata biti enaka.
Delovni imenik morate usmeriti na Facet:
cd facetsZa namestitev faset v Jupyter imate dve možnosti. Če ste Jupyter namestili s programom Conda za vse uporabnike, kopirajte to kodo:
lahko uporabite jupyter nbextension namestite facets-dist /
jupyter nbextension install facets-dist/V nasprotnem primeru uporabite:
jupyter nbextension install facets-dist/ --userV redu, vse ste pripravljeni. Odprimo Pregled faset.
Pregled
Overview za izračun statistike uporablja skript Python. V Jupyter morate uvoziti skript, imenovan generic_feature_statistics_generator. Ne skrbite; skript se nahaja v datotekah faset.
Locirati morate njegovo pot. To je enostavno narediti. Odprete fasete, odprete datoteko facets_overview in nato python. Kopirajte pot
Po tem se vrnite v Jupyter in napišite naslednjo kodo. Spremenite pot '/ Users / Thomas / facets / facets_overview / python' na svojo pot.
# Add the facets overview python code to the python path# Add timport syssys.path.append('/Users/Thomas/facets/facets_overview/python')Skript lahko uvozite s spodnjo kodo.
from generic_feature_statistics_generator importGenericFeatureStatisticsGeneratorV oknih postane ista koda
import syssys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")from generic_feature_statistics_generator import GenericFeatureStatisticsGeneratorZa izračun statistike funkcij morate uporabiti funkcijo GenericFeatureStatisticsGenerator () in uporabite objekt ProtoFromDataFrames. Podatkovni okvir lahko prenesete v slovar. Če želimo na primer ustvariti zbirno statistiko za vlak, lahko podatke shranimo v slovar in jih uporabimo v objektu "ProtoFromDataFrames"
'name': 'train', 'table': df_trainName je ime prikazane tabele, vi pa uporabite ime tabele, za katero želite izračunati povzetek. V vašem primeru je tabela s podatki 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")Nazadnje samo kopirate in prilepite spodnjo kodo. Koda prihaja neposredno iz GitHub. To bi morali videti:
# 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
Ko preverite podatke in njihovo porazdelitev, lahko narišete korelacijsko matrico. Korelacijska matrika izračuna Pearsonov koeficient. Ta koeficient je vezan med -1 in 1, pozitivna vrednost pomeni pozitivno korelacijo, negativna vrednost pa negativno korelacijo.
Zanima vas, katere spremenljivke so lahko dober kandidat za pogoje interakcije.
## 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})Izhod
png
Iz matrike lahko vidite:
- LSTAT
- RM
So močno povezani s PRICE. Druga vznemirljiva lastnost je močna pozitivna povezava med NOX in INDUS, kar pomeni, da se ti dve spremenljivki premikata v isti smeri. Poleg tega obstajajo tudi korelacije s CENO. DIS je tudi močno povezan z IND in NOX.
Najprej namigujete, da sta IND in NOX lahko dobra kandidata za prestrezanje, DIS pa bi se lahko tudi zanimivo osredotočil.
Z načrtovanjem parne mreže lahko greste nekoliko globlje. Podrobneje bo ponazoril korelacijski zemljevid, ki ste ga narisali prej.
Mreža parov, ki jo sestavljamo, je naslednja:
- Zgornji del: raztresena ploskev z vgrajeno črto
- Diagonala: Graf gostote jeder
- Spodnji del: Načrt gostote zrn z več spremenljivkami
Osredotočite se na štiri neodvisne spremenljivke. Izbira ustreza spremenljivkam z močno korelacijo s PRICE
- INDUS
- NOX
- RM
- LSTAT
poleg tega CENA.
Upoštevajte, da je standardna napaka privzeto dodana na razpršeni diagram.
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)Izhod
Začnimo z zgornjim delom:
- Cena je v negativni korelaciji z INDUS, NOX in LSTAT; pozitivno koreliral z RM.
- Z LSTAT in CENO je nekoliko nelinearnost
- Obstaja kot ravna črta, ko je cena enaka 50. Iz opisa nabora podatkov je bila PRICE okrnjena na vrednost 50
Diagonalno
- Zdi se, da ima NOX dve grozdi, eno okoli 0,5 in drugo okoli 0,85.
Če želite več o tem preveriti, si oglejte spodnji del. Multivariatna jedrna gostota je zanimiva v nekem smislu, kjer obarva večino točk. Razlika z razpršenostjo nariše gostoto verjetnosti, čeprav v naboru podatkov za določeno koordinato ni točke. Ko je barva močnejša, to kaže na visoko koncentracijo točke okoli tega območja.
Če preverite multivariatno gostoto za INDUS in NOX, lahko vidite pozitivno korelacijo in dve grozdi. Ko je delež industrije nad 18, je koncentracija dušikovih oksidov nad 0,6.
Razmislite lahko o dodajanju interakcije med INDUS-om in NOX-om v linearnem razmerju.
Na koncu lahko uporabite drugo orodje, ki ga je ustvaril Google, Facets Deep Dive. Vmesnik je razdeljen na štiri glavne odseke. Osrednje območje v sredini je prikaz podatkov, ki ga je mogoče povečati. Na vrhu plošče je spustni meni, kjer lahko spremenite razporeditev podatkov tako, da nadzoruje fasetiranje, pozicioniranje in barvo. Na desni je podroben pogled na določeno vrsto podatkov. To pomeni, da lahko v vizualizaciji središča kliknete katero koli piko podatkov, da si ogledate podrobnosti o tej podatkovni točki.
Med korakom vizualizacije podatkov vas zanima parna korelacija med neodvisno spremenljivko cene hiše. Vsebuje pa vsaj tri spremenljivke, 3D-ploskve pa so zapletene za delo.
Eden od načinov za reševanje tega problema je ustvarjanje kategorične spremenljivke. To pomeni, da lahko ustvarimo 2D ploskev v barvi pike. Spremenljivko PRICE lahko razdelite v štiri kategorije, pri čemer je vsaka kategorija kvartil (tj. 0,25, 0,5, 0,75). To novo spremenljivko pokličete 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")
Faseti globoko potapljanje
Če želite odpreti Deep Dive, morate podatke pretvoriti v json format. Pande kot predmet za to. To_json lahko uporabite za naborom podatkov Pandas.
Prva vrstica kode obravnava velikost nabora podatkov.
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')Spodnja koda prihaja iz Googla GitHub. Po zagonu kode bi morali videti naslednje:
# 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)) Zanima vas, ali obstaja povezava med industrijsko stopnjo, koncentracijo oksida, razdaljo do centra za zaposlitev in ceno hiše.
Za to najprej podatke razdelite po panogi in barvi s cenovnim kvartilom:
- Izberite fasetiranje X in izberite INDUS.
- Izberite Zaslon in izberite DIS. Pike bo obarval s kvartilom cene hiše
tukaj temnejše barve pomenijo, da je razdalja do prvega zaposlitvenega centra daleč.
Zaenkrat spet kaže, kaj veste, nižja stopnja v industriji, višja cena. Zdaj si lahko ogledate razčlenitev po INDUX-u, po NOX-u.
- Izberite fasetiranje Y in izberite NOX.
Zdaj lahko vidite, da ima hiša daleč od prvega zaposlitvenega centra najnižji delež v industriji in zato najnižjo koncentracijo oksida. Če se odločite za prikaz vrste z Q_PRICE in povečate spodnji levi kot, lahko vidite, za katero vrsto cene gre.
Imate še en namig, da so interakcije med IND, NOX in DIS lahko dobri kandidati za izboljšanje modela.
TensorFlow
V tem razdelku boste ocenili linearni klasifikator s pomočjo ocenjevalnega API-ja TensorFlow. Nadaljevali boste, kot sledi:
- Pripravite podatke
- Ocenite primerjalni model: Brez interakcije
- Ocenite model z interakcijo
Ne pozabite, da je cilj strojnega učenja minimalizirati napako. V tem primeru bo zmagal model z najmanjšo povprečno kvadratno napako. Ocenjevalnik TensorFlow samodejno izračuna to metriko.
Podatki o pripravi
V večini primerov morate podatke preoblikovati. Zato je Pregled faset fascinanten. Iz povzetka statistike ste videli, da obstajajo odstopanja. Te vrednosti vplivajo na ocene, ker niso videti kot populacija, ki jo analizirate. Izstopajoči rezultati so ponavadi pristranski. Na primer, pozitivni odstotek ponavadi preceni koeficient.
Dobra rešitev za reševanje tega problema je standardizacija spremenljivke. Standardizacija pomeni standardni odklon ena in nič. Proces standardizacije vključuje dva koraka. Najprej odšteje srednjo vrednost spremenljivke. Drugič, deli se z varianco, tako da ima porazdelitev enoto variance
Knjižnica sklearn je v pomoč pri standardizaciji spremenljivk. V ta namen lahko uporabite predhodno obdelavo modula s tehtnico.
S spodnjo funkcijo lahko prilagodite nabor podatkov. Upoštevajte, da stolpca z nalepkami in kategoričnih spremenljivk ne spreminjate.
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_scaleFunkcijo lahko uporabite za izdelavo skaliranega vlaka / testnega sklopa.
df_train_scale = standardize_data(df_train)df_test_scale = standardize_data(df_test)Osnovna regresija: Benchmark
Najprej treniraš in preizkusiš model brez interakcije. Namen je videti metriko zmogljivosti modela.
Način, kako usposobiti model, je natančno takšen, kot je vadnica za API na visoki ravni . Uporabili boste ocenjevalnik TensorFlow LinearRegressor.
Kot opomnik morate izbrati:
- funkcije, ki jih je treba vstaviti v model
- spremeniti lastnosti
- zgraditi linearni regresor
- zgraditi funkcijo input_fn
- izuriti model
- preizkusite model
Za usposabljanje modela uporabite vse spremenljivke v naboru podatkov. Skupaj obstajajo enake neprekinjene spremenljivke in ena kategorična spremenljivka
## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']CATE_FEATURES = ['CHAS']Funkcije pretvorite v številski ali kategorični stolpec
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 ustvarite z linearRegressor. Model shranite v mapo train_Boston
model = tf.estimator.LinearRegressor(model_dir="train_Boston",feature_columns=categorical_features + continuous_features)Izhod
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} Vsak stolpec v podatkih o vlaku ali preskusu se pretvori v tenzor s funkcijo 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 ocenite na podatkih o vlaku.
model.train(input_fn=get_input_fn(df_train_scale,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)Izhod
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.Končno ocenite zmogljivosti modela na testnem nizu
model.evaluate(input_fn=get_input_fn(df_test_scale,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)Izhod
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}Izguba modela je 1650. To je metrika, ki jo je treba premagati v naslednjem poglavju
Izboljšajte model: Pojem interakcije
V prvem delu vadnice ste videli zanimivo razmerje med spremenljivkami. Različne tehnike vizualizacije so pokazale, da sta INDUS in NOS povezana skupaj in povečata učinek na ceno. Ne samo, da interakcija med INDUS-om in NOS-om vpliva na ceno, temveč je tudi ta učinek močnejši pri interakciji z DIS.
Čas je, da to idejo posplošimo in preverimo, ali lahko izboljšate model, napovedan model.
Vsakemu naboru podatkov morate dodati dva nova stolpca: vlak + test. Za to ustvarite eno funkcijo za izračun izraza interakcije in drugo za izračun izraza trojne interakcije. Vsaka funkcija ustvari en stolpec. Ko so ustvarjene nove spremenljivke, jih lahko združite v nabor podatkov o vadbi in testni nabor podatkov.
Najprej morate ustvariti novo spremenljivko za interakcijo med INDUS-om in NOX-om.
Spodnja funkcija vrne dva podatkovna okvira, vlak in test, z interakcijo med var_1 in var_2, v vašem primeru INDUS in 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, testNova dva stolpca shranite
interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')interation_ind_ns_train.shape(325,)Drugič, ustvarite drugo funkcijo za izračun izraza trojne interakcije.
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')Zdaj, ko imate vse potrebne stolpce, jih lahko dodate za usposabljanje in testiranje nabora podatkov. Poimenujete ta dva nova podatkovna okvira:
- 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)Izhod
To je to; novi model lahko ocenite s pogoji interakcije in vidite, kako je z metriko uspešnosti.
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)Izhod
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} KODA
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)Izhod
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)Izhod
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}Nova izguba je 1515. Že z dodajanjem dveh novih spremenljivk ste izgubo lahko zmanjšali. To pomeni, da lahko naredite boljše napovedi kot pri primerjalnem modelu.