Linearna regresija TensorFlow s aspektom & Pojam interakcije

Sadržaj:

Anonim

U ovom vodiču naučit ćete kako provjeriti podatke i pripremiti ih za stvaranje jednostavnog zadatka linearne regresije.

Ovaj je vodič podijeljen u dva dijela:

  • Potražite interakciju
  • Testirajte model

U prethodnom uputstvu koristili ste skup podataka iz Bostona za procjenu medijane cijene kuće. Bostonski skup podataka ima malu veličinu, sa samo 506 promatranja. Ovaj se skup podataka smatra mjerilom za isprobavanje novih algoritama linearne regresije.

Skup podataka sastoji se od:

Promjenjiva Opis
zn Udio stambenog zemljišta zoniranog za parcele veće od 25 000 sq.ft.
indus Udio nerealiziranih hektara po gradu.
nox koncentracija dušikovih oksida
rm prosječni broj soba po stanu
dob udio vlasničkih jedinica izgrađenih prije 1940
dis ponderirane udaljenosti do pet bostonskih centara za zapošljavanje
porez puna vrijednost stope poreza na imovinu po 10.000 dolara
ptratio omjer učenika i učitelja prema gradu
medv Srednja vrijednost domova u kojima žive vlasnici u tisućama dolara
krim stopa kriminala po stanovniku po gradu
chas Lažna varijabla rijeke Charles (1 ako ograničava rijeku; 0 inače)
B udio crnaca u gradu

U ovom uputstvu procijenit ćemo srednju cijenu pomoću linearnog regresora, ali fokus je na jednom određenom procesu strojnog učenja: "priprema podataka".

Model generalizira obrazac u podacima. Da biste uhvatili takav obrazac, prvo ga morate pronaći. Dobra je praksa izvršiti analizu podataka prije pokretanja bilo kojeg algoritma strojnog učenja.

Odabir pravih značajki bitno utječe na uspjeh vašeg modela. Zamislite da pokušavate procijeniti plaću ljudi, ako ne uvrstite spol kao kovarijantu, na kraju ćete dobiti lošu procjenu.

Drugi način za poboljšanje modela je promatranje korelacije između neovisne varijable. Da se vratimo na primjer, obrazovanje možete smatrati izvrsnim kandidatom za predviđanje plaće, ali i zanimanja. Pošteno je reći, zanimanje ovisi o razini obrazovanja, naime visoko obrazovanje često dovodi do boljeg zanimanja. Ako uopćimo ovu ideju, možemo reći da se korelacija između zavisne varijable i objašnjene varijable može povećati za još jednu objašnjenju.

Da bismo uhvatili ograničeni učinak obrazovanja na zanimanje, možemo upotrijebiti pojam interakcije.

Ako pogledate jednadžbu plaće, ona postaje:

Ako je pozitivan, onda to znači da dodatni stupanj obrazovanja donosi veći porast srednje vrijednosti kuće za visoku razinu zanimanja. Drugim riječima, postoji učinak interakcije između obrazovanja i zanimanja.

U ovom uputstvu pokušat ćemo vidjeti koje varijable mogu biti dobar kandidat za pojmove interakcije. Testirat ćemo ako dodavanje ove vrste podataka vodi ka boljem predviđanju cijena.

U ovom ćete tutorijalu naučiti

  • Sažeti statistički podaci
  • Pregled aspekata
  • Faseti dubokog zarona
  • Instalirajte Facet
  • Pregled
  • Grafikon
  • Faseti dubokog zarona
  • TensorFlow
  • Podaci o pripremi
  • Osnovna regresija: mjerilo
  • Poboljšati model: Pojam interakcije

Sažeti statistički podaci

Postoji nekoliko koraka koje možete slijediti prije nego što nastavite s modelom. Kao što je ranije spomenuto, model je generalizacija podataka. Najbolja praksa je razumijevanje podataka i predviđanje. Ako ne znate svoje podatke, male su vam šanse da poboljšate svoj model.

Kao prvi korak, učitajte podatke kao okvir podataka pande i stvorite set treninga i set za testiranje.

Savjeti: Za ovaj vodič morate imati instaliran matplotlit i seaborn u Pythonu. Paket Python možete instalirati u letu s Jupyterom. Ne biste to trebali raditi

!conda install -- yes matplotlib

ali

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

Imajte na umu da ovaj korak nije potreban ako ste instalirali matplotlib i seaborn.

