Binárna klasifikácia v TensorFlow: Príklad lineárneho klasifikátora

Obsah:

Anonim

Dve najbežnejšie kontrolované výukové úlohy sú lineárna regresia a lineárny klasifikátor. Lineárna regresia predpovedá hodnotu, zatiaľ čo lineárny klasifikátor predpovedá triedu. Tento výukový program je zameraný na lineárny klasifikátor.

Čo je lineárny klasifikátor?

Lineárne Klasifikátor v strojového učenia je metóda pre zistenie triedu objektu na základe jeho vlastností pre štatistické klasifikácie. Robí rozhodnutie o klasifikácii na základe hodnoty lineárnej kombinácie charakteristík objektu. Lineárny klasifikátor sa používa v praktických úlohách, ako je klasifikácia dokumentov a problémy s mnohými premennými.

Problémy s klasifikáciou predstavujú zhruba 80 percent úlohy strojového učenia. Cieľom klasifikácie je predpovedať pravdepodobnosť každej triedy, ktorá dostane sadu vstupov. Označenie (tj. Závislá premenná) je diskrétna hodnota, ktorá sa nazýva trieda.

  1. Ak má návestie iba dve triedy, učiacim sa algoritmom je binárny klasifikátor.
  2. Klasifikátor viacerých tried zvláda štítky s viac ako dvoma triedami.

Typickým problémom binárnej klasifikácie je napríklad predpovedanie pravdepodobnosti druhého nákupu zákazníkom. Predpovedajte, že typ zvieraťa zobrazeného na obrázku predstavuje problém s klasifikáciou viacerých tried, pretože existujú viac ako dve odrody zvierat.

Teoretická časť tohto tutoriálu sa primárne zameriava na binárnu triedu. Viac informácií o výstupnej funkcii viacerých tried sa dozviete v budúcom tutoriáli.

V tomto návode sa naučíte

  • Čo je lineárny klasifikátor?
  • Ako funguje binárny klasifikátor?
  • Ako merať výkonnosť lineárneho klasifikátora?
  • Presnosť
  • Zmätková matica
  • Presnosť a citlivosť
  • Lineárny klasifikátor s TensorFlow
  • Krok 1) Importujte údaje
  • Krok 2) Prevod údajov
  • Krok 3) Trénujte klasifikátor
  • Krok 4) Vylepšite model
  • Krok 5) Hyperparameter: Lasso & Ridge

Ako funguje binárny klasifikátor?

V predchádzajúcom tutoriáli ste sa naučili, že funkcia sa skladá z dvoch druhov premenných, závislej premennej a sady funkcií (nezávislé premenné). V lineárnej regresii je závislou premennou reálne číslo bez rozsahu. Primárnym cieľom je predpovedať jeho hodnotu minimalizáciou strednej štvorcovej chyby.

Pre binárny klasifikátor TensorFlow mohol mať štítok dve možné celočíselné hodnoty. Vo väčšine prípadov je to [0,1] alebo [1,2]. Napríklad cieľom je predpovedať, či si zákazník kúpi produkt alebo nie. Štítok je definovaný takto:

  • Y = 1 (zákazník si kúpil produkt)
  • Y = 0 (zákazník si produkt nekúpi)

Model využíva funkcie X na zaradenie každého zákazníka do najpravdepodobnejšej triedy, do ktorej patrí, konkrétne do kategórie potenciálny kupujúci alebo nie.

Pravdepodobnosť úspechu sa počíta s logistickou regresiou . Algoritmus vypočíta pravdepodobnosť na základe funkcie X a predpovedá úspech, keď je táto pravdepodobnosť vyššia ako 50 percent. Formálnejšie sa pravdepodobnosť počíta tak, ako je uvedené v príklade binárnej klasifikácie TensorFlow:

kde 0 je množina váh, prvkov ab skreslenie.

Funkciu je možné rozdeliť na dve časti:

  • Lineárny model
  • Logistická funkcia

Lineárny model

Spôsob výpočtu váh už poznáte. Váhy sa počítajú pomocou bodového súčinu: Y je lineárna funkcia všetkých znakov x i . Ak model nemá vlastnosti, predikcia sa rovná skresleniu, b.

Hmotnosti označujú smer korelácia medzi funkciou x i a štítok y. Pozitívna korelácia zvyšuje pravdepodobnosť pozitívnej triedy, zatiaľ čo negatívna korelácia vedie k pravdepodobnosti bližšie k 0 (tj negatívna trieda).

Lineárny model vracia iba reálne číslo, ktoré nie je v súlade s mierou pravdepodobnosti rozsahu [0,1]. Logistická funkcia je potrebná na prevod výstupu lineárneho modelu na pravdepodobnosť,

Logistická funkcia

