TensorFlow linearna regresija s izrazom aspekta i interakcije

U ovom vodiฤu nauฤit ฤ‡ete kako provjeriti podatke i pripremiti ih za izradu jednostavnog zadatka linearne regresije.

Ovaj vodiฤ je podijeljen u dva dijela:

  • Potraลพite interakciju
  • Testirajte model

u prethodni vodiฤ, koristili ste skup podataka iz Bostona za procjenu srednje cijene kuฤ‡e. Bostonski skup podataka malen je, sa samo 506 opaลพanja. Ovaj skup podataka smatra se mjerilom za isprobavanje novih algoritama linearne regresije.

Skup podataka sastoji se od:

Varijabla Description
zn Udio stambenog zemljiลกta u zonama za parcele veฤ‡e od 25,000 sq.ft.
industrijski Udio ne-maloprodajnih poslovnih hektara po gradu.
NOx koncentracija duลกikovih oksida
rm prosjeฤan broj soba po stanu
starost udio jedinica u kojima stanuju vlasnici izgraฤ‘enih prije 1940
reฤ‡i mjerene udaljenosti do pet bostonskih centara za zapoลกljavanje
porez stopa poreza na imovinu pune vrijednosti za 10,000 dolara
ptratio omjer uฤenika i nastavnika po gradu
medv Srednja vrijednost domova u kojima ลพive vlasnici u tisuฤ‡ama dolara
zloฤinaฤki stopa kriminala po glavi stanovnika po gradu
Chas Charles River laลพna varijabla (1 ako ograniฤava rijeku; 0 inaฤe)
B udio crnaca po gradu

U ovom vodiฤu ฤ‡emo procijeniti srednju cijenu koristeฤ‡i linearni regresor, ali fokus je na jednom odreฤ‘enom procesu stroj za uฤenje: โ€œpriprema podataka.โ€

Model generalizira obrazac u podacima. Da biste uhvatili takav uzorak, prvo ga morate pronaฤ‡i. Dobra praksa je izvrลกiti analizu podataka prije pokretanja bilo kojeg algoritma strojnog uฤenja.

Odabir pravih znaฤajki ฤini veliku razliku u uspjehu vaลกeg modela. Zamislite da pokuลกate procijeniti plaฤ‡u ljudi, ako ne ukljuฤite spol kao kovarijatu, zavrลกit ฤ‡ete s loลกom procjenom.

Drugi naฤin poboljลกanja modela je promatranje korelacije izmeฤ‘u nezavisne varijable. Vratimo se primjeru, obrazovanje moลพete zamisliti kao izvrsnog kandidata za predviฤ‘anje plaฤ‡e, ali i zanimanja. Poลกteno je reฤ‡i da zanimanje ovisi o stupnju obrazovanja, naime visoko obrazovanje ฤesto vodi do boljeg zanimanja. Ako generaliziramo ovu ideju, moลพemo reฤ‡i da se korelacija izmeฤ‘u zavisne varijable i eksplanatorne varijable moลพe poveฤ‡ati joลก jednom eksplanatornom varijablom.

Kako bismo obuhvatili ograniฤeni uฤinak obrazovanja na zanimanje, moลพemo upotrijebiti termin interakcije.

Pojam interakcije

Ako pogledate jednadลพbu plaฤ‡a, ona postaje:

Pojam interakcije

If Pojam interakcije je pozitivan, onda implicira da dodatna razina obrazovanja donosi veฤ‡e poveฤ‡anje srednje vrijednosti kuฤ‡e za visoku razinu zanimanja. Drugim rijeฤima, postoji uฤinak interakcije izmeฤ‘u obrazovanja i zanimanja.

U ovom vodiฤu pokuลกat ฤ‡emo vidjeti koje varijable mogu biti dobar kandidat za uvjete interakcije. Testirat ฤ‡emo vodi li dodavanje ove vrste informacija boljem predviฤ‘anju cijena.

Sumarna statistika

Postoji nekoliko koraka koje moลพete slijediti prije nego ลกto prijeฤ‘ete na model. Kao ลกto je ranije spomenuto, model je generalizacija podataka. Najbolja praksa je razumjeti podatke i napraviti predviฤ‘anje. Ako ne poznajete svoje podatke, male su ลกanse da poboljลกate svoj model.

Kao prvi korak, uฤitajte podatke kao pandas podatkovni okvir i izradite skup za obuku i skup za testiranje.

Savjeti: Za ovaj vodiฤ morate imati instalirane matplotlit i seaborn Python. Moลพete instalirati Python paket u hodu sa Jupyter, Vas Ne bi trebao napravi to

!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 imate instalirane matplotlib i seaborn.

Matplotlib je biblioteka za izradu grafikona Python. Seaborn je knjiลพnica za statistiฤku vizualizaciju izgraฤ‘ena na temelju matplotliba. Pruลพa atraktivne i lijepe parcele.

Kod u nastavku uvozi potrebne biblioteke.

import pandas as pd
from sklearn import datasets
import tensorflow as tf
from sklearn.datasets import load_boston
import numpy as np

Knjiลพnica sklearn ukljuฤuje bostonski skup podataka. Moลพete pozvati njegov API za uvoz podataka.

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

Naziv znaฤajke pohranjuje se 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='<U7')

Moลพete preimenovati stupce.

df.columns = boston.feature_names
df['PRICE'] = boston.target
df.head(2)

Linearna regresija s izrazom aspekta i interakcije

Pretvorite varijablu CHAS kao varijablu niza i oznaฤite je s da ako je CHAS = 1 i ne ako je CHAS = 0

df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})
df['CHAS'].head(5)
0    no
1    no
2    no
3    no
4    no
Name: CHAS, dtype: object

S pandama je jednostavno podijeliti skup podataka. Skup podataka nasumiฤno podijelite s 80 posto skupa za obuku i 20 posto skupa za testiranje. pande imaju ugraฤ‘enu funkciju troลกkova za dijeljenje uzorka okvira podataka.

Prvi parametar frac je vrijednost od 0 do 1. Postavite ga na 0.8 da biste nasumiฤno odabrali 80 posto podatkovnog okvira.

Random_state omoguฤ‡uje vraฤ‡anje istog podatkovnog okvira za sve.

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

Moลพete dobiti oblik podataka. Trebalo bi biti:

  • Garnitura vlakova: 506*0.8 = 405
  • Ispitni set: 506*0.2 = 101
print(df_train.shape, df_test.shape)

Izlaz

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

Izlaz

KRIM ZN INDUS CHAS NOX RM AGE 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 zbrkani; ฤesto je neuravnoteลพen i posut izvanrednim vrijednostima koje odbacuju analizu i obuku strojnog uฤenja.

Prvi korak za ฤiลกฤ‡enje skupa podataka je razumijevanje gdje treba ฤiลกฤ‡enje. ฤŒiลกฤ‡enje skupa podataka moลพe biti teลกko izvesti, osobito na generalizirajuฤ‡i naฤin

Googleov istraลพivaฤki tim razvio je alat za ovaj posao tzv aspekti koji pomaลพu vizualizirati podatke i rezati ih na sve naฤine. Ovo je dobra polazna toฤka za razumijevanje naฤina na koji je skup podataka postavljen.

Aspekti vam omoguฤ‡uju da pronaฤ‘ete gdje podaci ne izgledaju baลก onako kako mislite.

Osim njihove web aplikacije, Google olakลกava ugradnju kompleta alata u Jupyter biljeลพnica.

Dva su dijela aspekata:

  • Pregled aspekata
  • Facets Deep Dive

Pregled aspekata

Facets Overview daje pregled skupa podataka. Pregled aspekata dijeli stupce podataka u retke koji prikazuju istaknute informacije

  1. postotak opaลพanja koje nedostaje
  2. minimalne i maksimalne vrijednosti
  3. statistike poput srednje vrijednosti, medijana i standardne devijacije.
  4. Takoฤ‘er dodaje stupac koji pokazuje postotak vrijednosti koje su nule, ลกto je korisno kada je veฤ‡ina vrijednosti nula.
  5. Moguฤ‡e je vidjeti ove distribucije na testnom skupu podataka, kao i na skupu za obuku za svaku znaฤajku. To znaฤi da moลพete joลก jednom provjeriti ima li test sliฤnu distribuciju podacima o vjeลพbanju.

Ovo je barem minimum koji treba uฤiniti prije bilo kakvog zadatka strojnog uฤenja. S ovim alatom ne propuลกtate ovaj kljuฤni korak, a on naglaลกava neke abnormalnosti.

Facets Deep Dive

Facets Deep Dive je super alat. Omoguฤ‡uje odreฤ‘enu jasnoฤ‡u vaลกeg skupa podataka i zumiranje do kraja kako biste vidjeli pojedinaฤni dio podataka. To znaฤi da moลพete rasporediti podatke po retku i stupcu preko bilo koje znaฤajke skupa podataka.

Koristit ฤ‡emo ova dva alata s bostonskim skupom podataka.

biljeลกke: Ne moลพete koristiti Facets Overview i Facets Deep Dive u isto vrijeme. Prvo morate oฤistiti biljeลพnicu da biste promijenili alat.

Instalirajte Facet

Web-aplikaciju Facet moลพete koristiti za veฤ‡inu analiza. U ovom vodiฤu vidjet ฤ‡ete kako ga koristiti unutar a Jupyter Notebook.

Prije svega, trebate instalirati nbextensions. To se radi s ovim kodom. Kopirate i zalijepite sljedeฤ‡i kod u terminal vaลกeg stroja.

pip install jupyter_contrib_nbextensions

Odmah nakon toga trebate klonirati repozitorije na svom raฤunalu. Imate dva izbora:

Opcija 1) Kopirajte i zalijepite ovaj kod u terminal (Preporuฤeno)

Ako na svom raฤunalu nemate instaliran Git, idite na ovaj URL https://git-scm.com/download/win i slijedite upute. Nakon ลกto ste gotovi, moลพete koristiti naredbu git u terminalu za Mac korisnika ili Anaconda prompt za Windows korisnik

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

Opcija 2) Idi na https://github.com/PAIR-code/facets i preuzmite spremiลกta.

Instalirajte Facet

Ako odaberete prvu opciju, datoteka ฤ‡e zavrลกiti u datoteci za preuzimanje. Moลพete dopustiti preuzimanje datoteke ili je povuฤ‡i na drugu stazu.

Moลพete provjeriti gdje su Faceti pohranjeni pomoฤ‡u ove naredbene linije:

echo `pwd`/`ls facets`

Sada kada ste locirali Facets, morate ga instalirati Jupyter Biljeลพnica. Morate postaviti radni direktorij na stazu na kojoj se nalaze faceti.

Vaลก trenutni radni direktorij i lokacija Facets zip trebaju biti isti.

Instalirajte Facet

Morate usmjeriti radni direktorij na Facet:

cd facets

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

moลพe koristiti jupyter nbextension install facets-dist/

jupyter nbextension install facets-dist/

U suprotnom koristite:

jupyter nbextension install facets-dist/ --user

U redu, spremni ste. Otvorimo Facet Overview.

SAลฝETAK

Pregled koristi a Python skripta za izraฤunavanje statistike. Morate uvesti skriptu pod nazivom generic_feature_statistics_generator Jupyter. Ne brinite; skripta se nalazi u datotekama faceta.

Morate locirati njegov put. Lako se radi. Otvorite facets, otvorite datoteku facets_overview i onda python. Kopirajte put

Pregledni aspekt

Nakon toga, vratite se na Jupyter, i napiลกite sljedeฤ‡i kod. Promijenite put '/Users/Thomas/facets/facets_overview/python' u svoj put.

# Add the facets overview python code to the python path# Add t 
import sys
sys.path.append('/Users/Thomas/facets/facets_overview/python')

Moลพete uvesti skriptu pomoฤ‡u donjeg koda.

from generic_feature_statistics_generator import 
GenericFeatureStatisticsGenerator

U Windowsima, isti kod postaje

import sys
sys.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 koristiti funkciju GenericFeatureStatisticsGenerator(), a vi koristite objekt ProtoFromDataFrames. Podatkovni okvir moลพete proslijediti u rjeฤniku. Na primjer, ako ลพelimo stvoriti sumarnu statistiku za set vlakova, moลพemo pohraniti informacije u rjeฤnik i koristiti ih u objektu `ProtoFromDataFramesโ€œ

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

Naziv 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 overview
import base64

gfsg = 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 kopirajte i zalijepite kod u nastavku. Kod dolazi izravno s GitHuba. Trebali biste moฤ‡i vidjeti ovo:

Pregledni aspekt

# Display the facets overview visualization for this data# Displ 
from IPython.core.display import display, HTML

HTML_TEMPLATE = """<link rel="import" href="/hr/nbextensions/facets-dist/facets-jupyter.html" >
        <facets-overview id="elem"></facets-overview>
        <script>
          document.querySelector("#elem").protoInput = "{protostr}";
        </script>"""
html = HTML_TEMPLATE.format(protostr=protostr)
display(HTML(html))

Grafikon

Nakon ลกto provjerite podatke i njihovu distribuciju, moลพete iscrtati korelacijsku matricu. Korelacijska matrica izraฤunava Pearsonov koeficijent. Ovaj koeficijent je vezan izmeฤ‘u -1 i 1, pri ฤemu pozitivna vrijednost oznaฤava pozitivnu korelaciju, a negativna vrijednost negativnu korelaciju.

Zanima vas koje varijable mogu biti dobar kandidat za uvjete interakcije.

## Choose important feature and further check with Dive
%matplotlib inline  
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="ticks")
# Compute the correlation matrix
corr = df.corr('pearson')
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))

# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)

# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,
            square=True, linewidths=.5, cbar_kws={"shrink": .5})

Izlaz

<matplotlib.axes._subplots.AxesSubplot at 0x1a184d6518>

png

Fasetni grafikon

Iz matrice moลพete vidjeti:

  • LSTAT
  • RM

U velikoj su korelaciji s PRICE. Joลก jedna uzbudljiva znaฤajka je jaka pozitivna korelacija izmeฤ‘u NOX i INDUS, ลกto znaฤi da se te dvije varijable kreฤ‡u u istom smjeru. Osim toga, tu su i korelacije s CIJENOM. DIS je takoฤ‘er u visokoj korelaciji s IND i NOX.

Imate neke prve naznake da IND i NOX mogu biti dobri kandidati za presretanje, a DIS bi takoฤ‘er mogao biti zanimljiv za fokusiranje.

Moลพete iฤ‡i malo dublje iscrtavanjem mreลพe parova. To ฤ‡e detaljnije ilustrirati mapu korelacije koju ste prije iscrtali.

Mreลพa parova sastavljena je na sljedeฤ‡i naฤin:

  • Gornji dio: Rasprลกeni dijagram s uklopljenom linijom
  • Dijagonala: dijagram gustoฤ‡e jezgre
  • Donji dio: Multivarijantni grafikon gustoฤ‡e jezgre

Vi birate fokus na ฤetiri nezavisne varijable. Izbor odgovara varijablama s jakom korelacijom s CIJENOM

  • INDUS
  • NOX
  • RM
  • LSTAT

ลกtoviลกe, CIJENA.

biljeลกke da se standardna pogreลกka prema zadanim postavkama dodaje dijagramu rasprลกenosti.

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

Fasetni grafikon

Poฤnimo s gornjim dijelom:

  • Cijena je u negativnoj korelaciji s INDUS-om, NOX-om i LSTAT-om; u pozitivnoj korelaciji s RM.
  • Postoji mala nelinearnost kod LSTAT-a i PRICE-a
  • Postoji poput ravne linije kada je cijena jednaka 50. Iz opisa skupa podataka, PRICE je skraฤ‡en na vrijednost od 50

Dijagonala

  • ฤŒini se da NOX ima dva klastera, jedan oko 0.5 i jedan oko 0.85.

Da biste saznali viลกe o tome, moลพete pogledati donji dio. Multivarijatna gustoฤ‡a kernela je zanimljiva u smislu da boji tamo gdje je veฤ‡ina toฤaka. Razlika s dijagramom rasprลกenosti crta gustoฤ‡u vjerojatnosti, iako nema toฤke u skupu podataka za danu koordinatu. Kada je boja jaฤa, to ukazuje na visoku koncentraciju toฤaka oko ovog podruฤja.

Ako provjerite multivarijantnu gustoฤ‡u za INDUS i NOX, moลพete vidjeti pozitivnu korelaciju i dva klastera. Kada je udio industrije iznad 18, koncentracija duลกikovih oksida je iznad 0.6.

Moลพete razmisliti o dodavanju interakcije izmeฤ‘u INDUS-a i NOX-a u linearni odnos.

Konaฤno, moลพete koristiti drugi alat koji je stvorio Google, Facets Deep Dive. Suฤelje je podijeljeno u ฤetiri glavna dijela. Srediลกnje podruฤje u sredini je zumirani prikaz podataka. Na vrhu ploฤe nalazi se padajuฤ‡i izbornik na kojem moลพete promijeniti raspored podataka kako biste kontrolirali fasetiranje, pozicioniranje i boju. S desne strane je 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 pojedinosti o toj odreฤ‘enoj podatkovnoj toฤki.

Tijekom koraka vizualizacije podataka, zainteresirani ste za traลพenje parne korelacije izmeฤ‘u nezavisne varijable o cijeni kuฤ‡e. Meฤ‘utim, ukljuฤuje najmanje tri varijable, a 3D dijagrami su komplicirani za rad.

Jedan od naฤina za rjeลกavanje ovog problema je stvaranje kategoriฤke varijable. Odnosno, moลพemo stvoriti 2D crteลพ obojati toฤku. Varijablu CIJENA moลพete podijeliti u ฤetiri kategorije, pri ฤemu je svaka kategorija kvartil (tj. 0.25, 0.5, 0.75). Ovu novu varijablu nazivate Q_PRICE.

## Check non linearity with important features
df['Q_PRICE'] =  pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])
## Show non linearity between RM and LSTAT
ax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")

Fasetni grafikon

Facets Deep Dive

Da biste otvorili Deep Dive, trebate transformirati podatke u json format. Pande kao objekt za to. Moลพete koristiti to_json nakon Pandas skupa podataka.

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 64
jsonstr = df.to_json(orient='records')

Kod u nastavku dolazi s Google GitHuba. Nakon ลกto pokrenete kod, trebali biste moฤ‡i vidjeti ovo:

Facets Deep Dive

# Display thde Dive visualization for this data
from IPython.core.display import display, HTML

# Create Facets template  
HTML_TEMPLATE = """<link rel="import" href="/hr/nbextensions/facets-dist/facets-jupyter.html">
        <facets-dive sprite-image-width="{sprite_size}" sprite-image-height="{sprite_size}" id="elem" height="600"></facets-dive>
        <script>
          document.querySelector("#elem").data = {jsonstr};
        </script>"""

# Load the json dataset and the sprite_size into the template
html = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)

# Display the template
display(HTML(html))

Zanima vas postoji li veza izmeฤ‘u industrijske stope, koncentracije oksida, udaljenosti do centra za zapoลกljavanje i cijene kuฤ‡e.

Za to prvo podijelite podatke prema rasponu industrije i boji s kvartilom cijene:

  • Odaberite fasetu X i odaberite INDUS.
  • Odaberite Display i odaberite DIS. Obojit ฤ‡e toฤkice kvartilom cijene kuฤ‡e

ovdje tamnije boje znaฤe da je udaljenost do prvog centra za zapoลกljavanje velika.

Za sada se ponovno pokazuje ลกto znate, niลพa stopa industrije, viลกa cijena. Sada moลพete pogledati raลกฤlambu po INDUX-u, po NOX-u.

  • Odaberite fasetu Y i odaberite NOX.

Sada moลพete vidjeti da kuฤ‡a daleko od prvog centra za zapoลกljavanje ima najniลพi udio u industriji i stoga najniลพu koncentraciju oksida. Ako odaberete prikazati vrstu s Q_PRICE i zumirati donji lijevi kut, moลพete vidjeti koja je to vrsta cijene.

Imate joลก jednu naznaku 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 s TensorFlow API-jem za procjene. Postupit ฤ‡ete na sljedeฤ‡i naฤin:

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

Zapamtite, cilj strojnog uฤenja je minimiziranje pogreลกke. U ovom sluฤaju ฤ‡e pobijediti model s najmanjom srednjom kvadratnom pogreลกkom. Procjenitelj TensorFlow automatski izraฤunava ovu metriku.

Podaci o pripremi

U veฤ‡ini sluฤajeva morate transformirati svoje podatke. Zato je Facets Overview fascinantan. Iz saลพete statistike vidjeli ste da postoje odstupanja. Te vrijednosti utjeฤu na procjene jer ne izgledaju poput populacije koju analizirate. Outlieri su obiฤno pristrani u rezultatima. Na primjer, pozitivni outlier ima tendenciju precijeniti koeficijent.

Dobro rjeลกenje za rjeลกavanje ovog problema je standardizacija varijable. Standardizacija znaฤi standardnu โ€‹โ€‹devijaciju jedan i srednju vrijednost nula. Proces standardizacije ukljuฤuje dva koraka. Prije svega, oduzima srednju vrijednost varijable. Drugo, dijeli se standardnom devijacijom tako da distribucija ima jediniฤnu standardnu โ€‹โ€‹devijaciju.

Knjiลพnica sklearn korisna je za standardizaciju varijabli. U tu svrhu moลพete koristiti pretprocesiranje modula s mjerilom objekta.

Moลพete upotrijebiti funkciju u nastavku za skaliranje skupa podataka. Imajte na umu da ne skalirate stupac oznake i kategoriฤke varijable.

from sklearn import preprocessing
def 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

Ovu funkciju moลพete koristiti za konstruiranje skaliranog skupa vlaka/testiranja.

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

Osnovna regresija: referentna vrijednost

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

Naฤin treniranja modela je isti kao u vodiฤu API visoke razine. Koristit ฤ‡ete TensorFlow procjenitelj LinearRegressor.

Podsjeฤ‡amo, trebate odabrati:

  • znaฤajke koje treba staviti u model
  • transformirati znaฤajke
  • konstruirati linearni regresor
  • konstruirajte funkciju input_fn
  • trenirati model
  • testirati model

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

## Add features to the bucket: 
### Define continuous list
CONTI_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 stvarate s linearRegressorom. Model spremate 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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a19e76ac8>, '_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 nizu ili testnim podacima pretvara se u tenzor pomoฤ‡u funkcije 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 = 1
INFO:tensorflow:global_step/sec: 144.457
INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)
INFO:tensorflow:global_step/sec: 258.392
INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)
INFO:tensorflow:global_step/sec: 227.998
INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)
INFO:tensorflow:global_step/sec: 210.739
INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)
INFO:tensorflow:global_step/sec: 234.237
INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)
INFO:tensorflow:global_step/sec: 238.1
INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)
INFO:tensorflow:global_step/sec: 237.934
INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)
INFO:tensorflow:global_step/sec: 220.687
INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)
INFO:tensorflow:global_step/sec: 232.702
INFO: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.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a19e76320>

Na kraju procjenjujete performanse modela na ispitnom 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:43
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43
INFO: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. Ovo je metrika koju treba nadmaลกiti u sljedeฤ‡em odjeljku

Poboljลกati model: Pojam interakcije

Tijekom prvog dijela lekcije vidjeli ste zanimljiv odnos izmeฤ‘u varijabli. Razliฤite tehnike vizualizacije otkrile su da su INDUS i NOS meฤ‘usobno povezani i okreฤ‡u se kako bi poveฤ‡ali 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 je u interakciji s DIS-om.

Vrijeme je da generaliziramo ovu ideju i vidimo moลพete li poboljลกati model predviฤ‘eni model.

Morate dodati dva nova stupca svakom skupu podataka: treniranje + test. Za to stvarate jednu funkciju za izraฤunavanje ฤlana interakcije i drugu za izraฤunavanje ฤlana trostruke interakcije. Svaka funkcija proizvodi jedan stupac. Nakon ลกto su nove varijable stvorene, moลพete ih spojiti u skup podataka za obuku i skup podataka za testiranje.

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

Funkcija u nastavku vraฤ‡a dva podatkovna okvira, treniranje i testiranje, s interakcijom 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

Pohranjujete dva nova stupca

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

Drugo, kreirate drugu funkciju za izraฤunavanje ฤlana 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, test
interation_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')

Sada kada imate sve potrebne stupce, moลพete ih dodati u skup podataka za obuku i testiranje. Ova dva nova podatkovna okvira imenujete:

  • df_vlak_novi
  • df_test_novo
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

Poboljลกajte termin interakcije modela

To je to; moลพete procijeniti novi model s uvjetima interakcije i vidjeti kakva je metrika izvedbe.

CONTI_FEATURES_NEW  = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT',
                       'INDUS_NOS', 'INDUS_NOS_DIS']
### Define categorical list
continuous_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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a1a5d5860>, '_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}

KODEKS

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 = 1
INFO:tensorflow:global_step/sec: 124.844
INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)
INFO:tensorflow:global_step/sec: 182.704
INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)
INFO:tensorflow:global_step/sec: 208.189
INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)
INFO:tensorflow:global_step/sec: 213.855
INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)
INFO:tensorflow:global_step/sec: 209.758
INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)
INFO:tensorflow:global_step/sec: 196.618
INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)
INFO:tensorflow:global_step/sec: 196.472
INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)
INFO:tensorflow:global_step/sec: 172.82
INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)
INFO:tensorflow:global_step/sec: 168.916
INFO: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.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1a5d5e10>
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:14
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14
INFO: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, mogli ste smanjiti gubitak. To znaฤi da moลพete napraviti bolje predviฤ‘anje nego s referentnim modelom.

Saลพmite ovu objavu uz: