TensorFlow binarna klasifikacija: primjer linearnog klasifikatora

Dvije najฤeลกฤ‡e nadzirano uฤenje zadaci su linearna regresija i linearni klasifikator. Linearna regresija predviฤ‘a vrijednost dok linearni klasifikator predviฤ‘a klasu. Ovaj vodiฤ usmjeren je na linearne klasifikatore.

ล to je linearni klasifikator?

A Linearni klasifikator u strojnom uฤenju je metoda za pronalaลพenje klase objekta na temelju njegovih karakteristika za statistiฤku klasifikaciju. Donosi odluku o klasifikaciji na temelju vrijednosti linearne kombinacije karakteristika objekta. Linearni klasifikator koristi se u praktiฤnim problemima poput klasifikacije dokumenata i problema s mnogo varijabli.

Problemi s klasifikacijom predstavljaju otprilike 80 posto zadatka strojnog uฤenja. Klasifikacija ima za cilj predviฤ‘anje vjerojatnosti svake klase s obzirom na skup inputa. Oznaka (tj. zavisna varijabla) je diskretna vrijednost, koja se naziva klasa.

  1. Ako oznaka ima samo dvije klase, algoritam uฤenja je binarni klasifikator.
  2. Multiclass klasifikator bavi se oznakama s viลกe od dvije klase.

Na primjer, tipiฤan problem binarne klasifikacije je predviฤ‘anje vjerojatnosti da kupac obavi drugu kupnju. Predviฤ‘anje vrste ลพivotinje prikazane na slici problem je viลกeklasne klasifikacije buduฤ‡i da postoji viลกe od dvije vrste ลพivotinja.

Teorijski dio ovog vodiฤa stavlja primarni fokus na binarnu klasu. Nauฤit ฤ‡ete viลกe o funkciji viลกeklasnog izlaza u buduฤ‡em vodiฤu.

Kako radi binarni klasifikator?

U prethodnom ste vodiฤu nauฤili da je funkcija sastavljena od dvije vrste varijabli, zavisne varijable i skupa znaฤajki (nezavisne varijable). U linearnoj regresiji, zavisna varijabla je realan broj bez raspona. Primarni cilj je predvidjeti njegovu vrijednost minimiziranjem srednje kvadratne pogreลกke.

Za TensorFlow binarni klasifikator, oznaka je mogla imati dvije moguฤ‡e vrijednosti cijelog broja. U veฤ‡ini sluฤajeva, to je [0,1] ili [1,2]. Na primjer, cilj je predvidjeti hoฤ‡e li kupac kupiti proizvod ili ne. Oznaka je definirana na sljedeฤ‡i naฤin:

  • Y = 1 (kupac je kupio proizvod)
  • Y = 0 (kupac ne kupuje proizvod)

Model koristi znaฤajke X za klasificiranje svakog kupca u najvjerojatniji razred kojem pripada, odnosno, potencijalni kupac ili ne.

Vjerojatnost uspjeha izraฤunava se s logistiฤka regresija. Algoritam ฤ‡e izraฤunati vjerojatnost na temelju svojstva X i predviฤ‘a uspjeh kada je ta vjerojatnost iznad 50 posto. Formalnije, vjerojatnost se izraฤunava kao ลกto je prikazano u donjem primjeru TensorFlow binarne klasifikacije:

Primjer binarne klasifikacije

gdje je 0 skup teลพina, znaฤajki, a b pristranost.

Funkcija se moลพe rastaviti na dva dijela:

  • Linearni model
  • Logistiฤka funkcija

Linearni model

Veฤ‡ ste upoznati s naฤinom na koji se izraฤunavaju teลพine. Teลพine se izraฤunavaju pomoฤ‡u toฤkastog produkta:Toฤkasti proizvod Y je linearna funkcija svih svojstava xi. Ako model nema znaฤajke, predviฤ‘anje je jednako pristranosti, b.

Ponderi pokazuju smjer korelacije izmeฤ‘u znaฤajki xi i oznaka y. Pozitivna korelacija poveฤ‡ava vjerojatnost pozitivne klase dok negativna korelacija vodi vjerojatnost bliลพe 0 (tj. negativnoj klasi).