Logistická funkcia alebo sigmoidná funkcia má tvar S a výstup tejto funkcie je vždy medzi 0 a 1.

Príklad logistických funkcií

Je ľahké dosadiť výstup lineárnej regresie na funkciu sigmoidu. Výsledkom je nové číslo s pravdepodobnosťou od 0 do 1.

Klasifikátor dokáže transformovať pravdepodobnosť na triedu

  • Hodnoty od 0 do 0,49 sa stanú triedou 0
  • Hodnoty medzi 0,5 a 1 sa stanú triedou 1

Ako merať výkonnosť lineárneho klasifikátora?

Presnosť

Celkový výkon klasifikátora sa meria pomocou metriky presnosti. Presnosť zhromažďuje všetky správne hodnoty delené celkovým počtom pozorovaní. Napríklad hodnota presnosti 80 percent znamená, že model je správny v 80 percentách prípadov.

Merajte výkonnosť lineárneho klasifikátora pomocou metriky Presnosť

S touto metrikou môžete zaznamenať nedostatok, najmä pre triedu nevyváženosti. Súbor údajov o nerovnováhe nastane, keď počet pozorovaní v skupine nie je rovnaký. Povedzme; sa pokúsite klasifikovať zriedkavú udalosť pomocou logistickej funkcie. Predstavte si, že sa klasifikátor pokúša odhadnúť smrť pacienta po chorobe. V dátach zomrelo 5 percent pacientov. Môžete trénovať klasifikátora, aby predpovedal počet úmrtí, a pomocou metriky presnosti hodnotiť výkony. Ak klasifikátor predpovedá 0 úmrtí pre celý súbor údajov, bude to správne v 95 percentách prípadov.

Zmätková matica

Lepším spôsobom, ako hodnotiť výkonnosť klasifikátora, je pozrieť sa na maticu zmätku.

Merajte výkonnosť lineárneho klasifikátora pomocou matice zmätku

Zmätená matica vizualizuje presnosť klasifikátora porovnaním skutočných a predpovedaných tried, ako je uvedené vo vyššie uvedenom príklade lineárneho klasifikátora. Binárna matica zámeny sa skladá zo štvorcov:

  • TP: Skutočne pozitívne: Predpovedané hodnoty sa správne predpovedali ako skutočné pozitívne
  • FP: Predpovedané hodnoty nesprávne predpovedali skutočné pozitívum. tj negatívne hodnoty predpovedané ako pozitívne
  • FN: False Negative: Pozitívne hodnoty predpovedané ako negatívne
  • TN: Skutočne záporné: Predpovedané hodnoty sa správne predpovedajú ako skutočné záporné hodnoty

Z matice zmätkov je ľahké porovnať skutočnú triedu a predpokladanú triedu.

Presnosť a citlivosť

Matica zámeny poskytuje dobrý pohľad na skutočne pozitívne a falošne pozitívne výsledky. V niektorých prípadoch je vhodnejšie mať stručnejšiu metriku.

Presnosť

Metrika presnosti ukazuje presnosť kladnej triedy. Meria sa tým, aká pravdepodobná je predpoveď pozitívnej triedy.

Maximálne skóre je 1, keď klasifikátor dokonale klasifikuje všetky kladné hodnoty. Samotná presnosť nie je veľmi užitočná, pretože ignoruje negatívnu triedu. Metrika je zvyčajne spárovaná s metrikou Recall. Pripomenutie sa tiež nazýva citlivosť alebo skutočná kladná miera.

Citlivosť

Citlivosť počíta pomer správne detegovaných pozitívnych tried. Táto metrika udáva, aký dobrý je model na rozpoznanie pozitívnej triedy.

Lineárny klasifikátor s TensorFlow

Pre tento tutoriál použijeme súbor údajov o sčítaní ľudu. Účelom je použiť premenné v súbore údajov na predpovedanie úrovne príjmu. Upozorňujeme, že príjem je binárna premenná

  • s hodnotou 1, ak je príjem> 50k
  • 0 ak príjem <50k.

Táto premenná je váš štítok

Tento súbor údajov obsahuje osem kategorických premenných:

  • pracovisku
  • vzdelanie
  • manželský
  • okupácia
  • vzťah
  • rasa
  • pohlavie
  • rodná krajina

okrem toho šesť spojitých premenných:

  • Vek
  • fnlwgt
  • vzdelanie_počet
  • kapitálový zisk
  • capital_loss
  • hours_week

Prostredníctvom tohto príkladu klasifikácie TensorFlow pochopíte, ako trénovať lineárne klasifikátory TensorFlow s odhadom TensorFlow a ako zlepšiť metriku presnosti.

Budeme postupovať nasledovne:

  • Krok 1) Importujte údaje
  • Krok 2) Prevod údajov
  • Krok 3) Trénujte klasifikátor
  • Krok 4) Vylepšite model
  • Krok 5) Hyperparameter: Lasso & Ridge

Krok 1) Importujte údaje

Najskôr importujete knižnice použité počas tohto kurzu.

import tensorflow as tfimport pandas as pd 

Ďalej importujete údaje z archívu UCI a definujete názvy stĺpcov. Stĺpce použijete na pomenovanie stĺpcov v dátovom rámci pandy.

Upozorňujeme, že klasifikátor budete trénovať pomocou dátového rámca Pandas.

## Define path dataCOLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital','occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss','hours_week', 'native_country', 'label']PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"PATH_test = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test"

Údaje uložené online sú už rozdelené medzi vlakovú súpravu a skúšobnú súpravu.

df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False)df_test = pd.read_csv(PATH_test,skiprows = 1, skipinitialspace=True, names = COLUMNS, index_col=False)

Vlaková súprava obsahuje 32 561 pozorovaní a testovacia súprava 16 281

print(df_train.shape, df_test.shape)print(df_train.dtypes)(32561, 15) (16281, 15)age int64workclass objectfnlwgt int64education objecteducation_num int64marital objectoccupation objectrelationship objectrace objectsex objectcapital_gain int64capital_loss int64hours_week int64native_country objectlabel objectdtype: object

Tensorflow vyžaduje na trénovanie klasifikátora boolovskú hodnotu. Musíte previesť hodnoty z reťazca na celé číslo. Štítok sa ukladá ako objekt, musíte ho však previesť na číselnú hodnotu. Nasledujúci kód vytvorí slovník s hodnotami, ktoré sa majú previesť a vytvoriť slučku nad položkou stĺpca. Upozorňujeme, že túto operáciu vykonáte dvakrát, jednu pre test vlaku, druhú pre testovaciu súpravu

label = {'<=50K': 0,'>50K': 1}df_train.label = [label[item] for item in df_train.label]label_t = {'<=50K.': 0,'>50K.': 1}df_test.label = [label_t[item] for item in df_test.label]

V údajoch o vlakoch je 24 720 príjmov nižších ako 50 000 a vyššie 7841. Pomer je pri testovacej súprave takmer rovnaký. Ďalšie informácie nájdete v tomto výučbe na tému Facety.

print(df_train["label"].value_counts())### The model will be correct in atleast 70% of the caseprint(df_test["label"].value_counts())## Unbalanced labelprint(df_train.dtypes)0 247201 7841Name: label, dtype: int640 124351 3846Name: label, dtype: int64age int64workclass objectfnlwgt int64education objecteducation_num int64marital objectoccupation objectrelationship objectrace objectsex objectcapital_gain int64capital_loss int64hours_week int64native_country objectlabel int64dtype: object

Krok 2) Prevod údajov

Pred trénovaním lineárneho klasifikátora s Tensorflow je potrebných niekoľko krokov. Musíte si pripraviť funkcie, ktoré chcete zahrnúť do modelu. Pri referenčnej regresii použijete pôvodné údaje bez akejkoľvek transformácie.

Odhadovateľ musí mať zoznam funkcií na trénovanie modelu. Preto je potrebné údaje stĺpca previesť na tenzor.

Dobrým postupom je definovať dva zoznamy funkcií na základe ich typu a potom ich odovzdať do stĺpcov feature_columns odhadcu.

Začnete konverziou súvislých funkcií, potom definujete segment s kategorickými údajmi.

Vlastnosti súboru údajov majú dva formáty:

  • Celé číslo
  • Objekt

Každá funkcia je uvedená v nasledujúcich dvoch premenných podľa ich typov.

## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week']### Define the categorical listCATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country']

Feature_column je vybavený objektom numeric_column, ktorý pomáha pri transformácii spojitých premenných na tenzor. V nižšie uvedenom kóde prevádzate všetky premenné z CONTI_FEATURES na tenzor s číselnou hodnotou. To je povinné pri zostavovaní modelu. Všetky nezávislé premenné je potrebné previesť na správny typ tenzora.

Nižšie napíšeme kód, ktorý vám umožní vidieť, čo sa deje za feature_column.numeric_column. Konvertovanú hodnotu pre vek vytlačíme. Je to z dôvodu vysvetlenia, a preto nie je potrebné rozumieť kódu v jazyku python. Pre pochopenie kódov môžete odkazovať na oficiálnu dokumentáciu.

def print_transformation(feature = "age", continuous = True, size = 2):#X = fc.numeric_column(feature)## Create feature namefeature_names = [feature]## Create dict with the datad = dict(zip(feature_names, [df_train[feature]]))## Convert ageif continuous == True:c = tf.feature_column.numeric_column(feature)feature_columns = [c]else:c = tf.feature_column.categorical_column_with_hash_bucket(feature, hash_bucket_size=size)c_indicator = tf.feature_column.indicator_column(c)feature_columns = [c_indicator]## Use input_layer to print the valueinput_layer = tf.feature_column.input_layer(features=d,feature_columns=feature_columns)## Create lookup tablezero = tf.constant(0, dtype=tf.float32)where = tf.not_equal(input_layer, zero)## Return lookup tbleindices = tf.where(where)values = tf.gather_nd(input_layer, indices)## Initiate graphsess = tf.Session()## Print valueprint(sess.run(input_layer))print_transformation(feature = "age", continuous = True)[[39.][50.][38.]… [58.][22.][52.]]

Hodnoty sú úplne rovnaké ako v df_train

continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES] 

Podľa dokumentácie TensorFlow existujú rôzne spôsoby prevodu kategorických údajov. Ak je zoznam slovíčok funkcie známy a nemá veľa hodnôt, je možné vytvoriť kategorický stĺpec s kategóriou_column_with_vocabulary_list. Priradí každému jedinečnému zoznamu slovníkov ID.

Napríklad ak má stav premennej tri odlišné hodnoty:

  • Manžel
  • Manželka
  • Slobodný

Potom sa pridelia tri identifikačné čísla. Napríklad manžel bude mať ID 1, manželka ID 2 atď.

Pre ilustráciu môžete tento kód použiť na konverziu premennej objektu na kategorický stĺpec v TensorFlow.

Celovečerný sex môže mať iba dve hodnoty: muž alebo žena. Keď prevedieme hraný sex, Tensorflow vytvorí 2 nové stĺpce, jeden pre mužský a jeden pre ženský. Ak je pohlavie rovnaké ako muž, potom sa nový stĺpec mužského pohlavia bude rovnať 1 a ženského pohlavia 0. Tento príklad je uvedený v nasledujúcej tabuľke:

riadkov

pohlavie

po transformácii

Muž

Žena

1

Muž

=>

1

0

2

Muž

=>

1

0

3

Žena

=>

0

1

V tensorflow:

print_transformation(feature = "sex", continuous = False, size = 2)[[1. 0.][1. 0.][1. 0.]… [0. 1.][1. 0.][0. 1.]]relationship = tf.feature_column.categorical_column_with_vocabulary_list('relationship', ['Husband', 'Not-in-family', 'Wife', 'Own-child', 'Unmarried','Other-relative'])

Ďalej sme pridali kód Pythonu na vytlačenie kódovania. Opäť nemusíte kódu rozumieť, účelom je vidieť transformáciu

Rýchlejším spôsobom transformácie údajov je však použitie metódy categorical_column_with_hash_bucket. Užitočná bude zmena premenných reťazcov v riedkej matici. Riedka matica je matica s väčšinou nulou. Metóda sa stará o všetko. Musíte len určiť počet segmentov a stĺpec kľúča. Počet segmentov je maximálny počet skupín, ktoré môže Tensorflow vytvoriť. Kľúčový stĺpec je jednoducho názov stĺpca, ktorý sa má konvertovať.

V nižšie uvedenom kóde vytvoríte slučku cez všetky kategorické prvky.

categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]

Krok 3) Trénujte klasifikátor

TensorFlow v súčasnosti poskytuje odhad pre lineárnu regresiu a lineárnu klasifikáciu.

  • Lineárna regresia: Lineárny regresor
  • Lineárna klasifikácia: LinearClassifier

Syntax lineárneho klasifikátora je rovnaká ako v tutoriále o lineárnej regresii, okrem jedného argumentu n_class. Musíte definovať stĺpec prvkov, adresár modelov a porovnať ich s lineárnym regresorom; máte definovaný počet tried. Pre logitnú regresiu je počet tried rovný 2.

Model bude počítať váhy stĺpcov obsiahnutých v kontinuálnych_funkciách a kategorických_funkciách.

model = tf.estimator.LinearClassifier(n_classes = 2,model_dir="ongoing/train",feature_columns=categorical_features+ continuous_features)

VÝKON:

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

Teraz, keď je klasifikátor definovaný, môžete vytvoriť vstupnú funkciu. Metóda je rovnaká ako v návode na lineárny regresor. Tu použijete veľkosť dávky 128 a zamiešate údaje.

FEATURES = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country']LABEL= 'label'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)

Vytvoríte funkciu s argumentmi požadovanými lineárnym odhadcom, tj počet epoch, počet dávok a zamiešate množinu údajov alebo poznámku. Pretože na odovzdanie údajov do modelu použijete metódu Pandas, musíte definovať premenné X ako dátový rámec pandas. Pamätajte, že prechádzate slučkou cez všetky dáta uložené vo FUNKCIÁCH.

Vycvičme model s objektom model.train. Predtým definovanú funkciu použijete na dodanie modelu príslušnými hodnotami. Upozorňujeme, že ste veľkosť dávky nastavili na 128 a počet epoch na hodnotu None. Model bude trénovaný na tisíc krokov.

model.train(input_fn=get_input_fn(df_train,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)
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 ongoing/train/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 65.8282INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)INFO:tensorflow:global_step/sec: 118.386INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)INFO:tensorflow:global_step/sec: 110.542INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)INFO:tensorflow:global_step/sec: 199.03INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)INFO:tensorflow:global_step/sec: 167.488INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)INFO:tensorflow:global_step/sec: 220.155INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)INFO:tensorflow:global_step/sec: 199.016INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)INFO:tensorflow:global_step/sec: 197.531INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)INFO:tensorflow:global_step/sec: 208.479INFO:tensorflow:loss = 22201.918, step = 901 (0.479 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train/model.ckpt.INFO:tensorflow:Loss for final step: 5444.363.

Strata sa následne znížila počas posledných 100 krokov, tj. Z 901 na 1 000.

Konečná strata po tisíc iteráciách je 5444. Svoj model môžete odhadnúť na testovacej sade a pozrieť si výkon. Ak chcete vyhodnotiť výkonnosť svojho modelu, musíte použiť objekt vyhodnotiť. Nakŕmite model testovacou súpravou a nastavíte počet epoch na 1, tj údaje sa do modelu dostanú iba raz.

model.evaluate(input_fn=get_input_fn(df_test,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)
INFO:tensorflow:Calling model_fn.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:22INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [100/1000]INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:23INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7615626, accuracy_baseline = 0.76377374, auc = 0.63300294, auc_precision_recall = 0.50891197, average_loss = 47.12155, global_step = 1000, label/mean = 0.23622628, loss = 5993.6406, precision = 0.49401596, prediction/mean = 0.18454961, recall = 0.38637546{'accuracy': 0.7615626,'accuracy_baseline': 0.76377374,'auc': 0.63300294,'auc_precision_recall': 0.50891197,'average_loss': 47.12155,'global_step': 1000,'label/mean': 0.23622628,'loss': 5993.6406,'precision': 0.49401596,'prediction/mean': 0.18454961,'recall': 0.38637546}

TensorFlow vráti všetky metriky, ktoré ste sa naučili v teoretickej časti. Bez prekvapenia je presnosť veľká kvôli nevyváženému štítku. Model je v skutočnosti o niečo lepší ako náhodný odhad. Predstavte si, že model predpovedá všetky domácnosti s príjmom nižším ako 50 tis., Potom má model presnosť 70 percent. Pri podrobnejšej analýze môžete vidieť, že predpoveď a počet stiahnutí sú pomerne nízke.

Krok 4) Vylepšite model

Teraz, keď máte referenčný model, sa ho môžete pokúsiť vylepšiť, to znamená zvýšiť presnosť. V predchádzajúcom tutoriáli ste sa naučili, ako zlepšiť silu predikcie pomocou výrazu interakcie. V tomto tutoriáli sa k tejto myšlienke vrátite pridaním polynomického výrazu k regresii.

Polynomiálna regresia je inštrumentálna, ak v dátach nie je linearita. Existujú dva spôsoby, ako zachytiť nelinearitu údajov.

  • Pridajte polynomiálny výraz
  • Spojitú premennú skombinujte do kategorickej premennej

Polynomický výraz

Na obrázku nižšie vidíte, čo je polynomiálna regresia. Je to rovnica s X premennými s rôznou silou. Polynomiálna regresia druhého stupňa má dve premenné, X a X na druhú. Tretí stupeň má tri premenné x, X 2 a X 3

Čo je to polynomiálna regresia

Ďalej sme zostrojili graf s dvoma premennými, X a Y. Je zrejmé, že vzťah nie je lineárny. Ak pridáme lineárnu regresiu, môžeme vidieť, že model nie je schopný zachytiť vzor (ľavý obrázok).

Teraz, keď sa pozrieme na ľavý obrázok z obrázku nižšie, pridali sme k regresii päťčlenné členenie (tj. Y = x + x 2 + x 3 + x 4 + x 5) . Model teraz lepšie zachytáva vzor. Toto je sila polynomiálnej regresie.

Vráťme sa k nášmu príkladu. Vek nie je v lineárnom vzťahu s príjmom. V ranom veku môže byť plochý príjem takmer nulový, pretože deti alebo mladí ľudia nepracujú. Potom sa zvyšuje v produktívnom veku a klesá počas dôchodku. Je to zvyčajne tvar obráteného U. Jedným zo spôsobov, ako tento vzorec zachytiť, je pridať k regresii mocninu dva.

Uvidíme, či to zvýši presnosť.

Túto novú funkciu musíte pridať do množiny údajov a do zoznamu nepretržitej funkcie.

Novú premennú pridáte do vlaku a otestujete množinu údajov, takže je pohodlnejšie napísať funkciu.

def square_var(df_t, df_te, var_name = 'age'):df_t['new'] = df_t[var_name].pow(2)df_te['new'] = df_te[var_name].pow(2)return df_t, df_te

Funkcia má 3 argumenty:

  • df_t: definujte tréningovú množinu
  • df_te: definujte testovaciu sadu
  • var_name = 'age': Definujte premennú, ktorá sa má transformovať

Môžete použiť objekt pow (2) na zarovnanie premenného veku. Všimnite si, že nová premenná má názov „nová“

Teraz, keď je napísaná funkcia square_var, môžete vytvoriť nové množiny údajov.

df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age') 

Ako vidíte, nová množina údajov má ešte jednu funkciu.

print(df_train_new.shape, df_test_new.shape)(32561, 16) (16281, 16) 

Štvorcová premenná sa v množine údajov nazýva nová. Musíte ho pridať do zoznamu nepretržitých funkcií.

CONTI_FEATURES_NEW = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week', 'new']continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]

Upozorňujeme, že ste zmenili adresár grafu. V rovnakom adresári nemôžete trénovať rôzne modely. To znamená, že musíte zmeniť cestu k argumentu model_dir. Pokiaľ to neurobíte, TensorFlow spôsobí chybu.

model_1 = tf.estimator.LinearClassifier(model_dir="ongoing/train1",feature_columns=categorical_features+ continuous_features_new)
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'ongoing/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':, '_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}FEATURES_NEW = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'new']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_NEW}),y = pd.Series(data_set[LABEL].values),batch_size=n_batch,num_epochs=num_epochs,shuffle=shuffle)

Teraz, keď je klasifikátor navrhnutý s novou množinou údajov, môžete trénovať a hodnotiť model.

model_1.train(input_fn=get_input_fn(df_train,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)
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 ongoing/train1/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 81.487INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)INFO:tensorflow:global_step/sec: 111.169INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)INFO:tensorflow:global_step/sec: 128.91INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)INFO:tensorflow:global_step/sec: 132.546INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)INFO:tensorflow:global_step/sec: 162.194INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)INFO:tensorflow:global_step/sec: 204.852INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)INFO:tensorflow:global_step/sec: 188.923INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)INFO:tensorflow:global_step/sec: 192.041INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)INFO:tensorflow:global_step/sec: 197.025INFO:tensorflow:loss = 3309.5786, step = 901 (0.507 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train1/model.ckpt.INFO:tensorflow:Loss for final step: 28861.898.
model_1.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)
INFO:tensorflow:Calling model_fn.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:37INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [100/1000]INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:39INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7944229, accuracy_baseline = 0.76377374, auc = 0.6093755, auc_precision_recall = 0.54885805, average_loss = 111.0046, global_step = 1000, label/mean = 0.23622628, loss = 14119.265, precision = 0.6682401, prediction/mean = 0.09116262, recall = 0.2576703{'accuracy': 0.7944229,'accuracy_baseline': 0.76377374,'auc': 0.6093755,'auc_precision_recall': 0.54885805,'average_loss': 111.0046,'global_step': 1000,'label/mean': 0.23622628,'loss': 14119.265,'precision': 0.6682401,'prediction/mean': 0.09116262,'recall': 0.2576703}

Štvorcová premenná zlepšila presnosť z 0,76 na 0,79. Pozrime sa, či môžete urobiť lepšie kombináciou výrazu bucketization a interakcie.

Bucketizácia a interakcia

Ako ste už videli, lineárny klasifikátor nedokáže správne zachytiť vzor veku a príjmu. Je to preto, lebo sa učí jednu váhu pre každú vlastnosť. Aby ste uľahčili klasifikátor, môžete urobiť jednu vec - vytvoriť túto funkciu. Bucketing transformuje numerickú funkciu na niekoľko určitých na základe rozsahu, do ktorého spadá, a každá z týchto nových funkcií naznačuje, či vek človeka spadá do tohto rozsahu.

Pomocou týchto nových funkcií môže lineárny model zachytiť vzťah učením sa rôznych váh pre každý segment.

V TensorFlow sa to robí pomocou bucketized_column. Musíte pridať rozsah hodnôt na hraniciach.

age = tf.feature_column.numeric_column('age')age_buckets = tf.feature_column.bucketized_column(age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

Už viete, že vek nie je lineárny s príjmom. Ďalším spôsobom, ako vylepšiť model, je interakcia. V slove TensorFlow ide o kríženie funkcií. Kríženie prvkov je spôsob, ako vytvoriť nové prvky, ktoré sú kombináciami existujúcich, čo môže byť užitočné pre lineárny klasifikátor, ktorý nedokáže modelovať interakcie medzi prvkami.

Vek môžete rozdeliť pomocou inej funkcie, ako je vzdelávanie. To znamená, že niektoré skupiny budú mať pravdepodobne vysoký príjem a iné nízke (premýšľajte o doktorandovi).

education_x_occupation = [tf.feature_column.crossed_column(['education', 'occupation'], hash_bucket_size=1000)]age_buckets_x_education_x_occupation = [tf.feature_column.crossed_column([age_buckets, 'education', 'occupation'], hash_bucket_size=1000)]

Ak chcete vytvoriť stĺpec krížových prvkov, použijete krížený_sloupec s premennými na kríženie v zátvorke. Hodnota hash_bucket_size označuje maximálne možnosti kríženia. Ak chcete vytvoriť interakciu medzi premennými (aspoň jedna premenná musí byť kategorická), môžete použiť tf.feature_column.crossed_column. Ak chcete použiť tento objekt, musíte do štvorcovej zátvorky pridať premennú na interakciu a druhý argument, veľkosť vedra. Veľkosť segmentu je maximálny možný počet skupín v rámci premennej. Tu nastavíte 1000, pretože nepoznáte presný počet skupín

age_buckets je potrebné najskôr pridať do štvorca, aby ste ho mohli pridať do stĺpcov funkcií. Nové funkcie tiež pridáte do stĺpcov funkcií a pripravíte odhad

base_columns = [age_buckets,]model_imp = tf.estimator.LinearClassifier(model_dir="ongoing/train3",feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation)

VÝKON

INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'ongoing/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': , '_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}
FEATURES_imp = ['age','workclass', 'education', 'education_num', 'marital','occupation', 'relationship', 'race', 'sex', 'native_country', 'new']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_imp}),y = pd.Series(data_set[LABEL].values),batch_size=n_batch,num_epochs=num_epochs,shuffle=shuffle)

Ste pripravení odhadnúť nový model a zistiť, či zvyšuje presnosť.

model_imp.train(input_fn=get_input_fn(df_train_new,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)
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 ongoing/train3/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 94.969INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)INFO:tensorflow:global_step/sec: 242.342INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)INFO:tensorflow:global_step/sec: 213.686INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)INFO:tensorflow:global_step/sec: 174.084INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)INFO:tensorflow:global_step/sec: 191.78INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)INFO:tensorflow:global_step/sec: 163.436INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)INFO:tensorflow:global_step/sec: 164.347INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)INFO:tensorflow:global_step/sec: 154.274INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)INFO:tensorflow:global_step/sec: 189.14INFO:tensorflow:loss = 44.69645, step = 901 (0.531 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train3/model.ckpt.INFO:tensorflow:Loss for final step: 44.18133.
model_imp.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)
INFO:tensorflow:Calling model_fn.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:52INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [100/1000]INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:54INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.8358209, accuracy_baseline = 0.76377374, auc = 0.88401634, auc_precision_recall = 0.69599575, average_loss = 0.35122654, global_step = 1000, label/mean = 0.23622628, loss = 44.67437, precision = 0.68986726, prediction/mean = 0.23320661, recall = 0.55408216{'accuracy': 0.8358209,'accuracy_baseline': 0.76377374,'auc': 0.88401634,'auc_precision_recall': 0.69599575,'average_loss': 0.35122654,'global_step': 1000,'label/mean': 0.23622628,'loss': 44.67437,'precision': 0.68986726,'prediction/mean': 0.23320661,'recall': 0.55408216}

Nová úroveň presnosti je 83,58 percenta. Je o štyri percentá vyššia ako v predchádzajúcom modeli.

Na záver môžete pridať regularizačný výraz, aby ste zabránili nadmernému vybaveniu.

Krok 5) Hyperparameter: Lasso & Ridge

Váš model môže trpieť overfitting alebo underfitting .

  • Prebytok výbavy: Model nedokáže zovšeobecniť predikciu na nové údaje
  • Nedostatočné vybavenie: Model nedokáže zachytiť vzor údajov. tj lineárna regresia, keď sú údaje nelineárne

Ak má model veľa parametrov a relatívne malé množstvo údajov, vedie to k zlým predpovediam. Predstavte si, že jedna skupina má iba tri pozorovania; model vypočíta váhu pre túto skupinu. Váha sa používa na predikciu; ak sa pozorovania testovacej súpravy pre túto konkrétnu skupinu úplne líšia od cvičnej súpravy, potom model urobí nesprávnu predpoveď. Počas hodnotenia cvičnou sadou je presnosť dobrá, ale nie dobrá s testovacou súpravou, pretože vypočítané váhy nie sú pravé na zovšeobecnenie vzoru. V takom prípade nevytvára primeranú predpoveď na neviditeľné údaje.

Aby ste zabránili nadmernému vybaveniu, regularizácia vám dáva možnosti kontrolovať takúto zložitosť a urobiť ju zovšeobecniteľnejšou. Existujú dve regularizačné techniky:

  • L1: Laso
  • L2: Hrebeň

V TensorFlow môžete tieto dva hyperparametre pridať do optimalizátora. Napríklad čím je hyperparameter L2 vyšší, váha býva veľmi nízka a takmer nulová. Prispôsobená čiara bude veľmi plochá, zatiaľ čo L2 blízka nule znamená, že váhy sú blízke pravidelnej lineárnej regresii.

Môžete vyskúšať sami rozdielnu hodnotu hyperparametrov a zistiť, či môžete zvýšiť úroveň presnosti.

Upozorňujeme, že ak zmeníte hyperparameter, musíte vymazať priečinok priebežne / train4, inak bude model začínať predtým trénovaným modelom.

Pozrime sa, ako je to s hype

model_regu = tf.estimator.LinearClassifier(model_dir="ongoing/train4", feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation,optimizer=tf.train.FtrlOptimizer(learning_rate=0.1,l1_regularization_strength=0.9,l2_regularization_strength=5))

OUPUT

INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train4', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': , '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
model_regu.train(input_fn=get_input_fn(df_train_new,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)

OUPUT

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 ongoing/train4/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 77.4165INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)INFO:tensorflow:global_step/sec: 187.889INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)INFO:tensorflow:global_step/sec: 201.895INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)INFO:tensorflow:global_step/sec: 217.992INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)INFO:tensorflow:global_step/sec: 193.676INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)INFO:tensorflow:global_step/sec: 202.195INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)INFO:tensorflow:global_step/sec: 216.756INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)INFO:tensorflow:global_step/sec: 240.215INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)INFO:tensorflow:global_step/sec: 220.336INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt.INFO:tensorflow:Loss for final step: 43.4942.
model_regu.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)

VÝKON

INFO:tensorflow:Calling model_fn.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-06-02-08:29:07INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [100/1000]INFO:tensorflow:Finished evaluation at 2018-06-02-08:29:09INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.83833915, accuracy_baseline = 0.76377374, auc = 0.8869794, auc_precision_recall = 0.7014905, average_loss = 0.34691378, global_step = 1000, label/mean = 0.23622628, loss = 44.12581, precision = 0.69720596, prediction/mean = 0.23662092, recall = 0.5579823{'accuracy': 0.83833915,'accuracy_baseline': 0.76377374,'auc': 0.8869794,'auc_precision_recall': 0.7014905,'average_loss': 0.34691378,'global_step': 1000,'label/mean': 0.23622628,'loss': 44.12581,'precision': 0.69720596,'prediction/mean': 0.23662092,'recall': 0.5579823}

S týmto hyperparametrom mierne zvyšujete metriky presnosti. V ďalšom návode sa dozviete, ako vylepšiť lineárny klasifikátor pomocou jadrovej metódy.

Zhrnutie

Ak chcete trénovať model, musíte:

  • Definujte vlastnosti: Nezávislé premenné: X
  • Definujte štítok: Závislá premenná: r
  • Postavte vlak / testovaciu súpravu
  • Definujte počiatočnú hmotnosť
  • Definujte stratovú funkciu: MSE
  • Optimalizujte model: Zostupný klesanie
  • Definovať:
    • Miera učenia
    • Počet epoch
    • Veľkosť šarže
    • Číslo triedy

V tomto tutoriáli ste sa naučili, ako používať API na vysokej úrovni pre klasifikátor lineárnej regresie. Musíte definovať:

  1. Stĺpce funkcií. Ak je priebežné: tf.feature_column.numeric_column (). Zoznam môžete vyplniť porozumením zoznamu pythónov
  2. Odhad: tf.estimator.LinearClassifier (feature_columns, model_dir, n_classes = 2)
  3. Funkcia na import údajov, veľkosti dávky a epochy: input_fn ()

Potom ste pripravení trénovať, hodnotiť a predpovedať pomocou programu train (), evalu () a predpovedať ()

Ak chcete zlepšiť výkonnosť modelu, môžete:

  • Použite polynomiálnu regresiu
  • Termín interakcie: tf.feature_column.crossed_column
  • Pridajte parameter regularizácie