Kurz lineární regrese s TensorFlow [Příklady]

⚡ Chytré shrnutí

Lineární regrese v TensorFlow modeluje vztah mezi numerickými rysy a spojitou cílovou hodnotou. Tento návod procvičuje prediktor cen nemovitostí v Bostonu třemi různými způsoby, a to pomocí Pandas, NumPy a nativních vstupních kanálů TensorFlow s odhadem LinearRegressor.

  • 🔘 Vzorový formulář: Lineární regrese fituje y = zkreslení + váha × x, rozšířená o více kovariátních proměnných pro vícerozměrné problémy.
  • ☑️ Tréninková smyčka: Gradientní sestup upravuje váhy v každé iteraci, dokud střední kvadratická chyba nepřestane klesat.
  • (Tj. API pro odhad: LinearRegressor potřebuje pouze sloupce funkcí, adresář modelu a vstupní funkci.
  • 🧪 Tři potrubí: Datové sady Pandas, NumPy a nativní TensorFlow využívají stejný model a vracejí identické předpovědi.
  • 🛠️ Zpracovaný příklad: Devět bostonských ukazatelů předpovídá střední hodnotu domu a dosahuje testovací ztráty 3215.
  • ⚠️ Realita verze: Odhady byly v TensorFlow 2.12 zastaralé a v 2.16 odstraněny, proto je třeba do Kerasu přenést novou práci.

Lineární regrese s TensorFlow

Co je lineární regrese?

Lineární regrese je statistický přístup k modelování vztahů mezi dvěma proměnnými. Toto modelování se provádí mezi skalární odezvou a jednou nebo více vysvětlujícími proměnnými. Vztah s jednou vysvětlující proměnnou se nazývá jednoduchá lineární regrese a s více než jednou vysvětlující proměnnou se nazývá vícenásobná lineární regrese.

TensorFlow poskytuje nástroje pro plnou kontrolu nad výpočty. To se provádí pomocí nízkoúrovňového API. Kromě toho je TensorFlow vybaven širokou škálou rozhraní API, která umožňují provádět mnoho strojové učení algoritmy. Toto je API na vysoké úrovni a TensorFlow je nazývá estimátory.

  • Nízkoúrovňové APIVytvořte architekturu a optimalizujte model od nuly. Pro začátečníka je to složité.
  • API na vysoké úrovniDefinujte algoritmus. Je uživatelsky přívětivý. TensorFlow poskytuje sadu nástrojů s názvem odhadce konstruovat, trénovat, vyhodnocovat a předpovídat.

V tomto tutoriálu budete používat pouze odhadciVýpočty jsou rychlejší a snáze se implementují. První část vysvětluje, jak použít gradientní sestupný optimalizátor k trénování lineární regrese v TensorFlow. Ve druhé části použijete datovou sadu Boston k predikci ceny domu pomocí odhadu TensorFlow.

Stáhněte si Boston DataSet

Jak trénovat lineární regresní model

Než začneme trénovat model, podívejme se, co vlastně lineární regrese je.

Představte si, že máte dvě proměnné, x a y, a vaším úkolem je předpovědět hodnotu y na základě znalosti hodnoty x. Pokud data vynesete do grafu, uvidíte pozitivní vztah mezi nezávislou proměnnou x a závislou proměnnou y, jak ukazuje bodový graf níže.

Bodový graf x oproti y zobrazující kladný lineární vztah

Můžete si všimnout, že pokud x=1, y bude zhruba rovno 6, a pokud x=2, y bude kolem 8.5.

Toto není příliš přesná metoda a je náchylná k chybám, zejména u datové sady obsahující stovky tisíc bodů.

Lineární regrese je vyhodnocena pomocí rovnice. Proměnná y je vysvětlena jednou nebo více kovariátami. Ve vašem příkladu existuje pouze jedna závislá proměnná. Pokud musíte napsat tuto rovnici, bude to:

Jednoduchá lineární regresní rovnice s vychýlením, váhou a chybovým členem

S:

  • Symbol koeficientu odchylky je zkreslení. To znamená, že pokud x=0, y=Hodnota koeficientu odchylky, když x rovno nule
  • Symbol váhového koeficientu spojený s x je váha spojená s x
  • Symbol zbytkové chyby je reziduum nebo chyba modelu. Zahrnuje to, co se model nemůže z dat naučit.

Představte si, že pasujete na model a najdete následující řešení:

  • Fitovaný koeficient zkreslení roven 3.8 = 3.8
  • Součinitel hmotnosti montované namontované rovný 2.78 = 2.78

Tato čísla můžete do rovnice dosadit a vznikne:

y= 3.8 + 2.78x

Nyní máte lepší způsob, jak najít hodnoty pro y. To znamená, že můžete nahradit x libovolnou hodnotou, abyste předpověděli y. Na obrázku níže jsme v rovnici nahradili x všemi hodnotami z datové sady a výsledek jsme vynesli do grafu.

Proložená regresní přímka nakreslená červeně skrz vynesené datové body

Červená čára představuje fitovanou hodnotu, tj. hodnoty y pro každou hodnotu x. Pro predikci y nemusíte vidět hodnotu x; pro každé x existuje hodnota, která patří k červené čáře. Predikci lze provádět i pro hodnoty x vyšší než 2.

Pokud chcete lineární regresi rozšířit na více kovariátních proměnných, můžete tak učinit přidáním dalších proměnných do modelu. Rozdíl mezi tradiční analýzou a lineární regresí spočívá v tom, že lineární regrese se zabývá tím, jak bude y reagovat na každou proměnnou x branou nezávisle.

Podívejme se na příklad. Představte si, že chcete předpovědět tržby zmrzlinárny. Datová sada obsahuje různé informace, jako je počasí (deštivo, slunečno, oblačno) a informace o zákaznících (plat, pohlaví, rodinný stav).

Tradiční analýza se bude snažit předpovědět prodej, řekněme, výpočtem průměru pro každou proměnnou a pokusem o odhad prodeje pro různé scénáře. To povede ke špatným předpovědím a omezí analýzu na zvolený scénář.

Pokud používáte lineární regresi, můžete napsat tuto rovnici:

Vícenásobná lineární regresní rovnice kombinující několik vážených kovariát

Algoritmus najde nejlepší řešení pro váhy; to znamená, že se pokusí minimalizovat náklady, které jsou rozdílem mezi fitovanou přímkou ​​a datovými body.

Jak funguje algoritmus

Níže uvedený diagram shrnuje smyčku, kterou algoritmus opakuje: výběr vah, predikce y, měření chyby a korekce vah.

Vývojový diagram trénovací smyčky lineární regrese od náhodných vah k minimalizované chybě

Algoritmus pro každý vybere náhodné číslo Náhodně inicializovaný koeficient zkreslení a Náhodně inicializovaný váhový koeficient a nahraďte hodnotu x, abyste získali předpokládanou hodnotu y. Pokud má datová sada 100 pozorování, algoritmus vypočítá 100 předpokládaných hodnot.

Můžeme vypočítat chybu, poznamenal Člen chyby modelu použitý při výpočtu ztráty, modelu, což je rozdíl mezi predikovanou hodnotou a skutečnou hodnotou. Kladná chyba znamená, že model podhodnocuje predikci y, a záporná chyba znamená, že model predikci y nadhodnocuje.

Cíl minimalizace čtverce chyby zapsaný v matematické notaci

Vaším cílem je minimalizovat druhou mocninu chyby. Algoritmus vypočítá průměr druhé mocniny chyby. Tento krok se nazývá minimalizace chyby. Pro lineární regresi je to... Střední kvadratická chyba, nazývaný také MSE. Matematicky je to:

Vzorec pro výpočet střední kvadratické chyby zapsaný v maticové notaci

Kde:

  • Symbol vektoru hmotnosti použitý ve vzorci MSE jsou váhy, takže Zápis předpokládané hodnoty použitý ve vzorci MSE odkazuje na předpokládanou hodnotu
  • y jsou skutečné hodnoty
  • m je počet pozorování

Všimněte si, že Transponovaná notace váhové matice znamená, že používá transpozici matic. The Záznam sumace a průměru použitý ve vzorci MSE je matematický zápis průměru.

Cílem je najít to nejlepší Symbol optimálního vahového potenciálu, který minimalizuje MSE což minimalizuje MSE.

Pokud je průměrná chyba velká, znamená to, že model funguje špatně a váhy nejsou správně zvoleny. Chcete-li opravit hmotnosti, musíte použít optimalizátor. Tradiční optimalizátor se nazývá Gradientní sestup.

Gradientní sestup bere derivaci a snižuje nebo zvyšuje váhu. Pokud je derivace kladná, váha se snižuje. Pokud je derivace záporná, váha se zvyšuje. Model aktualizuje váhy a přepočítává chybu. Tento proces se opakuje, dokud se chyba již nemění. Každý průchod se nazývá opakováníKromě toho jsou gradienty vynásobeny rychlostí učení, která udává rychlost učení.

Pokud je rychlost učení příliš nízká, bude konvergovat algoritmus velmi dlouho, protože vyžaduje mnohem více iterací. Pokud je rychlost učení příliš vysoká, algoritmus nemusí konvergovat nikdy. Níže uvedená křivka ztrát vykresluje chybu v závislosti na počtu iterací pro tuto datovou sadu.

Křivka ztrát znázorňující pokles a stabilizaci chyby po přibližně dvaceti iteracích

Z obrázku výše vidíte, že model opakuje proces asi 20krát, než najde stabilní hodnotu pro váhy, a tím dosáhne nejnižší chyby.

Všimněte si, že chyba se nerovná nule, ale stabilizuje se kolem hodnoty 5. To znamená, že model dostává typickou chybu 5. Pokud chcete chybu snížit, musíte do modelu přidat více informací, například více proměnných, nebo použít jiné odhady.

Pamatujete si první rovnici:

Finální fitovaná lineární regresní rovnice s vyřešenými váhami

Konečné váhy jsou 3.8 a 2.78. Video níže ukazuje, jak gradientní sestup optimalizuje ztrátovou funkci pro nalezení těchto vah.

Jak trénovat lineární regresi pomocí TensorFlow

Nyní, když lépe rozumíte tomu, co se děje za kapotou, jste připraveni použít estimátor API poskytované TensorFlow k trénování vaší první lineární regrese pomocí TensorFlow.

Poznámka k verzi: Níže uvedený pracovní postup odhadu byl napsán pro TensorFlow verze 1.x a rané verze 2.x. TensorFlow označil tf.estimator a tf.feature_column Rozhraní API byla ve verzi 2.12 zcela zastaralá a ve verzi 2.16 byly zrušeny odhady. V aktuální instalaci spusťte tento kód uvnitř TensorFlow 1.15 nebo 2.x-with-tf.compat.v1 prostředí nebo jej přenést do Kerasu, kde tf.keras.layers.Dense(1) Navíc vrstvy předzpracování nahrazují lineární regresor a sloupce rysů. Koncepty – rysy, popisky, dávky, epochy, MSE a gradientní sestup – zůstávají beze změny.

Budete používat datovou sadu Boston, která obsahuje následující proměnné.

Proměnlivý Description
zločin kriminalita na obyvatele podle města
zn podíl obytných pozemků v zónách pro pozemky o rozloze přes 25,000 XNUMX čtverečních stop.
indus podíl nemaloobchodních obchodních akrů na město.
nox koncentrace oxidů dusnatých
rm průměrný počet pokojů na byt
stáří podíl vlastnických jednotek postavených před rokem 1940
dis vážené vzdálenosti do pěti pracovních center v Bostonu
daň sazba daně z nemovitosti v plné hodnotě za 10,000 XNUMX dolarů
ptratio poměr žáků a učitelů podle města
medv Střední hodnota domů obývaných vlastníky v tisících dolarech

Vytvoříte tři různé datové sady:

dataset cíl formovat
Trénink Trénujte model a získejte závaží 400, 10
Hodnocení Vyhodnoťte výkon modelu na neviditelných datech 100, 10
Předpovědět Použijte model k předpovědi hodnoty domu na nových datech 6, 10

Cílem je využít vlastnosti datové sady k predikci hodnoty domu.

V druhé části tutoriálu se naučíte, jak používat TensorFlow se třemi různými způsoby importu dat:

Všimněte si, že všechny tři možnosti poskytují stejné výsledky.

Naučíte se, jak používat API vysoké úrovně k vytvoření, trénování a vyhodnocení modelu lineární regrese TensorFlow. Pokud byste používali API nízké úrovně, museli byste ručně definovat:

  • Ztrátová funkce
  • Optimalizátor: gradientní sestup
  • Násobení matic
  • Graf a tenzor

To je pro začátečníka zdlouhavé a složitější.

Řešení Pandy

Pro trénování modelu musíte importovat potřebné knihovny.

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

Krok 1) Importujte data pomocí Pandy.

