Binarna klasifikacija u TensorFlowu: Primjer linearnog klasifikatora

Sadržaj:

Anonim

Dva najčešća zadatka učenja pod nadzorom su linearna regresija i linearni klasifikator. Linearna regresija predviđa vrijednost dok linearni klasifikator predviđa klasu. Ovaj je vodič usredotočen na Linearni klasifikator.

Što je linearni klasifikator?

Linearna klasificiranja u strojno učenje je metoda za pronalaženje objekta klase na temelju svojih karakteristika za statističke klasifikacije. Odluku o klasifikaciji donosi na temelju vrijednosti linearne kombinacije karakteristika predmeta. Linearni klasifikator koristi se u praktičnim problemima poput klasifikacije dokumenata i problemima koji imaju mnogo varijabli.

Problemi s klasifikacijom predstavljaju otprilike 80 posto zadatka strojnog učenja. Cilj klasifikacije je predvidjeti vjerojatnost svake klase s obzirom na skup ulaznih podataka. 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. Višerazredni klasifikator bavi se oznakama s više od dvije klase.

Na primjer, tipični problem binarne klasifikacije je predvidjeti vjerojatnost da kupac izvrši drugu kupnju. Predvidjeti vrstu životinje prikazane na slici predstavlja višerazredni problem klasifikacije jer postoje više od dvije vrste životinja.

Teorijski dio ovog vodiča stavlja primarni fokus na binarnu klasu. O funkciji višeklasnog izlaza naučit ćete u budućem vodiču.

U ovom ćete tutorijalu naučiti

  • Što je linearni klasifikator?
  • Kako funkcionira binarni klasifikator?
  • Kako izmjeriti izvedbu linearnog klasifikatora?
  • Točnost
  • Matrica zbrke
  • Preciznost i osjetljivost
  • Linearni klasifikator s TensorFlowom
  • Korak 1) Uvezite podatke
  • Korak 2) Pretvorba podataka
  • Korak 3) Obučite klasifikator
  • Korak 4) Poboljšajte model
  • Korak 5) Hiperparametar: Lasso & Ridge

Kako funkcionira binarni klasifikator?

U prethodnom vodiču naučili ste da se funkcija sastoji od dvije vrste varijabli, ovisne varijable i skupa značajki (neovisne varijable). U linearnoj regresiji ovisna varijabla je stvarni broj bez raspona. Primarni je cilj predvidjeti njegovu vrijednost minimiziranjem srednje kvadratne pogreške.

Za binarni klasifikator TensorFlow oznaka je mogla imati dvije moguće cijele vrijednosti. U većini slučajeva to je ili [0,1] ili [1,2]. Primjerice, cilj je predvidjeti hoće li kupac kupiti proizvod ili ne. Oznaka je definirana kako slijedi:

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

Model koristi značajke X za klasificiranje svakog kupca u najizgledniju klasu kojoj pripada, naime potencijalni kupac ili ne.

Vjerojatnost uspjeha izračunava se logističkom regresijom . Algoritam će izračunati vjerojatnost na temelju značajke X i predviđa uspjeh kada je ta vjerojatnost veća od 50 posto. Formalnije, vjerojatnost se izračunava kako je prikazano u donjem primjeru binarne klasifikacije TensorFlow:

gdje je 0 skup težina, značajki i b pristranost.

Funkcija se može rastaviti na dva dijela:

  • Linearni model
  • Logistička funkcija

Linearni model

Već ste upoznati s načinom izračunavanja pondera. Ponderi se izračunavaju pomoću točkanog proizvoda: Y je linearna funkcija svih svojstava x i . Ako model nema značajke, predviđanje je jednako pristranosti, b.

Ponderi pokazuju smjer korelacije između značajki x i i oznake y. Pozitivna korelacija povećava vjerojatnost pozitivne klase, dok negativna korelacija dovodi vjerojatnost bliže 0, (tj. Negativna klasa).

Linearni model vraća samo stvarni broj, koji nije u skladu s mjerom vjerojatnosti opsega [0,1]. Logistička funkcija potrebna je za pretvaranje linearnog modela u vjerojatnost,

Logistička funkcija

Logistička funkcija ili sigmoidna funkcija ima oblik slova S i izlaz ove funkcije uvijek je između 0 i 1.

Primjer logističke funkcije

Lako je nadomjestiti izlaz linearne regresije u sigmoidnu funkciju. Rezultat je novi broj s vjerojatnošću između 0 i 1.

Klasifikator vjerojatnost može pretvoriti u klasu

  • Vrijednosti od 0 do 0,49 postaju klasa 0
  • Vrijednosti između 0,5 i 1 postaju razred 1

