Lineáris regressziós oktatóanyag a TensorFlow-val [Példák]

Mi az a lineáris regresszió?

Lineáris regresszió a statisztikai megközelítés két változó közötti kapcsolatok modellezésére. Ez a modellezés egy skaláris válasz és egy vagy több magyarázó változó között történik. Az egy magyarázó változóval való kapcsolatot egyszerű lineáris regressziónak, egynél több magyarázó változó esetén pedig többszörös lineáris regressziónak nevezzük.

A TensorFlow eszközöket biztosít a számítások teljes ellenőrzéséhez. Ez az alacsony szintű API-val történik. Ezen felül a TensorFlow API-k széles skálájával van felszerelve, hogy sok mindent végrehajtson gépi tanulás algoritmusok. Ez a magas szintű API. A TensorFlow ezeket becsléseknek nevezi

  • Alacsony szintű API: Építsd meg a modell architektúráját, optimalizálását a semmiből. Kezdőnek bonyolult
  • Magas szintű API: Határozza meg az algoritmust. Könnyebbé válik. A TensorFlow egy olyan eszköztárat biztosít, melynek neve becslő konstruálni, betanítani, értékelni és jóslatokat készíteni.

Ebben az oktatóanyagban a csak becslések. A számítások gyorsabbak és könnyebben megvalósíthatók. Az oktatóanyag első része elmagyarázza, hogyan használhatja a gradiens süllyedés-optimalizálót a TensorFlow lineáris regressziójának betanításához. A második részben a Boston adatkészletet fogja használni egy ház árának megjósolására a TensorFlow becslés segítségével.

Töltse le a Boston DataSet-et

Hogyan tanítsunk lineáris regressziós modellt

Mielőtt elkezdené a modell betanítását, nézzük meg, mi az a lineáris regresszió.

Képzelje el, hogy két változója van, az x és az y, és az Ön feladata, hogy megjósolja az érték ismeretének értékét. Ha ábrázolja az adatokat, pozitív kapcsolatot láthat a független x és a függő y változó között.

Tanítson egy lineáris regressziós modellt

Megfigyelhetjük, ha x=1,y nagyjából 6 lesz, és ha x=2,y 8.5 körül lesz.

Ez nem túl pontos módszer, és hajlamos a hibákra, különösen egy több százezer pontot tartalmazó adatkészlet esetén.

A lineáris regressziót egy egyenlettel értékeljük ki. Az y változót egy vagy több kovariáns magyarázza. A példádban csak egy függő változó van. Ha meg kell írni ezt az egyenletet, akkor ez lesz:

Tanítson egy lineáris regressziós modellt

Val vel:

  • Lineáris regresszió TensorFlow-val az elfogultság. azaz ha x=0, y=Tanítson egy lineáris regressziós modellt
  • Tanítson egy lineáris regressziós modellt az x-hez tartozó súly
  • Tanítson egy lineáris regressziós modellt a modell maradéka vagy hibája. Tartalmazza azt, amit a modell nem tud megtanulni az adatokból

Képzelje el, hogy megfelel a modellnek, és a következő megoldást találja:

  • Tanítson egy lineáris regressziós modellt = 3.8
  • Tanítson egy lineáris regressziós modellt = 2.78

Behelyettesítheti ezeket a számokat az egyenletben, és ez lesz:

y= 3.8 + 2.78x

Most egy jobb módszerrel keresheti meg y értékeit. Vagyis lecserélheti x-et tetszőleges értékre, amellyel meg akarja jósolni y-t. Az alábbi képen az egyenletben az x-et lecseréltük az adatkészlet összes értékére, és ábrázoltuk az eredményt.

Tanítson egy lineáris regressziós modellt

A piros vonal az illesztett értéket jelöli, vagyis az y értékeit minden x értékhez. Nem kell x értékét látnia y előrejelzéséhez, minden x-hez van olyan, amelyik a piros vonalhoz tartozik. 2-nél nagyobb x értékekre is megjósolhat!

Ha a lineáris regressziót több kovariánsra szeretné kiterjeszteni, akkor több változót ad hozzá a modellhez. A különbség a hagyományos elemzés és a lineáris regresszió között az, hogy a lineáris regresszió azt vizsgálja, hogy y hogyan fog reagálni az egyes x változókra egymástól függetlenül.

Lássunk egy példát. Képzelje el, hogy meg akarja jósolni egy fagylaltbolt eladásait. Az adatkészlet különböző információkat tartalmaz, mint például az időjárás (pl. esős, napos, felhős), ügyfélinformációkat (pl. fizetés, nem, családi állapot).

A hagyományos elemzés megpróbálja megjósolni az eladást úgy, hogy mondjuk kiszámolja az egyes változók átlagát, és megpróbálja megbecsülni az eladást különböző forgatókönyvekre. Ez rossz előrejelzésekhez vezet, és az elemzést a kiválasztott forgatókönyvre korlátozza.

Ha lineáris regressziót használ, felírhatja ezt az egyenletet:

Tanítson egy lineáris regressziós modellt

Az algoritmus megtalálja a legjobb megoldást a súlyokra; ez azt jelenti, hogy megpróbálja minimalizálni a költségeket (az illesztett vonal és az adatpontok közötti különbséget).

Hogyan működik az algoritmus

Az algoritmus működése

Az algoritmus mindegyikhez kiválaszt egy véletlen számot Lineáris regresszió TensorFlow-val és a Az algoritmus működése és cserélje ki x értékét, hogy megkapja y előrejelzett értékét. Ha az adatkészlet 100 megfigyelést tartalmaz, az algoritmus 100 előrejelzett értéket számít ki.

Ki tudjuk számítani a hibát, jegyezte meg Az algoritmus működése a modell értéke, amely a becsült érték és a valós érték különbsége. A pozitív hiba azt jelenti, hogy a modell alulbecsüli y előrejelzését, a negatív hiba pedig azt, hogy a modell túlbecsüli y előrejelzését.

Az algoritmus működése

A cél a hiba négyzetének minimalizálása. Az algoritmus kiszámítja a négyzetes hiba átlagát. Ezt a lépést a hiba minimalizálásának nevezik. A lineáris regresszióhoz az Mean Square Error, más néven MSE. Matematikailag ez:

Az algoritmus működése

Ahol:

  • Az algoritmus működése a súlyok olyanok-e Az algoritmus működése az előre jelzett értékre utal
  • y a valós értékek
  • m a megfigyelések száma

Ne feledje, hogy Az algoritmus működése azt jelenti, hogy a mátrixok transzponálását használja. A Az algoritmus működése az átlag matematikai jelölése.

A cél a legjobb megtalálása Az algoritmus működése amelyek minimalizálják az MSE-t

Ha az átlagos hiba nagy, az azt jelenti, hogy a modell rosszul teljesít, és a súlyokat nem megfelelően választották meg. A súlyok kijavításához optimalizálót kell használni. A hagyományos optimalizáló ún Gradiens Descent.

A gradiens süllyedés veszi a deriváltot, és csökkenti vagy növeli a súlyt. Ha a derivált pozitív, a súly csökken. Ha a derivált negatív, a súly növekszik. A modell frissíti a súlyokat, és újraszámolja a hibát. Ezt a folyamatot addig ismételjük, amíg a hiba már nem változik. Minden folyamatot an ismétlés. Ezenkívül a gradienseket megszorozzák a tanulási sebességgel. A tanulás sebességét jelzi.

Ha a tanulási sebesség túl kicsi, nagyon hosszú időbe telik, amíg az algoritmus konvergál (azaz sok iterációt igényel). Ha a tanulási arány túl magas, előfordulhat, hogy az algoritmus soha nem konvergál.

Az algoritmus működése

A fenti képen látható, hogy a modell ezt megelőzően körülbelül 20-szor megismétli a folyamatot, hogy stabil értéket találjon a súlyoknak, így elérve a legalacsonyabb hibát.

Ne feledje, hogy, a hiba nem egyenlő nullával, hanem 5 körül stabilizálódik. Ez azt jelenti, hogy a modell tipikus 5-ös hibát követ el. Ha csökkenteni szeretné a hibát, több információt kell hozzáadnia a modellhez, például több változót, vagy különböző becsléseket kell használnia. .

Emlékszel az első egyenletre

Az algoritmus működése

A végső súlyok 3.8 és 2.78. Az alábbi videó bemutatja, hogy a gradiens süllyedés hogyan optimalizálja a veszteségfüggvényt, hogy megtalálja ezt a súlyt

Hogyan tanítsunk lineáris regressziót a TensorFlow segítségével

Most, hogy jobban megértette, mi történik a motorháztető mögött, készen áll a TensorFlow által biztosított becslő API használatára az első lineáris regresszió képzésére a TensorFlow segítségével.

A Boston Dataset-et fogja használni, amely a következő változókat tartalmazza

krimi az egy főre jutó bűnözési ráta városonként
zn a 25,000 XNUMX négyzetméter feletti telkekre övezett lakóterület aránya.
indus városonkénti nem kiskereskedelmi üzleti hektárok aránya.
nox nitrogén-oxidok koncentrációja
rm átlagos szobaszám lakásonként
kor az 1940 előtt épült, saját tulajdonú egységek aránya
dis súlyozott távolságok öt bostoni munkaügyi központtól
adó teljes értékű ingatlanadó kulcsa dolláronként 10,000 XNUMX
ptratio tanuló-tanár arány városonként
medv A tulajdonos által használt házak medián értéke ezer dollárban

Három különböző adatkészletet fog létrehozni:

adatbázisba célkitűzés formálják
Képzések Tanítsd meg a modellt és szerezd meg a súlyokat 400, 10
Értékelés Értékelje a modell teljesítményét nem látott adatokon 100, 10
Tippelje Használja a modellt a ház értékének előrejelzésére új adatok alapján 6, 10

A cél az, hogy az adatkészlet jellemzőit felhasználva előre jelezzék a ház értékét.

Az oktatóanyag második részében megtudhatja, hogyan használhatja a TensorFlow-t három különböző módon az adatok importálására:

Vegye figyelembe, hogy minden lehetőség ugyanazokat az eredményeket nyújtani.

Megtanulja, hogyan használhatja a magas szintű API-t TensorFlow lineáris regressziós modell felépítéséhez, kiértékeléséhez. Ha alacsony szintű API-t használt, kézzel kellett meghatároznia a következőket:

  • Veszteség funkció
  • Optimalizálás: Gradiens süllyedés
  • Mátrixok szorzása
  • Grafikon és tenzor

Ez fárasztó és bonyolultabb a kezdő számára.

pandák

A modell betanításához importálnia kell a szükséges könyvtárakat.

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

Step 1) Importálja az adatokat ezzel panda.

Ön határozza meg az oszlopneveket, és tárolja a COLUMNS-ban. A pd.read_csv() segítségével importálhatja az adatokat.

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)

predikciós_készlet = pd.read_csv(“E:/boston_predict.csv”, skipinitialspace=True,skiprows=1, names=COLUMNS)

Kinyomtathatja az adatok alakját.

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

teljesítmény

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

Vegye figyelembe, hogy a címke, azaz az Ön y, benne van az adatkészletben. Tehát két másik listát kell meghatároznia. Az egyik csak a funkciókat tartalmazza, a másik pedig csak a címke nevét. Ez a két lista megmondja a becslőnek, hogy melyek az adatkészlet jellemzői, és melyik oszlopnév a címke

Ez az alábbi kóddal történik.

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

Step 2) Konvertálja az adatokat

A numerikus változókat a megfelelő formátumba kell konvertálnia. A Tensorflow módszert biztosít a folytonos változó konvertálására: tf.feature_column.numeric_column().

Az előző lépésben meghatározza a modellbe felvenni kívánt jellemzők listáját. Most ezt a listát használhatja számadatokká konvertálásához. Ha ki szeretne zárni szolgáltatásokat a modellből, nyugodtan dobjon egy vagy több változót a FEATURES listába, mielőtt létrehozza a feature_cols.

Vegye figyelembe, hogy használni fogja Python lista értelmezése a FEATURES listával egy új, feature_cols nevű lista létrehozásához. Segít elkerülni, hogy kilencszer írja le a tf.feature_column.numeric_column(). A listaértelmezés gyorsabb és tisztább módja új listák létrehozásának

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

Step 3) Határozza meg a becslést

Ebben a lépésben meg kell határoznia a becslést. A Tensorflow jelenleg 6 előre elkészített becslőt biztosít, ebből 3 az osztályozási feladathoz és 3 a TensorFlow regressziós feladathoz:

  • Regresszor
    • DNNRegressor
    • Lineáris regresszor
    • DNNLineaCombinedRegressor
  • osztályoz
    • DNNC osztályozó
    • Lineáris osztályozó
    • DNNLineaCombinedClassifier

Ebben az oktatóanyagban a Lineáris regresszort fogja használni. A funkció eléréséhez a tf.estimator programot kell használnia.

A függvénynek két argumentumra van szüksége:

  • feature_columns: A modellbe foglalandó változókat tartalmazza
  • model_dir: elérési út a grafikon tárolásához, a modellparaméterek mentéséhez stb

A Tensorflow automatikusan létrehoz egy train nevű fájlt a munkakönyvtárában. Ezt az elérési utat kell használnia a Tensorboard eléréséhez, ahogy az az alábbi TensorFlow regressziós példában látható.

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

teljesítmény

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}

A TensorFlow trükkös része a modell táplálásának módja. A Tensorflow-t úgy tervezték, hogy párhuzamos számítástechnikával és nagyon nagy adatkészlettel működjön. A gépi erőforrások korlátozottsága miatt lehetetlen a modellt egyszerre az összes adattal betáplálni. Ehhez minden alkalommal egy köteg adatot kell betáplálnia. Vegye figyelembe, hogy hatalmas adathalmazról beszélünk, több millió rekorddal. Ha nem ad hozzá köteget, memóriahiba lesz a végén.

Ha például az adatok 100 megfigyelést tartalmaznak, és 10-es kötegméretet ad meg, az azt jelenti, hogy a modell 10 megfigyelést fog látni minden iterációhoz (10*10).

Amikor a modell az összes adatot látta, befejez egyet korszak. Egy korszak határozza meg, hogy hányszor szeretné, hogy a modell lássa az adatokat. Jobb, ha ezt a lépést semmire állítja, és hagyja, hogy a modell többszöri iterációt hajtson végre.

Egy másik információ, amelyet hozzá kell adni, ha meg szeretné keverni az adatokat minden iteráció előtt. A képzés során fontos az adatok megkeverése, hogy a modell ne tanulja meg az adatkészlet konkrét mintáját. Ha a modell megtanulja az adatok mögöttes mintázatának részleteit, akkor nehézségei lesznek a nem látott adatok előrejelzésének általánosításában. Ezt hívják túlfeszített. A modell jól teljesít a betanítási adatokon, de nem tud megfelelően előre jelezni a nem látott adatokat.

A TensorFlow megkönnyíti ezt a két lépést. Amikor az adatok a folyamatba kerülnek, tudja, hogy hány megfigyelésre van szüksége (kötegelt), és hogy kell-e megkevernie az adatokat.

A Tensorflow utasítására a modell betáplálására használhatja a pandas_input_fn parancsot. Ennek az objektumnak 5 paraméterre van szüksége:

  • x: jellemző adatok
  • y: címkeadatok
  • batch_size: köteg. Alapértelmezés szerint 128
  • num_epoch: Korszak száma, alapértelmezés szerint 1
  • shuffle: Az adatok keverése vagy sem. Alapértelmezés szerint Nincs

Sokszor kell betáplálnia a modellt, hogy definiáljon egy függvényt a folyamat megismétléséhez. mindez a függvény 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)

A modell teljesítményének értékelésének szokásos módszere a következő:

  • Tanítsd meg a modellt
  • Értékelje a modellt egy másik adatkészletben
  • Készítsen jóslatot

A Tensorflow becslő három különböző funkciót biztosít a három lépés egyszerű végrehajtásához.

Step 4): Tanítsa meg a modellt

A modell értékeléséhez használhatja a becslő sorozatot. A vonatbecslőnek szüksége van egy input_fn paraméterre és számos lépésre. Használhatja a fent létrehozott függvényt a modell betáplálásához. Ezután utasítja a modellt, hogy 1000-szer iteráljon. Ne feledje, hogy nem adja meg az epochák számát, hagyja, hogy a modell 1000-szer iteráljon. Ha az epocha számát 1-re állítja, akkor a modell 4-szer ismétlődik: 400 rekord van a betanítási készletben, a köteg mérete 128

  1. 128 sorok
  2. 128 sorok
  3. 128 sorok
  4. 16 sorok

Ezért könnyebb beállítani az epochok számát none-ra, és meghatározni az iterációk számát az alábbi TensorFlow osztályozási példában látható módon.

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

teljesítmény

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.

Ellenőrizheti, hogy a Tensorboard a következő parancsot adja:

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

Step 5) Értékelje a modelljét

Az alábbi kóddal értékelheti modellje tesztkészlethez való illeszkedését:

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

teljesítmény

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

A veszteséget az alábbi kóddal nyomtathatja ki:

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

teljesítmény

Loss: 3215.895996

A modell vesztesége 3215. Ellenőrizheti az összesítő statisztikát, hogy képet kapjon a hiba nagyságáról.

training_set['medv'].describe()

teljesítmény

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

A fenti összesítő statisztikából tudja, hogy egy ház átlagos ára 22 ezer, minimum 9 ezer, maximum 50 ezer. A modell tipikusan 3 ezer dolláros hibát követ el.

Step 6) Tedd meg a jóslatot

Végül használhatja a TensorFlow becslést 6 bostoni ház értékének becslésére.

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

A becsült értékeinek kinyomtatásához használja ezt a kódot:

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

teljesítmény

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

A modell a következő értékeket prognosztizálja:

Ház Jóslás
1 32.29
2 18.96
3 27.27
4 29.29
5 16.43
7 21.46

Vegye figyelembe, hogy nem ismerjük a valódi értékét. A mély tanulás oktatóanyagában megpróbálja legyőzni a lineáris modellt

Numpy megoldás

Ez a rész elmagyarázza, hogyan lehet betanítani a modellt egy számszerű becslő segítségével az adatok betáplálásához. A módszer ugyanaz, kivéve a numpy_input_fn becslőt.

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

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

predikciós_készlet_n = pd.read_csv(“E:/boston_predict.csv”).values

Step 1) Importálja az adatokat

Először is meg kell különböztetnie a jellemző változóit a címkétől. Ezt meg kell tennie a képzési adatokhoz és az értékeléshez. Gyorsabb az adatok felosztására szolgáló függvény meghatározása.

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

A funkció segítségével leválaszthatja a címkét a vonat/kiértékelés adatkészlet jellemzőiről

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

Ki kell zárnia az előrejelzési adatkészlet utolsó oszlopát, mert az csak NaN-t tartalmaz

x_predict = prediction_set_n[:, :-2]

Erősítse meg a tömb alakját. Vegye figyelembe, hogy a címkének nem szabad méretet adnia, ez azt jelenti, hogy (400,).

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

teljesítmény

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

A jellemzőoszlopokat a következőképpen állíthatja össze:

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

A becslő a korábbiak szerint van definiálva, Ön utasítja a jellemző oszlopokat és a grafikon mentésének helyét.

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

teljesítmény

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}

A numpy estimapor segítségével betáplálhatja az adatokat a modellbe, majd betaníthatja a modellt. Ne feledje, hogy az olvashatóság megkönnyítése érdekében korábban definiáljuk az input_fn függvényt.

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

teljesítmény

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>

A modell kiértékeléséhez ugyanazt a lépést meg kell ismételnie egy másik becslővel

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)

teljesítmény

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}

Végül kiszámíthatja az előrejelzést. Hasonlónak kell lennie, mint a pandák.

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

teljesítmény

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 oldat

Az utolsó rész egy TensorFlow megoldással foglalkozik. Ez a módszer valamivel bonyolultabb, mint a másik.

Vegye figyelembe, hogy ha használja Jupyter jegyzetfüzet, a munkamenet futtatásához újra kell indítania és meg kell tisztítania a kernelt.

TensorFlow kiépített egy nagyszerű eszközt az adatok átadására a folyamatban. Ebben a részben az input_fn függvényt saját maga készíti el.

Step 1) Határozza meg az adatok elérési útját és formátumát

Először is deklarál két változót a csv fájl elérési útjával. Ne feledje, hogy két fájlja van, egy az edzéskészlethez, egy pedig a tesztkészlethez.

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

Ezután meg kell határoznia a használni kívánt oszlopokat a csv fájlból. Mindet felhasználjuk. Ezt követően meg kell határoznia a változó típusát.

A lebegő változókat [0.] határozza meg

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

Step 2) Határozza meg az input_fn függvényt

A függvény három részre bontható:

  1. Importálja az adatokat
  2. Hozd létre az iterátort
  3. Fogyassza az adatokat

Az alábbiakban található a funkció meghatározásához szükséges általános kód. A kódot ezután ismertetjük

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

** Importálja az adatokat**

Csv-fájl esetén a dataset metódus egy sort olvas be. Az adatkészlet felépítéséhez az objektumot kell használni TextLineAdatkészlet. Az adatkészletnek van fejléce, ezért az első sor kihagyásához a skip(1)-et kell használnia. Ezen a ponton csak az adatokat olvassa el, és kizárja a fejlécet a folyamatban. A modell betáplálásához el kell választani a funkciókat a címkétől. Az adatok bármilyen transzformációjának alkalmazására használt módszer a térkép.

Ez a metódus meghív egy függvényt, amelyet létre kell hozni, hogy utasításokat adjon az adatok átalakítására. Dióhéjban, át kell adnia az adatokat a TextLineDataset objektum, zárja ki a fejlécet, és alkalmazzon egy függvény által utasított transzformációt.Kód magyarázata

  • tf.data.TextLineDataset(data_file): Ez a sor olvassa be a csv fájlt
  • .skip(1) : a fejléc kihagyása
  • .map(parse_csv)): elemzi a rekordokat a tenzorokba. Meg kell határoznia egy függvényt, amely utasítást ad a térképobjektumnak. Meghívhatja ezt a függvényt parse_csv.

Ez a függvény a tf.decode_csv metódussal elemzi a csv fájlt, és deklarálja a szolgáltatásokat és a címkét. A jellemzők deklarálhatók szótárként vagy sorként. A szótár módszert használod, mert kényelmesebb.Kódmagyarázat

  • tf.decode_csv(value, record_defaults= RECORDS_ALL): a decode_csv metódus a TextLineAdatkészlet a csv fájl olvasásához. A record_defaults utasítja a TensorFlow-t az oszlopok típusára vonatkozóan.
  • dict(zip(_CSV_COLUMNS, oszlopok)): A szótár feltöltése az adatfeldolgozás során kibontott összes oszloptal
  • features.pop('median_house_value'): Zárja ki a célváltozót a jellemzőváltozóból, és hozzon létre egy címkeváltozót

Az adatkészletnek további elemekre van szüksége a tenzorok iteratív táplálásához. Valójában hozzá kell adni a metódusismétlést, hogy az adatkészlet korlátlan ideig folytathassa a modell táplálását. Ha nem adja hozzá a metódust, a modell csak egyszer ismétlődik, majd hibát ad, mert a folyamatban nincs több adat.

Ezt követően kötegelt módszerrel szabályozhatja a köteg méretét. Ez azt jelenti, hogy meg kell adnia az adatkészletnek, hogy hány adatot szeretne átadni a folyamatban minden iterációhoz. Ha nagy tételméretet állít be, a modell lassú lesz.

3. lépés) Hozza létre az iterátort

Most készen áll a második lépésre: hozzon létre egy iterátort az adatkészlet elemeinek visszaadásához.

Az operátor létrehozásának legegyszerűbb módja a make_one_shot_iterator metódus.

Ezt követően az iterátorból létrehozhatja a szolgáltatásokat és a címkéket.

4. lépés) Fogyassza el az adatokat

Ellenőrizheti, hogy mi történik az input_fn függvénnyel. Az adatok felhasználásához meg kell hívnia a függvényt egy munkamenetben. Próbálkozzon 1-es tételmérettel.

Vegye figyelembe, hogy a szótár jellemzőit és a címkét tömbként nyomtatja ki.

Megjelenik a csv fájl első sora. Megpróbálhatja többször futtatni ezt a kódot különböző kötegméretekkel.

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)

teljesítmény

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

Step 4) Határozza meg a jellemző oszlopot

A numerikus oszlopokat a következőképpen kell meghatároznia:

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

Vegye figyelembe, hogy az összes változót egy vödörben kell kombinálnia

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

Step 5) Építsd meg a modellt

A modellt a LinearRegressor becslővel taníthatja.

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

teljesítmény

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}

Használnia kell egy lambda függvényt, hogy engedélyezze az argumentum beírását az inpu_fn függvényben. Ha nem használ a lambda funkció, nem képezheti ki a modellt.

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

teljesítmény

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>

Az alábbi kóddal értékelheti a modell illeszkedését a tesztkészletre:

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

teljesítmény

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

Az utolsó lépés az érték megjóslása a jellemzők mátrixai alapján. Írhat egy szótárt a megjósolni kívánt értékekkel. Modellje 9 funkcióval rendelkezik, így mindegyikhez meg kell adnia egy értéket. A modell mindegyikre előrejelzést ad.

Az alábbi kódban megadta a df_predict csv fájlban található összes szolgáltatás értékét.

Új input_fn függvényt kell írnia, mert nincs címke az adatkészletben. Használhatja a from_tensor API-t az adatkészletből.

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)

Végül kinyomtatja az előrejelzéseket.

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

teljesítmény

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

Összegzésként

A modell betanításához a következőket kell tennie:

  • Határozza meg a jellemzőket: Független változók: X
  • Határozza meg a címkét: Függő változó: y
  • Készítsen vonatot/próbakészletet
  • Határozza meg a kezdeti súlyt
  • Határozza meg a veszteségfüggvényt: MSE
  • A modell optimalizálása: Gradiens süllyedés
  • Határozza meg:
    • Tanulási arány
    • Korszak száma
    • Csomó méret

Ebben az oktatóanyagban megtanulta, hogyan kell használni a magas szintű API-t egy lineáris regressziós TensorFlow becsléshez. Meg kell határoznia:

  1. Funkcióoszlopok. Ha folyamatos: tf.feature_column.numeric_column(). Feltölthet egy listát a python listaértelmezéssel
  2. A becslő: tf.estimator.LinearRegressor(feature_columns, model_dir)
  3. Egy függvény az adatok importálására, a köteg méretére és korszakára: input_fn()

Ezt követően készen áll a képzésre, a kiértékelésre és a jóslatok készítésére a train(), az értékelés() és az előrejelzés() segítségével.