Kaks levinumat juhendatud õppeülesannet on lineaarne regressioon ja lineaarne klassifikaator. Lineaarne regressioon ennustab väärtust, samas kui lineaarne klassifikaator klassi. See õpetus on keskendunud lineaarsele klassifikaatorile.
Mis on lineaarne klassifikaator?
Linear Klassifitseerijale Machine Learning on meetod leida objekti klassi põhineb selle omaduste statistiline liigitus. See teeb klassifitseerimise otsuse objekti omaduste lineaarse kombinatsiooni väärtuse põhjal. Lineaarset klassifikaatorit kasutatakse praktilistes probleemides, näiteks dokumentide klassifikatsioonis ja paljude muutujatega probleemides.
Klassifitseerimisprobleemid moodustavad umbes 80 protsenti masinaõppe ülesandest. Klassifikatsiooni eesmärk on prognoosida iga klassi tõenäosust antud sisendite hulga korral. Silt (st sõltuv muutuja) on diskreetne väärtus, mida nimetatakse klassiks.
- Kui sildil on ainult kaks klassi, on õppimisalgoritm binaarne klassifikaator.
- Mitmeklassiline klassifikaator tegeleb rohkem kui kahe klassiga siltidega.
Näiteks on tüüpiline binaarse klassifikatsiooni probleem ennustada tõenäosust, et klient teise ostu sooritab. Ennustage pildil kuvatava looma tüüpi, kuna tegemist on mitmeklasse klassifitseerimisega, kuna loomi on rohkem kui kaks.
Selle õpetuse teoreetilises osas pööratakse põhitähelepanu binaarklassile. Mitmeklassilise väljundfunktsiooni kohta leiate lisateavet tulevast õpetusest.
Selles õpetuses saate teada
- Mis on lineaarne klassifikaator?
- Kuidas binaarne klassifikaator töötab?
- Kuidas mõõta lineaarse klassifikaatori toimivust?
- Täpsus
- Segadusmaatriks
- Täpsus ja tundlikkus
- Lineaarne klassifikaator koos TensorFlow'ga
- 1. samm. Importige andmed
- 2. samm. Andmete teisendamine
- Samm 3) koolitage klassifikaatorit
- 4. samm. Parandage mudelit
- 5. samm: hüperparameeter: Lasso & Ridge
Kuidas binaarne klassifikaator töötab?
Eelmises õpetuses õppisite, et funktsioon koosneb kahesugustest muutujatest, sõltuvast muutujast ja funktsioonide komplektist (sõltumatud muutujad). Lineaarses regressioonis on sõltuv muutuja reaalarv ilma vahemikuta. Peamine eesmärk on ennustada selle väärtust, minimeerides keskmise ruuduvea.
TensorFlow binaarklassifikaatori jaoks võib märgisel olla kaks võimalikku täisarvu väärtust. Enamasti on see kas [0,1] või [1,2]. Näiteks on eesmärk ennustada, kas klient ostab toote või mitte. Silt on määratletud järgmiselt:
- Y = 1 (klient ostis toote)
- Y = 0 (klient ei osta toodet)
Mudel kasutab funktsioone X, et klassifitseerida iga klient kõige tõenäolisemasse klassi, millesse ta kuulub, nimelt potentsiaalne ostja või mitte.
Edu tõenäosus arvutatakse logistilise regressiooniga . Algoritm arvutab tõenäosuse, mis põhineb tunnusel X ja ennustab edukust, kui see tõenäosus on üle 50 protsendi. Ametlikumalt arvutatakse tõenäosus, nagu on näidatud allpool toodud TensorFlow binaarse klassifikatsiooni näites:
kus 0 on kaalude hulk, funktsioonid ja b kallutatus.
Funktsiooni saab jagada kaheks osaks:
- Lineaarne mudel
- Logistiline funktsioon
Lineaarne mudel
Kaalude arvutamise viis on teile juba tuttav. Kaalud arvutatakse punkttoote abil: Y on kõigi tunnuste x i lineaarfunktsioon . Kui mudelil pole funktsioone, on ennustus võrdne eelarvamusega, b.
Kaalud näitavad omaduste x i ja sildi y vahelise korrelatsiooni suuna . Positiivne korrelatsioon suurendab positiivse klassi tõenäosust, samas kui negatiivne korrelatsioon viib tõenäosuse lähemale 0-le (st negatiivsele klassile).
Lineaarne mudel tagastab ainult reaalarvu, mis ei ole kooskõlas vahemiku [0,1] tõenäosusmõõduga. Logistiline funktsioon on vajalik lineaarse mudeli väljundi teisendamiseks tõenäosuseks,
Logistiline funktsioon
Logistilisel funktsioonil ehk sigmoidfunktsioonil on S-kuju ja selle funktsiooni väljund on alati vahemikus 0 kuni 1.

Logistilise funktsiooni näide
Lineaarse regressiooni väljundit on lihtne asendada sigmoidfunktsiooniga. Selle tulemuseks on uus arv tõenäosusega vahemikus 0 kuni 1.
Klassifikaator saab teisendada tõenäosuse klassiks
- Väärtused vahemikus 0 kuni 0,49 muutuvad klassiks 0
- Väärtused vahemikus 0,5 kuni 1 muutuvad 1. klassiks
Kuidas mõõta lineaarse klassifikaatori toimivust?
Täpsus
Klassifikaatori üldist jõudlust mõõdetakse täpsusmõõdikuga. Täpsus kogub kõik õiged väärtused jagatuna vaatluste koguarvuga. Näiteks täpsuse väärtus 80 protsenti tähendab, et mudel on 80 protsendil juhtudest õige.

Lineaarse klassifikaatori toimivuse mõõtmine mõõdikute täpsuse abil
Selle mõõdikuga saate märkida puuduse, eriti tasakaalustamatuse klassi puhul. Tasakaalustamatuse andmekogum tekib siis, kui vaatluste arv rühma kohta ei ole võrdne. Ütleme; proovite liigitada haruldast sündmust logistilise funktsiooniga. Kujutage ette, et klassifikaator püüab hinnata patsiendi surma pärast haigust. Andmetes sureb 5 protsenti patsientidest. Saate koolitada klassifikaatorit surma arvu prognoosimiseks ja esituste hindamiseks kasutada täpsusmõõdikut. Kui klassifikaator ennustab kogu andmekogumi jaoks 0 surma, on see õige 95 protsendil juhtumitest.
Segadusmaatriks
Parem viis klassifikaatori toimivuse hindamiseks on segiajamise maatriksi vaatamine.

Mõõtke lineaarse klassifikaatori toimivust segiajamise maatriksi abil
Segiajamise maatriks visualiseerib klassifikaatori täpsust, võrreldes tegelikke ja ennustatud klasse, nagu on näidatud ülaltoodud lineaarse klassifikaatori näites. Binaarne segiajamise maatriks koosneb ruutudest:
- TP: tõeline positiivne: ennustatud väärtused on õigesti prognoositud tegelikuks positiivseks
- FP: ennustatud väärtused ennustasid valesti tegelikku positiivset. st negatiivsed väärtused ennustatakse positiivseteks
- FN: Vale negatiivne: positiivsed väärtused ennustatakse negatiivseteks
- TN: Tõeline negatiivne: ennustatud väärtused on õigesti prognoositud tegelikuks negatiivseks
Segadusmaatriksist on lihtne võrrelda tegelikku klassi ja ennustatud klassi.
Täpsus ja tundlikkus
Segiajamise maatriks annab hea ülevaate tõelisest positiivsest ja valepositiivsest. Mõnel juhul on eelistatav lühem mõõdik.
Täpsus
Täpsusmõõdik näitab positiivse klassi täpsust. See mõõdab, kui tõenäoline on positiivse klassi ennustamine õige.
Maksimaalne punktisumma on 1, kui klassifikaator klassifitseerib kõik positiivsed väärtused täiuslikult. Üksnes täpsusest pole suurt abi, sest see eirab negatiivset klassi. Mõõdik on tavaliselt seotud mõõdiku tagasikutsumisega. Tagasikutsumist nimetatakse ka tundlikkuseks või tõeliseks positiivseks määraks.
Tundlikkus
Tundlikkus arvutab õigesti tuvastatud positiivsete klasside suhte. See mõõdik annab teada, kui hea on mudel positiivse klassi ära tunda.
Lineaarne klassifikaator koos TensorFlow'ga
Selle õpetuse jaoks kasutame loenduse andmekogumit. Selle eesmärk on kasutada loenduse andmekogumis olevaid muutujaid sissetulekutaseme prognoosimiseks. Pange tähele, et sissetulek on binaarne muutuja
- väärtusega 1, kui sissetulek> 50k
- 0, kui sissetulek on <50k.
See muutuja on teie silt
See andmekogum sisaldab kaheksat kategoorilist muutujat:
- töökoht
- haridus
- abieluline
- okupatsioon
- suhe
- võistlus
- sugu
- päritoluriik
lisaks kuus pidevat muutujat:
- vanus
- fnlwgt
- haridus_num
- kapital_kasum
- kapitali_kaotus
- tundi_nädal
Selle TensorFlow klassifikatsiooni näite kaudu saate aru, kuidas koolitada lineaarseid TensorFlow klassifikaatoreid TensorFlow hindajaga ja kuidas täpsusmõõdikut parandada.
Jätkame järgmiselt:
- 1. samm. Importige andmed
- 2. samm. Andmete teisendamine
- 3. samm. Treenige klassifikaatorit
- 4. samm. Parandage mudelit
- 5. samm: hüperparameeter: Lasso & Ridge
1. samm. Importige andmed
Esmalt impordite õpetuse ajal kasutatud teegid.
import tensorflow as tfimport pandas as pd
Järgmisena impordite andmed UCI arhiivist ja määratlete veergude nimed. Pandade andmeraamis olevate veergude nimetamiseks kasutate veerge.
Pange tähele, et koolitate klassifikaatorit Pandase andmekaadri abil.
## 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"
Veebis salvestatud andmed on juba jaotatud rongikomplekti ja katsekomplekti vahel.
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)
Rongikomplekt sisaldab 32 561 vaatlust ja testikomplekt 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 nõuab klassifikaatori koolitamiseks Boole'i väärtust. Peate valama väärtused stringist täisarvuks. Silt on objektina pood, kuid peate selle teisendama arvväärtuseks. Allpool olev kood loob sõnastiku, mille väärtused on teisendatavad ja veerupunktile silmuseks viidud. Pange tähele, et teete seda toimingut kaks korda, üks rongikatse jaoks, teine testikomplekti jaoks
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]
Rongiandmetes on 24 720 sissetulekut, mis on väiksem kui 50 000 ja 7841 üle. Suhe on testikomplekti puhul peaaegu sama. Lisateavet leiate sellest juhendist Facetsi kohta.
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. samm. Andmete teisendamine
Enne Tensorflowi abil lineaarse klassifikaatori koolitamist on vaja teha mõned sammud. Peate ette valmistama mudelisse kaasatavad funktsioonid. Võrdlusregressioonis kasutate algandmeid ilma teisendusi rakendamata.
Hinnangul peab mudeli koolitamiseks olema funktsioonide loend. Seega tuleb veeru andmed teisendada tensoriks.
Hea tava on määratleda kaks omaduste loendit nende tüübi põhjal ja seejärel edastada need hindaja veergude funktsioon_veergudesse.
Alustage pidevate funktsioonide teisendamisega ja määrake seejärel kategooriliste andmetega ämber.
Andmekogumi funktsioonidel on kaks vormingut:
- Täisarv
- Objekt
Iga funktsioon on loetletud järgmises kahes muutujas vastavalt nende tüübile.
## 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']
Funktsioon_veerg on varustatud objektiga numbriline veerg, mis aitab muuta pidevaid muutujaid tensoriks. Alltoodud koodis teisendate kõik muutujad kategooriast CONTI_FEATURES arvulise väärtusega tensoriks. See on mudeli koostamiseks kohustuslik. Kõik sõltumatud muutujad tuleb teisendada sobivaks tensoritüübiks.
Allpool kirjutame koodi, mis võimaldab teil näha, mis toimub funktsiooni_veerg.numbriline_veerg taga. Prindime vanuse teisendatud väärtuse. See on selgitamiseks, seega pole vaja pythoni koodi mõista. Koodide mõistmiseks võite viidata ametlikule dokumentatsioonile.
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.]]
Väärtused on täpselt samad mis failis df_train
continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]
TensorFlow dokumentatsiooni kohaselt on kategooriliste andmete teisendamiseks erinevaid viise. Kui funktsiooni sõnavara loend on teada ja sellel pole palju väärtusi, on võimalik kategooriline veerg luua kategooria_veerg_sõnavara_loendiga. See määrab kõigile ainulaadsetele sõnavaraloenditele ID.
Näiteks kui muutuja olekul on kolm erinevat väärtust:
- Abikaasa
- Naine
- Vallaline
Siis omistatakse kolm isikutunnistust. Näiteks on abikaasal ID 1, naisel ID 2 ja nii edasi.
Illustreerimise eesmärgil saate selle koodi abil muuta objekti muutuja kategooriaseks veeruks teenuses TensorFlow.
Tunnusseksil võib olla ainult kaks väärtust: mees või naine. Kui me teisendame funktsiooni soo, loob Tensorflow 2 uut veergu, ühe isase ja teise naissoost. Kui sugu on võrdne meessoost, on uus veeru mees võrdne 1 ja naissoost 0. See näide kuvatakse allolevas tabelis:
read |
sugu |
pärast ümberkujundamist |
mees |
naissoost |
1 |
mees |
=> |
1 |
0 |
2 |
mees |
=> |
1 |
0 |
3 |
naissoost |
=> |
0 |
1 |
Tensorvoos:
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'])
Allpool lisasime kodeeringu printimiseks Pythoni koodi. Jällegi pole teil vaja koodi mõista, selle eesmärk on näha teisendust
Kiirem viis andmete teisendamiseks on kasutada meetodit categoryor_column_with_hash_bucket. Kasuks tuleb stringimuutujate muutmine hõredas maatriksis. Hõre maatriks on põhiliselt nulliga maatriks. Meetod hoolitseb kõige eest. Peate määrama ainult ämbrite arvu ja võtmeveeru. Ämbrite arv on maksimaalne rühmade arv, mille Tensorflow saab luua. Võtmeveeru on lihtsalt teisendatava veeru nimi.
Allpool olevas koodis loote kõigi kategooriliste funktsioonide kohta silmuse.
categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]
Samm 3) koolitage klassifikaatorit
TensorFlow pakub praegu lineaarse regressiooni ja lineaarse klassifikatsiooni hindajat.
- Lineaarne regressioon: LinearRegressor
- Lineaarne klassifikatsioon: LinearClassifier
Lineaarse klassifikaatori süntaks on sama, mis lineaarse regressiooni õpetuses, välja arvatud üks argument n_class. Peate määratlema funktsioonide veeru, mudeli kataloogi ja võrdlema seda lineaarse regressoriga; teil on määratletud klassi number. Logit regressiooni korral on klassi arv võrdne 2-ga.
Mudel arvutab veergude massi, mis sisalduvad pidev_omadused ja kategoorilised_omadused.
model = tf.estimator.LinearClassifier(n_classes = 2,model_dir="ongoing/train",feature_columns=categorical_features+ continuous_features)
VÄLJUND:
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}
Nüüd, kui klassifikaator on määratletud, saate luua sisendfunktsiooni. Meetod on sama, mis lineaarregressori õpetuses. Siin kasutate partii suurust 128 ja segate andmeid.
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)
Loote funktsiooni lineaarse prognoosija nõutavate argumentidega, st ajastute arv, partiide arv ja segage andmekogumit või märkust. Kuna andmete edastamiseks mudelisse kasutate Pandase meetodit, peate X muutujad määratlema pandade andmekaadrina. Pange tähele, et jälgite kõiki funktsiooni FEATURES salvestatud andmeid.
Treenime mudelit objektimudeliga.train. Eelnevalt määratletud funktsiooni abil saate mudeli sisestada sobivate väärtustega. Pange tähele, et määrasite partii suuruseks 128 ja ajastute arvuks Puudub. Mudelit koolitatakse üle tuhande sammu.
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.
Pange tähele, et kaotus vähenes hiljem viimase 100 sammu jooksul, st 901-lt 1000-le.
Lõplik kaotus pärast tuhat iteratsiooni on 5444. Oma mudelit saate hinnata testikomplektis ja vaadata toimivust. Mudeli jõudluse hindamiseks peate kasutama objekti hindamist. Toidate mudeli testikomplektiga ja määrate ajajärkude arvuks 1, st andmed lähevad mudelisse ainult üks kord.
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 tagastab kõik teoreetilises osas õpitud mõõdikud. Üllatuseta on tasakaalustamata sildi tõttu täpsus suur. Tegelikult toimib mudel pisut paremini kui juhuslik oletus. Kujutage ette, et mudel ennustab kõiki leibkondi, kelle sissetulek on väiksem kui 50 000, siis on mudeli täpsus 70 protsenti. Lähemal analüüsil näete, et ennustus ja tagasikutsumine on üsna madalad.
4. samm. Parandage mudelit
Nüüd, kui teil on võrdlusmudel olemas, võite proovida seda parandada, st suurendada täpsust. Eelmises õpetuses õppisite, kuidas interaktsiooniterminiga ennustamisvõimet parandada. Selles õpetuses vaatate seda ideed uuesti, lisades regressioonile polünoomi.
Polünoomne regressioon on oluline, kui andmetes on mittelineaarsus. Mittelineaarsuse jäädvustamiseks andmetes on kaks võimalust.
- Lisage polünoomitermin
- Pange pidev muutuja kategooriliseks muutujaks
Polünoomide termin
Allolevalt pildilt näete, mis on polünoomne regressioon. See on võrrand X erineva võimsusega muutujaga. Teise astme polünoomregressioonil on kaks muutujat, X ja X ruudus. Kolmandal astmel on kolm muutujat, X, X 2 ja X 3

Mis on polünoomne regressioon
Allpool koostasime kahe muutujaga X ja Y graafiku. On ilmne, et seos pole lineaarne. Kui lisame lineaarse regressiooni, näeme, et mudel ei suuda mustrit hõivata (vasakpoolne pilt).
Nüüd vaadake alloleva pildi vasakpoolset pilti, lisasime regressioonile viie tähtaja (st y = x + x 2 + x 3 + x 4 + x 5. Mudel haarab mustri nüüd paremini. See on polünoomse regressiooni jõud.
Tuleme tagasi oma näite juurde. Vanus ei ole sissetulekuga lineaarses seoses. Varases eas võib sissetulek olla nullilähedane, kuna lapsed või noored ei tööta. Siis see suureneb tööeas ja väheneb pensionipõlves. Tavaliselt on see ümberpööratud U-kuju. Üks viis selle mustri jäädvustamiseks on regressioonile kahe astme lisamine.
Vaatame, kas see suurendab täpsust.
Selle uue funktsiooni peate lisama andmekogumisse ja pidevate funktsioonide loendisse.
Lisate uue muutuja rongi- ja testiandmekogumisse, nii et funktsiooni on mugavam kirjutada.
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
Funktsioonil on 3 argumenti:
- df_t: määrake koolituskomplekt
- df_te: määrake testikomplekt
- var_name = 'vanus': määrake teisendatav muutuja
Muutuva vanuse ruudutamiseks saate kasutada objekti pow (2). Pange tähele, et uue muutuja nimi on "uus"
Nüüd, kui funktsioon square_var on kirjutatud, saate luua uued andmekogumid.
df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age')
Nagu näete, on uuel andmekogul veel üks funktsioon.
print(df_train_new.shape, df_test_new.shape)(32561, 16) (16281, 16)
Ruutu muutujat nimetatakse andmekogumis uueks. Peate selle lisama pidevate funktsioonide loendisse.
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]
Pange tähele, et muutsite graafiku kataloogi. Erinevaid mudeleid ei saa koolitada ühes kataloogis. See tähendab, et peate muutma argumenti model_dir teed. Kui te seda ei tee, viskab TensorFlow vea.
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)
Nüüd, kui klassifikaator on koostatud uue andmekogumiga, saate mudelit koolitada ja hinnata.
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}
Ruuduline muutuja parandas täpsust 0,76-lt 0,79-le. Vaatame, kas saate paremini hakkama, kombineerides ämbritsemise ja interaktsioonitermini.
Koppimine ja suhtlemine
Nagu varem nägite, ei suuda lineaarne klassifikaator vanuse ja sissetuleku mustrit õigesti tabada. Seda seetõttu, et see õpib iga funktsiooni jaoks ühe kaalu. Klassifikaatori jaoks on selle lihtsustamiseks üks funktsioon. Koppimine muudab arvulise tunnuse mitmeks kindlaks, lähtudes vahemikust, kuhu see langeb, ja igaüks neist uutest funktsioonidest näitab, kas inimese vanus jääb sellesse vahemikku.
Nende uute funktsioonide abil saab lineaarne mudel seose haarata, õppides iga ämbri jaoks erinevat kaalu.
TensorFlow'is tehakse seda veeruga bucketized_column. Piiridesse peate lisama väärtuste vahemiku.
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])
Te juba teate, et vanus on sissetulekuga mittelineaarne. Teine võimalus mudeli täiustamiseks on suhtlemine. TensorFlow sõnaga on see funktsioonide ületamine. Funktsioonide ületamine on viis uute funktsioonide loomiseks, mis on olemasolevate kombinatsioonid, mis võib olla kasulik lineaarse klassifikaatori jaoks, mis ei saa funktsioonide vahelist interaktsiooni modelleerida.
Vanust saate jagada mõne muu funktsiooniga, näiteks haridusega. See tähendab, et mõnel rühmal on tõenäoliselt kõrge sissetulek ja teisel madal (mõelge doktorandile).
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)]
Funktsioonideülese veeru loomiseks kasutage sulgudes ristumiseks muutujatega cross_column. Hash_bucket_size näitab maksimaalseid ületamisvõimalusi. Muutujate vahelise interaktsiooni loomiseks (vähemalt üks muutuja peab olema kategooriline) saate kasutada tf.feature_column.crossed_column. Selle objekti kasutamiseks peate nurksulgudesse lisama muutuja suhtlemiseks ja teise argumendi, ämbri suuruse. Ämber suurus on maksimaalne rühm võimalik arv muutuja sees. Siin määrate selle väärtuseks 1000, kuna te ei tea gruppide täpset arvu
age_buckets tuleb enne ruudukujulist lisada, et see funktsiooni veergudesse lisada. Samuti lisate funktsioonide veergudele uued funktsioonid ja valmistate ette prognoosija
base_columns = [age_buckets,]model_imp = tf.estimator.LinearClassifier(model_dir="ongoing/train3",feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation)
VÄLJUND
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)
Olete valmis uut mudelit hindama ja vaatama, kas see parandab täpsust.
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}
Uus täpsustase on 83,58 protsenti. See on neli protsenti kõrgem kui eelmine mudel.
Lõpuks võite lisada seadistamise termini, et vältida ülekäimist.
5. samm: hüperparameeter: Lasso & Ridge
Teie mudel saab kannatavad overfitting või underfitting .
- Liigne paigaldamine: mudel ei suuda prognoosi üldistada uutele andmetele
- Alamvarustus: mudel ei suuda andmete mustrit jäädvustada. st lineaarne regressioon, kui andmed on mittelineaarsed
Kui mudelil on palju parameetreid ja suhteliselt väike andmemaht, põhjustab see prognoose halvasti. Kujutage ette, ühel grupil on ainult kolm vaatlust; mudel arvutab selle rühma kaalu. Kaalu kasutatakse ennustamiseks; kui selle konkreetse rühma testikomplekti vaatlused erinevad täielikult treeningkomplektist, siis annab mudel vale ennustuse. Treeningukomplektiga hindamise ajal on täpsus hea, kuid testikomplektiga mitte hea, sest arvutatud kaalud ei ole tõelised mustri üldistamiseks. Sel juhul ei anna see nähtamatute andmete põhjal mõistlikku ennustust.
Ülemäärase paigaldamise vältimiseks annab seadistamine teile võimaluse sellist keerukust kontrollida ja üldistada. Reguleerimise tehnikaid on kaks:
- L1: Lasso
- L2: Ridge
TensorFlow'is saate need kaks hüperparameetrit optimeerijasse lisada. Näiteks, mida kõrgem on hüperparameeter L2, kipub kaal olema väga madal ja nullilähedane. Paigaldatud joon on väga tasane, samas kui nulli lähedane L2 tähendab, et kaalud on regulaarse lineaarse regressiooni lähedal.
Võite ise proovida hüperparameetrite erinevat väärtust ja vaadata, kas saate täpsustaset tõsta.
Pange tähele, et kui muudate hüperparameetrit, peate kustutama kausta käimasolev / rong4, vastasel juhul algab mudel varem koolitatud mudeliga.
Vaatame, kuidas on hüppe täpsus
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))
OUTUT
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)
OUTUT
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Create CheckpointSaverHook.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Saving checkpoints for 1 into ongoing/train4/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 77.4165INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)INFO:tensorflow:global_step/sec: 187.889INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)INFO:tensorflow:global_step/sec: 201.895INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)INFO:tensorflow:global_step/sec: 217.992INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)INFO:tensorflow:global_step/sec: 193.676INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)INFO:tensorflow:global_step/sec: 202.195INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)INFO:tensorflow:global_step/sec: 216.756INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)INFO:tensorflow:global_step/sec: 240.215INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)INFO:tensorflow:global_step/sec: 220.336INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt.INFO:tensorflow:Loss for final step: 43.4942.
model_regu.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)
VÄLJUND
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}
Selle hüperparameetriga suurendate täpsusmõõdikuid veidi. Järgmises õpetuses saate teada, kuidas lineaarset klassifikaatorit tuumameetodi abil parandada.
Kokkuvõte
Mudeli koolitamiseks peate:
- Määratlege omadused: Iseseisvad muutujad: X
- Määrake silt: Sõltuv muutuja: y
- Ehitage rong / katsekomplekt
- Määrake algkaal
- Määratlege kadumisfunktsioon: MSE
- Optimeerige mudelit: gradientne laskumine
- Määratlege:
- Õppimise määr
- Ajastu arv
- Partii suurus
- Klasside arv
Selles õpetuses õppisite kasutama lineaarse regressiooni klassifikaatori jaoks kõrgetasemelist API-d. Peate määratlema:
- Funktsiooni veerud. Kui see on pidev: tf.feature_column.numeric_column (). Saate loendi asendada pythoni loendi mõistmisega
- Hinnanguline: tf.estimator.LinearClassifier (feature_columns, model_dir, n_classes = 2)
- Funktsioon andmete, partii suuruse ja ajastu importimiseks: input_fn ()
Pärast seda olete valmis treenima, hindama ja rongiga ennustama (), hindama () ja ennustama ()
Mudeli jõudluse parandamiseks võite:
- Kasutage polünoomregressiooni
- Suhtlustermin: tf.feature_column.crossed_column
- Lisage seadistamise parameeter