Linearni model vraฤ‡a samo realni broj, koji nije u skladu s mjerom vjerojatnosti raspona [0,1]. Logistiฤka funkcija je potrebna za pretvaranje izlaza linearnog modela u vjerojatnost,

Logistiฤka funkcija

Logistiฤka funkcija ili sigmoidna funkcija ima oblik slova S, a izlaz ove funkcije je uvijek izmeฤ‘u 0 i 1.

Primjer logistiฤke funkcije

Primjer logistiฤke funkcije
Primjer logistiฤke funkcije

Lako je zamijeniti izlaz linearne regresije u sigmoidnu funkciju. Rezultat je novi broj s vjerojatnoลกฤ‡u izmeฤ‘u 0 i 1.

Klasifikator moลพe transformirati vjerojatnost u klasu

  • Vrijednosti izmeฤ‘u 0 i 0.49 postaju klasa 0
  • Vrijednosti izmeฤ‘u 0.5 i 1 postaju klasa 1

Kako izmjeriti izvedbu linearnog klasifikatora?

Toฤnost

Ukupna izvedba klasifikatora mjeri se metrikom toฤnosti. Toฤnost prikuplja sve toฤne vrijednosti podijeljene s ukupnim brojem opaลพanja. Na primjer, vrijednost toฤnosti od 80 posto znaฤi da je model toฤan u 80 posto sluฤajeva.

metrika toฤnosti
Izmjerite izvedbu Linearnog klasifikatora pomoฤ‡u metrike toฤnosti

Moลพete primijetiti nedostatak ove metrike, posebno za klasu neravnoteลพe. Skup podataka o neravnoteลพi javlja se kada broj opaลพanja po skupini nije jednak. Recimo; pokuลกavate klasificirati rijedak dogaฤ‘aj s logistiฤkom funkcijom. Zamislite da klasifikator pokuลกava procijeniti smrt pacijenta nakon bolesti. Prema podacima, 5 posto pacijenata premine. Moลพete uvjeลพbati klasifikator da predvidi broj smrti i koristite metriku toฤnosti za procjenu performansi. Ako klasifikator predviฤ‘a 0 smrti za cijeli skup podataka, to ฤ‡e biti toฤno u 95 posto sluฤajeva.

Matrica zabune

Bolji naฤin za procjenu uฤinka klasifikatora je pogled na matricu zabune.

Matrica zabune
Izmjerite izvedbu Linearnog klasifikatora pomoฤ‡u matrice zabune

The matrica zabune vizualizira toฤnost klasifikatora usporeฤ‘ujuฤ‡i stvarne i predviฤ‘ene klase kao ลกto je prikazano u gornjem primjeru linearnog klasifikatora. Binarna matrica zabune sastoji se od kvadrata:

  • TP: True Positive: Predviฤ‘ene vrijednosti toฤno predviฤ‘ene kao stvarne pozitivne
  • FP: Predviฤ‘ene vrijednosti netoฤno su predvidjele stvarni pozitivan. tj. Negativne vrijednosti predviฤ‘ene kao pozitivne
  • FN: Laลพno negativno: Pozitivne vrijednosti predviฤ‘ene kao negativne
  • TN: Istinski negativan: Predviฤ‘ene vrijednosti toฤno predviฤ‘ene kao stvarni negativni

Iz matrice zabune lako je usporediti stvarnu klasu i predviฤ‘enu klasu.

Preciznost i osjetljivost

Matrica zabune pruลพa dobar uvid u pravu pozitivu i laลพno pozitivu. U nekim sluฤajevima, poลพeljno je imati saลพetiju metriku.

Preciznost

Metrika preciznosti pokazuje toฤnost pozitivne klase. Mjeri koliko je vjerojatno da je predviฤ‘anje pozitivne klase toฤno.

Preciznost

Maksimalna ocjena je 1 kada klasifikator savrลกeno klasificira sve pozitivne vrijednosti. Sama preciznost nije od velike pomoฤ‡i jer zanemaruje negativnu klasu. Metrika je obiฤno uparena s metrikom opoziva. Prisjeฤ‡anje se takoฤ‘er naziva osjetljivost ili prava pozitivna stopa.

Osjetljivost

