Dve najpogostejši nadzorovani učni nalogi sta linearna regresija in linearni klasifikator. Linearna regresija napove vrednost, linearni klasifikator pa razred. Ta vadnica je osredotočena na Linearni klasifikator.
Kaj je linearni klasifikator?
Linearni klasifikator v strojnem učenju je metoda za iskanje razred nekega predmeta na podlagi svojih lastnosti za statistične klasifikacije. Odloča o razvrstitvi na podlagi vrednosti linearne kombinacije značilnosti predmeta. Linearni klasifikator se uporablja v praktičnih problemih, kot so klasifikacija dokumentov in problemi z veliko spremenljivkami.
Težave s klasifikacijo predstavljajo približno 80 odstotkov naloge strojnega učenja. Cilj klasifikacije je napovedati verjetnost vsakega razreda glede na nabor vhodnih podatkov. Oznaka (tj. Odvisna spremenljivka) je diskretna vrednost, imenovana razred.
- Če ima oznaka samo dva razreda, je učni algoritem binarni klasifikator.
- Večrazredni klasifikator se loteva nalepk z več kot dvema razredoma.
Na primer, tipična binarna klasifikacija je napovedovanje verjetnosti, da kupec opravi drugi nakup. Predvidevanje vrste živali, prikazane na sliki, je večrazreden problem klasifikacije, saj obstajata več kot dve vrsti živali.
Teoretični del te vaje osredotoča predvsem na binarni razred. V prihodnji vadnici boste izvedeli več o izhodni funkciji več razredov.
V tej vadnici boste izvedeli
- Kaj je linearni klasifikator?
- Kako deluje binarni klasifikator?
- Kako izmeriti zmogljivost linearnega klasifikatorja?
- Natančnost
- Matrica zmede
- Natančnost in občutljivost
- Linearni klasifikator s TensorFlow
- Korak 1) Uvozite podatke
- 2. korak) Pretvorba podatkov
- Korak 3) Uri klasifikator
- Korak 4) Izboljšajte model
- 5. korak) Hiperparameter: Lasso & Ridge
Kako deluje binarni klasifikator?
V prejšnji vadnici ste izvedeli, da je funkcija sestavljena iz dveh vrst spremenljivk, odvisne spremenljivke in nabora lastnosti (neodvisne spremenljivke). Pri linearni regresiji je odvisna spremenljivka realno število brez obsega. Primarni cilj je napovedati njegovo vrednost z zmanjšanjem povprečne napake na kvadrat.
Za binarni klasifikator TensorFlow je lahko oznaka imela dve možni celoštevilčni vrednosti. V večini primerov je to [0,1] ali [1,2]. Cilj je na primer predvideti, ali bo kupec izdelek kupil ali ne. Oznaka je opredeljena na naslednji način:
- Y = 1 (kupec je izdelek kupil)
- Y = 0 (kupec izdelka ne kupi)
Model uporablja lastnosti X za razvrščanje vsake stranke v najverjetnejši razred, ki mu pripada, in sicer potencialni kupec ali ne.
Verjetnost uspeha se izračuna z logistično regresijo . Algoritem bo izračunal verjetnost na podlagi lastnosti X in napovedal uspeh, ko bo ta verjetnost nad 50 odstotkov. Bolj formalno se verjetnost izračuna, kot je prikazano v spodnjem primeru binarne klasifikacije TensorFlow:
kjer je 0 niz uteži, lastnosti in b pristranskost.
Funkcijo lahko razstavimo na dva dela:
- Linearni model
- Logistična funkcija
Linearni model
Način izračuna uteži že poznate. Uteži se izračunajo s pikčastim zmnožkom: Y je linearna funkcija vseh lastnosti x i . Če model nima lastnosti, je napoved enaka pristranskosti, b.
Uteži kažejo smer korelacije med značilnostmi x i in oznako y. Pozitivna korelacija poveča verjetnost pozitivnega razreda, negativna korelacija pa verjetnost približa 0 (tj. Negativni razred).
Linearni model vrne le realno število, ki ni v skladu z verjetnostno mero območja [0,1]. Logistična funkcija je potrebna za pretvorbo izhoda linearnega modela v verjetnost,
Logistična funkcija
Logistična funkcija ali sigmoidna funkcija ima obliko S in izhod te funkcije je vedno med 0 in 1.
Izhod linearne regresije je enostavno nadomestiti s sigmoidno funkcijo. Rezultat je nova številka z verjetnostjo med 0 in 1.
Klasifikator lahko verjetnost spremeni v razred
- Vrednosti med 0 in 0,49 postanejo razred 0
- Vrednosti med 0,5 in 1 postanejo razred 1
Kako izmeriti zmogljivost linearnega klasifikatorja?
Natančnost
Skupna uspešnost klasifikatorja se meri z metriko natančnosti. Natančnost zbira vse pravilne vrednosti, deljene s skupnim številom opazovanj. Na primer, vrednost natančnosti 80 odstotkov pomeni, da je model v 80 odstotkih primeren.
Pri tej metriki lahko opazite pomanjkljivost, zlasti pri razredu neravnovesja. Nabor podatkov o neravnovesju se pojavi, kadar število opazovanj na skupino ni enako. Recimo; poskusite klasificirati redek dogodek z logistično funkcijo. Predstavljajte si, da klasifikator poskuša oceniti smrt bolnika po bolezni. V podatkih umre 5 odstotkov bolnikov. Klasifikator lahko usposobite za napovedovanje števila smrtnih primerov in uporabite metriko natančnosti za oceno zmogljivosti. Če klasifikator napoveduje 0 smrtnih primerov za celoten nabor podatkov, bo to v 95 odstotkih pravilno.
Matrica zmede
Boljši način za oceno uspešnosti klasifikatorja je pogled na matriko zmede.
Matrica zmede ponazarja natančnost klasifikatorja s primerjavo dejanskih in predvidenih razredov, kot je prikazano v zgornjem primeru Linearnega klasifikatorja. Matrika binarne zmede je sestavljena iz kvadratov:
- TP: resnično pozitivno: predvidene vrednosti so pravilno napovedane kot dejanske pozitivne
- FP: Predvidene vrednosti so napačno napovedale dejansko pozitivno vrednost. Negativne vrednosti so napovedane kot pozitivne
- FN: Lažno negativno: pozitivne vrednosti so napovedane kot negativne
- TN: resnično negativno: predvidene vrednosti so pravilno napovedane kot dejanske negativne vrednosti
Iz matrice zmede je enostavno primerjati dejanski razred in predvideni razred.
Natančnost in občutljivost
Matrica zmede omogoča dober vpogled v resnično pozitivne in lažno pozitivne. V nekaterih primerih je zaželena bolj jedrnata metrika.
Natančnost
Meritev natančnosti prikazuje natančnost pozitivnega razreda. Meri, kako verjetno je napoved pozitivnega razreda pravilna.
Najvišja ocena je 1, če klasifikator popolnoma razvrsti vse pozitivne vrednosti. Natančnost sama po sebi ni v veliko korist, ker ignorira negativni razred. Meritev je običajno seznanjena z metriko odpoklica. Odpoklic se imenuje tudi občutljivost ali resnična pozitivna stopnja.
Občutljivost
Občutljivost izračuna razmerje med pravilno zaznanimi pozitivnimi razredi. Ta metrika prikazuje, kako dober je model, da prepozna pozitiven razred.
Linearni klasifikator s TensorFlow
Za to vadnico bomo uporabili popisni niz podatkov. Namen je uporabiti spremenljivke v popisnem naboru podatkov za napovedovanje ravni dohodka. Upoštevajte, da je dohodek binarna spremenljivka
- z vrednostjo 1, če je dohodek> 50k
- 0 če je dohodek <50k.
Ta spremenljivka je vaša oznaka
Ta nabor podatkov vključuje osem kategoričnih spremenljivk:
- delovnem mestu
- izobraževanje
- zakonski
- poklic
- razmerje
- dirka
- seks
- Domača država
poleg tega šest neprekinjenih spremenljivk:
- starost
- fnlwgt
- izobraževalna_številka
- kapitalski dobiček
- izguba kapitala
- ur_teden
Skozi ta primer klasifikacije TensorFlow boste razumeli, kako trenirati linearne klasifikatorje TensorFlow z ocenjevalnikom TensorFlow in kako izboljšati meritev natančnosti.
Nadaljevali bomo, kot sledi:
- Korak 1) Uvozite podatke
- 2. korak) Pretvorba podatkov
- Korak 3) Uri klasifikator
- Korak 4) Izboljšajte model
- 5. korak) Hiperparameter: Lasso & Ridge
Korak 1) Uvozite podatke
Najprej uvozite knjižnice, uporabljene med vadnico.
import tensorflow as tfimport pandas as pd
Nato podatke uvozite iz arhiva UCI in definirate imena stolpcev. Stolpce boste uporabili za poimenovanje stolpcev v podatkovnem okviru pand.
Upoštevajte, da boste klasifikator učili z uporabo podatkovnega okvira 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"
Podatki, shranjeni v spletu, so že razdeljeni med vlakovni in preskusni sklop.
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 vlakov vsebuje 32.561 opazovanj, testni sklop pa 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
Za usposabljanje klasifikatorja Tensorflow zahteva logično vrednost. Vrednosti morate pretvoriti iz niza v celo število. Oznaka je shranjena kot predmet, vendar jo morate pretvoriti v številčno vrednost. Spodnja koda ustvari slovar z vrednostmi za pretvorbo in zanko nad elementom stolpca. Upoštevajte, da to operacijo izvedete dvakrat, eno za preizkus vlaka in eno za testni niz
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 podatkih o vlakih je 24.720 dohodkov nižjih od 50 tisoč in 7841 zgoraj. Razmerje je pri testnem kompletu skoraj enako. Če želite več informacij, si oglejte to vadnico o Facets.
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
2. korak) Pretvorba podatkov
Potrebno je nekaj korakov, preden se s Tensorflowom naučite linearnega klasifikatorja. Pripraviti morate funkcije, ki jih želite vključiti v model. V referenčni regresiji boste uporabili izvirne podatke brez kakršne koli preobrazbe.
Ocenjevalec mora imeti seznam funkcij za usposabljanje modela. Zato je treba podatke stolpca pretvoriti v tenzor.
Dobra praksa je, da določite dva seznama funkcij glede na njihovo vrsto in jih nato prenesete v stolpce_znak ocenjevalnika.
Začeli boste s pretvorbo neprekinjenih funkcij, nato pa definirali segment s kategoričnimi podatki.
Značilnosti nabora podatkov so v dveh oblikah:
- Celo število
- Predmet
Vsaka značilnost je navedena v naslednjih dveh spremenljivkah glede na njihovo vrsto.
## 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']
Stolpec_mest je opremljen s številskim_stubom predmeta, ki pomaga pri pretvorbi zveznih spremenljivk v tenzor. V spodnji kodi pretvorite vse spremenljivke iz CONTI_FEATURES v tenzor s številsko vrednostjo. To je obvezno za izdelavo modela. Vse neodvisne spremenljivke je treba pretvoriti v pravi tip tenzorja.
Spodaj napišemo kodo, ki vam omogoča, da vidite, kaj se dogaja za feature_column.numeric_column. Pretvorjeno vrednost bomo natisnili za starost. To je za pojasnitev, zato ni treba razumeti pythonove kode. Za razumevanje kod se lahko sklicujete na uradno dokumentacijo.
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.]]
Vrednosti so popolnoma enake kot v df_train
continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]
Glede na dokumentacijo TensorFlow obstajajo različni načini pretvorbe kategoričnih podatkov. Če je seznam besedišča funkcije znan in nima veliko vrednosti, je mogoče ustvariti kategorični stolpec s kategoričnim_ stolpcem_ s_vokabularnim_listom. Vsem unikatnim besednjakom bo dodelil ID.
Na primer, če ima status spremenljivke tri različne vrednosti:
- Mož
- Žena
- Samski
Nato bodo pripisani trije ID. Na primer, mož bo imel ID 1, žena ID 2 itd.
Za ponazoritev lahko s to kodo pretvorite objektno spremenljivko v kategorični stolpec v TensorFlow.
Značilni seks ima lahko samo dve vrednosti: moški ali ženska. Ko bomo pretvorili igrani spol, bo Tensorflow ustvaril 2 nova stolpca, enega za moškega in enega za žensko. Če je spol enak moškemu, bo novi stolpec moški enak 1, ženska pa 0. Ta primer je prikazan v spodnji tabeli:
vrstice |
seks |
po preobrazbi |
moški |
samica |
1. |
moški |
=> |
1. |
0 |
2. |
moški |
=> |
1. |
0 |
3. |
samica |
=> |
0 |
1. |
V tenzorju:
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'])
Spodaj smo dodali kodo Python za tiskanje kodiranja. Še enkrat, kode vam ni treba razumeti, njen namen je videti preobrazbo
Vendar pa je hitrejši način preoblikovanja podatkov uporaba metode categorical_column_with_hash_bucket. Spreminjanje nizovnih spremenljivk v redki matriki bo koristno. Redka matrica je matrika z večinoma nič. Metoda poskrbi za vse. Določiti morate le število segmentov in stolpec ključev. Število segmentov je največje število skupin, ki jih lahko ustvari Tensorflow. Ključni stolpec je preprosto ime stolpca za pretvorbo.
V spodnji kodi ustvarite zanko nad vsemi kategoričnimi lastnostmi.
categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]
Korak 3) Uri klasifikator
TensorFlow trenutno ponuja ocenjevalnik linearne regresije in linearne klasifikacije.
- Linearna regresija: LinearRegressor
- Linearna klasifikacija: LinearClassifier
Sintaksa linearnega klasifikatorja je enaka kot v vadnici o linearni regresiji, razen enega argumenta, n_class. Določiti morate stolpec lastnosti, imenik modelov in primerjati z linearnim regresorjem; določite število predavanj. Za logit regresijo je število razredov enako 2.
Model bo izračunal uteži stolpcev, ki jih vsebujejo neprekinjene_značilnosti in kategorične_značilnosti.
model = tf.estimator.LinearClassifier(n_classes = 2,model_dir="ongoing/train",feature_columns=categorical_features+ continuous_features)
IZHOD:
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}
Zdaj, ko je klasifikator definiran, lahko ustvarite vhodno funkcijo. Metoda je enaka kot pri vadnici linearnega regresorja. Tu uporabite velikost paketa 128 in podatke premešate.
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)
Ustvarite funkcijo z argumenti, ki jih zahteva linearni ocenjevalnik, tj. Število obdobij, število paketov in premešate nabor podatkov ali opombo. Ker za prenos podatkov v model uporabljate metodo Pandas, morate spremenljivke X definirati kot podatkovni okvir pand. Upoštevajte, da zaokrožite po vseh podatkih, shranjenih v FEATURES.
Učimo model z objektnim modelom.train. Funkcijo, ki ste jo predhodno določili, uporabljate za podajanje modela z ustreznimi vrednostmi. Velikost paketa nastavite na 128, število obdobij pa na Brez. Model bo usposobljen v tisoč korakih.
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.
Upoštevajte, da se je izguba pozneje v zadnjih 100 korakih zmanjšala, tj. Z 901 na 1000.
Končna izguba po tisoč ponovitvah je 5444. Svoj model lahko ocenite na testnem naboru in si ogledate uspešnost. Če želite oceniti delovanje vašega modela, morate uporabiti objekt vrednotenja. Model napolnite s testnim naborom in nastavite število obdobij na 1, tj. Podatki bodo v model šli le enkrat.
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 vrne vse meritve, ki ste se jih naučili v teoretičnem delu. Brez presenečenja je natančnost velika zaradi neuravnotežene nalepke. Pravzaprav model deluje nekoliko bolje kot naključno ugibanje. Predstavljajte si, da model napoveduje vsa gospodinjstva z dohodkom nižjim od 50 tisoč, potem ima model natančnost 70 odstotkov. Če natančneje analizirate, lahko vidite, da sta napoved in odpoklic precej nizka.
Korak 4) Izboljšajte model
Zdaj, ko imate primerjalni model, ga lahko poskusite izboljšati, to je povečati natančnost. V prejšnji vadnici ste se naučili, kako izboljšati moč predvidevanja z interakcijskim izrazom. V tej vadnici boste to idejo ponovno pregledali tako, da boste regresiji dodali polinomski izraz.
Polinomska regresija je ključnega pomena, kadar je v podatkih nelinearnost. Obstajata dva načina za zajemanje nelinearnosti podatkov.
- Dodaj polinomski izraz
- Neprekinjeno spremenljivko vstavi v kategorično spremenljivko
Polinomski izraz
Na spodnji sliki lahko vidite, kaj je polinomska regresija. Je enačba z X spremenljivkami z različno močjo. Polinomska regresija druge stopnje ima dve spremenljivki, X in X na kvadrat. Tretja stopnja ima tri spremenljivke, X, X 2 in X 3
Spodaj smo zgradili graf z dvema spremenljivkama, X in Y. Očitno je, da razmerje ni linearno. Če dodamo linearno regresijo, lahko vidimo, da model ne more zajeti vzorca (leva slika).
Zdaj, poglejte levo sliko s spodnje slike, regresiji smo dodali pet-članek (to je y = x + x 2 + x 3 + x 4 + x 5. Model zdaj zajema veliko boljši vzorec. To je moč polinomske regresije.
Vrnimo se k našemu primeru. Starost ni v linearni povezavi z dohodkom. Zgodnja starost ima lahko pavšalni dohodek skoraj nič, ker otroci ali mladi ne delajo. Nato se poveča delovno sposobna, med upokojitvijo pa zmanjša. Običajno je obrnjena-U oblika. Eden od načinov za zajemanje tega vzorca je dodajanje stopnje dva regresiji.
Poglejmo, ali to poveča natančnost.
To novo funkcijo morate dodati naboru podatkov in na seznamu neprekinjenih funkcij.
Novo spremenljivko dodate v nabor podatkov o vlaku in preizkusu, zato je primerneje napisati funkcijo.
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 argumente:
- df_t: določite niz vadbe
- df_te: določite testni niz
- var_name = 'starost': Določite spremenljivko za preoblikovanje
Z objektom pow (2) lahko spremenite starost na kvadrat. Upoštevajte, da je nova spremenljivka poimenovana 'novo'
Zdaj, ko je napisana funkcija square_var, lahko ustvarite nove nabore podatkov.
df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age')
Kot lahko vidite, ima novi nabor podatkov še eno funkcijo.
print(df_train_new.shape, df_test_new.shape)(32561, 16) (16281, 16)
Kvadratna spremenljivka se v naboru podatkov imenuje nova. Dodati ga morate na seznam neprekinjenih funkcij.
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]
Upoštevajte, da ste spremenili imenik grafa. V istem imeniku ne morete trenirati različnih modelov. To pomeni, da morate spremeniti pot argumenta model_dir. Če tega ne storite, bo TensorFlow povzročil napako.
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)
Zdaj, ko je klasifikator zasnovan z novim naborom podatkov, lahko model trenirate in ocenite.
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}
Spremenljivka na kvadrat je izboljšala natančnost z 0,76 na 0,79. Poglejmo, ali lahko naredite boljše, če združite izračun medsebojnega povezovanja in interakcije.
Buketizacija in interakcija
Kot ste že videli, linearni klasifikator ne more pravilno zajeti vzorca starostnega dohodka. To je zato, ker se nauči eno težo za vsako funkcijo. Za lažje razvrščanje je ena stvar, ki jo lahko naredite, da funkcijo sefnete. Bucketing pretvori številčno funkcijo v več določenih glede na obseg, v katerega spada, in vsaka od teh novih funkcij kaže, ali starost osebe spada v to območje.
S temi novimi funkcijami lahko linearni model zajame odnos z učenjem različnih uteži za vsako vedro.
V programu TensorFlow se to izvede z bucketized_column. V meje morate dodati obseg vrednosti.
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])
Že veste, da starost ni linearna glede na dohodek. Drug način za izboljšanje modela je interakcija. Po besedah TensorFlow gre za prehajanje lastnosti. Prehajanje lastnosti je način za ustvarjanje novih funkcij, ki so kombinacije obstoječih, kar je lahko v pomoč pri linearnem klasifikatorju, ki ne more modelirati interakcij med značilnostmi.
Starost lahko razdelite z drugo funkcijo, kot je izobraževanje. To pomeni, da bodo nekatere skupine verjetno imele visok dohodek, druge pa nizke (pomislite na doktoranda).
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)]
Če želite ustvariti stolpec z navzkrižnimi značilnostmi, uporabite križani stolpec s spremenljivkami, ki jih želite prečkati v oklepaju. Hash_bucket_size označuje največje možnosti prehoda. Če želite ustvariti interakcijo med spremenljivkami (vsaj ena spremenljivka mora biti kategorična), lahko uporabite tf.feature_column.crossed_column. Če želite uporabiti ta objekt, morate v oglatem oklepaju dodati spremenljivko za interakcijo in drugi argument, velikost segmenta. Velikost segmenta je največje število možnih skupin znotraj spremenljivke. Tu ga nastavite na 1000, saj ne veste natančnega števila skupin
age_buckets, preden jo želite dodati v stolpce funkcij. Nove stolpce dodate tudi v stolpce s funkcijami in pripravite ocenjevalnik
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)
IZHOD
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)
Pripravljeni ste oceniti novi model in preveriti, ali izboljša natanč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 stopnja natančnosti je 83,58 odstotka. Za štiri odstotke je višji od prejšnjega modela.
Na koncu lahko dodate še izraz za regularizacijo, da preprečite prekomerno opremljanje.
5. korak) Hiperparameter: Lasso & Ridge
Vaš model lahko trpi zaradi prekomerne ali pomanjkljive opreme .
- Prekomerno opremljanje: model ne more posplošiti napovedi na nove podatke
- Underfitting: Model ne more zajeti vzorca podatkov. tj. linearna regresija, kadar so podatki nelinearni
Kadar ima model veliko parametrov in sorazmerno malo podatkov, to vodi do slabih napovedi. Predstavljajte si, ena skupina ima samo tri opazovanja; model bo izračunal utež za to skupino. Utež se uporablja za napovedovanje; če se opazovanja testnega sklopa za to določeno skupino popolnoma razlikujejo od treninga, potem bo model dal napačno napoved. Med ocenjevanjem z vadbenim nizom je natančnost dobra, s testnim sklopom pa ne, ker izračunane uteži niso resnične za posploševanje vzorca. V tem primeru ne daje razumne napovedi za nevidne podatke.
Da bi preprečili prekomerno opremljanje, vam regularizacija omogoča nadzor nad tako zapletenostjo in njeno bolj splošno uporabo. Obstajata dve tehniki regularizacije:
- L1: Laso
- L2: Greben
V TensorFlow lahko ta dva hiperparametra dodate v optimizator. Na primer, višja kot je hiperparameter L2, je teža zelo majhna in blizu nič. Vgrajena črta bo zelo ravna, medtem ko L2 blizu nič pomeni, da so uteži blizu običajne linearne regresije.
Sami lahko preizkusite različno vrednost hiperparametrov in preverite, ali lahko povečate stopnjo natančnosti.
Upoštevajte, da če spremenite hiperparameter, morate izbrisati mapo tekoče / vlak4, sicer se bo model zagnal s predhodno usposobljenim modelom.
Poglejmo, kakšna je natančnost pri 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))
IZPAD
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)
IZPAD
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)
IZHOD
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 tem hiperparametrom nekoliko povečate meritve natančnosti. V naslednji vadnici boste izvedeli, kako izboljšati linearni klasifikator z uporabo metode jedra.
Povzetek
Če želite usposobiti model, morate:
- Določite lastnosti: Neodvisne spremenljivke: X
- Določite oznako: Odvisna spremenljivka: y
- Izdelajte vlak / testni sklop
- Določite začetno težo
- Določite funkcijo izgube: MSE
- Optimizirajte model: gradientni spust
- Določite:
- Stopnja učenja
- Število obdobij
- Velikost serije
- Število predavanj
V tej vadnici ste se naučili, kako uporabljati API na visoki ravni za klasifikator linearne regresije. Določiti morate:
- Stolpci s funkcijami. Če je neprekinjeno: tf.feature_column.numeric_column (). Seznam lahko zapolnite z razumevanjem seznama python
- Ocenjevalec: tf.estimator.LinearClassifier (feature_columns, model_dir, n_classes = 2)
- Funkcija za uvoz podatkov, velikosti serije in obdobja: input_fn ()
Po tem ste pripravljeni trenirati, ovrednotiti in napovedati z train (), evaluacijo () in napovedovanjem ()
Za izboljšanje zmogljivosti modela lahko:
- Uporabite polinomsko regresijo
- Izraz interakcije: tf.feature_column.crossed_column
- Dodajte parameter regularizacije