Matplotlib je knjižnica za stvaranje grafikona u Pythonu. Seaborn je knjižnica statističke vizualizacije izgrađena na vrhu matplotliba. Pruža atraktivne i lijepe parcele.

Kôd u nastavku 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 uključuje skup podataka iz Bostona. Možete pozvati njegov API za uvoz podataka.

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

Ime značajke pohranjeno je u objektu feature_names u nizu.

boston.feature_names

Izlaz

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

Stupce možete preimenovati.

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

Varijablu CHAS pretvorite u varijablu niza i označite je s yes ako je CHAS = 1 i ne ako CHAS = 0

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

S pandama je jednostavno podijeliti skup podataka. Skup podataka nasumično podijelite s 80 posto skupa treninga i 20 posto skupa za testiranje. Pande imaju ugrađenu funkciju troškova za razdvajanje uzorka okvira podataka.

Prvi parametar frac je vrijednost od 0 do 1. Postavljate ga na 0,8 da biste slučajno odabrali 80 posto podatkovnog okvira.

Random_state omogućuje vraćanje istog okvira podataka za sve.

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

Možete dobiti oblik podataka. Trebalo bi biti:

  • Komplet vlakova: 506 * 0,8 = 405
  • Testni set: 506 * 0,2 = 101
print(df_train.shape, df_test.shape)

Izlaz

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

Izlaz

ZLOČIN ZN INDUS LIJEK NOX RM DOB DIS RAD POREZ PTRATIO B LSTAT CIJENA
0 0,00632 18,0 2,31 Ne 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 Ne 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 Ne 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 Ne 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 Ne 0,524 6.172 96.1 5,9505 5.0 311,0 15.2 396,90 19.15 27.1

Podaci su neuredni; često je neuravnotežen i posut izvanrednim vrijednostima koje odbacuju analizu i trening strojnog učenja.

Prvi korak prema čišćenju skupa podataka je razumijevanje gdje mu je potrebno čišćenje. Čišćenje skupa podataka može biti nezgodno, pogotovo na bilo koji način koji se može generalizirati

Googleov istraživački tim razvio je alat za ovaj posao nazvan Facets koji pomaže vizualizirati podatke i razvrstati ih na sve načine. Ovo je dobro polazište za razumijevanje načina postavljanja skupa podataka.

Fasete vam omogućuju da pronađete gdje podaci ne izgledaju baš onako kako razmišljate.

Osim njihove web aplikacije, Google olakšava ugradnju alata u Jupyterovu bilježnicu.

Dva su aspekta aspekata:

  • Pregled aspekata
  • Faseti dubokog zarona

Pregled aspekata

Pregled aspekata daje pregled skupa podataka. Pregled aspekata dijeli stupce podataka u redove istaknutih informacija koje se prikazuju

  1. postotak propuštenog promatranja
  2. min i max vrijednosti
  3. statistika poput srednje vrijednosti, medijana i standardne devijacije.
  4. Također dodaje stupac koji prikazuje postotak vrijednosti koje su nule, što je korisno kada je većina vrijednosti nula.
  5. Te je raspodjele moguće vidjeti na testnom skupu podataka, kao i set obuke za svaku značajku. To znači da možete dvaput provjeriti ima li test sličnu distribuciju kao podaci o treningu.

To je barem minimum koji treba obaviti prije bilo kojeg zadatka strojnog učenja. Pomoću ovog alata ne propuštate ovaj presudni korak i on naglašava neke abnormalnosti.

Faseti dubokog zarona

Facets Deep Dive je cool alat. Omogućuje jasnoću vašeg skupa podataka i zumiranje do kraja kako biste vidjeli pojedinačni podatak. To znači da možete fasetirati podatke po retku i stupcu preko bilo koje značajke skupa podataka.

Upotrijebit ćemo ova dva alata s bostonskim skupom podataka.

Napomena : Ne možete istodobno koristiti Pregled faseta i Deep Dive. Da biste promijenili alat, prvo morate očistiti bilježnicu.

Instalirajte Facet

Veći dio analize možete koristiti web aplikaciju Facet. U ovom vodiču vidjet ćete kako ga koristiti u Jupyterovoj bilježnici.

Prije svega, morate instalirati nbextensions. Gotovo je s ovim kodom. Kopirate i zalijepite sljedeći kod u terminal vašeg stroja.

pip install jupyter_contrib_nbextensions 

Odmah nakon toga trebate klonirati spremišta na računalu. Imate dva izbora:

Opcija 1) Kopirajte i zalijepite ovaj kod u terminal (preporučeno)

Ako na vašem računalu nije instaliran Git, idite na ovaj URL https://git-scm.com/download/win i slijedite upute. Nakon što završite, možete upotrijebiti git naredbu u terminalu za Mac korisnike ili upit Anaconda za Windows korisnike

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

Opcija 2) Idite na https://github.com/PAIR-code/facets i preuzmite spremišta.

Ako odaberete prvu opciju, datoteka završava u vašoj datoteci za preuzimanje. Datoteku možete pustiti da se preuzme ili je povući na drugi put.

Ovim naredbenim retkom možete provjeriti gdje su pohranjene facete:

echo `pwd`/`ls facets` 

Sad kad ste pronašli Facete, morate ga instalirati u Jupyter bilježnicu. Morate postaviti radni direktorij na stazu na kojoj se nalaze fasete.

Vaš trenutni radni direktorij i mjesto Facets zip-a trebali bi biti jednaki.

Morate usmjeriti radni direktorij na Facet:

cd facets

Da biste instalirali facete u Jupyter, imate dvije mogućnosti. Ako ste Jupyter instalirali s Condom za sve korisnike, kopirajte ovaj kod:

može koristiti jupyter nbextension instalirati facets-dist /

jupyter nbextension install facets-dist/

U suprotnom koristite:

jupyter nbextension install facets-dist/ --user

U redu, sve ste spremni. Otvorimo Pregled aspekata.

Pregled

Overview koristi Python skriptu za izračunavanje statistike. U Jupyter morate uvesti skriptu koja se naziva generic_feature_statistics_generator. Ne brinite; skripta se nalazi u fasetnim datotekama.

Morate pronaći njegov put. To je lako učiniti. Otvorite fasete, otvorite datoteku facets_overview, a zatim python. Kopirajte put

Nakon toga, vratite se na Jupyter i napišite sljedeći kod. Promijenite put '/ Users / Thomas / facets / facets_overview / python' na svoj put.

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

Skriptu možete uvesti sa donjim kodom.

from generic_feature_statistics_generator importGenericFeatureStatisticsGenerator

U sustavu Windows isti kôd postaje

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

Da biste izračunali statistiku značajki, morate upotrijebiti funkciju GenericFeatureStatisticsGenerator () i koristite objekt ProtoFromDataFrames. Okvir podataka možete proslijediti u rječnik. Na primjer, ako želimo stvoriti sažeti statistički prikaz za vlak, možemo podatke pohraniti u rječnik i koristiti u objektu `ProtoFromDataFrames`

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

Name je naziv prikazane tablice, a vi koristite naziv tablice za koju želite izračunati sažetak. U vašem primjeru tablica koja sadrži podatke je 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")

Na kraju, samo kopirate i zalijepite donji kod. Kôd dolazi izravno s GitHub-a. Ovo biste trebali vidjeti:

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

Grafikon

Nakon što provjerite podatke i njihovu distribuciju, možete ucrtati matricu korelacije. Matrica korelacije izračunava Pearsonov koeficijent. Ovaj je koeficijent vezan između -1 i 1, pri čemu pozitivna vrijednost ukazuje na pozitivnu korelaciju, a negativna vrijednost na negativnu korelaciju.

Zanima vas koje varijable mogu biti dobar kandidat za pojmove 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})

Izlaz

png

Iz matrice možete vidjeti:

  • LSTAT
  • RM

Snažno su povezani s PRICE. Još jedna uzbudljiva značajka je snažna pozitivna korelacija između NOX-a i INDUS-a, što znači da se te dvije varijable kreću u istom smjeru. Osim toga, postoje i korelacije s CIJENOM. DIS je također u visokoj korelaciji s IND i NOX.

Prvo nagovještavate da IND i NOX mogu biti dobri kandidati za termin presretanja, a DIS bi također mogao biti zanimljiv za usredotočiti se.

Možete ući malo dublje crtajući parnu mrežu. Detaljnije će ilustrirati korelacijsku kartu koju ste prethodno iscrtali.

Mreža parova koju smo sastavili slijedi:

  • Gornji dio: Raspršena parcela s ugrađenom linijom
  • Dijagonala: Grafikon gustoće zrna
  • Donji dio: Multivarijantna ploha gustoće zrna

Odabirete fokus na četiri neovisne varijable. Izbor odgovara varijablama s jakom korelacijom s PRICE

  • INDUS
  • NOX
  • RM
  • LSTAT

štoviše, CIJENA.

Imajte na umu da se standardna pogreška po defaultu dodaje na raspršeni dijagram.

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)

Izlaz

Počnimo s gornjim dijelom:

  • Cijena je u negativnoj korelaciji s INDUS-om, NOX-om i LSTAT-om; pozitivno korelirao s RM.
  • LSTAT i CIJENA su blago nelinearni
  • Postoji ravna crta kada je cijena jednaka 50. Iz opisa skupa podataka PRICE je skraćena u vrijednosti 50

Dijagonalno

  • Čini se da NOX ima dvije nakupine, jednu oko 0,5 i drugu oko 0,85.

Da biste provjerili više o tome, možete pogledati donji dio. Multivarijatna gustina zrna je zanimljiva u određenom smislu kako boji gdje je većina točaka. Razlika u dijagramu raspršenja crta gustoću vjerojatnosti, iako za skup zadanih koordinata nema točke u skupu podataka. Kad je boja jača, to ukazuje na visoku koncentraciju točke oko ovog područja.

Ako provjerite multivarijacijsku gustoću za INDUS i NOX, možete vidjeti pozitivnu korelaciju i dva klastera. Kada je udio industrije veći od 18, koncentracija dušikovih oksida veća je od 0,6.

Možete razmišljati o dodavanju interakcije između INDUS-a i NOX-a u linearnom odnosu.

Napokon, možete koristiti i druge alate koje je stvorio Google, Facets Deep Dive. Sučelje je podijeljeno u četiri glavna dijela. Središnje područje u središtu je prikaz podataka koji se može povećati. Na vrhu ploče nalazi se padajući izbornik u kojem možete promijeniti raspored podataka kako biste kontrolirali fasetiranje, pozicioniranje i boju. S desne strane nalazi se detaljan prikaz određenog reda podataka. To znači da možete kliknuti bilo koju točku podataka u središnjoj vizualizaciji da biste vidjeli detalje o toj određenoj točki podataka.

Tijekom koraka vizualizacije podataka zanima vas traženje uparene korelacije između neovisne varijable o cijeni kuće. Međutim, uključuje najmanje tri varijable, a 3D grafički prikazi složeni su za rad.

Jedan od načina rješavanja ovog problema je stvaranje kategorijalne varijable. Odnosno, možemo stvoriti 2D crtanje u boji točke. Varijablu PRICE možete podijeliti u četiri kategorije, a svaka kategorija je kvartil (tj. 0,25, 0,5, 0,75). Ovu novu varijablu nazivate 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 dubokog zarona

Da biste otvorili Deep Dive, morate transformirati podatke u json format. Pande kao objekt za to. To_json možete koristiti nakon skupa podataka Pandas.

Prvi redak koda obrađuje veličinu skupa podataka.

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 u nastavku dolazi s Google GitHub-a. Nakon pokretanja koda trebali biste vidjeti ovo:

# 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 postoji li veza između industrijske stope, koncentracije oksida, udaljenosti od radnog mjesta i cijene kuće.

Za to prvo podatke dijelite prema industrijskom rasponu i bojama s kvartilom cijena:

  • Odaberite fasetiranje X i odaberite INDUS.
  • Odaberite Display i odaberite DIS. Točke će obojiti kvartilom cijene kuće

ovdje tamnije boje znače da je udaljenost do prvog radnog mjesta daleko.

Zasad opet pokazuje ono što znate, niža stopa u industriji, veća cijena. Sada možete pogledati raščlambu prema INDUX-u, prema NOX-u.

  • Odaberite fasetiranje Y i odaberite NOX.

Sada možete vidjeti kako kuća daleko od prvog centra za zapošljavanje ima najmanji udio u industriji, a time i najnižu koncentraciju oksida. Ako se odlučite za prikaz vrste s Q_PRICE i zumiranje donjeg lijevog kuta, možete vidjeti o kojoj se cijeni radi.

Imate još jedan nagovještaj da interakcija između IND, NOX i DIS može biti dobar kandidat za poboljšanje modela.

TensorFlow

U ovom ćete odjeljku procijeniti linearni klasifikator pomoću API-ja za procjenu TensorFlow. Nastavit ćete kako slijedi:

  • Pripremite podatke
  • Procijenite referentni model: Nema interakcije
  • Procijenite model s interakcijom

