Lineær regresjonsveiledning med TensorFlow [Eksempler]

Hva er lineær regresjon?

lineær regresjon er en tilnærming innen statistikk for modellering av sammenhenger mellom to variabler. Denne modelleringen gjøres mellom en skalarrespons og en eller flere forklaringsvariabler. Forholdet til én forklaringsvariabel kalles enkel lineær regresjon og for mer enn én forklaringsvariabel kalles det multippel lineær regresjon.

TensorFlow gir verktøy for å ha full kontroll over beregningene. Dette gjøres med lavnivå-API. På toppen av det er TensorFlow utstyrt med et stort utvalg av APIer for å utføre mange maskinlæring algoritmer. Dette er API på høyt nivå. TensorFlow kaller dem estimatorer

  • API på lavt nivå: Bygg arkitekturen, optimalisering av modellen fra bunnen av. Det er komplisert for en nybegynner
  • API på høyt nivå: Definer algoritmen. Det er lettere-vennlig. TensorFlow gir en verktøykasse kalt estimator å konstruere, trene, evaluere og lage en prediksjon.

I denne opplæringen vil du bruke bare estimatorer. Beregningene er raskere og er enklere å implementere. Den første delen av opplæringen forklarer hvordan du bruker gradient descent optimizer for å trene en lineær regresjon i TensorFlow. I en andre del vil du bruke Boston-datasettet til å forutsi prisen på et hus ved hjelp av TensorFlow-estimator.

Last ned Boston DataSet

Hvordan trene en lineær regresjonsmodell

Før vi begynner å trene modellen, la oss ta en titt på hva som er en lineær regresjon.

Tenk deg at du har to variabler, x og y, og oppgaven din er å forutsi verdien av å vite verdien av . Hvis du plotter dataene, kan du se en positiv sammenheng mellom den uavhengige variabelen din, x og den avhengige variabelen y.

Tren en lineær regresjonsmodell

Du kan observere at hvis x=1, vil y være omtrent lik 6 og hvis x=2, vil y være rundt 8.5.

Dette er ikke en veldig nøyaktig metode og utsatt for feil, spesielt med et datasett med hundretusenvis av poeng.

En lineær regresjon evalueres med en ligning. Variabelen y forklares av en eller flere kovariater. I ditt eksempel er det bare én avhengig variabel. Hvis du må skrive denne ligningen, vil den være:

Tren en lineær regresjonsmodell

Med:

  • Lineær regresjon med TensorFlow er skjevheten. dvs. hvis x=0, y=Tren en lineær regresjonsmodell
  • Tren en lineær regresjonsmodell er vekten knyttet til x
  • Tren en lineær regresjonsmodell er resten eller feilen til modellen. Det inkluderer det modellen ikke kan lære av dataene

Tenk deg at du passer modellen og du finner følgende løsning for:

  • Tren en lineær regresjonsmodell = 3.8
  • Tren en lineær regresjonsmodell = 2.78

Du kan erstatte disse tallene i ligningen og det blir:

y= 3.8 + 2.78x

Du har nå en bedre måte å finne verdiene for y på. Det vil si at du kan erstatte x med hvilken som helst verdi du vil forutsi y. I bildet nedenfor har vi erstattet x i ligningen med alle verdiene i datasettet og plott resultatet.

Tren en lineær regresjonsmodell

Den røde linjen representerer den tilpassede verdien, det vil si verdiene til y for hver verdi av x. Du trenger ikke se verdien av x for å forutsi y, for hver x er det noen som tilhører den røde linjen. Du kan også forutsi for verdier på x høyere enn 2!

Hvis du ønsker å utvide den lineære regresjonen til flere kovariater, kan du ved å legge til flere variabler i modellen. Forskjellen mellom tradisjonell analyse og lineær regresjon er at den lineære regresjonen ser på hvordan y vil reagere for hver variabel x tatt uavhengig.

La oss se et eksempel. Tenk deg at du vil forutsi salget til en iskrembutikk. Datasettet inneholder forskjellig informasjon som været (dvs. regn, sol, overskyet), kundeinformasjon (dvs. lønn, kjønn, sivilstand).

Tradisjonell analyse vil prøve å forutsi salget ved å la oss si å beregne gjennomsnittet for hver variabel og prøve å estimere salget for forskjellige scenarier. Det vil føre til dårlige spådommer og begrense analysen til det valgte scenarioet.

Hvis du bruker lineær regresjon, kan du skrive denne ligningen:

Tren en lineær regresjonsmodell

Algoritmen vil finne den beste løsningen for vektene; det betyr at den vil prøve å minimere kostnadene (forskjellen mellom den monterte linjen og datapunktene).

Hvordan algoritmen fungerer

Arbeid av algoritme

Algoritmen vil velge et tilfeldig tall for hver Lineær regresjon med TensorFlow og Arbeid av algoritme og erstatte verdien av x for å få den anslåtte verdien av y. Hvis datasettet har 100 observasjoner, beregner algoritmen 100 predikerte verdier.

Vi kan beregne feilen, bemerket Arbeid av algoritme av modellen, som er forskjellen mellom den predikerte verdien og den reelle verdien. En positiv feil betyr at modellen undervurderer prediksjonen av y, og en negativ feil betyr at modellen overvurderer prediksjonen til y.

Arbeid av algoritme

Målet ditt er å minimere kvadratet av feilen. Algoritmen beregner gjennomsnittet av kvadratfeilen. Dette trinnet kalles minimering av feilen. For lineær regresjon er Mean Square Feil, også kalt MSE. Matematisk er det:

Arbeid av algoritme

Hvor:

  • Arbeid av algoritme er vektene slik Arbeid av algoritme refererer til den anslåtte verdien
  • y er de virkelige verdiene
  • m er antall observasjoner

Legg merke til at Arbeid av algoritme betyr at den bruker transponeringen av matrisene. De Arbeid av algoritme er den matematiske notasjonen av gjennomsnittet.

Målet er å finne de beste Arbeid av algoritme som minimerer MSE

Hvis gjennomsnittsfeilen er stor, betyr det at modellen yter dårlig og vektene ikke er riktig valgt. For å korrigere vektene må du bruke en optimizer. Den tradisjonelle optimizeren kalles Gradient Nedstigning.

Gradientnedstigningen tar den deriverte og reduserer eller øker vekten. Hvis derivatet er positivt, reduseres vekten. Hvis den deriverte er negativ, øker vekten. Modellen vil oppdatere vektene og beregne feilen på nytt. Denne prosessen gjentas til feilen ikke endres lenger. Hver prosess kalles en køyring. Dessuten multipliseres gradientene med en læringsrate. Det indikerer hastigheten på læringen.

Hvis læringshastigheten er for liten, vil det ta veldig lang tid før algoritmen konvergerer (dvs. krever mange iterasjoner). Hvis læringshastigheten er for høy, kan det hende at algoritmen aldri konvergerer.

Arbeid av algoritme

Du kan se fra bildet over, modellen gjentar prosessen ca. 20 ganger før for å finne en stabil verdi for vektene, og når derfor den laveste feilen.

Legg merke til at, feilen er ikke lik null, men stabiliserer seg rundt 5. Det betyr at modellen gjør en typisk feil på 5. Hvis du vil redusere feilen, må du legge til mer informasjon til modellen, for eksempel flere variabler eller bruke forskjellige estimatorer .

Du husker den første ligningen

Arbeid av algoritme

Sluttvektene er 3.8 og 2.78. Videoen nedenfor viser deg hvordan gradientnedstigningen optimaliserer tapsfunksjonen for å finne denne vekten

Hvordan trene en lineær regresjon med TensorFlow

Nå som du har en bedre forståelse av hva som skjer bak panseret, er du klar til å bruke estimator-APIet levert av TensorFlow for å trene din første lineære regresjon ved hjelp av TensorFlow.

Du vil bruke Boston Dataset, som inkluderer følgende variabler

krim kriminalitet per innbygger etter by
zn andel boligareal som er regulert for tomter over 25,000 XNUMX sq.ft.
Indus andel ikke-detaljhandelsvirksomhet per by.
nox konsentrasjon av nitrogenoksider
rm gjennomsnittlig antall rom per bolig
alder andel av selveiere bygget før 1940
DIS vektede avstander til fem Boston sysselsettingssentre
skatt full verdi eiendomsskattesats per dollar 10,000 XNUMX
ptratio elev-lærer forholdet etter by
medv Medianverdien av eierboliger i tusen dollar

Du vil lage tre forskjellige datasett:

datasett Målet forme
Kurs Tren modellen og skaff vektene 400, 10
Evaluering Evaluer ytelsen til modellen på usynlige data 100, 10
forutsi Bruk modellen til å forutsi husverdi på nye data 6, 10

Målet er å bruke funksjonene i datasettet til å forutsi verdien av huset.

I løpet av den andre delen av opplæringen vil du lære hvordan du bruker TensorFlow med tre forskjellige måter å importere dataene på:

Merk at alle alternativer gi de samme resultatene.

Du vil lære hvordan du bruker høynivå-API for å bygge, trene og evaluere en TensorFlow lineær regresjonsmodell. Hvis du brukte API-en på lavt nivå, måtte du definere for hånd:

  • Tapsfunksjon
  • Optimaliser: Gradientnedstigning
  • Multiplikasjon av matriser
  • Graf og tensor

Dette er kjedelig og mer komplisert for nybegynnere.

pandaer

Du må importere de nødvendige bibliotekene for å trene modellen.

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

Trinn 1) Importer dataene med panda.

Du definerer kolonnenavnene og lagrer dem i KOLONNER. Du kan bruke pd.read_csv() for å importere dataene.

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)

prediction_set = pd.read_csv(“E:/boston_predict.csv”, skipinitialspace=True,skiprows=1, names=COLUMNS)

Du kan skrive ut formen på dataene.

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

Produksjon

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

Merk at etiketten, altså din y, er inkludert i datasettet. Så du må definere to andre lister. En som bare inneholder funksjonene og en med kun navnet på etiketten. Disse to listene vil fortelle estimatoren din hva som er funksjonene i datasettet og hvilket kolonnenavn som er etiketten

Det gjøres med koden nedenfor.

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

Trinn 2) Konverter dataene

Du må konvertere de numeriske variablene i riktig format. Tensorflow gir en metode for å konvertere kontinuerlig variabel: tf.feature_column.numeric_column().

I forrige trinn definerer du en liste over en funksjon du vil inkludere i modellen. Nå kan du bruke denne listen til å konvertere dem til numeriske data. Hvis du vil ekskludere funksjoner i modellen din, kan du gjerne slippe en eller flere variabler i listen FEATURES før du konstruerer feature_cols

Merk at du vil bruke Python listeforståelse med listen FEATURES for å lage en ny liste kalt feature_cols. Det hjelper deg å unngå å skrive ni ganger tf.feature_column.numeric_column(). En listeforståelse er en raskere og renere måte å lage nye lister på

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

Trinn 3) Definer estimatoren

I dette trinnet må du definere estimatoren. Tensorflow tilbyr for tiden 6 forhåndsbygde estimatorer, inkludert 3 for klassifiseringsoppgaver og 3 for TensorFlow regresjonsoppgaver:

  • Regressor
    • DNNRegressor
    • LineærRegressor
    • DNNLineaCombinedRegressor
  • klassifisere
    • DNNklassifiserer
    • LinearClassifier
    • DNNLineaCombinedClassifier

I denne opplæringen vil du bruke den lineære regressoren. For å få tilgang til denne funksjonen må du bruke tf.estimator.

Funksjonen trenger to argumenter:

  • feature_columns: Inneholder variablene som skal inkluderes i modellen
  • model_dir: bane for å lagre grafen, lagre modellparametrene osv

Tensorflow vil automatisk opprette en fil kalt tog i arbeidskatalogen din. Du må bruke denne banen for å få tilgang til Tensorboard som vist i TensorFlow-regresjonseksemplet nedenfor.

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

Produksjon

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}

Den vanskelige delen med TensorFlow er måten å mate modellen på. Tensorflow er designet for å fungere med parallell databehandling og svært store datasett. På grunn av begrensningen av maskinressursene er det umulig å mate modellen med alle dataene samtidig. For det må du mate en batch med data hver gang. Merk at vi snakker om et stort datasett med millioner eller flere poster. Hvis du ikke legger til batch, vil du ende opp med en minnefeil.

For eksempel, hvis dataene dine inneholder 100 observasjoner og du definerer en batchstørrelse på 10, betyr det at modellen vil se 10 observasjoner for hver iterasjon (10*10).

Når modellen har sett alle dataene, fullfører den en epoke. En epoke definerer hvor mange ganger du vil at modellen skal se dataene. Det er bedre å sette dette trinnet til ingen og la modellen utføre iterasjon antall ganger.

En annen informasjon å legge til er om du vil blande dataene før hver iterasjon. Under opplæringen er det viktig å stokke dataene slik at modellen ikke lærer spesifikt mønster av datasettet. Hvis modellen lærer detaljene i det underliggende mønsteret til dataene, vil den ha vanskeligheter med å generalisere prediksjonen for usynlige data. Dette kalles overtilpassing. Modellen presterer bra på treningsdataene, men kan ikke forutsi riktig for usett data.

TensorFlow gjør disse to trinnene enkle å gjøre. Når dataene går til rørledningen, vet den hvor mange observasjoner den trenger (batch) og om den må stokke dataene.

For å instruere Tensorflow hvordan modellen skal mate, kan du bruke pandas_input_fn. Dette objektet trenger 5 parametere:

  • x: funksjonsdata
  • y: etikettdata
  • batch_size: batch. Som standard 128
  • num_epoch: Antall epoker, som standard 1
  • shuffle: Bland eller ikke dataene. Som standard, Ingen

Du må mate modellen mange ganger slik at du definerer en funksjon for å gjenta denne prosessen. all denne funksjonen 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)

Den vanlige metoden for å evaluere ytelsen til en modell er å:

  • Tren modellen
  • Evaluer modellen i et annet datasett
  • Gjør spådommer

Tensorflow-estimator gir tre forskjellige funksjoner for å utføre disse tre trinnene enkelt.

Trinn 4): Tren modellen

Du kan bruke estimatortoget til å evaluere modellen. Togestimatoren trenger en input_fn og en rekke trinn. Du kan bruke funksjonen du opprettet ovenfor for å mate modellen. Deretter ber du modellen om å iterere 1000 ganger. Merk at du ikke spesifiserer antall epoker, du lar modellen iterere 1000 ganger. Hvis du setter antallet epoker til 1, vil modellen iterere 4 ganger: Det er 400 poster i treningssettet, og batchstørrelsen er 128

  1. 128 rader
  2. 128 rader
  3. 128 rader
  4. 16 rader

Derfor er det lettere å sette antall epoker til ingen og definere antall iterasjoner som vist i eksemplet under TensorFlow-klassifiseringen.

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

Produksjon

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.

Du kan sjekke Tensorboard vil følgende kommando:

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

Trinn 5) Vurder modellen din

Du kan evaluere passformen til modellen din på testsettet med koden nedenfor:

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

Produksjon

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

Du kan skrive ut tapet med koden nedenfor:

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

Produksjon

Loss: 3215.895996

Modellen har et tap på 3215. Du kan sjekke oppsummeringsstatistikken for å få en ide om hvor stor feilen er.

training_set['medv'].describe()

Produksjon

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

Fra oppsummeringsstatistikken ovenfor vet du at gjennomsnittsprisen for et hus er 22 tusen, med en minimumspris på 9 tusen og maksimum 50 tusen. Modellen gjør en typisk feil på 3k dollar.

Trinn 6) Gjør spådommen

Til slutt kan du bruke estimatoren TensorFlow-prediksjon for å estimere verdien av 6 Boston-hus.

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

For å skrive ut de estimerte verdiene for kan du bruke denne koden:

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

Produksjon

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

Modellen anslår følgende verdier:

hus Prediksjon
1 32.29
2 18.96
3 27.27
4 29.29
5 16.43
7 21.46

Merk at vi ikke vet den sanne verdien av . I opplæringen for dyp læring vil du prøve å slå den lineære modellen

Numpy løsning

Denne delen forklarer hvordan du trener modellen ved å bruke en numpy estimator for å mate dataene. Metoden er den samme bortsett fra at du vil bruke numpy_input_fn estimator.

training_set_n = pd.read_csv(“E:/boston_train.csv”).values

test_set_n = pd.read_csv(“E:/boston_test.csv”).values

prediction_set_n = pd.read_csv(“E:/boston_predict.csv”).values

Trinn 1) Importer dataene

Først av alt må du skille funksjonsvariablene fra etiketten. Du må gjøre dette for treningsdata og evaluering. Det er raskere å definere en funksjon for å dele dataene.

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

Du kan bruke funksjonen til å dele etiketten fra funksjonene til tog/evaluer datasettet

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

Du må ekskludere den siste kolonnen i prediksjonsdatasettet fordi det bare inneholder NaN

x_predict = prediction_set_n[:, :-2]

Bekreft formen på matrisen. Merk at etiketten ikke skal ha en dimensjon, det betyr (400,).

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

Produksjon

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

Du kan konstruere funksjonskolonnene som følger:

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

Estimatoren er definert som før, du instruerer funksjonskolonnene og hvor grafen skal lagres.

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

Produksjon

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}

Du kan bruke numpy estimapor til å mate dataene til modellen og deretter trene modellen. Merk at vi definerer input_fn-funksjonen før for å lette lesbarheten.

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

Produksjon

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>

Du replikerer det samme trinnet med en annen estimator for å evaluere modellen din

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)

Produksjon

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}

Til slutt kan du beregne prediksjonen. Det bør være det samme som pandaer.

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

Produksjon

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-løsning

Den siste delen er dedikert til en TensorFlow-løsning. Denne metoden er litt mer komplisert enn den andre.

Merk at hvis du bruker Jupyter bærbare, må du starte på nytt og rense kjernen for å kjøre denne økten.

tensorflow har bygget et flott verktøy for å sende dataene inn i rørledningen. I denne delen skal du bygge input_fn-funksjonen selv.

Trinn 1) Definer banen og formatet til dataene

Først av alt, erklærer du to variabler med banen til csv-filen. Merk at du har to filer, en for treningssettet og en for testsettet.

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

Deretter må du definere kolonnene du vil bruke fra csv-filen. Vi vil bruke alle. Etter det må du deklarere hvilken type variabel det er.

Flytningsvariabelen er definert av [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]]

Trinn 2) Definer input_fn-funksjonen

Funksjonen kan deles inn i tre deler:

  1. Importer dataene
  2. Lag iteratoren
  3. Konsumere dataene

Nedenfor er den generelle koden for å definere funksjonen. Koden vil bli forklart etterpå

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

** Importer data**

For en csv-fil leser datasettmetoden én linje om gangen. For å bygge datasettet må du bruke objektet TextLineDatasett. Datasettet ditt har en overskrift, så du må bruke skip(1) for å hoppe over den første linjen. På dette tidspunktet leser du bare dataene og ekskluderer overskriften i pipelinen. For å mate modellen må du skille funksjonene fra etiketten. Metoden som brukes for å bruke enhver transformasjon på dataene er kart.

Denne metoden kaller en funksjon som du vil opprette for å instruere hvordan du transformerer dataene. Kort fortalt må du sende dataene i TextLineDatasettobjekt, ekskluder overskriften og bruk en transformasjon som er instruert av en funksjon.Kodeforklaring

  • tf.data.TextLineDatasett(data_fil): Denne linjen leste csv-filen
  • .skip(1): hopp over overskriften
  • .map(parse_csv)): parse postene inn i tensoreneDu må definere en funksjon for å instruere kartobjektet. Du kan kalle denne funksjonen parse_csv.

Denne funksjonen analyserer csv-filen med metoden tf.decode_csv og erklærer funksjonene og etiketten. Funksjonene kan deklareres som en ordbok eller en tuppel. Du bruker ordbokmetoden fordi det er mer praktisk. Kodeforklaring

  • tf.decode_csv(verdi, record_defaults= RECORDS_ALL): metoden decode_csv bruker utdataene fra TextLineDatasett for å lese csv-filen. record_defaults instruerer TensorFlow om kolonnetypen.
  • dict(zip(_CSV_COLUMNS, columns)): Fyll ut ordboken med alle kolonnene som er hentet ut under denne databehandlingen
  • features.pop('median_house_value'): Ekskluder målvariabelen fra funksjonsvariabelen og lag en etikettvariabel

Datasettet trenger flere elementer for iterativt å mate tensorene. Faktisk må du legge til metoderepetisjonen for å la datasettet fortsette på ubestemt tid for å mate modellen. Hvis du ikke legger til metoden, vil modellen iterere bare én gang og deretter gi en feil fordi det ikke mates mer data i rørledningen.

Etter det kan du kontrollere batchstørrelsen med batchmetoden. Det betyr at du forteller datasettet hvor mange data du vil sende i pipelinen for hver iterasjon. Hvis du angir en stor batchstørrelse, vil modellen være treg.

Trinn 3) Lag iteratoren

Nå er du klar for det andre trinnet: lag en iterator for å returnere elementene i datasettet.

Den enkleste måten å lage en operator på er med metoden make_one_shot_iterator.

Etter det kan du lage funksjonene og etikettene fra iteratoren.

Trinn 4) Bruk dataene

Du kan sjekke hva som skjer med input_fn-funksjonen. Du må ringe funksjonen i en økt for å konsumere dataene. Du prøver med en batchstørrelse lik 1.

Merk at den skriver ut funksjonene i en ordbok og etiketten som en matrise.

Den vil vise den første linjen i csv-filen. Du kan prøve å kjøre denne koden mange ganger med forskjellig batchstørrelse.

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)

Produksjon

({'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))

Trinn 4) Definer funksjonskolonnen

Du må definere de numeriske kolonnene som følger:

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

Merk at du må kombinere alle variablene i en bøtte

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

Trinn 5) Bygg modellen

Du kan trene modellen med estimatoren LinearRegressor.

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

Produksjon

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}

Du må bruke en lambda-funksjon for å tillate å skrive argumentet i funksjonen inpu_fn. Hvis du ikke bruker en lambda-funksjon, kan du ikke trene modellen.

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

Produksjon

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>

Du kan evaluere passformen til modellen din på testsettet med koden nedenfor:

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

Produksjon

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

Det siste trinnet er å forutsi verdien av basert på verdien av , matrisene til funksjonene. Du kan skrive en ordbok med verdiene du vil forutsi. Modellen din har 9 funksjoner, så du må oppgi en verdi for hver. Modellen vil gi en prediksjon for hver av dem.

I koden nedenfor skrev du verdiene for hver funksjon som finnes i csv-filen df_predict.

Du må skrive en ny input_fn-funksjon fordi det ikke er noen etikett i datasettet. Du kan bruke API fra_tensor fra datasettet.

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)

Til slutt skriver du ut spådommene.

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

Produksjon

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

Sammendrag

For å trene en modell må du:

  • Definer funksjonene: Uavhengige variabler: X
  • Definer etiketten: Avhengig variabel: y
  • Konstruer et tog/testsett
  • Definer startvekten
  • Definer tapsfunksjonen: MSE
  • Optimaliser modellen: Gradientnedstigning
  • Definere:
    • Læringsfrekvens
    • Antall epoker
    • Partistørrelse, Gruppestørrelse

I denne opplæringen lærte du hvordan du bruker høynivå-API for en lineær regresjon TensorFlow-estimator. Du må definere:

  1. Funksjonskolonner. Hvis kontinuerlig: tf.feature_column.numeric_column(). Du kan fylle ut en liste med python-listeforståelse
  2. Estimatoren: tf.estimator.LinearRegressor(feature_columns, model_dir)
  3. En funksjon for å importere dataene, batchstørrelsen og epoken: input_fn()

Etter det er du klar til å trene, evaluere og forutsi med train(), evaluate() og predict()