Osjetljivost izraฤunava omjer pravilno detektiranih pozitivnih klasa. Ova metrika pokazuje koliko je model dobar za prepoznavanje pozitivne klase.

Osjetljivost

Linearni klasifikator s TensorFlowom

Za ovaj vodiฤ koristit ฤ‡emo skup podataka popisa stanovniลกtva. Svrha je koristiti varijable u skupu podataka popisa za predviฤ‘anje razine prihoda. Imajte na umu da je prihod binarna varijabla

  • s vrijednoลกฤ‡u 1 ako je prihod > 50k
  • 0 ako je prihod < 50k.

Ova varijabla je vaลกa oznaka

Ovaj skup podataka ukljuฤuje osam kategoriฤkih varijabli:

  • na radnom mjestu
  • obrazovanje
  • braฤni
  • okupacija
  • odnos
  • utrka
  • seks
  • rodna_zemlja

osim toga, ลกest kontinuiranih varijabli:

  • starost
  • fnlwgt
  • obrazovanje_br
  • kapitalni dobitak
  • gubitak_kapitala
  • sati_tjedan

Kroz ovaj primjer TensorFlow klasifikacije razumjet ฤ‡ete kako trenirati linearne TensorFlow klasifikatore s TensorFlow estimatorom i kako poboljลกati metriku toฤnosti.

Postupit ฤ‡emo na sljedeฤ‡i naฤin:

  • Korak 1) Uvezite podatke
  • Korak 2) Pretvorba podataka
  • Korak 3) Obuฤite klasifikatora
  • Korak 4) Poboljลกajte model
  • Korak 5) Hiperparametar: laso i greben

Korak 1) Uvezite podatke

Prvo uvozite biblioteke koriลกtene tijekom poduke.

import tensorflow as tf
import pandas as pd

Zatim uvozite podatke iz arhive UCI-ja i definirate nazive stupaca. Koristit ฤ‡ete COLUMNS za imenovanje stupaca u pandas podatkovnom okviru.

Imajte na umu da ฤ‡ete obuฤiti klasifikator koristeฤ‡i Pandas podatkovni okvir.

## Define path data
COLUMNS = ['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"

Podaci pohranjeni online veฤ‡ su podijeljeni izmeฤ‘u skupa vlakova i skupa za testiranje.

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)

Skup vlakova sadrลพi 32,561 16,281 opaลพanja, a testni skup XNUMX XNUMX

print(df_train.shape, df_test.shape)
print(df_train.dtypes)
(32561, 15) (16281, 15)
age                int64
workclass         object
fnlwgt             int64
education         object
education_num      int64
marital           object
occupation        object
relationship      object
race              object
sex               object
capital_gain       int64
capital_loss       int64
hours_week         int64
native_country    object
label             object
dtype: object

Tensorflow zahtijeva Booleovu vrijednost za obuku klasifikatora. Morate pretvoriti vrijednosti iz niza u cijeli broj. Oznaka se pohranjuje kao objekt, meฤ‘utim, trebate je pretvoriti u numeriฤku vrijednost. Kod u nastavku stvara rjeฤnik s vrijednostima za pretvaranje i prelazi preko stavke stupca. Imajte na umu da ovu operaciju izvodite dva puta, jednu za test vlaka, jednu za skup testova

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]

U podacima vlaka ima 24,720 prihoda niลพih od 50k i 7841 iznad. Omjer je gotovo isti za test set. Za viลกe pogledajte ovaj vodiฤ o aspektima.

print(df_train["label"].value_counts())
### The model will be correct in atleast 70% of the case
print(df_test["label"].value_counts())
## Unbalanced label
print(df_train.dtypes)
0    24720
1     7841
Name: label, dtype: int64
0    12435
1     3846
Name: label, dtype: int64
age                int64
workclass         object
fnlwgt             int64
education         object
education_num      int64
marital           object
occupation        object
relationship      object
race              object
sex               object
capital_gain       int64
capital_loss       int64
hours_week         int64
native_country    object
label              int64
dtype: object

Korak 2) Pretvorba podataka

Potrebno je nekoliko koraka prije nego ลกto uvjeลพbate linearni klasifikator s Tensorflowom. Morate pripremiti znaฤajke koje ฤ‡ete ukljuฤiti u model. U regresiji referentne vrijednosti koristit ฤ‡ete izvorne podatke bez primjene bilo kakve transformacije.

Procjenitelj mora imati popis znaฤajki za obuku modela. Stoga se podaci stupca moraju pretvoriti u tenzor.

Dobra praksa je definirati dva popisa znaฤajki na temelju njihove vrste i zatim ih proslijediti u feature_columns estimatora.

Poฤet ฤ‡ete pretvaranjem kontinuiranih znaฤajki, zatim definirati kantu s kategoriฤkim podacima.

Znaฤajke skupa podataka imaju dva formata:

  • Integer
  • Objekt

Svaka znaฤajka navedena je u sljedeฤ‡e dvije varijable prema njihovoj vrsti.

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

Feature_column opremljen je objektom numeric_column koji pomaลพe u transformaciji kontinuiranih varijabli u tenzor. U donjem kodu pretvarate sve varijable iz CONTI_FEATURES u tenzor s numeriฤkom vrijednoลกฤ‡u. Ovo je obavezno za konstruiranje modela. Sve nezavisne varijable treba pretvoriti u odgovarajuฤ‡i tip tenzora.

U nastavku piลกemo kod da biste vidjeli ลกto se dogaฤ‘a iza feature_column.numeric_column. Ispisat ฤ‡emo pretvorenu vrijednost za dob. To je u svrhu objaลกnjenja, stoga nema potrebe za razumijevanjem python koda. Moลพete pogledati sluลพbenu dokumentaciju da biste razumjeli kodove.

def print_transformation(feature = "age", continuous = True, size = 2): 
    #X = fc.numeric_column(feature)
    ## Create feature name
    feature_names = [
    feature]

    ## Create dict with the data
    d = dict(zip(feature_names, [df_train[feature]]))

    ## Convert age
    if 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 value
    input_layer = tf.feature_column.input_layer(
        features=d,
        feature_columns=feature_columns
        )
    ## Create lookup table
    zero = tf.constant(0, dtype=tf.float32)
    where = tf.not_equal(input_layer, zero)
    ## Return lookup tble
    indices = tf.where(where)
    values = tf.gather_nd(input_layer, indices)
    ## Initiate graph
    sess = tf.Session()
    ## Print value
    print(sess.run(input_layer))
print_transformation(feature = "age", continuous = True) 
[[39.]
 [50.]
 [38.]
 ...
 [58.]
 [22.]
 [52.]]

Vrijednosti su potpuno iste kao u df_train

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

Prema TensorFlow dokumentaciji, postoje razliฤiti naฤini pretvaranja kategoriฤkih podataka. Ako je popis rjeฤnika znaฤajke poznat i nema mnogo vrijednosti, moguฤ‡e je stvoriti kategoriฤki stupac s categorical_column_with_vocabulary_list. Dodijelit ฤ‡e ID svim jedinstvenim popisima vokabulara.

Na primjer, ako status varijable ima tri razliฤite vrijednosti:

  • Suprug
  • ลฝena
  • jedan

Tada ฤ‡e se pripisati tri ID-a. Na primjer, muลพ ฤ‡e imati ID 1, ลพena ID 2 i tako dalje.

U svrhu ilustracije, moลพete koristiti ovaj kod za pretvaranje varijable objekta u kategoriฤki stupac u TensorFlowu.

Obiljeลพje spola moลพe imati samo dvije vrijednosti: muลกko ili ลพensko. Kada ฤ‡emo pretvoriti znaฤajku spola, Tensorflow ฤ‡e stvoriti 2 nova stupca, jedan za muลกkarce i jedan za ลพene. Ako je spol jednak muลกkom, tada ฤ‡e novi stupac muลกki biti jednak 1, a ลพenski 0. Ovaj primjer prikazan je u donjoj tablici:

redaka seks nakon transformacije muลกki ลพena
1 muลกki => 1 0
2 muลกki => 1 0
3 ลพena => 0 1

U tenzorskom toku:

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

U nastavku smo dodali Python kod za ispis kodiranja. Opet, ne morate razumjeti kod, svrha je vidjeti transformaciju

Meฤ‘utim, brลพi naฤin transformacije podataka je koriลกtenje metode categorical_column_with_hash_bucket. Promjena varijabli niza u rijetkoj matrici bit ฤ‡e korisna. Rijetka matrica je matrica s veฤ‡inom nula. Metoda se brine za sve. Trebate samo navesti broj spremnika i kljuฤni stupac. Broj spremnika maksimalan je broj grupa koje Tensorflow moลพe stvoriti. Kljuฤni stupac jednostavno je naziv stupca koji treba pretvoriti.

U donjem kodu stvarate petlju preko svih kategoriฤkih znaฤajki.

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

Korak 3) Obuฤite klasifikator

TensorFlow trenutno pruลพa estimator za linearnu regresiju i linearnu klasifikaciju.

  • Linearna regresija: LinearRegressor
  • Linearna klasifikacija: LinearClassifier

Sintaksa linearnog klasifikatora je ista kao u vodiฤu o Linearna regresija osim jednog argumenta, n_class. Morate definirati stupac znaฤajki, direktorij modela i usporediti s linearnim regresorom; morate definirati broj klase. Za logit regresiju, broj klase je jednak 2.

Model ฤ‡e izraฤunati teลพine stupaca sadrลพanih u continuous_features i categorical_features.

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

Izlaz

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': 
<tensorflow.python.training.server_lib.ClusterSpec object at 0x181f24c898>, '_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}

Sada kada je klasifikator definiran, moลพete kreirati funkciju unosa. Metoda je ista kao u vodiฤu za linearni regresor. Ovdje koristite veliฤinu serije od 128 i mijeลกate podatke.

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)

Kreirate funkciju s argumentima koje zahtijeva linearni procjenitelj, tj. broj epoha, broj serija i mijeลกate skup podataka ili biljeลกku. Buduฤ‡i da koristite pande metodu za prosljeฤ‘ivanje podataka u model, trebate definirati X varijable kao pandas podatkovni okvir. Imajte na umu da prelazite preko svih podataka pohranjenih u FEATURES.

Uvjeลพbajmo model s objektnim modelom.vjeลพbati. Prethodno definiranu funkciju koristite za unos odgovarajuฤ‡ih vrijednosti u model. Imajte na umu da ste postavili veliฤinu serije na 128, a broj epoha na Niลกta. Model ฤ‡e se trenirati preko tisuฤ‡u koraka.

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 = 1
INFO:tensorflow:global_step/sec: 65.8282
INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)
INFO:tensorflow:global_step/sec: 118.386
INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)
INFO:tensorflow:global_step/sec: 110.542
INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)
INFO:tensorflow:global_step/sec: 199.03
INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)
INFO:tensorflow:global_step/sec: 167.488
INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)
INFO:tensorflow:global_step/sec: 220.155
INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)
INFO:tensorflow:global_step/sec: 199.016
INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)
INFO:tensorflow:global_step/sec: 197.531
INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)
INFO:tensorflow:global_step/sec: 208.479
INFO: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.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181f223630>

Imajte na umu da se gubitak naknadno smanjio tijekom zadnjih 100 koraka, tj. s 901 na 1000.

Konaฤni gubitak nakon tisuฤ‡u iteracija je 5444. Moลพete procijeniti svoj model na testnom setu i vidjeti performanse. Da biste procijenili izvedbu svog modela, morate koristiti objektnu ocjenu. Model napunite testnim skupom i postavite broj epoha na 1, tj. podaci ฤ‡e iฤ‡i u model samo jednom.

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:22
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000
INFO: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:23
INFO: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 vraฤ‡a sve metrike koje ste nauฤili u teoretskom dijelu. Bez iznenaฤ‘enja, toฤnost je velika zbog neuravnoteลพene oznake. Zapravo, model ima malo bolju izvedbu od nasumiฤne pretpostavke. Zamislite da model predviฤ‘a sva kuฤ‡anstva s prihodom niลพim od 50 tisuฤ‡a, tada model ima toฤnost od 70 posto. Pri bliลพoj analizi, moลพete vidjeti da su predviฤ‘anje i prisjeฤ‡anje priliฤno niski.

Korak 4) Poboljลกajte model

Sada kada imate benchmark model, moลพete ga pokuลกati poboljลกati, odnosno poveฤ‡ati toฤnost. U prethodnom vodiฤu nauฤili ste kako poboljลกati snagu predviฤ‘anja pomoฤ‡u pojma interakcije. U ovom ฤ‡ete vodiฤu ponovno razmotriti ovu ideju dodavanjem polinomskog ฤlana regresiji.

Polinomska regresija je korisna kada postoji nelinearnost podataka. Postoje dva naฤina za biljeลพenje nelinearnosti u podacima.

  • Dodajte polinomski ฤlan
  • Kontinuiranu varijablu pretvorite u kategoriฤku varijablu

Polinomski ฤlan

Na donjoj slici moลพete vidjeti ลกto je polinomska regresija. To je jednadลพba s X varijablama razliฤite snage. Polinomska regresija drugog stupnja ima dvije varijable, X i X na kvadrat. Treฤ‡i stupanj ima tri varijable, X, X2, i X3

Polinomska regresija
ล to je polinomska regresija

U nastavku smo konstruirali graf s dvije varijable, X i Y. Oฤito je da odnos nije linearan. Ako dodamo linearnu regresiju, moลพemo vidjeti da model ne moลพe uhvatiti uzorak (lijeva slika).

Sada, pogledajte lijevu sliku sa slike ispod, dodali smo pet ฤlanova regresiji (to je y=x+x2+x3+x4+x5. Model sada puno bolje biljeลพi uzorak. Ovo je moฤ‡ polinomske regresije.

Polinomska regresija

Vratimo se naลกem primjeru. Dob nije u linearnoj vezi s prihodom. Rana dob moลพe imati stalan prihod blizu nule jer djeca ili mladi ljudi ne rade. Zatim se poveฤ‡ava u radnoj dobi i smanjuje tijekom umirovljenja. Obiฤno je oblika obrnutog slova U. Jedan od naฤina da se uhvati ovaj uzorak je dodavanje snage dva regresiji.

Da vidimo hoฤ‡e li to poveฤ‡ati toฤnost.

Morate dodati ovu novu znaฤajku u skup podataka i na popis kontinuiranih znaฤajki.

Novu varijablu dodajete u skup podataka treniranja i testiranja, tako da je prikladnije napisati funkciju.

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

Funkcija ima 3 argumenta:

  • df_t: definirajte skup za obuku
  • df_te: definirajte ispitni skup
  • var_name = 'age': Definirajte varijablu za transformaciju

Moลพete koristiti objekt pow(2) za kvadriranje varijable starosti. Imajte na umu da je nova varijabla nazvana 'novo'

Sada kada je funkcija square_var napisana, moลพete stvoriti nove skupove podataka.

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

Kao ลกto vidite, novi skup podataka ima joลก jednu znaฤajku.

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

Kvadratna varijabla naziva se new u skupu podataka. Morate ga dodati na popis kontinuiranih znaฤajki.

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]

biljeลกke da ste promijenili direktorij Grafa. Ne moลพete trenirati razliฤite modele u istom direktoriju. To znaฤi da trebate promijeniti putanju argumenta model_dir. Ako to ne uฤinite, TensorFlow ฤ‡e izbaciti pogreลกku.

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': 
<tensorflow.python.training.server_lib.ClusterSpec object at 0x1820f04b70>, '_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)

Sada kada je klasifikator dizajniran s novim skupom podataka, moลพete trenirati i procijeniti 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 = 1
INFO:tensorflow:global_step/sec: 81.487
INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)
INFO:tensorflow:global_step/sec: 111.169
INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)
INFO:tensorflow:global_step/sec: 128.91
INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)
INFO:tensorflow:global_step/sec: 132.546
INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)
INFO:tensorflow:global_step/sec: 162.194
INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)
INFO:tensorflow:global_step/sec: 204.852
INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)
INFO:tensorflow:global_step/sec: 188.923
INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)
INFO:tensorflow:global_step/sec: 192.041
INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)
INFO:tensorflow:global_step/sec: 197.025
INFO: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.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1820f04c88>
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:37
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000
INFO: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:39
INFO: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}

Kvadratna varijabla poboljลกala je toฤnost s 0.76 na 0.79. Da vidimo moลพete li uspjeti bolje kombiniranjem izraza bucketization i interakcije.

Bucketizacija i interakcija

Kao ลกto ste vidjeli prije, linearni klasifikator ne moลพe ispravno uhvatiti obrazac dobi i prihoda. To je zato ลกto uฤi jednu teลพinu za svaku znaฤajku. Kako biste klasifikatoru olakลกali posao, jednu stvar koju moลพete uฤiniti je izdvojiti znaฤajku. Bucketing transformira numeriฤku znaฤajku u nekoliko odreฤ‘enih na temelju raspona u koji spada, a svaka od tih novih znaฤajki pokazuje spada li dob osobe u taj raspon.

S ovim novim znaฤajkama, linearni model moลพe uhvatiti odnos uฤenjem razliฤitih teลพina za svaku kantu.

U TensorFlowu se to radi s bucketized_column. Morate dodati raspon vrijednosti u granice.

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

Veฤ‡ znate da dob nije linearna s prihodom. Drugi naฤin poboljลกanja modela je interakcija. Rijeฤju TensorFlowa, to je kriลพanje znaฤajki. Kriลพanje znaฤajki naฤin je stvaranja novih znaฤajki koje su kombinacije postojeฤ‡ih, ลกto moลพe biti od pomoฤ‡i za linearni klasifikator koji ne moลพe modelirati interakcije izmeฤ‘u znaฤajki.

Dob moลพete raลกฤlaniti pomoฤ‡u druge znaฤajke kao ลกto je obrazovanje. Odnosno, neke ฤ‡e skupine vjerojatno imati visoke prihode, a druge niske (razmislite o doktoratu).

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

Da biste stvorili kriลพni stupac znaฤajki, koristite crossed_column s varijablama za kriลพanje u zagradi. Hash_bucket_size oznaฤava maksimalne moguฤ‡nosti kriลพanja. Za stvaranje interakcije izmeฤ‘u varijabli (barem jedna varijabla mora biti kategoriฤka), moลพete koristiti tf.feature_column.crossed_column. Da biste koristili ovaj objekt, morate u uglate zagrade dodati varijablu za interakciju i drugi argument, veliฤinu spremnika. Veliฤina spremnika je najveฤ‡i moguฤ‡i broj grupa unutar varijable. Ovdje ga postavljate na 1000 jer ne znate toฤan broj grupa

age_buckets potrebno je kvadrirati prije dodavanja u stupce znaฤajki. Takoฤ‘er dodajete nove znaฤajke u stupce znaฤajki i pripremate procjenitelj

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)

Izlaz

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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1823021be0>, '_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)

Spremni ste procijeniti novi model i vidjeti hoฤ‡e li poboljลกati toฤnost.

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 = 1
INFO:tensorflow:global_step/sec: 94.969
INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)
INFO:tensorflow:global_step/sec: 242.342
INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)
INFO:tensorflow:global_step/sec: 213.686
INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)
INFO:tensorflow:global_step/sec: 174.084
INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)
INFO:tensorflow:global_step/sec: 191.78
INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)
INFO:tensorflow:global_step/sec: 163.436
INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)
INFO:tensorflow:global_step/sec: 164.347
INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)
INFO:tensorflow:global_step/sec: 154.274
INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)
INFO:tensorflow:global_step/sec: 189.14
INFO: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.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1823021cf8>
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:52
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000
INFO: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:54
INFO: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}

Nova razina toฤnosti je 83.58 posto. To je ฤetiri posto viลกe od prethodnog modela.

Na kraju, moลพete dodati termin za reguliranje kako biste sprijeฤili prekomjerno opremanje.

Korak 5) Hiperparametar: laso i greben

Vaลก model moลพe patiti od prekomjerno opremanje or nedovoljna opremljenost.

  • Prekomjerno opremanje: model ne moลพe generalizirati predviฤ‘anje na nove podatke
  • Nedovoljno prilagoฤ‘avanje: model ne moลพe uhvatiti uzorak podataka. tj. linearna regresija kada su podaci nelinearni

Kada model ima puno parametara i relativno malu koliฤinu podataka, to dovodi do loลกih predviฤ‘anja. Zamislite, jedna grupa ima samo tri zapaลพanja; model ฤ‡e izraฤunati teลพinu za ovu grupu. Teลพina se koristi za predviฤ‘anje; ako se opaลพanja testnog skupa za ovu posebnu skupinu potpuno razlikuju od skupa za treniranje, tada ฤ‡e model napraviti krivo predviฤ‘anje. Tijekom evaluacije sa skupom za vjeลพbanje, toฤnost je dobra, ali nije dobra s testnim skupom jer izraฤunate teลพine nisu prave za generalizaciju uzorka. U ovom sluฤaju ne donosi razumno predviฤ‘anje na temelju nevidljivih podataka.

Kako biste sprijeฤili prekomjerno prilagoฤ‘avanje, regularizacija vam daje moguฤ‡nosti kontrole takve sloลพenosti i da je uฤinite generaliziranijom. Postoje dvije tehnike regulacije:

  • L1: Laso
  • L2: Greben

U TensorFlowu moลพete dodati ova dva hiperparametra u optimizator. Na primjer, ลกto je viลกi hiperparametar L2, teลพina ima tendenciju da bude vrlo niska i blizu nule. Uklopljena linija bit ฤ‡e vrlo ravna, dok L2 blizu nule implicira da su ponderi blizu regularne linearne regresije.

Moลพete sami isprobati razliฤite vrijednosti hiperparametara i vidjeti moลพete li poveฤ‡ati razinu toฤnosti.

biljeลกke da ako promijenite hiperparametar, trebate izbrisati mapu ongoing/train4 inaฤe ฤ‡e model zapoฤeti s prethodno obuฤenim modelom.

Pogledajmo kakva je toฤnost s hypeom

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

IZLAZ

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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1820d9c128>, '_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)

IZLAZ

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 = 1
INFO:tensorflow:global_step/sec: 77.4165
INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)
INFO:tensorflow:global_step/sec: 187.889
INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)
INFO:tensorflow:global_step/sec: 201.895
INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)
INFO:tensorflow:global_step/sec: 217.992
INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)
INFO:tensorflow:global_step/sec: 193.676
INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)
INFO:tensorflow:global_step/sec: 202.195
INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)
INFO:tensorflow:global_step/sec: 216.756
INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)
INFO:tensorflow:global_step/sec: 240.215
INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)
INFO:tensorflow:global_step/sec: 220.336
INFO: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.


<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181ff39e48>
model_regu.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

Izlaz

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:07
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000
INFO: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:09
INFO: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}

Ovim hiperparametrom malo poveฤ‡avate metriku toฤnosti. U sljedeฤ‡em vodiฤu nauฤit ฤ‡ete kako poboljลกati linearni klasifikator pomoฤ‡u kernel metode.

Rezime

Da biste obuฤili model, trebate:

  • Definirajte znaฤajke: Neovisne varijable: X
  • Definirajte oznaku: Zavisna varijabla: y
  • Konstruirajte vlak/set za testiranje
  • Definirajte poฤetnu teลพinu
  • Definirajte funkciju gubitka: MSE
  • Optimizirajte model: Gradijent spuลกtanja
  • Definirati:
    • Stopa uฤenja
    • Broj epohe
    • Veliฤina serije
    • Broj razreda

U ovom vodiฤu ste nauฤili kako koristiti API visoke razine za klasifikator linearne regresije. Trebate definirati:

  1. Stupci znaฤajki. Ako je kontinuirano: tf.feature_column.numeric_column(). Popis moลพete popuniti razumijevanjem popisa u pythonu
  2. Procjenitelj: tf.estimator.LinearClassifier(feature_columns, model_dir, n_classes = 2)
  3. Funkcija za uvoz podataka, veliฤine serije i epohe: input_fn()

Nakon toga, spremni ste za obuku, procjenu i predviฤ‘anje pomoฤ‡u train(), evaluate() i predict()

Da biste poboljลกali performanse modela, moลพete:

  • Koristite polinomsku regresiju
  • Pojam interakcije: tf.feature_column.crossed_column
  • Dodajte parametar regularizacije

Saลพmite ovu objavu uz: