Tässä opetusohjelmassa opit tarkistamaan tiedot ja valmistelemaan niitä yksinkertaisen lineaarisen regressiotehtävän luomiseksi.
Tämä opetusohjelma on jaettu kahteen osaan:
- Etsi vuorovaikutusta
- Testaa malli
Edellisessä opetusohjelmassa käytit Bostonin aineistoa talon mediaanihinnan arvioimiseksi. Bostonin aineistolla on pieni koko, vain 506 havaintoa. Tätä tietoaineistoa pidetään vertailukohtana uusien lineaaristen regressioalgoritmien kokeilemisessa.
Aineisto koostuu:
Vaihteleva | Kuvaus |
zn | Yli 25 000 neliömetrin tontteihin kaavoitetun asuinmaan osuus |
indus | Muu kuin vähittäiskaupan yrityshehtaarien osuus kaupunkia kohti. |
nox | typpioksidien pitoisuus |
rm | huoneiden keskimääräinen lukumäärä asuntoa kohti |
ikä | ennen vuotta 1940 rakennettujen omistamien yksiköiden osuus |
dis | painotetut etäisyydet viiteen Bostonin työvoimakeskukseen |
verottaa | kiinteän omaisuuden veroaste 10000 dollaria kohti |
ptratio | oppilaan ja opettajan suhde kaupunkikohtaisesti |
medv | Omistaja-asuntojen mediaaniarvo tuhansina dollareina |
Crim | asukasta kohden rikollisuusaste kaupungeittain |
chas | Charles Riverin nuken muuttuja (1, jos jokia rajoittaa; 0 muuten) |
B | mustien osuus kaupungin mukaan |
Tässä opetusohjelmassa arvioimme mediaanihinnan käyttämällä lineaarista regresoria, mutta painopiste on yhdessä tietyssä koneoppimisen prosessissa: "tietojen valmistelussa".
Malli yleistää datan mallin. Jos haluat kaapata tällaisen kuvion, sinun on löydettävä se ensin. Hyvä käytäntö on suorittaa data-analyysi ennen koneoppimisalgoritmin suorittamista.
Oikeiden ominaisuuksien valitseminen vaikuttaa kaikin tavoin mallisi menestykseen. Kuvittele, että yrität arvioida ihmisten palkkoja, jos et sisällytä sukupuolta kovariaattina, päädyt huonoon arvioon.
Toinen tapa parantaa mallia on tarkastella riippumattomien muuttujien välistä korrelaatiota. Palataksemme esimerkkiin, voit ajatella koulutusta erinomaisena ehdokkaana palkan mutta myös ammatin ennustamiseen. On oikeudenmukaista sanoa, että ammatti riippuu koulutustasosta, nimittäin korkea-asteen koulutus johtaa usein parempaan ammattiin. Jos yleistämme tämän ajatuksen, voimme sanoa, että riippuvan muuttujan ja selittävän muuttujan välinen korrelaatio voidaan suurentaa vielä yhdellä selittävällä muuttujalla.
Ottaaksemme koulutuksen rajoitetun vaikutuksen ammattiin voimme käyttää vuorovaikutustermiä.
Jos tarkastellaan palkan yhtälöä, siitä tulee:
Jos se on positiivinen, se tarkoittaa, että ylimääräinen koulutustaso nostaa talon mediaaniarvoa korkeammalla korkealla ammattitasolla. Toisin sanoen koulutuksen ja ammatin välillä on vuorovaikutusvaikutus.
Tässä opetusohjelmassa yritämme nähdä, mitkä muuttujat voivat olla hyvä ehdokas vuorovaikutustermeille. Testataan, johtaako tällaisen tiedon lisääminen parempaan hintaennusteeseen.
Tässä opetusohjelmassa opit
- Yhteenvetotilastot
- Fasettien yleiskatsaus
- Kasvojen syväsukellus
- Asenna Facet
- Yleiskatsaus
- Kaavio
- Kasvojen syväsukellus
- TensorFlow
- Valmistelutiedot
- Perus regressio: Vertailuarvo
- Paranna mallia: vuorovaikutustermi
Yhteenvetotilastot
Voit seurata muutamia vaiheita ennen malliin siirtymistä. Kuten aiemmin mainittiin, malli on yleistys tiedoille. Paras käytäntö on ymmärtää tiedot ja tehdä ennuste. Jos et tiedä tietojasi, sinulla on pienet mahdollisuudet parantaa malliasi.
Ensimmäisessä vaiheessa lataa tiedot pandojen tietokehyksenä ja luo harjoitusjoukko ja testaussarja.
Vinkkejä: Tätä opetusohjelmaa varten sinulla on oltava matplotlit ja seaborn asennettuna Pythoniin. Voit asentaa Python-paketin lennossa Jupyterin avulla. Sinun ei pitäisi tehdä tätä
!conda install -- yes matplotlib
mutta
import sys!{sys.executable} -m pip install matplotlib # Already installed!{sys.executable} -m pip install seaborn
Huomaa, että tämä vaihe ei ole tarpeen, jos sinulla on matplotlib ja merisyntyinen asennettuna.
Matplotlib on kirjasto, jolla luodaan kaavio Pythonissa. Seaborn on tilastollinen visualisointikirjasto, joka on rakennettu matplotlibin päälle. Se tarjoaa houkuttelevia ja kauniita tontteja.
Alla oleva koodi tuo tarvittavat kirjastot.
import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np
Kirjaston sklearn sisältää Bostonin aineiston. Voit soittaa sen API: lle tuoda tiedot.
boston = load_boston()df = pd.DataFrame(boston.data)
Ominaisuuden nimi tallennetaan objektin ominaisuuden_nimet taulukossa.
boston.feature_names
Tuotos
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='Voit nimetä sarakkeet uudelleen.
df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)
Muunnat muuttujan CHAS merkkijonomuuttujaksi ja merkitset sen kyllä, jos CHAS = 1 ja ei, jos CHAS = 0
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: objectPandojen kanssa on yksinkertaista jakaa tietojoukko. Jaat tietojoukon satunnaisesti 80 prosentin koulutusjoukolla ja 20 prosentin testausjoukolla. Pandoissa on sisäänrakennettu kustannustoiminto datakehysnäytteen jakamiseksi.
Ensimmäisen parametrin frac arvo on 0–1. Asetat arvoksi 0,8 valitaksesi satunnaisesti 80 prosenttia datakehyksestä.
Random_state sallii saman datakehyksen palauttamisen kaikille.
### Create train/test setdf_train=df.sample(frac=0.8,random_state=200)df_test=df.drop(df_train.index)Voit saada datan muodon. Sen pitäisi olla:
- Junajoukko: 506 * 0,8 = 405
- Testisarja: 506 * 0,2 = 101
print(df_train.shape, df_test.shape)Tuotos
(405, 14) (101, 14)df_test.head(5)Tuotos
RIKKOMUS ZN INDUS CHAS NOX RM IKÄ DIS RAD VEROTTAA PTRATIO B LSTAT HINTA 0 0,00632 18.0 2.31 ei 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 ei 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 ei 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 ei 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 ei 0,524 6.172 96.1 5.9505 5.0 311,0 15.2 396.90 19.15 27.1 Tiedot ovat sotkuisia; se on usein epätasapainossa ja siroteltu ulkopuolisilla arvoilla, jotka heittävät analyysin ja koneoppimisen koulutuksen.
Ensimmäinen askel tietojoukon puhdistamiseksi on ymmärtää, missä se on puhdistettava. Tietojoukon puhdistaminen voi olla hankalaa etenkin kaikilla yleistettävillä tavoilla
Google Research -tiimi on kehittänyt tätä työtä varten työkalun nimeltä Facets, joka auttaa visualisoimaan tietoja ja leikkaamaan ne kaikenlaisilla tavoilla. Tämä on hyvä lähtökohta ymmärtää miten datajoukko on järjestetty.
Fasettien avulla voit löytää paikan, josta tiedot eivät näytä aivan samalla tavalla kuin ajattelet.
Paitsi heidän verkkosovelluksensa, Google helpottaa työkalupaketin upottamista Jupyter-muistikirjaan.
Facets on kaksi osaa:
- Fasettien yleiskatsaus
- Kasvojen syväsukellus
Fasettien yleiskatsaus
Facets Overview antaa yleiskuvan tietojoukosta. Facets Overview jakaa tietojen sarakkeet riveihin näkyvistä tärkeistä tiedoista
- puuttuvien havaintojen prosenttiosuus
- min ja max arvot
- tilastot, kuten keskiarvo, mediaani ja keskihajonta.
- Se lisää myös sarakkeen, joka näyttää prosenttien arvoista, jotka ovat nollia, mikä on hyödyllistä, kun suurin osa arvoista on nollia.
- Nämä jakaumat on mahdollista nähdä testitietojoukossa sekä kunkin ominaisuuden koulutusjoukot. Se tarkoittaa, että voit tarkistaa, että testillä on samanlainen jakauma kuin harjoitustiedoilla.
Tämä on ainakin vähimmäisvaatimus ennen koneoppimista. Tämän työkalun avulla et missaa tätä ratkaisevaa vaihetta, ja se tuo esiin joitain poikkeavuuksia.
Kasvojen syväsukellus
Facets Deep Dive on hieno työkalu. Se antaa tietoisuutesi tietojoukolle ja zoomaa kokonaan sisään nähdäksesi yksittäisen datan. Se tarkoittaa, että voit rajata tiedot riveittäin ja sarakkeittain mihin tahansa tietojoukon ominaisuuksiin.
Käytämme näitä kahta työkalua Bostonin tietojoukon kanssa.
Huomaa : Et voi käyttää Facets Overview- ja Facets Deep Dive -sovelluksia samanaikaisesti. Sinun on ensin tyhjennettävä muistikirja, jotta voit vaihtaa työkalua.
Asenna Facet
Voit käyttää Facetin verkkosovellusta suurimman osan analyysistä. Tässä opetusohjelmassa näet, kuinka sitä käytetään Jupyter-muistikirjassa.
Ensinnäkin sinun on asennettava nbextensions. Se tehdään tällä koodilla. Kopioit ja liität seuraavan koodin koneesi päätelaitteeseen.
pip install jupyter_contrib_nbextensionsHeti sen jälkeen sinun on kloonattava tietokonevarastot. Sinulla on kaksi vaihtoehtoa:
Vaihtoehto 1) Kopioi ja liitä tämä koodi päätelaitteeseen (suositus)
Jos koneellasi ei ole Git-sovellusta, siirry tähän URL-osoitteeseen https://git-scm.com/download/win ja noudata ohjeita. Kun olet valmis, voit käyttää pääkäyttäjän git-komentoa Mac-käyttäjälle tai Anaconda-kehotetta Windows-käyttäjälle
git clone https://github.com/PAIR-code/facetsVaihtoehto 2) Siirry osoitteeseen https://github.com/PAIR-code/facets ja lataa arkistot.
Jos valitset ensimmäisen vaihtoehdon, tiedosto päätyy lataustiedostoon. Voit joko antaa tiedoston ladata tai vetää sen toiselle polulle.
Voit tarkistaa, missä Facets on tallennettu tällä komentorivillä:
echo `pwd`/`ls facets`Nyt kun olet löytänyt Facets, sinun on asennettava se Jupyter Notebookiin. Sinun on asetettava työhakemisto polulle, jolla puolet sijaitsevat.
Nykyisen työkansion ja Facets-zip-sijainnin tulisi olla samat.
Sinun on osoitettava työkansio Facetiin:
cd facetsVoit asentaa Facetsin Jupyteriin kahdella tavalla. Jos olet asentanut Jupyterin Condan kanssa kaikille käyttäjille, kopioi tämä koodi:
voi käyttää jupyter nbextension asentaa facets-dist /
jupyter nbextension install facets-dist/Muussa tapauksessa käytä:
jupyter nbextension install facets-dist/ --userSelvä, olet valmistautunut. Avaa Facet Overview.
Yleiskatsaus
Yleiskatsaus käyttää Python-komentosarjaa tilastojen laskemiseen. Sinun on tuotava komento nimeltä generic_feature_statistics_generator Jupyteriin. Älä huoli; komentosarja sijaitsee puolitiedostoissa.
Sinun on löydettävä sen polku. Se on helppo tehdä. Avaa avaimet, avaa tiedosto facets_overview ja sitten python. Kopioi polku
Sen jälkeen palaa takaisin Jupyteriin ja kirjoita seuraava koodi. Muuta polku '/ Users / Thomas / facets / facets_overview / python' polulle.
# Add the facets overview python code to the python path# Add timport syssys.path.append('/Users/Thomas/facets/facets_overview/python')Voit tuoda komentosarjan alla olevalla koodilla.
from generic_feature_statistics_generator importGenericFeatureStatisticsGeneratorWindowsissa sama koodi tulee
import syssys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")from generic_feature_statistics_generator import GenericFeatureStatisticsGeneratorOminaisuustilastojen laskemiseksi sinun on käytettävä funktiota GenericFeatureStatisticsGenerator () ja objektia ProtoFromDataFrames. Voit siirtää datakehyksen sanakirjassa. Esimerkiksi, jos haluamme luoda yhteenvetotilaston junajoukolle, voimme tallentaa tiedot sanakirjaan ja käyttää niitä objektissa `` ProtoFromDataFrames ''.
'name': 'train', 'table': df_trainNimi on näytettävän taulukon nimi, ja käytät taulukon nimeä, jonka haluat laskea yhteenvedon. Esimerkissäsi taulukko, joka sisältää tiedot, on 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")Lopuksi kopioit ja liitä alla oleva koodi. Koodi tulee suoraan GitHubilta. Sinun pitäisi pystyä näkemään tämä:
# 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)) Kaavio
Kun olet tarkistanut tiedot ja niiden jakauman, voit piirtää korrelaatiomatriisin. Korrelaatiomatriisi laskee Pearsonin kertoimen. Tämä kerroin on sidottu välillä -1 ja 1, positiivinen arvo osoittaa positiivisen korrelaation ja negatiivinen arvo negatiivisen korrelaation.
Olet kiinnostunut näkemään, mitkä muuttujat voivat olla hyvä ehdokas vuorovaikutustermeille.
## 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})Tuotos
png
Matriisista näet:
- LSTAT
- RM
Korreloivat voimakkaasti PRICE: n kanssa. Toinen mielenkiintoinen piirre on vahva positiivinen korrelaatio NOX: n ja INDUS: n välillä, mikä tarkoittaa, että nämä kaksi muuttujaa liikkuvat samaan suuntaan. Lisäksi ne ovat myös korreloimassa PRICE: n kanssa. DIS korreloi myös voimakkaasti IND: n ja NOX: n kanssa.
Sinulla on ensimmäinen vihje siitä, että IND ja NOX voivat olla hyviä ehdokkaita sieppauskaudelle ja DIS voi olla myös mielenkiintoista keskittyä.
Voit mennä hieman syvemmälle piirtämällä pariruudukon. Se havainnollistaa yksityiskohtaisemmin aiemmin piirtämääsi korrelaatiokarttaa.
Parin ruudukko, jonka muodostamme, on seuraava:
- Yläosa: Hajontakaavio, jossa on asennettu viiva
- Lävistäjä: Ytimen tiheyskaavio
- Alaosa: Monimuuttujan ytimen tiheyskaavio
Valitset kohdennuksen neljään itsenäiseen muuttujaan. Valinta vastaa muuttujia, jotka korreloivat voimakkaasti PRICE: n kanssa
- INDUS
- NOX
- RM
- LSTAT
lisäksi HINTA.
Huomaa , että vakiovirhe lisätään oletusarvoisesti sirontakaavioon.
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)Tuotos
Aloitetaan yläosasta:
- Hinta korreloi negatiivisesti INDUS: n, NOX: n ja LSTAT: n kanssa; korreloi positiivisesti RM: n kanssa.
- LSTAT: n ja PRICE: n kanssa on hieman epälineaarisuus
- Siellä on kuin suora viiva, kun hinta on 50. Tietojoukon kuvauksesta PRICE on katkaistu arvolla 50
Lävistäjä
- NOX: lla näyttää olevan kaksi klusteria, yksi noin 0,5 ja toinen noin 0,85.
Voit tarkistaa siitä tarkemmin tarkastelemalla alaosaa. Monimuuttujainen ytimen tiheys on mielenkiintoinen siinä mielessä, että se värittää siellä missä suurin osa pisteistä on. Ero hajontakaavioon piirtää todennäköisyystiheyden, vaikka tietojoukossa ei olisikaan pistettä tietylle koordinaatille. Kun väri on vahvempi, se osoittaa suuren pistekonsentraation tämän alueen ympärillä.
Jos tarkistat INDUS- ja NOX-muuttujien tiheyden, näet positiivisen korrelaation ja kaksi klusteria. Kun teollisuuden osuus on yli 18, typpioksidipitoisuus on yli 0,6.
Voit miettiä INDUS: n ja NOX: n välisen vuorovaikutuksen lisäämistä lineaarisessa suhteessa.
Lopuksi voit käyttää toista Googlen luomaa työkalua, Facets Deep Dive. Käyttöliittymä on jaettu neljään pääosaan. Keskellä oleva keskialue on tietojen zoomattava näyttö. Paneelin yläosassa on avattava valikko, jossa voit muuttaa tietojen asettelun fasetoinnille, paikannukselle ja väreille. Oikealla on yksityiskohtainen näkymä tietystä tietorivistä. Se tarkoittaa, että voit napsauttaa mitä tahansa tietopistettä keskellä olevassa visualisoinnissa nähdäksesi tietyn tietopisteen yksityiskohdat.
Datan visualisointivaiheen aikana olet kiinnostunut etsimään pareittain korrelaatiota riippumattoman muuttujan ja talon hinnan välillä. Siihen liittyy kuitenkin vähintään kolme muuttujaa, ja 3D-käyrät ovat monimutkaisia työskennellä.
Yksi tapa puuttua tähän ongelmaan on luoda kategorinen muuttuja. Toisin sanoen voimme luoda 2D-piirroksen värin pisteen. Voit jakaa muuttujan PRICE neljään luokkaan, jolloin jokainen luokka on kvartiili (eli 0,25, 0,5, 0,75). Kutsut tätä uutta muuttujaa 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")
Kasvojen syväsukellus
Deep Dive -sovelluksen avaamiseksi sinun on muutettava tiedot json-muotoon. Pandat sen kohteena. Voit käyttää to_json-tiedostoa Pandas-tietojoukon jälkeen.
Koodin ensimmäinen rivi käsittelee tietojoukon kokoa.
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')Alla oleva koodi tulee Google GitHubista. Kun olet suorittanut koodin, sinun pitäisi pystyä näkemään tämä:
# 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)) Olet kiinnostunut selvittämään, onko teollisuuden hinnan, oksidipitoisuuden, etäisyyden työpaikkaan ja talon hinnan välillä yhteys.
Tätä varten jaat ensin tiedot toimialueen ja värin mukaan hintaneljänneksen mukaan:
- Valitse fasetointi X ja valitse INDUS.
- Valitse Näyttö ja DIS. Se värjää pisteet talon hinnan kvartiililla
tässä tummemmat värit tarkoittavat, että etäisyys ensimmäiseen työpaikkaan on pitkä.
Toistaiseksi se osoittaa jälleen mitä tiedät, alhaisempi teollisuusaste, korkeampi hinta. Nyt voit tarkastella erittelyä INDUX: n, NOX: n mukaan.
- Valitse viistetty Y ja valitse NOX.
Nyt voit nähdä, että kaukana ensimmäisestä työpaikasta sijaitsevalla talolla on pienin teollisuuden osuus ja siten pienin oksidipitoisuus. Jos päätät näyttää tyypin Q_PRICE-arvolla ja zoomata vasenta alakulmaa, näet minkä tyyppisen hinnan se on.
Sinulla on toinen vihje siitä, että IND: n, NOX: n ja DIS: n välinen vuorovaikutus voi olla hyvä ehdokas mallin parantamiseksi.
TensorFlow
Tässä osiossa arvioit lineaarisen luokittelijan TensorFlow-estimaattoreiden sovellusliittymällä. Toimi seuraavasti:
- Valmistele tiedot
- Arvioi vertailumalli: Ei vuorovaikutusta
- Arvioi malli vuorovaikutuksella
Muista, että koneoppimisen tavoitteena on minimoida virhe. Tässä tapauksessa malli, jolla on pienin keskimääräinen neliövirhe, voittaa. TensorFlow-estimaattori laskee tämän muuttujan automaattisesti.
Valmistelutiedot
Useimmissa tapauksissa sinun on muutettava tietosi. Siksi Facets-katsaus on kiehtova. Yhteenvetotilastosta näet poikkeavuuksia. Nämä arvot vaikuttavat arvioihin, koska ne eivät näytä analysoitavalta populaatiolta. Poikkeukselliset poikkeavat yleensä tuloksista. Esimerkiksi positiivinen poikkeama pyrkii yliarvioimaan kertoimen.
Hyvä ratkaisu tämän ongelman ratkaisemiseen on muuttujan standardointi. Standardointi tarkoittaa yhden keskihajontaa ja nollan keskiarvoa. Standardointiprosessi käsittää kaksi vaihetta. Ensinnäkin se vähentää muuttujan keskiarvon. Toiseksi se jakaa varianssilla siten, että jakaumalla on yksikkövarianssi
Kirjaston sklearn on hyödyllinen muuttujien standardoinnissa. Voit käyttää moduulin esikäsittelyä objekti-asteikolla tähän tarkoitukseen.
Voit käyttää alla olevaa toimintoa skaalaamaan tietojoukkoa. Huomaa, että et skaalaa tarrasaraketta ja kategorisia muuttujia.
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_scaleVoit käyttää toimintoa rakentamaan skaalattu juna / testisarja.
df_train_scale = standardize_data(df_train)df_test_scale = standardize_data(df_test)Perus regressio: Vertailuarvo
Ensinnäkin koulutat ja testaat mallia ilman vuorovaikutusta. Tarkoituksena on nähdä mallin suorituskykymittari.
Tapa kouluttaa mallia on täsmälleen sama kuin korkean tason API: n opetusohjelma . Käytät TensorFlow-estimaattoria LinearRegressor.
Muistutuksena sinun on valittava:
- malliin asetettavat ominaisuudet
- muuttaa ominaisuuksia
- konstruoi lineaarinen regressori
- rakenna funktio input_fn
- kouluta mallia
- testaa mallia
Mallin kouluttamiseen käytetään kaikkia tietojoukon muuttujia. Yhteensä on tasomaisia muuttujia ja yksi kategorinen muuttuja
## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']CATE_FEATURES = ['CHAS']Muunat ominaisuudet numeeriseksi tai kategoriseksi sarakkeeksi
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'])]Luot mallin linearRegressorilla. Tallennat mallin kansioon train_Boston
model = tf.estimator.LinearRegressor(model_dir="train_Boston",feature_columns=categorical_features + continuous_features)Tuotos
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} Jokainen juna- tai testidatan sarake muunnetaan tensoriksi funktiolla 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)Arvioit mallin junatiedoista.
model.train(input_fn=get_input_fn(df_train_scale,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)Tuotos
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.Viimeinkin arvioit mallin suorituskyvyn testisarjassa
model.evaluate(input_fn=get_input_fn(df_test_scale,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)Tuotos
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}Mallin menetys on 1650. Tämä on mittari, joka on voitettava seuraavassa osassa
Paranna mallia: vuorovaikutustermi
Opetusohjelman ensimmäisen osan aikana näet muuttujien välillä mielenkiintoisen suhteen. Erilaiset visualisointitekniikat paljastivat, että INDUS ja NOS ovat yhteydessä toisiinsa ja kääntyvät suurentaakseen vaikutusta hintaan. INDUS: n ja NOS: n välinen vuorovaikutus ei vaikuta hintaan, mutta myös tämä vaikutus on vahvempi, kun se on vuorovaikutuksessa DIS: n kanssa.
On aika yleistää tämä ajatus ja nähdä, voitko parantaa mallin ennustettua mallia.
Sinun on lisättävä kaksi uutta saraketta kuhunkin tietojoukkoon: juna + testi. Tätä varten luot yhden funktion vuorovaikutustermin laskemiseksi ja toisen kolminkertaisen vuorovaikutustermin laskemiseksi. Jokainen toiminto tuottaa yhden sarakkeen. Kun uudet muuttujat on luotu, voit yhdistää ne harjoitustietojoukkoon ja testataineistoon.
Ensinnäkin sinun on luotava uusi muuttuja INDUS: n ja NOX: n vuorovaikutusta varten.
Alla oleva funktio palauttaa kaksi datakehystä, juna ja testi, vuorovaikutuksella var_1 ja var_2, tapauksessasi INDUS ja 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, testTallennat kaksi uutta saraketta
interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')interation_ind_ns_train.shape(325,)Toiseksi luot toisen toiminnon kolminkertaisen vuorovaikutustermin laskemiseksi.
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')Nyt kun sinulla on kaikki tarvittavat sarakkeet, voit lisätä ne kouluttaa ja testata aineistoa. Nimeät nämä kaksi uutta datakehystä:
- 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)Tuotos
Se on siinä; voit arvioida uuden mallin vuorovaikutustermeillä ja nähdä, miten suorituskykymittari on.
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)Tuotos
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} KOODI
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)Tuotos
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)Tuotos
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}Uusi tappio on 1515. Pelkästään lisäämällä kaksi uutta muuttujaa, voit vähentää tappiota. Se tarkoittaa, että voit tehdä paremman ennusteen kuin vertailumallilla.