Lineaarisen regression opetusohjelma TensorFlow'lla [esimerkkejä]

Mikä on lineaarinen regressio?

Lineaarinen regressio on tilastollinen lähestymistapa kahden muuttujan välisten suhteiden mallintamiseen. Tämä mallinnus tehdään skalaarivasteen ja yhden tai useamman selittävän muuttujan välillä. Suhdetta yhteen selittävään muuttujaan kutsutaan yksinkertaiseksi lineaariseksi regressioksi ja useamman kuin yhden selittävän muuttujan kohdalla sitä kutsutaan moninkertaiseksi lineaariseksi regressioksi.

TensorFlow tarjoaa työkalut laskelmien täydelliseen hallintaan. Tämä tehdään matalan tason API:lla. Tämän lisäksi TensorFlow on varustettu laajalla valikoimalla API-liittymiä, jotka suorittavat monia koneoppiminen algoritmeja. Tämä on korkean tason API. TensorFlow kutsuu niitä arvioijiksi

  • Matalan tason API: Rakenna arkkitehtuuri, mallin optimointi tyhjästä. Se on monimutkaista aloittelijalle
  • Korkean tason API: Määritä algoritmi. Se on helppokäyttöinen. TensorFlow tarjoaa työkalupakin nimeltä estimaattori rakentaa, kouluttaa, arvioida ja ennustaa.

Tässä opetusohjelmassa käytät vain arvioijat. Laskelmat ovat nopeampia ja helpompia toteuttaa. Opetusohjelman ensimmäisessä osassa selitetään, kuinka gradientin laskeutumisoptimoijaa käytetään lineaarisen regression harjoittamiseen TensorFlow'ssa. Toisessa osassa käytät Bostonin tietojoukkoa talon hinnan ennustamiseen TensorFlow-estimaattorilla.

Lataa Boston DataSet

Kuinka kouluttaa lineaarista regressiomallia

Ennen kuin alamme harjoitella mallia, katsotaanpa, mikä on lineaarinen regressio.

Kuvittele, että sinulla on kaksi muuttujaa, x ja y, ja sinun tehtäväsi on ennustaa arvon tuntemisen arvo. Jos piirrät tiedot, voit nähdä positiivisen suhteen riippumattoman muuttujan x ja riippuvan muuttujan y välillä.

Harjoittele lineaarista regressiomallia

Voit huomata, että jos x=1,y on suunnilleen yhtä suuri kuin 6 ja jos x=2,y on noin 8.5.

Tämä ei ole kovin tarkka menetelmä ja altis virheille, varsinkin satojatuhansia pisteitä sisältävän tietojoukon kanssa.

Lineaarinen regressio arvioidaan yhtälön avulla. Muuttuja y selitetään yhdellä tai usealla yhteismuuttujalla. Esimerkissäsi on vain yksi riippuvainen muuttuja. Jos sinun on kirjoitettava tämä yhtälö, se on:

Harjoittele lineaarista regressiomallia

Kanssa:

  • Lineaarinen regressio TensorFlow'n kanssa on puolueellisuus. eli jos x=0, y=Harjoittele lineaarista regressiomallia
  • Harjoittele lineaarista regressiomallia on x:ään liittyvä paino
  • Harjoittele lineaarista regressiomallia on mallin jäännös tai virhe. Se sisältää sen, mitä malli ei voi oppia tiedoista

Kuvittele, että sovit malliin ja löydät seuraavan ratkaisun:

  • Harjoittele lineaarista regressiomallia = 3.8
  • Harjoittele lineaarista regressiomallia = 2.78

Voit korvata nämä luvut yhtälössä ja siitä tulee:

y = 3.8 + 2.78x

Sinulla on nyt parempi tapa löytää y:n arvot. Eli voit korvata x:n millä tahansa arvolla, jonka haluat ennustaa y:n. Alla olevassa kuvassa olemme korvanneet yhtälön x kaikilla tietojoukon arvoilla ja piirtäneet tuloksen.

Harjoittele lineaarista regressiomallia

Punainen viiva edustaa sovitettua arvoa, eli y:n arvoja jokaiselle x:n arvolle. Sinun ei tarvitse nähdä x:n arvoa ennustaaksesi y:tä, jokaiselle x:lle on mikä tahansa, joka kuuluu punaiseen viivaan. Voit myös ennustaa arvoja x suurempi kuin 2!

Jos haluat laajentaa lineaarista regressiota useammille kovariaateille, voit lisätä malliin enemmän muuttujia. Ero perinteisen analyysin ja lineaarisen regression välillä on se, että lineaarinen regressio tarkastelee, kuinka y reagoi kullekin muuttujalle x itsenäisesti.

Katsotaanpa esimerkkiä. Kuvittele, että haluat ennustaa jäätelökaupan myyntiä. Aineisto sisältää erilaisia ​​tietoja, kuten sää (esim. sateinen, aurinkoinen, pilvinen), asiakastiedot (esim. palkka, sukupuoli, siviilisääty).

Perinteinen analyysi yrittää ennustaa myyntiä esimerkiksi laskemalla kunkin muuttujan keskiarvon ja yrittämällä arvioida myyntiä eri skenaarioissa. Se johtaa huonoihin ennusteisiin ja rajoittaa analyysin valittuun skenaarioon.

Jos käytät lineaarista regressiota, voit kirjoittaa tämän yhtälön:

Harjoittele lineaarista regressiomallia

Algoritmi löytää parhaan ratkaisun painoille; se tarkoittaa, että se yrittää minimoida kustannukset (eron sovitetun viivan ja datapisteiden välillä).

Kuinka algoritmi toimii

Algoritmin toiminta

Algoritmi valitsee kullekin satunnaisluvun Lineaarinen regressio TensorFlow'n kanssa ja Algoritmin toiminta ja korvaa x:n arvo saadaksesi y:n ennustetun arvon. Jos tietojoukossa on 100 havaintoa, algoritmi laskee 100 ennustettua arvoa.

Voimme laskea virheen, huomautti Algoritmin toiminta mallista, joka on ennustetun arvon ja todellisen arvon välinen ero. Positiivinen virhe tarkoittaa, että malli aliarvioi y:n ennusteen ja negatiivinen virhe tarkoittaa, että malli yliarvioi y:n ennusteen.

Algoritmin toiminta

Tavoitteesi on minimoida virheen neliö. Algoritmi laskee neliövirheen keskiarvon. Tätä vaihetta kutsutaan virheen minimoimiseksi. Lineaariselle regressiolle on Keskimääräinen neliövirhe, jota kutsutaan myös MSE:ksi. Matemaattisesti se on:

Algoritmin toiminta

Missä:

  • Algoritmin toiminta onko painot niin Algoritmin toiminta viittaa ennustettuun arvoon
  • y on todelliset arvot
  • m on havaintojen lukumäärä

Huomaa, että Algoritmin toiminta tarkoittaa, että se käyttää matriisien transponointia. The Algoritmin toiminta on keskiarvon matemaattinen merkintä.

Tavoitteena on löytää paras Algoritmin toiminta jotka minimoivat MSE:n

Jos keskimääräinen virhe on suuri, se tarkoittaa, että malli toimii huonosti ja painoja ei ole valittu oikein. Painot korjataksesi sinun on käytettävä optimoijaa. Perinteinen optimoija on ns Kaltevuuslasku.

Gradienttilasku ottaa derivaatan ja vähentää tai lisää painoa. Jos derivaatta on positiivinen, painoa pienennetään. Jos derivaatta on negatiivinen, paino kasvaa. Malli päivittää painot ja laskee virheen uudelleen. Tätä prosessia toistetaan, kunnes virhe ei enää muutu. Jokaista prosessia kutsutaan an iteraatio. Lisäksi gradientit kerrotaan oppimisnopeudella. Se osoittaa oppimisen nopeuden.

Jos oppimisnopeus on liian pieni, kestää hyvin kauan algoritmin konvergoiminen (eli vaatii paljon iteraatioita). Jos oppimisnopeus on liian korkea, algoritmi ei ehkä koskaan lähentyisi.

Algoritmin toiminta

Yllä olevasta kuvasta näet, että malli toistaa prosessin noin 20 kertaa ennen kuin löytää painoille vakaan arvon, saavuttaen siten alimman virheen.

Huomaa, että, virhe ei ole yhtä suuri kuin nolla, vaan stabiloituu 5:n ympärille. Se tarkoittaa, että malli tekee tyypillisen virheen 5. Jos haluat pienentää virhettä, sinun on lisättävä malliin lisätietoja, kuten enemmän muuttujia tai käytettävä erilaisia ​​estimaattoreita .

Muistat ensimmäisen yhtälön

Algoritmin toiminta

Lopulliset painot ovat 3.8 ja 2.78. Alla oleva video näyttää, kuinka kaltevuuslasku optimoi häviöfunktion näiden painojen löytämiseksi

Lineaarisen regression harjoittaminen TensorFlow'lla

Nyt kun ymmärrät paremmin, mitä konepellin takana tapahtuu, olet valmis käyttämään TensorFlow'n tarjoamaa estimaattorisovellusliittymää ensimmäisen lineaarisen regression harjoittamiseen TensorFlow'n avulla.

Käytät Bostonin tietojoukkoa, joka sisältää seuraavat muuttujat

rikos rikollisuus asukasta kohden kaupungeittain
zn yli 25,000 XNUMX neliömetrin suuruisille tonteille kaavoitetun asuinmaan osuus.
Indus osuus vähittäiskaupan ulkopuolisista eekkeristä kaupunkia kohden.
nox typen oksidien pitoisuus
rm keskimääräinen huonemäärä asuntoa kohden
ikä ennen vuotta 1940 rakennettujen omistusasuntojen osuus
DIS painotetut etäisyydet viiteen Bostonin työvoimakeskukseen
vero täysiarvoinen kiinteistöveroprosentti 10,000 XNUMX dollaria kohden
ptratio oppilaiden ja opettajien välinen suhde kaupungeittain
medv Omistusasuntojen mediaaniarvo tuhansissa dollareissa

Luot kolme erilaista tietojoukkoa:

aineisto tavoite muoto
koulutus Harjoittele mallia ja hanki painot 400, 10
Arviointi Arvioi mallin suorituskykyä näkymättömillä tiedoilla 100, 10
Ennustaa Käytä mallia talon arvon ennustamiseen uusien tietojen perusteella 6, 10

Tavoitteena on käyttää tietojoukon ominaisuuksia talon arvon ennustamiseen.

Opetusohjelman toisessa osassa opit käyttämään TensorFlow'ta kolmella eri tavalla tietojen tuomiseen:

  • Pandan kanssa
  • Kanssa Nöpö
  • Vain TF

Huomaa, että kaikki vaihtoehdot tarjota samat tulokset.

Opit käyttämään korkean tason API:ta TensorFlow-lineaarisen regressiomallin rakentamiseen ja arvioimiseen. Jos käytit matalan tason APIa, sinun oli määritettävä käsin:

  • Tappio-toiminto
  • Optimoi: kaltevuuslasku
  • Matriisien kertolasku
  • Graafi ja tensori

Tämä on työlästä ja monimutkaisempaa aloittelijalle.

Panda

Sinun on tuotava tarvittavat kirjastot mallin kouluttamiseksi.

import pandas as pd
from sklearn import datasets
import tensorflow as tf
import itertools

Vaihe 1) Tuo tiedot sovelluksella panda.

Määrität sarakkeiden nimet ja tallennat ne COLUMNS-kansioon. Voit tuoda tiedot komennolla pd.read_csv().

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",
           "dis", "tax", "ptratio", "medv"]

training_set = pd.read_csv("E:/boston_train.csv", skipinitialspace=True,skiprows=1, names=COLUMNS)

test_set = pd.read_csv("E:/boston_test.csv", skipinitialspace=True,skiprows=1, names=COLUMNS)

ennustusjoukko = pd.read_csv("E:/boston_predict.csv", skipinitialspace=True,skiprows=1, names=COLUMNS)

Voit tulostaa tietojen muodon.

print(training_set.shape, test_set.shape, prediction_set.shape)

ulostulo

(400, 10) (100, 10) (6, 10)

Huomaa, että tunniste eli y-kirjaimesi sisältyy tietojoukkoon. Joten sinun on määritettävä kaksi muuta luetteloa. Yksi sisältää vain ominaisuudet ja toinen vain tunnisteen nimen. Nämä kaksi luetteloa kertovat arvioijallesi, mitkä ovat tietojoukon ominaisuudet ja mikä sarakkeen nimi on tunniste

Se tehdään alla olevalla koodilla.

FEATURES = ["crim", "zn", "indus", "nox", "rm",				
                 "age", "dis", "tax", "ptratio"]
LABEL = "medv"

Vaihe 2) Muunna tiedot

Sinun on muunnettava numeeriset muuttujat oikeaan muotoon. Tensorflow tarjoaa menetelmän jatkuvan muuttujan muuntamiseksi: tf.feature_column.numeric_column().

Edellisessä vaiheessa määrität luettelon ominaisuuksista, jotka haluat sisällyttää malliin. Nyt voit käyttää tätä luetteloa muuntaaksesi ne numeerisiksi tiedoiksi. Jos haluat sulkea pois ominaisuuksia mallistasi, pudota vapaasti yksi tai useampi muuttuja luettelosta OMINAISUUDET, ennen kuin muodostat ominaisuuden_cols.

Huomaa, että käytät Python luettelon ymmärtäminen luettelon OMINAISUUDET avulla luodaksesi uuden luettelon nimeltä feature_cols. Se auttaa välttämään kirjoittamista yhdeksän kertaa tf.feature_column.numeric_column(). Listan ymmärtäminen on nopeampi ja selkeämpi tapa luoda uusia luetteloita

feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES]

Vaihe 3) Määrittele estimaattori

Tässä vaiheessa sinun on määritettävä estimaattori. Tensorflow tarjoaa tällä hetkellä kuusi valmiiksi rakennettua estimaattoria, joista 6 luokitustehtävää varten ja 3 TensorFlow-regressiotehtävää varten:

  • Regressori
    • DNNRegressor
    • Lineaarinen regressori
    • DNNLineaCombinedRegressor
  • luokittelija
    • DNNC-luokitus
    • Lineaarinen luokitin
    • DNNLineaCombinedClassifier

Tässä opetusohjelmassa käytät lineaarista regressoria. Voit käyttää tätä toimintoa käyttämällä tf.estimator-ohjelmaa.

Funktio tarvitsee kaksi argumenttia:

  • feature_columns: Sisältää malliin sisällytettävät muuttujat
  • model_dir: polku kaavion tallentamiseen, mallin parametrien tallentamiseen jne

Tensorflow luo automaattisesti tiedoston nimeltä train työhakemistoosi. Sinun on käytettävä tätä polkua päästäksesi Tensorboardiin alla olevan TensorFlow-regressioesimerkin mukaisesti.

estimator = tf.estimator.LinearRegressor(    
        feature_columns=feature_cols,   
        model_dir="train")

ulostulo

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train', '_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 0x1a215dc550>, '_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}

TensorFlow'n hankala osa on tapa ruokkia mallia. Tensorflow on suunniteltu toimimaan rinnakkaislaskennan ja erittäin suuren tietojoukon kanssa. Koneen resurssien rajallisuuden vuoksi on mahdotonta syöttää malliin kaikkia tietoja kerralla. Tätä varten sinun on syötettävä joukko tietoja joka kerta. Huomaa, että puhumme valtavasta tietojoukosta, jossa on miljoonia tai enemmän tietueita. Jos et lisää erää, päädyt muistivirheeseen.

Jos tietosi sisältävät esimerkiksi 100 havaintoa ja määrität eräkoon 10, se tarkoittaa, että malli näkee 10 havaintoa jokaisessa iteraatiossa (10*10).

Kun malli on nähnyt kaikki tiedot, se viimeistelee yhden aikakausi. Epookki määrittää, kuinka monta kertaa haluat mallin näkevän tiedot. On parempi asettaa tämän vaiheen arvoksi ei mitään ja antaa mallin suorittaa iteraatioiden lukumäärän.

Toinen lisättävä tieto on, jos haluat sekoittaa tiedot ennen jokaista iteraatiota. Harjoittelun aikana on tärkeää sekoittaa dataa, jotta malli ei opi tietojoukon tiettyä mallia. Jos malli oppii datan taustalla olevan mallin yksityiskohdat, sillä on vaikeuksia yleistää näkymätön datan ennustetta. Tätä kutsutaan liikaa. Malli toimii hyvin harjoitusdatalla, mutta ei voi ennustaa oikein näkymättömille tiedoille.

TensorFlow tekee näistä kahdesta vaiheesta helppoa. Kun data menee liukuhihnaan, se tietää kuinka monta havaintoa se tarvitsee (erä) ja jos sen täytyy sekoittaa dataa.

Voit opastaa Tensorflowa mallin syöttämisessä käyttämällä pandas_input_fn. Tämä objekti tarvitsee 5 parametria:

  • x: ominaisuustiedot
  • y: etikettitiedot
  • eräkoko: erä. Oletuksena 128
  • num_epoch: Epookkien lukumäärä, oletuksena 1
  • shuffle: Sekoita tai älä sekoita tietoja. Oletuksena Ei mitään

Sinun on syötettävä mallia useita kertoja, jotta voit määrittää funktion tämän prosessin toistamiseksi. kaikki tämä funktio get_input_fn.

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)

Tavallinen menetelmä mallin suorituskyvyn arvioimiseksi on:

  • Harjoittele mallia
  • Arvioi malli eri tietojoukossa
  • Tee ennustus

Tensorflow-estimaattori tarjoaa kolme erilaista toimintoa näiden kolmen vaiheen suorittamiseksi helposti.

Vaihe 4): Kouluta mallia

Voit käyttää estimaattorijunaa mallin arvioimiseen. Junaestimaattori tarvitsee input_fn ja useita vaiheita. Voit käyttää yllä luomaasi toimintoa mallin syöttämiseen. Sitten ohjeistat mallia iteroimaan 1000 kertaa. Huomaa, että et määritä aikakausien määrää, annat mallin iteroitua 1000 kertaa. Jos asetat epookkien lukumääräksi 1, malli toistuu 4 kertaa: Harjoitussarjassa on 400 tietuetta ja eräkoko on 128

  1. 128-rivit
  2. 128-rivit
  3. 128-rivit
  4. 16-rivit

Siksi on helpompi asettaa epookkien lukumääräksi ei mitään ja määrittää iteraatioiden lukumäärä alla olevan TensorFlow-luokitusesimerkin mukaisesti.

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

ulostulo

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/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 238.616
INFO:tensorflow:loss = 13909.657, step = 101 (0.420 sec)
INFO:tensorflow:global_step/sec: 314.293
INFO:tensorflow:loss = 12881.449, step = 201 (0.320 sec)
INFO:tensorflow:global_step/sec: 303.863
INFO:tensorflow:loss = 12391.541, step = 301 (0.327 sec)
INFO:tensorflow:global_step/sec: 308.782
INFO:tensorflow:loss = 12050.5625, step = 401 (0.326 sec)
INFO:tensorflow:global_step/sec: 244.969
INFO:tensorflow:loss = 11766.134, step = 501 (0.407 sec)
INFO:tensorflow:global_step/sec: 155.966
INFO:tensorflow:loss = 11509.922, step = 601 (0.641 sec)
INFO:tensorflow:global_step/sec: 263.256
INFO:tensorflow:loss = 11272.889, step = 701 (0.379 sec)
INFO:tensorflow:global_step/sec: 254.112
INFO:tensorflow:loss = 11051.9795, step = 801 (0.396 sec)
INFO:tensorflow:global_step/sec: 292.405
INFO:tensorflow:loss = 10845.855, step = 901 (0.341 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.9873.

Voit tarkistaa Tensorboardin seuraavan komennon:

activate hello-tf
# For MacOS
tensorboard --logdir=./train
# For Windows
tensorboard --logdir=train

Vaihe 5) Arvioi mallisi

Voit arvioida mallisi sopivuuden testisarjaan alla olevalla koodilla:

ev = estimator.evaluate(    
          input_fn=get_input_fn(test_set,                          
          num_epochs=1,                          
          n_batch = 128,                          
          shuffle=False))

ulostulo

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-01:43:13
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-01:43:13
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896

Voit tulostaa tappion alla olevalla koodilla:

loss_score = ev["loss"]
print("Loss: {0:f}".format(loss_score))

ulostulo

Loss: 3215.895996

Mallin häviö on 3215. Yhteenvetotilastosta saat käsityksen virheen suuruudesta.

training_set['medv'].describe()

ulostulo

count    400.000000
mean      22.625500
std        9.572593
min        5.000000
25%       16.600000
50%       21.400000
75%       25.025000
max       50.000000
Name: medv, dtype: float64

Yllä olevasta yhteenvetotilastosta tiedät, että asunnon keskihinta on 22 tuhatta, minimihinta 9 tuhatta ja maksimi 50 tuhatta. Malli tekee tyypillisen 3k dollarin virheen.

Vaihe 6) Tee ennustus

Lopuksi voit käyttää estimaattoria TensorFlow ennustaa arvioidaksesi 6 Bostonin talon arvon.

y = estimator.predict(    
         input_fn=get_input_fn(prediction_set,                          
         num_epochs=1,                          
         n_batch = 128,                          
         shuffle=False))

Voit tulostaa arvioidut arvot käyttämällä tätä koodia:

predictions = list(p["predictions"] for p in itertools.islice(y, 6))print("Predictions: {}".format(str(predictions)))

ulostulo

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.96125], dtype=float32), array([27.270979], dtype=float32), array([29.299236], dtype=float32), array([16.436684], dtype=float32), array([21.460876], dtype=float32)]

Malli ennustaa seuraavat arvot:

Talo Ennustus
1 32.29
2 18.96
3 27.27
4 29.29
5 16.43
7 21.46

Huomaa, että emme tiedä todellista arvoa. Syväoppimisen opetusohjelmassa yrität voittaa lineaarisen mallin

Numpy ratkaisu

Tässä osiossa kerrotaan, kuinka mallia koulutetaan käyttämällä numpy-estimaattoria tietojen syöttämiseen. Menetelmä on sama, paitsi että käytät numpy_input_fn estimaattoria.

training_set_n = pd.read_csv("E:/boston_train.csv").arvot

test_set_n = pd.read_csv("E:/boston_test.csv").arvot

ennustus_set_n = pd.read_csv("E:/boston_predict.csv").arvot

Vaihe 1) Tuo tiedot

Ensinnäkin sinun on erotettava ominaisuusmuuttujat etiketistä. Sinun on tehtävä tämä harjoitustietoja ja arviointia varten. On nopeampaa määrittää funktio datan jakamiseksi.

def prepare_data(df):     
        X_train = df[:, :-3]    
        y_train = df[:,-3]    
        return X_train, y_train

Voit käyttää toimintoa jakaaksesi tarran juna/arvioi tietojoukon ominaisuuksista

X_train, y_train = prepare_data(training_set_n)
X_test, y_test = prepare_data(test_set_n)

Sinun on suljettava pois ennustetietojoukon viimeinen sarake, koska se sisältää vain NaN

x_predict = prediction_set_n[:, :-2]

Vahvista taulukon muoto. Huomaa, että tarralla ei saa olla mittaa, se tarkoittaa (400,).

print(X_train.shape, y_train.shape, x_predict.shape)

ulostulo

(400, 9) (400,) (6, 9)

Voit rakentaa ominaisuussarakkeet seuraavasti:

feature_columns = [      tf.feature_column.numeric_column('x', shape=X_train.shape[1:])]

Estimaattori on määritelty kuten ennenkin, ohjeistat ominaisuussarakkeet ja mihin kuvaaja tallennetaan.

estimator = tf.estimator.LinearRegressor(    
         feature_columns=feature_columns,    
         model_dir="train1")

ulostulo

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train1', '_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 0x1a218d8f28>, '_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}

Voit käyttää numpy estimaporia syöttämään tiedot mallille ja kouluttamaan mallia. Huomaa, että määritämme input_fn-funktion ennen luettavuuden helpottamiseksi.

# Train the estimatortrain_input = tf.estimator.inputs.numpy_input_fn(   
           x={"x": X_train},    
           y=y_train,    
           batch_size=128,    
           shuffle=False,    
           num_epochs=None)
           estimator.train(input_fn = train_input,steps=5000)

ulostulo

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 train1/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 490.057
INFO:tensorflow:loss = 13909.656, step = 101 (0.206 sec)
INFO:tensorflow:global_step/sec: 788.986
INFO:tensorflow:loss = 12881.45, step = 201 (0.126 sec)
INFO:tensorflow:global_step/sec: 736.339
INFO:tensorflow:loss = 12391.541, step = 301 (0.136 sec)
INFO:tensorflow:global_step/sec: 383.305
INFO:tensorflow:loss = 12050.561, step = 401 (0.260 sec)
INFO:tensorflow:global_step/sec: 859.832
INFO:tensorflow:loss = 11766.133, step = 501 (0.117 sec)
INFO:tensorflow:global_step/sec: 804.394
INFO:tensorflow:loss = 11509.918, step = 601 (0.125 sec)
INFO:tensorflow:global_step/sec: 753.059
INFO:tensorflow:loss = 11272.891, step = 701 (0.134 sec)
INFO:tensorflow:global_step/sec: 402.165
INFO:tensorflow:loss = 11051.979, step = 801 (0.248 sec)
INFO:tensorflow:global_step/sec: 344.022
INFO:tensorflow:loss = 10845.854, step = 901 (0.288 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train1/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.985.
Out[23]:
<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1b6ea860>

Toistat saman vaiheen eri estimaattorilla mallin arvioimiseksi

eval_input = tf.estimator.inputs.numpy_input_fn(    
       x={"x": X_test},    
       y=y_test, 
       shuffle=False,    
       batch_size=128,    
       num_epochs=1)
   estimator.evaluate(eval_input,steps=None)

ulostulo

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-01:44:00
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-01:44:00
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.158947, global_step = 1000, loss = 3215.8945
Out[24]:
{'average_loss': 32.158947, 'global_step': 1000, 'loss': 3215.8945}

Lopuksi voit laskea ennusteen. Sen pitäisi olla samanlainen kuin pandat.

test_input = tf.estimator.inputs.numpy_input_fn(    
        x={"x": x_predict},    
        batch_size=128,    
        num_epochs=1,   
        shuffle=False)
        y = estimator.predict(test_input) 			
predictions = list(p["predictions"] for p in itertools.islice(y, 6))
print("Predictions: {}".format(str(predictions)))

ulostulo

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.961248], dtype=float32), array([27.270979], dtype=float32), array([29.299242], dtype=float32), array([16.43668], dtype=float32), array([21.460878], dtype=float32)]

Tensorflow ratkaisu

Viimeinen osa on omistettu TensorFlow-ratkaisulle. Tämä menetelmä on hieman monimutkaisempi kuin toinen.

Huomaa, että jos käytät Jupyter muistikirja, sinun täytyy käynnistää uudelleen ja puhdistaa ydin suorittaaksesi tämän istunnon.

TensorFlow on rakentanut loistavan työkalun tietojen siirtämiseen putkistoon. Tässä osiossa rakennat input_fn-funktion itse.

Vaihe 1) Määritä tietojen polku ja muoto

Ensinnäkin määrität kaksi muuttujaa csv-tiedoston polulla. Huomaa, että sinulla on kaksi tiedostoa, yksi harjoitussarjaa ja toinen testaussarjaa varten.

import tensorflow as tf
df_train = "E:/boston_train.csv"
df_eval = "E:/boston_test.csv"

Sitten sinun on määritettävä sarakkeet, joita haluat käyttää csv-tiedostosta. Käytämme kaikki. Tämän jälkeen sinun on ilmoitettava muuttujan tyyppi.

Float-muuttuja määritellään [0.]

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",				
                "dis", "tax", "ptratio", "medv"]RECORDS_ALL = [[0.0], [0.0], [0.0], [0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]]

Vaihe 2) Määritä input_fn-funktio

Funktio voidaan jakaa kolmeen osaan:

  1. Tuo tiedot
  2. Luo iteraattori
  3. Käytä dataa

Alla on yleiskoodi funktion määrittelemiseksi. Koodi selitetään myöhemmin

def input_fn(data_file, batch_size, num_epoch = None):				
       # Step 1				
          def parse_csv(value):        
          columns = tf.decode_csv(value, record_defaults= RECORDS_ALL)        
          features = dict(zip(COLUMNS, columns))				
          #labels = features.pop('median_house_value')        
          labels =  features.pop('medv')        
          return features, labels							
          
          # Extract lines from input files using the 
          Dataset API.    dataset = (tf.data.TextLineDataset(data_file) # Read text file       
          .skip(1) # Skip header row       
          .map(parse_csv))			   
          
          dataset = dataset.repeat(num_epoch)    
          dataset = dataset.batch(batch_size) 				
          # Step 3    
          iterator = dataset.make_one_shot_iterator()    
          features, labels = iterator.get_next()    
          return features, labels

** Tuo tiedot**

Csv-tiedostossa tietojoukkomenetelmä lukee yhden rivin kerrallaan. Tietojoukon rakentamiseksi sinun on käytettävä objektia TextLineTietojoukko. Tietojoukossasi on otsikko, joten sinun on käytettävä skip(1)-komentoa ohittaaksesi ensimmäinen rivi. Tässä vaiheessa luet vain tiedot ja suljet pois liukuhihnan otsikon. Syöttääksesi mallin, sinun on erotettava ominaisuudet tarrasta. Menetelmä, jota käytetään minkä tahansa muunnoksen soveltamiseen dataan, on kartta.

Tämä menetelmä kutsuu funktiota, jonka luot ohjeiden muuntamista varten. Lyhyesti sanottuna sinun on välitettävä tiedot TextLineTietojoukkoobjekti, jätä pois otsikko ja käytä muunnos, jota funktio ohjaa.Koodin selitys

  • tf.data.TextLineDataset(data_file): Tämä rivi lukee csv-tiedoston
  • .skip(1) : ohittaa otsikon
  • .map(parse_csv)): jäsentää tietueet tensoreihinSinun on määritettävä funktio, joka ohjaa karttaobjektia. Voit kutsua tätä funktiota parse_csv.

Tämä funktio jäsentää csv-tiedoston menetelmällä tf.decode_csv ja ilmoittaa ominaisuudet ja tunnisteen. Ominaisuudet voidaan ilmoittaa sanakirjana tai monikkona. Käytät sanakirjamenetelmää, koska se on kätevämpää.Koodin selitys

  • tf.decode_csv(arvo, record_defaults= RECORDS_ALL): menetelmä decode_csv käyttää TextLineTietojoukko csv-tiedoston lukemiseen. record_defaults opastaa TensorFlow'ta sarakkeiden tyypistä.
  • dict(zip(_CSV_COLUMNS, columns)): täytä sanakirja kaikilla tämän tietojenkäsittelyn aikana puretuilla sarakkeilla
  • features.pop('median_house_value'): Sulje kohdemuuttuja pois ominaisuusmuuttujasta ja luo tunnistemuuttuja

Tietojoukko tarvitsee lisäelementtejä syöttääkseen tensorit iteratiivisesti. Itse asiassa sinun on lisättävä menetelmän toisto, jotta tietojoukko voi jatkaa mallin syöttämistä loputtomiin. Jos et lisää menetelmää, malli toistuu vain kerran ja antaa sitten virheilmoituksen, koska prosessissa ei syötetä enempää dataa.

Sen jälkeen voit hallita eräkokoa erämenetelmällä. Se tarkoittaa, että kerrot tietojoukolle, kuinka monta dataa haluat siirtää liukuhihnassa kullekin iteraatiolle. Jos asetat suuren eräkoon, malli on hidas.

Vaihe 3) Luo iteraattori

Nyt olet valmis toiseen vaiheeseen: luo iteraattori palauttamaan tietojoukon elementit.

Yksinkertaisin tapa luoda operaattori on menetelmä make_one_shot_iterator.

Tämän jälkeen voit luoda ominaisuuksia ja tunnisteita iteraattorista.

Vaihe 4) Käytä tiedot

Voit tarkistaa, mitä tapahtuu input_fn-funktiolla. Sinun on kutsuttava toiminto istunnon aikana kuluttaaksesi dataa. Kokeile niin, että erän koko on 1.

Huomaa, että se tulostaa sanakirjan ominaisuudet ja tarran taulukkona.

Se näyttää csv-tiedoston ensimmäisen rivin. Voit yrittää suorittaa tämän koodin useita kertoja eri koolla.

next_batch = input_fn(df_train, batch_size = 1, num_epoch = None)
with tf.Session() as sess:    
     first_batch  = sess.run(next_batch)    
     print(first_batch)

ulostulo

({'crim': array([2.3004], dtype=float32), 'zn': array([0.], dtype=float32), 'indus': array([19.58], dtype=float32), 'nox': array([0.605], dtype=float32), 'rm': array([6.319], dtype=float32), 'age': array([96.1], dtype=float32), 'dis': array([2.1], dtype=float32), 'tax': array([403.], dtype=float32), 'ptratio': array([14.7], dtype=float32)}, array([23.8], dtype=float32))

Vaihe 4) Määritä ominaisuussarake

Sinun on määritettävä numeeriset sarakkeet seuraavasti:

X1= tf.feature_column.numeric_column('crim')
X2= tf.feature_column.numeric_column('zn')
X3= tf.feature_column.numeric_column('indus')
X4= tf.feature_column.numeric_column('nox')
X5= tf.feature_column.numeric_column('rm')
X6= tf.feature_column.numeric_column('age')
X7= tf.feature_column.numeric_column('dis')
X8= tf.feature_column.numeric_column('tax')
X9= tf.feature_column.numeric_column('ptratio')

Huomaa, että sinun on yhdistettävä kaikki muuttujat ämpäriin

base_columns = [X1, X2, X3,X4, X5, X6,X7, X8, X9]

Vaihe 5) Rakenna malli

Voit harjoitella mallia estimaattorilla LinearRegressor.

model = tf.estimator.LinearRegressor(feature_columns=base_columns, model_dir='train3')

ulostulo

INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'train3', '_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 0x1820a010f0>, '_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}

Sinun on käytettävä lambda-funktiota, jotta voit kirjoittaa argumentin funktioon inpu_fn. Jos et käytä a lambda -toiminto, et voi kouluttaa mallia.

# Train the estimatormodel.train(steps =1000,    
          input_fn= lambda : input_fn(df_train,batch_size=128, num_epoch = None))

ulostulo

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 train3/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 72.5646
INFO:tensorflow:loss = 13909.657, step = 101 (1.380 sec)
INFO:tensorflow:global_step/sec: 101.355
INFO:tensorflow:loss = 12881.449, step = 201 (0.986 sec)
INFO:tensorflow:global_step/sec: 109.293
INFO:tensorflow:loss = 12391.541, step = 301 (0.915 sec)
INFO:tensorflow:global_step/sec: 102.235
INFO:tensorflow:loss = 12050.5625, step = 401 (0.978 sec)
INFO:tensorflow:global_step/sec: 104.656
INFO:tensorflow:loss = 11766.134, step = 501 (0.956 sec)
INFO:tensorflow:global_step/sec: 106.697
INFO:tensorflow:loss = 11509.922, step = 601 (0.938 sec)
INFO:tensorflow:global_step/sec: 118.454
INFO:tensorflow:loss = 11272.889, step = 701 (0.844 sec)
INFO:tensorflow:global_step/sec: 114.947
INFO:tensorflow:loss = 11051.9795, step = 801 (0.870 sec)
INFO:tensorflow:global_step/sec: 111.484
INFO:tensorflow:loss = 10845.855, step = 901 (0.897 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train3/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.9873.
Out[8]:
<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x18225eb8d0>

Voit arvioida mallisi sopivuuden testisarjaan alla olevalla koodilla:

results = model.evaluate(steps =None,input_fn=lambda: input_fn(df_eval, batch_size =128, num_epoch = 1))
for key in results:   
print("   {}, was: {}".format(key, results[key]))

ulostulo

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-02:06:02
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-02:06:02
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896
   average_loss, was: 32.158958435058594
   loss, was: 3215.89599609375
   global_step, was: 1000

Viimeinen vaihe on arvon ennustaminen ominaisuuden matriisien arvon perusteella. Voit kirjoittaa sanakirjan arvoilla, jotka haluat ennustaa. Mallissasi on 9 ominaisuutta, joten sinun on annettava arvo jokaiselle. Malli tarjoaa ennusteen jokaiselle niistä.

Alla olevaan koodiin kirjoitit kunkin df_predict csv-tiedoston sisältämien ominaisuuksien arvot.

Sinun on kirjoitettava uusi input_fn-funktio, koska tietojoukossa ei ole tunnistetta. Voit käyttää API from_tensor tietojoukosta.

prediction_input = {				
          'crim': [0.03359,5.09017,0.12650,0.05515,8.15174,0.24522],				
          'zn': [75.0,0.0,25.0,33.0,0.0,0.0],				
          'indus': [2.95,18.10,5.13,2.18,18.10,9.90],				
          'nox': [0.428,0.713,0.453,0.472,0.700,0.544],				
          'rm': [7.024,6.297,6.762,7.236,5.390,5.782],				
          'age': [15.8,91.8,43.4,41.1,98.9,71.7],				
          'dis': [5.4011,2.3682,7.9809,4.0220,1.7281,4.0317],				
          'tax': [252,666,284,222,666,304],				
          'ptratio': [18.3,20.2,19.7,18.4,20.2,18.4]
     }
     def test_input_fn():    
     dataset = tf.data.Dataset.from_tensors(prediction_input)    
     return dataset
     
     # Predict all our prediction_inputpred_results = model.predict(input_fn=test_input_fn)

Lopuksi tulostat ennusteet.

for pred in enumerate(pred_results):    
print(pred)

ulostulo

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
(0, {'predictions': array([32.297546], dtype=float32)})
(1, {'predictions': array([18.96125], dtype=float32)})
(2, {'predictions': array([27.270979], dtype=float32)})
(3, {'predictions': array([29.299236], dtype=float32)})
(4, {'predictions': array([16.436684], dtype=float32)})
(5, {'predictions': array([21.460876], dtype=float32)})

INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-5000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. (0, {'predictions': array([35.60663], dtype=float32)}) (1, {'predictions': array([22.298521], dtype=float32)}) (2, {'predictions': array([25.74533], dtype=float32)}) (3, {'predictions': array([35.126694], dtype=float32)}) (4, {'predictions': array([17.94416], dtype=float32)}) (5, {'predictions': array([22.606628], dtype=float32)})

Yhteenveto

Mallin kouluttamiseksi sinun on:

  • Määrittele ominaisuudet: Riippumattomat muuttujat: X
  • Määrittele tunniste: Riippuva muuttuja: y
  • Rakenna juna/koesarja
  • Määritä alkuperäinen paino
  • Määritä häviöfunktio: MSE
  • Optimoi malli: Gradienttilasku
  • Määritellä:
    • Oppimisnopeus
    • Epookin lukumäärä
    • Erän koko

Tässä opetusohjelmassa opit käyttämään korkean tason API:ta lineaarisen regression TensorFlow-estimaattorissa. Sinun on määritettävä:

  1. Ominaisuussarakkeet. Jos jatkuva: tf.feature_column.numeric_column(). Voit täyttää luettelon python-luetteloiden ymmärtämisellä
  2. Estimaattori: tf.estimator.LinearRegressor(feature_columns, model_dir)
  3. Funktio, jolla tuodaan tiedot, erän koko ja aikakausi: input_fn()

Sen jälkeen olet valmis harjoittelemaan, arvioimaan ja tekemään ennusteita train(), arvioi() ja ennusta()