Názvy sloupců definujete a ukládáte je do COLUMNS. Pro import dat můžete použít pd.read_csv().

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

Každý hovor nasměrujte na soubory CSV, které jste si dříve stáhli.

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)

Tvar dat můžete vytisknout.

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

Výstup

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

V datové sadě je zahrnut popisek, tedy vaše y. Proto je třeba definovat dva další seznamy: jeden obsahující pouze prvky a druhý pouze s názvem popisku. Tyto dva seznamy vašemu odhadci sdělí, jaké prvky v datové sadě jsou a který název sloupce je popiskem.

To se provádí pomocí kódu níže.

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

Krok 2) Převeďte data

Je potřeba převést číselné proměnné do správného formátu. TensorFlow poskytuje metodu pro převod spojité proměnné: tf.feature_column.numeric_column().

V předchozím kroku jste definovali seznam prvků, které chcete do modelu zahrnout. Nyní můžete tento seznam použít k jejich převodu na číselná data. Pokud chcete prvky z modelu vyloučit, můžete před konstrukcí feature_cols ze seznamu FEATURES vynechat jednu nebo více proměnných.

Upozorňujeme, že budete používat Python Použijte funkci FEATURES pro generování seznamu a vytvořte nový seznam s názvem feature_cols. To vám pomůže vyhnout se devítinásobnému psaní funkce tf.feature_column.numeric_column(). Funkce FEATURES pro generování seznamu je rychlejší a čistší způsob, jak vytvářet nové seznamy.

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