Zapamtite, cilj strojnog učenja je minimiziranje pogreške. U tom će slučaju pobijediti model s najmanjom srednjom kvadratnom pogreškom. Procjenjivač TensorFlow automatski izračunava ovu metriku.

Podaci o pripremi

U većini slučajeva morate transformirati svoje podatke. Zbog toga je Pregled aspekata fascinantan. Iz sažetke statistike vidjeli ste da postoje odstupanja. Te vrijednosti utječu na procjene jer ne izgledaju poput populacije koju analizirate. Outlieri su obično pristravali prema rezultatima. Na primjer, pozitivni odstupač prekomjerno precjenjuje koeficijent.

Dobro rješenje za rješavanje ovog problema je standardizacija varijable. Standardizacija znači standardno odstupanje jedinice i sredstvo nule. Proces standardizacije uključuje dva koraka. Prije svega, oduzima srednju vrijednost varijable. Drugo, dijeli se s varijancom tako da distribucija ima jediničnu varijansu

Knjižnica sklearn korisna je za standardizaciju varijabli. U tu svrhu možete upotrijebiti predobradu modula sa skalom objekta.

Možete koristiti funkciju u nastavku za skaliranje skupa podataka. Imajte na umu da ne skalirate stupac oznake i kategorijske varijable.

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

Pomoću funkcije možete konstruirati skalirani vlak / ispitni sklop.

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

Osnovna regresija: mjerilo

Prije svega, trenirate i testirate model bez interakcije. Svrha je vidjeti metriku izvedbe modela.

Način na koji se trenira model je upravo onakav kakav je vodič za API na visokoj razini . Upotrijebit ćete procjenjivač TensorFlow LinearRegressor.

Podsjećanja radi, morate odabrati:

  • značajke koje treba staviti u model
  • transformirati značajke
  • konstruirati linearni regresor
  • konstruirati funkciju input_fn
  • osposobiti model
  • testirati model

Za obuku modela koristite sve varijable u skupu podataka. Ukupno postoje kontinuirane varijable i jedna kategorička varijabla

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

Značajke pretvarate u numerički stupac ili kategorički stupac

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 kreirate pomoću linearRegressor. Model pohranite u mapu train_Boston

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

Izlaz

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}

Svaki stupac u podacima o vlaku ili ispitivanju pretvara se u tenzor s funkcijom 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 procjenjujete na podacima o vlaku.

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

Izlaz

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.

Napokon procjenjujete izvedbe modela na testnom setu

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

Izlaz

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}

Gubitak modela je 1650. To je metrika koju treba pobijediti u sljedećem odjeljku

Poboljšati model: Pojam interakcije

Tijekom prvog dijela tutorijala vidjeli ste zanimljiv odnos između varijabli. Različite tehnike vizualizacije otkrile su da su INDUS i NOS povezani zajedno i okreću se kako bi se povećao učinak na cijenu. Ne samo da interakcija između INDUS-a i NOS-a utječe na cijenu, već je i taj učinak jači kada komunicira s DIS-om.

Vrijeme je da ovu ideju generalizirate i vidite možete li poboljšati model predviđeni modelom.

U svaki skup skupova podataka morate dodati dva nova stupca: vlak + test. Za to stvorite jednu funkciju za izračunavanje pojma interakcije, a drugu za izračunavanje pojma trostruke interakcije. Svaka funkcija stvara jedan stupac. Nakon što se kreiraju nove varijable, možete ih povezati u skup podataka o treningu i testni skup podataka.

Prije svega, trebate stvoriti novu varijablu za interakciju između INDUS-a i NOX-a.

Funkcija u nastavku vraća dva podatkovna okvira, vlak i test, uz interakciju između var_1 i var_2, u vašem slučaju INDUS i 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

Spremite dva nova stupca

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

Drugo, stvorite drugu funkciju za izračunavanje pojma trostruke 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')

Sad kad imate sve potrebne stupce, možete ih dodati za obuku i testiranje skupa podataka. Naveli ste ova 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)

Izlaz

To je to; možete procijeniti novi model s uvjetima interakcije i vidjeti kakav je mjerni podatak.

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)

Izlaz

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}

KODIRATI

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)

Izlaz

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)

Izlaz

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}

Novi gubitak je 1515. Samo dodavanjem dvije nove varijable, uspjeli ste smanjiti gubitak. To znači da možete napraviti bolje predviđanje nego s referentnim modelom.