A két leggyakoribb felügyelt tanulási feladat a lineáris regresszió és a lineáris osztályozó. A lineáris regresszió jósol egy értéket, míg a lineáris osztályozó egy osztályt. Ez az oktatóanyag a lineáris osztályozóra összpontosít.
Mi az a lineáris osztályozó?
A gépi tanulás lineáris osztályozója egy módszer az objektum osztályának megkeresésére a statisztikai osztályozás jellemzői alapján. Osztályozási döntést hoz az objektum jellemzőinek lineáris kombinációjának értéke alapján. A lineáris osztályozót olyan gyakorlati problémákban használják, mint a dokumentumok osztályozása és sok változóval rendelkező problémák.
Az osztályozási problémák a gépi tanulási feladat nagyjából 80 százalékát teszik ki. A besorolás célja az egyes osztályok valószínűségének megjóslása adott bemenetek halmaza esetén. A címke (azaz a függő változó) egy diszkrét érték, az úgynevezett osztály.
- Ha a címkének csak két osztálya van, akkor a tanulási algoritmus bináris osztályozó.
- A többosztályos osztályozó kétnél több osztályú címkéket kezel.
Például egy tipikus bináris osztályozási probléma az, hogy megjósolja annak valószínűségét, hogy az ügyfél második vásárlást hajt végre. A képen látható állat típusának megjósolása többosztályos osztályozási probléma, mivel kétnél több állatfajta létezik.
A bemutató elméleti része elsődlegesen a bináris osztályra helyezi a hangsúlyt. A többosztályos kimeneti funkcióról egy későbbi oktatóanyagban tudhat meg többet.
Ebben az oktatóanyagban megtanulja
- Mi az a lineáris osztályozó?
- Hogyan működik a bináris osztályozó?
- Hogyan mérhető a lineáris osztályozó teljesítménye?
- Pontosság
- Zavarzási mátrix
- Pontosság és érzékenység
- Lineáris osztályozó a TensorFlow segítségével
- 1. lépés: Importálja az adatokat
- 2. lépés: Adatkonvertálás
- 3. lépés: Képezze ki az osztályozót
- 4. lépés: Javítsa a modellt
- 5. lépés) Hyperparameter: Lasso & Ridge
Hogyan működik a bináris osztályozó?
Az előző oktatóanyagban megtanulta, hogy egy függvény kétféle változóból áll, egy függő változóból és egy jellemzőkészletből (független változók). A lineáris regresszióban a függő változó tartomány nélküli valós szám. Az elsődleges cél az érték előrejelzése az átlagos négyzethiba minimalizálásával.
A TensorFlow bináris osztályozó esetében a címke két lehetséges egész értékkel rendelkezhetett. A legtöbb esetben vagy [0,1], vagy [1,2]. Például a cél megjósolni, hogy az ügyfél vásárol-e terméket vagy sem. A címke meghatározása a következő:
- Y = 1 (az ügyfél vásárolta a terméket)
- Y = 0 (az ügyfél nem vásárolja meg a terméket)
A modell az X tulajdonságokat használja arra, hogy minden vevőt a legvalószínűbb osztályba sorolja, amelybe tartozik, nevezetesen a potenciális vevő vagy sem.
A siker valószínűségét logisztikai regresszióval számoljuk . Az algoritmus kiszámítja a valószínűséget az X jellemző alapján, és megjósolja a sikert, ha ez a valószínűség meghaladja az 50 százalékot. Formálisabban a valószínűség kiszámítása az alábbi TensorFlow bináris osztályozási példa szerint történik:
ahol 0 a súlyok, a jellemzők és a b torzítás halmaza.
A függvény két részre bontható:
- A lineáris modell
- A logisztikai függvény
Lineáris modell
Ön már ismeri a súlyok kiszámításának módját. A súlyokat egy pont szorzat segítségével számoljuk ki: Y az x i összes jellemző lineáris függvénye . Ha a modellnek nincsenek jellemzői, akkor az előrejelzés megegyezik az elfogultsággal, b.
A súlyok jelzik az x i jellemzők és az y címke közötti korreláció irányát . A pozitív korreláció növeli a pozitív osztály valószínűségét, míg a negatív korreláció a valószínűséget közelíti a 0-hoz (azaz negatív osztályhoz).
A lineáris modell csak a valós számot adja vissza, amely nincs összhangban a [0,1] tartomány valószínűségi mérésével. A logisztikai függvényre van szükség a lineáris modell kimenetének valószínűséggé konvertálásához,
Logisztikai funkció
A logisztikai függvénynek vagy a sigmoid függvénynek S alakja van, és ennek a függvénynek a kimenete mindig 0 és 1 között van.
Könnyű a lineáris regresszió kimenetét a sigmoid függvényre helyettesíteni. Új számot eredményez 0 és 1 közötti valószínűséggel.
Az osztályozó a valószínűséget osztályokká alakíthatja
- A 0 és 0,49 közötti értékek 0 osztályba kerülnek
- A 0,5 és 1 közötti értékek 1. osztályba kerülnek
Hogyan mérhető a lineáris osztályozó teljesítménye?
Pontosság
Az osztályozó teljes teljesítményét a pontossági mutatóval mérik. A pontosság összegyűjti az összes helyes értéket elosztva a megfigyelések teljes számával. Például a 80 százalékos pontosság azt jelenti, hogy az esetek 80 százalékában a modell helyes.
Megfigyelhet egy hiányosságot ezzel a mutatóval, különösen az egyensúlyhiány-osztály esetében. Az egyensúlyhiány-adatkészlet akkor fordul elő, ha a megfigyelések száma csoportonként nem egyenlő. Mondjuk; megpróbál egy ritka eseményt osztályozni logisztikai függvénnyel. Képzelje el, hogy az osztályozó megpróbálja megbecsülni egy beteg halálát egy betegség után. Az adatok szerint a betegek 5 százaléka elmúlik. Képezhet egy osztályozót, hogy megjósolja a halálesetek számát, és a pontosság mutatóval értékelheti a teljesítményeket. Ha az osztályozó a teljes adatkészletre 0 halált jósol, akkor az esetek 95 százalékában helyes lesz.
Zavarzási mátrix
Az osztályozó teljesítményének értékelésének jobb módja, ha megnézzük a zavaros mátrixot.
A zavaros mátrix a tényleges és az előrejelzett osztályok összehasonlításával vizualizálja az osztályozó pontosságát, amint az a fenti lineáris osztályozó példában látható. A bináris zavaros mátrix négyzetekből áll:
- TP: Igaz pozitív: Az előrejelzett értékek helyesen jósolták meg tényleges pozitívnak
- FP: Az előrejelzett értékek helytelenül jósolták meg a tényleges pozitív értéket. azaz pozitívnak jósolt negatív értékek
- FN: hamis negatív: negatívnak jósolt pozitív értékek
- TN: Igaz negatív: Az előrejelzett értékek helyesen jósolták tényleges negatívnak
A zavaros mátrixból könnyen össze lehet hasonlítani a tényleges osztályt és az előrejelzett osztályt.
Pontosság és érzékenység
A zavartsági mátrix jó betekintést nyújt az igazi pozitív és hamis pozitívba. Bizonyos esetekben előnyösebb egy tömörebb metrika.
Pontosság
A precíziós mutató a pozitív osztály pontosságát mutatja. Azt méri, hogy a pozitív osztály előrejelzése mennyire valószínű a helyes.
A maximális pontszám 1, ha az osztályozó tökéletesen osztályozza az összes pozitív értéket. Önmagában a precizitás nem túl hasznos, mert figyelmen kívül hagyja a negatív osztályt. A mutató általában párosul a Visszahívás mutatóval. A visszahívást érzékenységnek vagy valódi pozitív aránynak is nevezik.
Érzékenység
Az érzékenység kiszámítja a helyesen észlelt pozitív osztályok arányát. Ez a mutató azt mutatja meg, hogy a modell mennyire képes felismerni egy pozitív osztályt.
Lineáris osztályozó a TensorFlow segítségével
Ehhez az oktatóanyaghoz a népszámlálási adatkészletet fogjuk használni. A cél a népszámlálási adatkészlet változóinak felhasználása a jövedelemszint előrejelzésére. Vegye figyelembe, hogy a jövedelem bináris változó
- 1 értékkel, ha a jövedelem> 50 ezer
- 0, ha a jövedelem <50k.
Ez a változó a címke
Ez az adatkészlet nyolc kategorikus változót tartalmaz:
- munkahely
- oktatás
- házassági
- Foglalkozása
- kapcsolat
- verseny
- szex
- Szülőföld
ráadásul hat folyamatos változó:
- kor
- fnlwgt
- oktatás_szám
- tőkenyereség
- tőke_veszteség
- óra_ hét
Ezen a TensorFlow osztályozási példán keresztül meg fogja érteni, hogyan kell lineáris TensorFlow osztályozókat képezni a TensorFlow becsléssel, és hogyan lehet javítani a pontosság mutatót.
A következőképpen fogunk eljárni:
- 1. lépés: Importálja az adatokat
- 2. lépés: Adatkonvertálás
- 3. lépés: Képezze ki az osztályozót
- 4. lépés: Javítsa a modellt
- 5. lépés) Hyperparameter: Lasso & Ridge
1. lépés: Importálja az adatokat
Először importálja az oktatóanyag során használt könyvtárakat.
import tensorflow as tfimport pandas as pd
Ezután importálja az adatokat az UCI archívumából, és meghatározza az oszlopok nevét. Az OSZLOPOK segítségével meg fogja nevezni az oszlopokat egy pandák adatkeretében.
Ne feledje, hogy az osztályozót egy Pandas adatkeret segítségével fogja képezni.
## 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"
Az online tárolt adatok már fel vannak osztva a vonatkészlet és a tesztkészlet között.
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)
A vonatkészlet 32 561 megfigyelést, a tesztkészlet pedig 16 281 megfigyelést tartalmaz
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
A Tensorflow logikai értéket igényel az osztályozó képzéséhez. Az értékeket karakterláncról egész számra kell önteni. A címke objektumként tárolható, azonban numerikus értékre kell konvertálnia. Az alábbi kód egy szótárt hoz létre az átalakítandó értékekkel és az oszlopelem fölé vezetéssel. Ne feledje, hogy ezt a műveletet kétszer hajtja végre, egyet a vonatvizsgálathoz, egyet a tesztkészlethez
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]
A vonat adataiban 24 720 jövedelem szerepel 50 000-nél alacsonyabb és 7841 felett. Az arány szinte azonos a tesztkészlet esetében. Kérjük, olvassa el ezt az oktatóanyagot a Facets-ről.
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. lépés: Adatkonvertálás
Néhány lépés szükséges, mielőtt egy lineáris osztályozót betanítana a Tensorflow segítségével. Előkészítenie kell a modellbe beépítendő funkciókat. A benchmark regresszióban az eredeti adatokat transzformáció alkalmazása nélkül fogja használni.
A becslőnek rendelkeznie kell a jellemzők listájával a modell kiképzéséhez. Ezért az oszlop adatait tenzorrá kell átalakítani.
Jó gyakorlat az, hogy a jellemzők két listáját definiáljuk a típusuk alapján, majd továbbadjuk őket a becslő feature_ oszlopaiba.
Először a folyamatos szolgáltatások átalakításával kezdi meg, majd meghatároz egy csoportot a kategorikus adatokkal.
Az adatkészlet szolgáltatásainak két formátuma van:
- Egész szám
- Tárgy
Minden funkció a következő két változóban van felsorolva, típusuk szerint.
## 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']
A feature_column objektum numeric_column-nal van ellátva, amely elősegíti a folyamatos változók tenzorrá történő átalakítását. Az alábbi kódban a CONTI_FEATURES összes változóját számértékű tenzorrá konvertálja. Ez kötelező a modell felépítéséhez. Az összes független változót át kell alakítani a megfelelő típusú tenzorra.
Az alábbiakban írunk egy kódot, amelyből megtudhatja, mi történik a feature_column.numeric_column mögött. Kinyomtatjuk az életkor konvertált értékét. Magyarázó célra szolgál, ezért nincs szükség a python kód megértésére. A kódok megértése érdekében olvassa el a hivatalos dokumentációt.
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.]]
Az értékek pontosan megegyeznek a df_train értékkel
continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]
A TensorFlow dokumentációja szerint a kategorikus adatok konvertálásának különböző módjai vannak. Ha egy szolgáltatás szókincslistája ismert, és nem tartalmaz rengeteg értéket, akkor a kategória oszlop létrehozható a kategória_oszlop_szótár_listával. Minden egyedi szókincslistához hozzárendel egy azonosítót.
Például, ha egy változó állapotának három különálló értéke van:
- Férj
- Feleség
- Egyetlen
Ezután három azonosítót rendelünk hozzá. Például a férjnek azonosítója lesz 1, feleségének azonosítója 2 és így tovább.
Szemléltetés céljából használhatja ezt a kódot egy objektumváltozó kategorikus oszlopká alakításához a TensorFlow-ban.
A nemi jellemzőnek csak két értéke lehet: férfi vagy nő. Amikor átalakítjuk a jellemző nemet, a Tensorflow 2 új oszlopot hoz létre, egyet a hímnek, egyet a nőnek. Ha a nem egyenlő a férfival, akkor az új oszlop hím értéke 1, a nőé pedig 0. Ez a példa az alábbi táblázatban látható:
sorok |
szex |
átalakulás után |
férfi |
női |
1 |
férfi |
=> |
1 |
0 |
2 |
férfi |
=> |
1 |
0 |
3 |
női |
=> |
0 |
1 |
Tensorflow-ban:
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'])
Az alábbiakban Python-kódot adtunk a kódolás kinyomtatásához. Ismét nem kell megértened a kódot, a cél az átalakulás megtekintése
Az adatok átalakításának gyorsabb módja azonban a kategória_oszlop_vagy_hash_bucket módszer használata. Hasznos lesz a string változók megváltoztatása egy ritka mátrixban. A ritka mátrix olyan mátrix, amelynek zöme nulla. A módszer mindenről gondoskodik. Csak a vödrök számát és a kulcsoszlopot kell megadnia. A vödrök száma a csoportok maximális száma, amelyet a Tensorflow létrehozhat. A kulcsoszlop egyszerűen az átalakítandó oszlop neve.
Az alábbi kódban hurkot hoz létre az összes kategorikus jellemző felett.
categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]
3. lépés: Képezze ki az osztályozót
A TensorFlow jelenleg becslést ad a lineáris regresszióról és a lineáris osztályozásról.
- Lineáris regresszió: Lineáris regresszor
- Lineáris osztályozás: LinearClassifier
A lineáris osztályozó szintaxisa megegyezik a lineáris regresszióval kapcsolatos oktatóanyaggal, kivéve egy argumentumot, az n_osztályt. Meg kell határoznia a szolgáltatás oszlopot, a modell könyvtárat, és össze kell hasonlítania a lineáris regresszorral; megadhatod az osztály számát. Logit regresszió esetén az osztály száma 2.
A modell kiszámítja a folyamatos_jellemzők és a kategorikus_jellemzők oszlopainak súlyát.
model = tf.estimator.LinearClassifier(n_classes = 2,model_dir="ongoing/train",feature_columns=categorical_features+ continuous_features)
KIMENET:
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}
Most, hogy az osztályozó meg van határozva, létrehozhatja a beviteli függvényt. A módszer ugyanaz, mint a lineáris regresszor oktatóanyagban. Itt 128-as kötegméretet használ, és összekeveri az adatokat.
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)
Létrehoz egy függvényt a lineáris becslés által megkövetelt argumentumokkal, azaz a korszakok számával, a kötegek számával, és megkeveri az adatkészletet vagy a jegyzetet. Mivel a Pandas módszerrel továbbítja az adatokat a modellbe, meg kell határoznia az X változókat pandas adatkeretként. Ne feledje, hogy a FEATURES-ban tárolt összes adatot áttekinti.
Képezzük a modellt az objektum modellel.vonat. Az előzőleg definiált függvény segítségével táplálja a modellt a megfelelő értékekkel. Ne feledje, hogy a kötegelt méretet 128-ra, a korszakok számát pedig Nincs értékre állítja. A modellt több mint ezer lépésben fogják kiképezni.
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.
Ne feledje, hogy a veszteség később csökkent az utolsó 100 lépés során, azaz 901-ről 1000-re.
A végső veszteség ezer ismétlés után 5444. Becsülheti meg a modelljét a tesztkészleten, és láthatja a teljesítményt. A modell teljesítményének értékeléséhez használnia kell az értékelő objektumot. Táplálja a modellt a tesztkészlettel, és 1-re állítja a korszakok számát, azaz az adatok csak egyszer kerülnek a modellbe.
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}
A TensorFlow az elméleti részben megismert mutatókat adja vissza. Meglepetés nélkül nagy a pontosság a kiegyensúlyozatlan címke miatt. Valójában a modell valamivel jobban teljesít, mint egy véletlenszerű találgatás. Képzelje el, hogy a modell minden olyan háztartást megjósol, amelynek jövedelme alacsonyabb, mint 50 000, és akkor a modell pontossága 70 százalék. Közelebb elemezve láthatja, hogy az előrejelzés és a visszahívás meglehetősen alacsony.
4. lépés: Javítsa a modellt
Most, hogy van referencia modellje, megpróbálhatja javítani, vagyis növelni a pontosságot. Az előző oktatóanyagban megtanulta, hogyan lehet javítani az előrejelzési képességet egy interakciós kifejezéssel. Ebben az oktatóanyagban újra áttekinti ezt az ötletet egy polinom kifejezés hozzáadásával a regresszióhoz.
A polinom regresszió akkor fontos, ha nemlineárisak az adatok. A nemlinearitás rögzítésére kétféle módon van lehetőség.
- Adjon hozzá polinom kifejezést
- Csoportosítsa a folytonos változót kategorikus változóvá
Polinomiális kifejezés
Az alábbi képen láthatja, hogy mi a polinom regresszió. Ez egy egyenlet X változóval, különböző teljesítményű. A második fokú polinom regressziónak két változója van, az X és az X négyzet. A harmadik fokozatnak három változója van, X, X 2 és X 3
Az alábbiakban két változóval, X és Y grafikont készítettünk. Nyilvánvaló, hogy a kapcsolat nem lineáris. Ha hozzáadunk egy lineáris regressziót, láthatjuk, hogy a modell nem képes rögzíteni a mintát (bal oldali kép).
Most nézze meg az alábbi kép bal oldali képét, és öt tagot adtunk a regresszióhoz (azaz y = x + x 2 + x 3 + x 4 + x 5. A modell most sokkal jobban rögzíti a mintát. Ez a polinom regresszió ereje.
Térjünk vissza a példánkra. Az életkor nincs lineáris kapcsolatban a jövedelemmel. Előfordulhat, hogy a korai életkorban a jövedelem közel nulla, mivel a gyermekek vagy a fiatalok nem dolgoznak. Ezután megnő a munkaképes kor, és csökken a nyugdíjazás során. Tipikusan inverz-U alak. Ennek a mintának a megragadásának egyik módja az, hogy a regresszióhoz kettő hatványt adunk.
Lássuk, növeli-e a pontosságot.
Hozzá kell adnia ezt az új szolgáltatást az adatkészlethez és a folyamatos szolgáltatás listájához.
Az új változót hozzáadja a vonat és a teszt adatkészletéhez, így kényelmesebb egy függvény megírása.
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
A függvénynek 3 argumentuma van:
- df_t: definiálja a képzési készletet
- df_te: definiálja a tesztkészletet
- var_name = 'age': Adja meg az átalakítandó változót
Használhatja a pow (2) objektumot a változó életkor négyzetének felrajzolására. Vegye figyelembe, hogy az új változó neve „új”
Most, hogy a square_var függvény meg van írva, létrehozhatja az új adatkészleteket.
df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age')
Mint látható, az új adatkészletnek van még egy funkciója.
print(df_train_new.shape, df_test_new.shape)(32561, 16) (16281, 16)
A négyzet változót újnak nevezzük az adatkészletben. Hozzá kell adnia a folyamatos szolgáltatások listájához.
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]
Ne feledje , hogy megváltoztatta a Graph könyvtárát. Nem lehet különböző modelleket betanítani egy könyvtárba. Ez azt jelenti, hogy meg kell változtatnia a model_dir argumentum elérési útját. Ha nem, akkor a TensorFlow hibát dob.
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)
Most, hogy az osztályozót az új adatkészlettel tervezték, betaníthatja és értékelheti a modellt.
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}
A négyzetes változó 0,76-ról 0,79-re javította a pontosságot. Nézzük meg, hogy tehet-e jobban, ha ötvözi a csoportosítást és az interakciós kifejezést.
Vödörzés és interakció
Mint korábban látta, a lineáris osztályozó nem képes helyesen megragadni az életkor-jövedelem mintázatát. Ez azért van, mert minden funkcióhoz egyetlen súlyt tanul. Az osztályozó megkönnyítése érdekében az egyik dolog, amit megtehet, az a funkció tárolása. A csoportosulás egy numerikus jellemzőt többé alakít át annak alapján, hogy milyen tartományba esik, és ezek az új jellemzők mindegyike jelzi, hogy az ember életkora ebbe a tartományba esik-e.
Ezekkel az új funkciókkal a lineáris modell megragadhatja a kapcsolatot azáltal, hogy az egyes vödrökhöz különböző súlyokat tanul meg.
A TensorFlow-ban a bucketized_column paranccsal történik. Hozzá kell adnia az értéktartományt a határokhoz.
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])
Már tudja, hogy az életkor nem lineáris a jövedelemmel. A modell fejlesztésének másik módja az interakció. A TensorFlow szavai szerint ez a funkció átlépése. A funkciókeresztezés olyan új funkciók létrehozásának módja, amelyek a meglévők kombinációi, ami hasznos lehet egy lineáris osztályozó számára, amely nem képes modellezni a funkciók közötti interakciókat.
Az életkort lebonthatja egy másik funkcióval, például az oktatással. Vagyis egyes csoportok valószínűleg magas jövedelműek, mások alacsonyak (gondoljunk csak a Ph.D. hallgatóra).
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)]
Kereszttulajdonság-oszlop létrehozásához használja a keresztezett_oszlopot a változókkal a zárójelben való keresztezéshez. A hash_bucket_size jelöli a maximális keresztezési lehetőségeket. A változók közötti interakció létrehozásához (legalább egy változónak kategorikusnak kell lennie) használhatja a tf.feature_column.crossed_column elemet. Az objektum használatához szögletes zárójelbe kell tenni a kölcsönhatásba lépő változót és egy második argumentumot, a vödör méretét. A vödör mérete a változókon belüli csoportok maximális száma. Itt állítottad 1000-re, mivel nem tudod a csoportok pontos számát
Az age_buckets négyzetet fel kell venni, mielőtt hozzáadná a szolgáltatás oszlopaihoz. Ezenkívül hozzáadja az új szolgáltatásokat a funkció oszlopokhoz, és előkészíti a becslőt
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)
KIMENET
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)
Készen áll arra, hogy megbecsülje az új modellt, és megnézze, javítja-e a pontosságot.
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}
Az új pontossági szint 83,58 százalék. Négy százalékkal magasabb, mint az előző modell.
Végül felvehet egy szabályozási kifejezést a túlillesztés megakadályozása érdekében.
5. lépés) Hyperparameter: Lasso & Ridge
A modell szenvednek overfitting vagy underfitting .
- Túlterhelés: A modell nem képes általánosítani az előrejelzést új adatokra
- Alulteljesítés: A modell nem képes megragadni az adatok mintázatát. azaz lineáris regresszió, ha az adatok nem lineárisak
Ha egy modell sok paraméterrel és viszonylag alacsony adatmennyiséggel rendelkezik, az rossz előrejelzésekhez vezet. Képzelje el, hogy egy csoportnak csak három megfigyelése van; a modell kiszámítja ennek a csoportnak a súlyát. A súlyt jósláshoz használják; ha az adott csoport tesztkészletének megfigyelései teljesen eltérnek a képzési halmaztól, akkor a modell rossz előrejelzést fog tenni. Az edzéskészlettel végzett értékelés során a pontosság jó, de a tesztkészlettel nem jó, mert a kiszámított súlyok nem igazak a minta általánosításához. Ebben az esetben nem ad ésszerű előrejelzést a nem látott adatokra.
A túlillesztés megakadályozása érdekében a rendszeresítés lehetőséget nyújt az ilyen összetettség ellenőrzésére és általánosabbá tételére. Két szabályozási technika létezik:
- L1: Lasso
- L2: Ridge
A TensorFlow alkalmazásban felveheti ezt a két hiperparamétert az optimalizálóba. Például, minél magasabb az L2 hiperparaméter, a súly nagyon alacsony és közel nulla. Az illesztett vonal nagyon lapos lesz, míg a nullához közeli L2 azt jelenti, hogy a súlyok közel vannak a szabályos lineáris regresszióhoz.
Kipróbálhatja egyedül a hiperparaméterek különböző értékét, és megnézheti, hogy növelheti-e a pontosság szintjét.
Vegye figyelembe, hogy ha megváltoztatja a hiperparamétert, akkor törölnie kell a folyamatban lévő / train4 mappát, különben a modell a korábban betanított modellel indul.
Lássuk, milyen a pontosság a hype-val
model_regu = tf.estimator.LinearClassifier(model_dir="ongoing/train4", feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation,optimizer=tf.train.FtrlOptimizer(learning_rate=0.1,l1_regularization_strength=0.9,l2_regularization_strength=5))
OUPUT
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train4', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec':, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
model_regu.train(input_fn=get_input_fn(df_train_new,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)
OUPUT
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Create CheckpointSaverHook.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Saving checkpoints for 1 into ongoing/train4/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 77.4165INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)INFO:tensorflow:global_step/sec: 187.889INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)INFO:tensorflow:global_step/sec: 201.895INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)INFO:tensorflow:global_step/sec: 217.992INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)INFO:tensorflow:global_step/sec: 193.676INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)INFO:tensorflow:global_step/sec: 202.195INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)INFO:tensorflow:global_step/sec: 216.756INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)INFO:tensorflow:global_step/sec: 240.215INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)INFO:tensorflow:global_step/sec: 220.336INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt.INFO:tensorflow:Loss for final step: 43.4942.
model_regu.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)
KIMENET
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}
Ezzel a hiperparaméterrel kissé növeli a pontosság mutatóit. A következő oktatóanyagban megtanulhatja, hogyan lehet egy lineáris osztályozót kernelmódszerrel fejleszteni.
Összegzés
A modell kiképzéséhez:
- Definiálja a jellemzőket: Független változók: X
- Határozza meg a címkét: Függő változó: y
- Készítsen vonatot / tesztkészletet
- Határozza meg a kezdeti súlyt
- Definiálja a veszteségfüggvényt: MSE
- Optimalizálja a modellt: gradiens süllyedés
- Határozza meg:
- Tanulási arány
- Korszakok száma
- Csomó méret
- Osztály száma
Ebben az oktatóanyagban megtanulta, hogyan kell használni a magas szintű API-t egy lineáris regressziós osztályozóhoz. Meg kell határoznia:
- Feature oszlopok. Ha folyamatos: tf.feature_column.numeric_column (). A listát python lista megértésével töltheti fel
- A becslő: tf.estimator.LinearClassifier (feature_columns, model_dir, n_classes = 2)
- Az adatok, a kötegméret és a korszak importálására szolgáló függvény: input_fn ()
Ezt követően készen áll az edzésre, az értékelésre és a vonattal való előrejelzésre (), az értékelésre () és a jóslásra ()
A modell teljesítményének javítása érdekében a következőket teheti:
- Használjon polinom regressziót
- Interakciós kifejezés: tf.feature_column.crossed_column
- Adjon hozzá szabályozási paramétert