Krok 3) Definujte odhadce

V tomto kroku je třeba definovat odhad. TensorFlow nabízí šest předpřipravených odhadů, tři pro klasifikační úlohy a tři pro regresní úlohy TensorFlow:

  • Regresor
    • DNRegressor
    • Lineární regresor
    • DNNLineární kombinovaný regresor
  • Klasifikátor
    • DNNCklasifikátor
    • LinearClassifier
    • DNNLineární kombinovaný klasifikátor

V tomto tutoriálu budete používat lineární regresor. Pro přístup k této funkci musíte použít tf.estimator.

Funkce potřebuje dva argumenty:

  • feature_columns: obsahuje proměnné, které mají být zahrnuty do modelu
  • model_dir: cesta k uložení grafu, uložení parametrů modelu atd.

TensorFlow automaticky vytvoří složku s názvem train ve vašem pracovním adresáři. Pro přístup k ní je třeba použít tuto cestu. TensorBoard, jak je znázorněno v níže uvedeném příkladu regrese TensorFlow.

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

Výstup

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}

Nejzáludnější částí TensorFlow je způsob, jakým model naplnit. TensorFlow je navržen pro práci s paralelními výpočty a velmi rozsáhlými datovými sadami. Vzhledem k omezeným strojovým zdrojům není možné naplnit model všemi daty najednou. K tomu je nutné pokaždé naplnit dávku dat. Upozorňujeme, že mluvíme o obrovských datových sadách s miliony nebo více záznamy. Pokud dávku nepřidáte, dojde k chybě paměti.