Kako izmjeriti izvedbu linearnog klasifikatora?

Točnost

Ukupna izvedba klasifikatora mjeri se metrikom točnosti. Točnost prikuplja sve ispravne 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.

Izmjerite performanse Linearnog klasifikatora pomoću metrike točnosti

Ovom metrikom možete primijetiti nedostatak, posebno za klasu neravnoteže. Skup podataka o neravnoteži događa se kada broj opažanja po grupi 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 umre. Možete osposobiti klasifikator za predviđanje broja smrtnih slučajeva i upotrijebiti metriku točnosti za procjenu izvedbi. Ako klasifikator predviđa 0 smrtnih slučajeva za cijeli skup podataka, to će biti točno u 95 posto slučajeva.

Matrica zbrke

Bolji način za procjenu izvedbe klasifikatora je promatranje matrice zbrke.

Izmjerite performanse Linearnog klasifikatora pomoću zbunjujuće matrice

Matrica zbrke vizualizira točnost klasifikatora uspoređujući stvarne i predviđene klase kao što je prikazano u gornjem primjeru Linearnog klasifikatora. Matrica binarne zbrke sastoji se od kvadrata:

  • TP: Istinito pozitivno: Predviđene vrijednosti točno su predviđene kao stvarne pozitivne
  • FP: Predviđene vrijednosti pogrešno su predvidjele stvarnu pozitivu. tj. negativne vrijednosti predviđene kao pozitivne
  • FN: Lažno negativno: Pozitivne vrijednosti predviđaju se kao negativne
  • TN: Tačno negativno: Predviđene vrijednosti točno su predviđene kao stvarne negativne

Iz matrice zbrke lako je usporediti stvarnu klasu i predviđenu klasu.

Preciznost i osjetljivost

Matrica zbrke pruža dobar uvid u istinsku pozitivnu i lažno pozitivnu. U nekim je slučajevima poželjno imati sažetiju metriku.

Preciznost

Mjerna vrijednost preciznosti pokazuje točnost pozitivne klase. Mjeri se vjerojatnost točnog predviđanja pozitivne klase.

Maksimalni rezultat je 1 kada klasifikator savršeno klasificira sve pozitivne vrijednosti. Sama preciznost nije od velike pomoći jer ignorira negativnu klasu. Metrika je obično uparena s metrikom opoziva. Prisjećanje se naziva i osjetljivost ili istinska pozitivna stopa.

Osjetljivost

Osjetljivost izračunava omjer ispravno otkrivenih pozitivnih klasa. Ova metrika pokazuje koliko je dobar model prepoznavanje pozitivne klase.

Linearni klasifikator s TensorFlowom

Za ovu lekciju koristit ćemo popis podataka. Svrha je koristiti varijable u popisnom skupu podataka za predviđanje razine dohotka. Imajte na umu da je prihod binarna varijabla

  • s vrijednošću 1 ako je prihod> 50k
  • 0 ako je prihod <50k.

Ova je varijabla vaša oznaka

Ovaj skup podataka uključuje osam kategorijskih varijabli:

  • radno mjesto
  • obrazovanje
  • bračni
  • okupacija
  • odnos
  • utrka
  • seks
  • zavičajna_zemlja

štoviše, šest kontinuiranih varijabli:

  • dob
  • fnlwgt
  • broj_obrazovanja
  • kapitalni dobitak
  • gubitak_kapitala
  • sati_tjedan

Kroz ovaj primjer klasifikacije TensorFlow, razumjet ćete kako trenirati linearne klasifikatore TensorFlow s procjeniteljem TensorFlow i kako poboljšati metriku točnosti.

Nastavit ćemo kako slijedi:

  • Korak 1) Uvezite podatke
  • Korak 2) Pretvorba podataka
  • Korak 3) Obučite klasifikator
  • Korak 4) Poboljšajte model
  • Korak 5) Hiperparametar: Lasso & Ridge

Korak 1) Uvezite podatke

Prvo uvezite knjižnice korištene tijekom vodiča.

import tensorflow as tfimport pandas as pd 

Dalje uvozite podatke iz arhive UCI-a i definirate imena stupaca. STOLPCIMA ćete koristiti za imenovanje stupaca u okviru podataka pande.

Imajte na umu da ćete klasifikator obučavati pomoću Pandasovog okvira podataka.

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

Podaci pohranjeni na mreži već su podijeljeni između vlakova i ispitnog kompleta.

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)

Komplet vlakova sadrži 32.561 promatranje, a testni sklop 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 zahtijeva logičku vrijednost za obuku klasifikatora. Vrijednosti morate prebaciti iz niza u cijeli broj. Oznaka se pohranjuje kao objekt, međutim, trebate je pretvoriti u numeričku vrijednost. Kôd u nastavku stvara rječnik s vrijednostima koje treba pretvoriti i prebaciti preko stavke stupca. Imajte na umu da ovu operaciju izvodite dva puta, jednu za test vlaka, jednu za testni set

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 o vlakovima postoji 24.720 prihoda nižih od 50 tisuća i 7841 iznad. Omjer je gotovo jednak za test set. Za više informacija pogledajte ovaj vodič na Facesetu.

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

Korak 2) Pretvorba podataka

Potrebno je nekoliko koraka prije nego što trenirate linearni klasifikator s Tensorflowom. Morate pripremiti značajke koje ćete uključiti u model. U referentnoj regresiji koristit ćete izvorne podatke bez primjene bilo kakve transformacije.

Procjenitelj mora imati popis značajki za osposobljavanje modela. Stoga se podaci stupca trebaju pretvoriti u tenzor.

Dobra je praksa definirati dva popisa značajki na temelju njihove vrste i zatim ih proslijediti u stupce_ značajke procjenitelja.

Počet ćete s pretvaranjem kontinuiranih značajki, a zatim definirajte skup s kategorijskim podacima.

Značajke skupa podataka imaju dva formata:

  • Cijeli broj
  • Objekt

Svaka je značajka navedena u sljedeće dvije varijable prema njihovim vrstama.

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

Stupac_značajke opremljen je numeričkim_stupacom objekta koji pomaže u transformaciji kontinuiranih varijabli u tenzor. U donjem kodu pretvorite sve varijable iz CONTI_FEATURES u tenzor s numeričkom vrijednošću. To je obvezno za konstrukciju modela. Sve neovisne varijable potrebno je pretvoriti u odgovarajući tip tenzora.

Ispod napišemo kod koji će vam omogućiti da vidite što se događa iza feature_column.numeric_column. Ispisat ćemo pretvorenu vrijednost za dob. Radi objašnjenja, stoga nema potrebe za razumijevanjem python koda. Za razumijevanje kodova možete se obratiti službenoj dokumentaciji.

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

Vrijednosti su potpuno iste kao u df_train

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

Prema dokumentaciji TensorFlow-a, postoje različiti načini pretvaranja kategorijskih podataka. Ako je popis rječnika neke značajke poznat i nema puno vrijednosti, moguće je stvoriti kategorički stupac s categorical_column_with_vocabulary_list. Svim jedinstvenim rječničkim rječnicima dodijelit će ID.

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

  • Suprug
  • Žena
  • Singl

Tada će se dodijeliti tri ID-a. Na primjer, muž će imati ID 1, supruga ID 2 i tako dalje.

U svrhu ilustracije, ovaj kod možete koristiti za pretvorbu varijable objekta u kategorički stupac u TensorFlowu.

Značajni spol može imati samo dvije vrijednosti: mušku ili žensku. Kada pretvorimo značajni spol, Tensorflow će stvoriti 2 nova stupca, jedan za muške i jedan za ženske. Ako je spol jednak muškom, tada će novi stupac muški biti jednak 1, a ženski 0. Ovaj je primjer prikazan u donjoj tablici:

redaka

seks

nakon preobrazbe

muški

žena

1

muški

=>

1

0

2

muški

=>

1

0

3

žena

=>

0

1

U tenzoru:

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

Ispod smo dodali Python kôd za ispis kodiranja. Opet, ne trebate razumjeti kôd, svrha je vidjeti transformaciju

Međutim, brži način transformacije podataka je upotreba metode categorical_column_with_hash_bucket. Izmjena string varijabli u rijetkoj matrici bit će korisna. Prorjeđena matrica je matrica s uglavnom nulom. Metoda brine o svemu. Trebate samo navesti broj segmenata i stupac ključa. Broj segmenata je maksimalni iznos grupa koje Tensorflow može stvoriti. Ključni stupac jednostavno je naziv stupca koji se pretvara.

U donjem kodu kreirate petlju nad svim kategorijskim značajkama.

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 nudi procjenitelj linearne regresije i linearne klasifikacije.

  • Linearna regresija: LinearRegressor
  • Linearna klasifikacija: LinearClassifier

Sintaksa linearnog klasifikatora ista je kao u vodiču o linearnoj regresiji, osim jednog argumenta, n_class. Morate definirati stupac značajke, direktorij modela i usporediti s linearnim regresorom; morate definirati broj predavanja. Za logit regresiju, broj klase je jednak 2.

Model će izračunati težine stupaca sadržanih u kontinuiranim_karakteristikama i kategoričkim_karakteristikama.

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':, '_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 stvoriti ulaznu funkciju. Metoda je ista kao u vodiču linearnog regresora. Ovdje koristite skupnu veličinu 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)

Stvorite funkciju s argumentima potrebnim za linearni procjenjivač, tj. Brojem epoha, brojem serija i promiješajte skup podataka ili bilješku. Budući da koristite metodu Pandas za prosljeđivanje podataka u model, morate definirati X varijable kao okvir podataka pande. Imajte na umu da prelazite preko svih podataka pohranjenih u ZNAČAJKE.

Obučimo model s objektnim modelom.train. Koristite prethodno definiranu funkciju za napajanje modela odgovarajućim vrijednostima. Imajte na umu da ste veličinu serije postavili na 128, a broj epoha na None. Model će biti obučen u više od 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 = 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.

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

Konačni gubitak nakon tisuću ponavljanja je 5444. Svoj model možete procijeniti na testnom setu i vidjeti izvedbu. Da biste procijenili izvedbu svog modela, trebate koristiti objektnu procjenu. Model nahranite testnim skupom i postavite broj epoha na 1, tj. Podaci će u model ići 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: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 vraća sve mjerne podatke koje ste naučili u teoretskom dijelu. Bez iznenađenja, točnost je velika zbog neuravnotežene naljepnice. Zapravo, model ima nešto bolje rezultate od slučajnih nagađanja. Zamislite da model predviđa sva kućanstva s prihodom manjim od 50 000, a tada model ima točnost od 70 posto. Pomnijom analizom možete vidjeti da su predviđanja i opoziv prilično niski.

Korak 4) Poboljšajte model

Sad kad imate referentni model, možete ga pokušati poboljšati, odnosno povećati točnost. U prethodnom uputstvu naučili ste kako poboljšati moć predviđanja pomoću termina interakcije. U ovom vodiču ponovno ćete posjetiti ovu ideju dodavanjem polinomskog pojma u regresiju.

Polinomska regresija je ključna kada u podacima postoji nelinearnost. Postoje dva načina za bilježenje nelinearnosti podataka.

  • Dodajte polinomni pojam
  • Uključi kontinuiranu varijablu u kategoričku varijablu

Polinomni pojam

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, X 2 i X 3

Što je polinomska regresija

Ispod 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 nije u stanju uhvatiti uzorak (lijeva slika).

Sada, pogledajte lijevu sliku sa donje slike, regresiji smo dodali pet članova (to je y = x + x 2 + x 3 + x 4 + x 5. Model sada bilježi puno bolji uzorak. Ovo je snaga polinomske regresije.

Vratimo se našem primjeru. Dob nije u linearnoj vezi s prihodom. Rana dob može imati paušalni dohodak blizu nule jer djeca ili mladi ne rade. Tada se povećava radna dob, a smanjuje tijekom umirovljenja. To je tipično obrnuto-U oblik. Jedan od načina da se uhvati ovaj obrazac je dodavanje potencije dvije regresiji.

Da vidimo hoće li povećati točnost.

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

Dodajte novu varijablu u skup podataka o vlaku i testiranju, pa 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 set treninga
  • df_te: definirajte testni skup
  • var_name = 'dob': definirajte varijablu koju želite transformirati

Možete upotrijebiti objekt pow (2) za kvadratno promjenjivu dob. Imajte na umu da je nova varijabla nazvana 'nova'

Sada kada je napisana funkcija square_var, 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 novom 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]

Imajte na umu da ste promijenili direktorij Grafikona. Ne možete trenirati različite modele u istom direktoriju. Znači, trebate promijeniti put 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':, '_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 = 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}

Kvadratna varijabla poboljšala je točnost s 0,76 na 0,79. Da vidimo možemo li bolje kombinirati pojam buketizacije i interakcije.

Buketizacija i interakcija

Kao što ste već vidjeli, linearni klasifikator nije u mogućnosti ispravno uhvatiti obrazac dobnog dohotka. To je zato što nauči jednu težinu za svaku značajku. Da biste klasifikatoru olakšali, jedna stvar koju možete učiniti je značajka u skupinama. Skupljanje pretvara numeričku značajku u nekoliko određenih na temelju raspona u koji spada, a svaka od tih novih značajki ukazuje na to spada li dob osobe u taj raspon.

S ovim novim značajkama linearni model može zabilježiti odnos učenjem različitih težina za svaku kantu.

U TensorFlow-u to se 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 je dob nelinearna s prihodom. Drugi način za poboljšanje modela je interakcija. Riječju TensorFlow-a to je prelazak značajki. Ukrštanje značajki način je za stvaranje novih značajki koje su kombinacije postojećih, što može biti korisno za linearni klasifikator koji ne može modelirati interakcije između značajki.

Možete podijeliti dob pomoću druge značajke poput obrazovanja. Odnosno, neke će skupine vjerojatno imati visok prihod, a druge niske (Razmislite o doktorandu).

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 poprečni stupac značajke, koristite ukršteni stupac s varijablama za ukrštanje u zagradu. Hash_bucket_size označava maksimalne mogućnosti prijelaza. Da biste stvorili interakciju između varijabli (barem jedna varijabla mora biti kategorična), možete koristiti tf.feature_column.crossed_column. Da biste koristili ovaj objekt, trebate dodati u kvadratnu zagradu varijablu za interakciju i drugi argument, veličinu segmenta. Veličina segmenta najveći je mogući broj grupa unutar varijable. Ovdje ga postavite na 1000 jer ne znate točan broj grupa

age_buckets prije kvadrata treba ga dodati u stupac značajke. Također dodate nove značajke u stupce značajki i pripremite 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': , '_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 poboljšava li 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 = 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}

Nova razina točnosti iznosi 83,58 posto. Četiri je posto veći od prethodnog modela.

Konačno, možete dodati termin za regularizaciju kako biste spriječili prekomjerno opremanje.

Korak 5) Hiperparametar: Lasso & Ridge

Vaš model može patiti od prekomjerne ili manje opreme .

  • Prekomjerno prilagođavanje: model nije u stanju generalizirati predviđanje na nove podatke
  • Underfitting: Model nije u stanju 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 skupina ima samo tri opažanja; model će izračunati ponder za ovu skupinu. Uteg se koristi za predviđanje; ako se promatranje testnog skupa za ovu određenu skupinu u potpunosti razlikuje od skupa treninga, tada će model dati pogrešno predviđanje. Tijekom ocjenjivanja s trening setom, točnost je dobra, ali nije dobra s test setom, jer izračunati ponderi nisu istiniti za generaliziranje uzorka. U ovom slučaju ne daje razumno predviđanje nevidljivih podataka.

Kako bi se spriječilo prekomjerno prilagođavanje, regularizacija vam daje mogućnosti da kontrolirate takvu složenost i učinite je uopćenijom. Postoje dvije tehnike regularizacije:

  • L1: Laso
  • L2: Ridge

U TensorFlow možete dodati ova dva hiperparametara u optimizator. Primjerice, što je hiperparametar L2 veći, težina je vrlo mala i blizu nule. Ugrađena linija bit će vrlo ravna, dok L2 blizu nule podrazumijeva da su ponderi blizu redovite linearne regresije.

Možete sami isprobati različitu vrijednost hiperparametara i provjeriti možete li povećati razinu točnosti.

Imajte na umu da ako promijenite hiperparametar, morate izbrisati mapu current / train4, inače će model započeti s prethodno obučenim modelom.

Da vidimo kako 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))

IZVAN

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)

IZVAN

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)

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

Ovim hiperparametrom malo povećavate mjerne podatke točnosti. U sljedećem uputstvu naučit ćete kako poboljšati linearni klasifikator pomoću metode jezgre.

Sažetak

Da biste trenirali model, morate:

  • Definirajte značajke: Nezavisne varijable: X
  • Definirajte oznaku: Ovisna varijabla: y
  • Napravite vlak / ispitni sklop
  • Definirajte početnu težinu
  • Definirajte funkciju gubitka: MSE
  • Optimizirajte model: Gradijentni spust
  • Definirati:
    • Stopa učenja
    • Broj epohe
    • Veličina serije
    • Broj razreda

U ovom vodiču naučili ste kako koristiti API visoke razine za klasifikator linearne regresije. Morate definirati:

  1. Stupci s značajkama. Ako je kontinuirano: tf.feature_column.numeric_column (). Popis možete popuniti razumijevanjem popisa python
  2. Procjenitelj: tf.estimator.LinearClassifier (značajka_stupaci, model_dir, n_classes = 2)
  3. Funkcija za uvoz podataka, veličine serije i epohe: input_fn ()

Nakon toga, spremni ste za trening, procjenu i predviđanje s train (), evaluacija () i predviđanje ()

Da biste poboljšali performanse modela, možete:

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