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.
Ako pogledate jednadลพbu plaฤa, ona postaje:
If 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)
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
- postotak opaลพanja koje nedostaje
- minimalne i maksimalne vrijednosti
- statistike poput srednje vrijednosti, medijana i standardne devijacije.
- Takoฤer dodaje stupac koji pokazuje postotak vrijednosti koje su nule, ลกto je korisno kada je veฤina vrijednosti nula.
- 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.
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.
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
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:
# 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
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
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")
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:
# 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
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.