Pokud například vaše data obsahují 100 pozorování a definujete velikost dávky 10, znamená to, že model uvidí 10 pozorování pro každou iteraci (10*10).

Jakmile model prohlédne všechna data, dokončí jednu epochu. Epocha definuje, kolikrát chcete, aby model data viděl. Je lepší nastavit tento krok na žádný a nechat model provést stanovený počet iterací.

Druhou informací, kterou je třeba přidat, je, zda chcete data před každou iterací promíchat. Během trénování je důležité data promíchat tak, aby se model nenaučil specifický vzorec datové sady. Pokud se model naučí podrobnosti o základním vzoru dat, bude mít potíže se zobecněním predikce pro neviditelná data. Tomu se říká přeplnění (overfitting). Model si vede dobře na trénovacích datech, ale nedokáže správně predikovat pro neviditelná data.

TensorFlow tyto dva kroky usnadňuje. Když data jdou do kanálu, ví, kolik pozorování potřebuje (dávka) a zda je nutné data promíchat.

Chcete-li instruovat TensorFlow, jak má model krmit, můžete použít pandas_input_fn. Tento objekt potřebuje pět parametrů:

  • x: data funkcí
  • y: údaje štítku
  • batch_size: dávka. Ve výchozím nastavení 128
  • num_epoch: počet epoch, standardně 1
  • shuffle: zamíchat data, nebo ne. Ve výchozím nastavení Žádné

Model je potřeba mnohokrát napájet, proto definujete funkci, která tento proces opakuje. Tuto funkci nazvete 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)

Obvyklá metoda hodnocení výkonu modelu je:

  • Trénujte model
  • Vyhodnoťte model na jiné datové sadě
  • Udělejte předpověď

Odhad TensorFlow nabízí tři různé funkce pro snadné provedení těchto tří kroků.

Krok 4) Trénujte model

Pro přizpůsobení modelu můžete použít metodu estimátoru s vlakem. Vlakový estimátor potřebuje vstupní funkci (input_fn) a určitý počet kroků. Pro zadání dat modelu můžete použít funkci, kterou jste vytvořili výše. Poté instruujete model, aby iteroval 1000krát. Všimněte si, že nezadáváte počet epoch; necháte model iterovat 1000krát. Pokud nastavíte počet epoch na 1, model bude iterovat čtyřikrát, protože v trénovací sadě je 400 záznamů a velikost dávky je 128:

  1. Řady 128
  2. Řady 128
  3. Řady 128
  4. Řady 16

Proto je snazší nastavit počet epoch na žádnou a definovat počet iterací, jak je znázorněno v níže uvedeném příkladu klasifikace TensorFlow.

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

Výstup

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.

TensorBoard můžete zkontrolovat pomocí následujícího příkazu:

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

Krok 5) Zhodnoťte svůj model

Pomocí níže uvedeného kódu můžete vyhodnotit vhodnost vašeho modelu na testovací sadě:

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

Výstup

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

Ztrátu si můžete vytisknout pomocí níže uvedeného kódu:

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

Výstup

Loss: 3215.895996

Model má ztrátu 3215. Můžete se podívat na souhrnné statistiky, abyste získali představu o tom, jak velká je chyba.

training_set['medv'].describe()

Výstup

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

Z výše uvedené souhrnné statistiky víte, že průměrná cena domu je 22 tisíc, s minimální cenou 5 tisíc a maximální 50 tisíc. Protože vykázaná ztráta je střední kvadratická chyba, je typická chyba v původních jednotkách zhruba druhá odmocnina z 32.16, což je asi 5.7 tisíce dolarů.

Krok 6) Proveďte předpověď

Nakonec můžete k odhadu hodnoty šesti domů v Bostonu použít predikční metodu TensorFlow.

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

Pro tisk odhadovaných hodnot můžete použít tento kód:

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

Výstup

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

Model předpovídá následující hodnoty:

Dům Předpověď
1 32.29
2 18.96
3 27.27
4 29.29
5 16.43
6 21.46

V tutoriálu o hlubokém učení se pokusíte překonat lineární model.

Řešení NumPy

Tato část vysvětluje, jak trénovat model pomocí odhadu NumPy pro dodávání dat. Metoda je stejná, až na to, že použijete odhad numpy_input_fn.

Přečtěte si stejné tři soubory CSV, ale ponechte pouze nezpracovaná pole NumPy s příponami .values.

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

Krok 1) Importujte data

Nejprve je třeba rozlišit proměnné atributů od popisku. To je třeba udělat pro trénovací data a vyhodnocovací data. Rychlejší je definovat funkci pro rozdělení dat.

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

Funkci můžete použít k oddělení popisku od prvků vlaku a vyhodnocení datových sad.

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

Je třeba vyloučit poslední sloupec predikční datové sady, protože obsahuje pouze NaN.

x_predict = prediction_set_n[:, :-2]

Potvrďte tvar pole. Všimněte si, že popisek by neměl mít druhý rozměr, což znamená (400,).

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

Výstup

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

Sloupce prvků můžete sestavit takto:

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

Odhad je definován stejně jako dříve: zadáte sloupce rysů a kam se má graf uložit.

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

Výstup

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}

Pro vložení dat do modelu a následné trénování modelu můžete použít odhad NumPy. Všimněte si, že pro snazší čitelnost jsme předem definovali funkci input_fn.

# Train the estimator
train_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)

Výstup

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>

Stejný krok replikujete s jinou vstupní funkcí pro vyhodnocení modelu.

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)

Výstup

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}

Nakonec můžete vypočítat predikci. Měla by být podobná výsledku Pandas.

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

Výstup

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

Řešení TensorFlow

Poslední část je věnována čistému TensorFlow řešení. Tato metoda je o něco složitější než ostatní dvě.

Upozorňujeme, že pokud používáte Jupyter zápisník, pro spuštění této relace je nutné restartovat a vymazat jádro.

TensorFlow vytvořil skvělý nástroj pro předávání dat do pipeline. V této části si sami vytvoříte funkci input_fn.

Krok 1) Definujte cestu a formát dat

Nejprve deklarujete dvě proměnné s cestou k souborům CSV. Všimněte si, že máte dva soubory, jeden pro trénovací sadu a jeden pro testovací sadu.

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

Pak je třeba definovat sloupce, které chcete použít ze souboru CSV. Použijeme je všechny. Poté je třeba deklarovat typ každé proměnné.

Proměnné s plovoucí čárkou jsou definovány pomocí [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]]

Krok 2) Definujte funkci input_fn

Funkci lze rozdělit do tří částí:

  1. Importujte data
  2. Vytvořte iterátor
  3. Spotřebujte data

Níže je uveden celkový kód pro definici funkce. Kód bude vysvětlen později.

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

Importujte data

V souboru CSV metoda dataset čte řádky po řádcích. Pro sestavení datové sady je třeba použít objekt TextLineDatová sada. Vaše datová sada má hlavičku, takže k přeskočení prvního řádku je třeba použít skip(1). V tomto okamžiku data pouze načtete a hlavičku v kanálu vyloučíte. Pro naplnění modelu je třeba oddělit prvky od popisku. Metoda použitá k provedení jakékoli transformace na data je map.

Tato metoda volá funkci, kterou vytvoříte, aby instruovala, jak transformovat data. Stručně řečeno, musíte předat data do TextLineObjekt datové sady, vyloučit záhlaví a aplikovat transformaci, která je instruována funkcí.

Code vysvětlení

  • tf.data.TextLineDataset(data_file): tento řádek čte soubor CSV
  • .skip(1): přeskočí záhlaví
  • .map(parse_csv)): analyzuje záznamy do tenzorů

Musíte definovat funkci pro instrukce objektu mapy. Tuto funkci můžete zavolat parse_csv.

Tato funkce analyzuje soubor CSV metodou tf.decode_csv a deklaruje atributy a popisek. Agenti mohou být deklarováni jako slovník nebo n-tice. Metodu slovník používáte, protože je pohodlnější.

Code vysvětlení

  • tf.decode_csv(value, record_defaults= RECORDS_ALL): metoda decode_csv používá výstup TextLineDatová sada pro čtení souboru CSV. record_defaults instruuje TensorFlow o typech sloupců. V TensorFlow 2.x se tento symbol nachází v souboru tf.io.decode_csv.
  • dict(zip(SLOUPCE, sloupce)): naplní slovník všemi sloupci extracběhem tohoto zpracování dat
  • features.pop('medv'): vyloučí cílovou proměnnou z proměnných rysů a vytvoří proměnnou popisku

Datová sada potřebuje další prvky pro iterativní doplňování tenzorů. Je skutečně nutné přidat metodu repeat, aby datová sada mohla pokračovat v donekonečna a doplňovat model. Pokud metodu nepřidáte, model bude iterovat pouze jednou a poté vyvolá chybu, protože do kanálu nebudou přidávána žádná další data.

Poté můžete pomocí metody batch ovládat velikost dávky. To znamená, že datové sadě sdělíte, kolik dat chcete pro každou iteraci předat do pipeline. Pokud nastavíte velkou velikost dávky, model bude pomalý.

Krok 3) Vytvořte iterátor

Nyní jste připraveni na druhý krok: vytvořte iterátor pro vrácení prvků v datové sadě.

Nejjednodušší způsob vytvoření operátoru je pomocí metody make_one_shot_iterator.

Poté můžete vytvořit funkce a štítky z iterátoru.

Krok 4) Spotřebujte data

Můžete zkontrolovat, co se stane s funkcí input_fn. Funkci je nutné zavolat v relaci, aby bylo možné spotřebovat data. Zkuste to s velikostí dávky rovnou 1.

Všimněte si, že vytiskne atributy ve slovníku a popisek jako pole.

Zobrazí se první řádek souboru CSV. Tento kód můžete zkusit spustit mnohokrát s různými velikostmi dávek.

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)

Výstup

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

Krok 5) Definujte sloupec prvku

Číselné sloupce je třeba definovat takto:

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

Všimněte si, že je třeba sloučit všechny proměnné v jednom kbelíku.

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

Krok 6) Sestavte model

Model můžete trénovat pomocí estimátoru LinearRegressor.

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

Výstup

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}

Musíte použít a funkce lambda aby bylo možné zapsat argumenty pro funkci input_fn. Pokud nepoužijete lambda funkci, nemůžete model trénovat.

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

Výstup

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>

Pomocí níže uvedeného kódu můžete vyhodnotit vhodnost vašeho modelu na testovací sadě:

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

Výstup

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

Posledním krokem je predikce hodnoty cíle na základě hodnoty matice atributů. Můžete napsat slovník s hodnotami, které chcete predikovat. Váš model má devět atributů, takže je třeba pro každý z nich zadat hodnotu. Model pro každý z nich poskytne predikci.

V níže uvedeném kódu zapíšete hodnoty každé funkce, která je obsažena v souboru CSV s funkcí df_predict.

Protože v datové sadě není žádný popisek, je potřeba napsat novou funkci input_fn. Můžete použít API from_tensors z objektu Dataset.

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_input
     pred_results = model.predict(input_fn=test_input_fn)

Nakonec vytisknete předpovědi.

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

Výstup

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

Všechny tři kanály vracejí stejných šest predikcí, což potvrzuje, že volba mezi Pandas, NumPy a nativní datovou sadou TensorFlow je otázkou pohodlí, nikoli přesnosti.

Nejčastější dotazy

Ne. TensorFlow označil odhady a sloupce funkcí jako zcela zastaralé ve verzi 2.12 a ve verzi 2.16 je zrušil. Pro spuštění tohoto kódu beze změny si připněte TensorFlow 1.15 nebo 2.15, nebo přepište model s vrstvami Keras, což tým TensorFlow nyní doporučuje.

Načtěte soubory CSV pomocí Pandy, škálujte devět prvků pomocí normalizační vrstvy a poté na ně naskládejte jednu jednotku Dense(1). Zkompilujte s optimalizátorem a ztrátou mean_squared_error a poté zavolejte fit. Jedna jednotka Dense bez aktivace je lineární regrese.

Začněte kolem 0.01 a upravte faktorem deseti. Příliš nízká rychlost vyžaduje mnohem více iterací ke konvergenci, zatímco příliš velká rychlost způsobuje oscilaci ztráty. Nakreslete křivku ztrát a ponechte nejvyšší rychlost, která stále plynule klesá.

scikit-learn odstranil ve verzi 1.2 funkci load_boston z etických důvodů týkajících se uměle vytvořené rasové proměnné. Tento tutoriál čte obyčejné soubory CSV, takže odkaz ke stažení stále funguje, ale nové projekty by měly místo toho používat datové sady pro bydlení v Kalifornii nebo v Ames.

Mean Square Error (střední kvadratická chyba) obnovuje původní jednotky, Mean Absolute Error (střední absolutní chyba) odolává odlehlým hodnotám a R-kvadrát uvádí vysvětlený podíl rozptylu. Uveďte metriku absolutní chyby vedle R-kvadrátu, protože vysoký R-kvadrát může stále skrývat velké individuální predikční chyby.

Lineární regrese predikuje spojité číslo, například cenu domu. lineární klasifikátor předpovídá označení diskrétní třídy. Oba odpovídají váženému součtu znaků, ale klasifikátor tento součet projde rozhodovacím prahem.

Automatizované kanály hodnotí prvky pomocí regularizace Lasso, vzájemné informace nebo důležitosti permutací a poté odstraňují ty nejslabší. Nástroje AutoML prohledávají předzpracování a možnosti modelování společně, takže strávíte méně času ručním výběrem sloupců, které patří do feature_cols.

Copilot rychle vytváří základní návrhy, včetně vstupních funkcí, seznamů sloupců funkcí a vyhodnocovacích smyček. Každý návrh považujte za koncept, protože často generuje zastaralá volání Estimatoru. Před spuštěním zkontrolujte každý vygenerovaný symbol s aktuálním rozhraním TensorFlow API.

Shrňte tento příspěvek takto: