Klasyfikacja binarna TensorFlow: przykład klasyfikatora liniowego

⚡ Inteligentne podsumowanie

Klasyfikatory liniowe przypisują każdą obserwację do klasy na podstawie ważonej sumy jej cech. W tym przewodniku zbudujemy binarny klasyfikator TensorFlow na podstawie zbioru danych spisowych i zwiększymy jego dokładność z 0.76 do 0.84.

  • 🔘 Definicja podstawowa: Klasyfikator liniowy przewiduje klasę dyskretną na podstawie liniowej kombinacji wartości cech.
  • Krok prawdopodobieństwa: Funkcja logistyczna przekształca wynik modelu liniowego na prawdopodobieństwo pomiędzy 0 i 1.
  • Metryki mają znaczenie: Sama dokładność wprowadza w błąd w przypadku niezrównoważonych etykiet, dlatego należy ją połączyć z matrycą pomyłek, precyzją i odwołaniem.
  • 🧪 Przegląd spisu: Sześć kolumn ciągłych i osiem kolumn kategorycznych staje się tensorami zanim estymator je zobaczy.
  • 🛠️. Inżynieria funkcji: Podniesienie wieku do kwadratu, zaliczenie go do grup, a następnie skrzyżowanie wykształcenia z zawodem podnosi dokładność z 0.7616 do 0.8358.
  • 📈 Uregulowanie: Optymalizator Ftrl z L1 na poziomie 0.9 i L2 na poziomie 5 podnosi ostateczną dokładność do 0.8383.

Klasyfikator liniowy TensorFlow do klasyfikacji binarnej

Dwa najczęstsze Nadzorowana nauka zadaniami są regresja liniowa i klasyfikator liniowy. Regresja liniowa przewiduje wartość, podczas gdy klasyfikator liniowy przewiduje klasę. Ten samouczek skupia się na klasyfikatorach liniowych.

Co to jest klasyfikator liniowy?

A Klasyfikator liniowy w uczeniu maszynowym to metoda znajdowania klasy obiektu na podstawie jego charakterystyki na potrzeby klasyfikacji statystycznej. Podejmuje decyzję o klasyfikacji na podstawie wartości kombinacji liniowej cech obiektu. Klasyfikator liniowy jest stosowany w problemach praktycznych, takich jak klasyfikacja dokumentów i problemy posiadające wiele zmiennych.

Problemy z klasyfikacją stanowią około 80 procent zadań uczenia maszynowego. Klasyfikacja ma na celu przewidzenie prawdopodobieństwa każdej klasy przy danym zestawie danych wejściowych. Etykieta (tj. zmienna zależna) jest wartością dyskretną, zwaną klasą.

  1. Jeśli etykieta ma tylko dwie klasy, algorytmem uczenia jest klasyfikator binarny.
  2. Klasyfikator wieloklasowy obsługuje etykiety zawierające więcej niż dwie klasy.

Na przykład typowym problemem klasyfikacji binarnej jest przewidzenie prawdopodobieństwa, że ​​klient dokona drugiego zakupu. Przewidzenie rodzaju zwierzęcia wyświetlanego na obrazku jest problemem klasyfikacji wieloklasowej, ponieważ istnieją więcej niż dwie odmiany zwierząt.

Część teoretyczna tego samouczka skupia się przede wszystkim na klasie binarnej. Więcej o wieloklasowej funkcji wyjściowej dowiesz się w następnym samouczku.

Mając definicję, następnym krokiem jest sprawdzenie, w jaki sposób algorytm przekształca surowe cechy w decyzję klasową.

Jak działa klasyfikator binarny?

Z poprzedniego samouczka dowiedziałeś się, że funkcja składa się z dwóch rodzajów zmiennych, zmiennej zależnej i zestawu cech (zmiennych niezależnych). W regresji liniowej zmienną zależną jest liczba rzeczywista bez zakresu. Podstawowym celem jest przewidzenie jego wartości poprzez minimalizację błędu średniokwadratowego.

Dla litu szacuje się TensorFlow W klasyfikatorze binarnym etykieta może mieć dwie możliwe wartości całkowite. W większości przypadków jest to [0,1] lub [1,2]. Na przykład celem jest przewidzenie, czy klient kupi produkt, czy nie. Etykieta jest definiowana w następujący sposób:

  • Y = 1 (klient kupił produkt)
  • Y = 0 (klient nie kupuje produktu)

Model wykorzystuje cechy X do zaklasyfikowania każdego klienta do najbardziej prawdopodobnej klasy, do której należy, czyli potencjalnego nabywcy lub nie.

Oblicza się prawdopodobieństwo sukcesu regresja logistyczna. Algorytm obliczy prawdopodobieństwo na podstawie cechy X i przewidzi sukces, gdy prawdopodobieństwo to przekroczy 50 procent. Bardziej formalnie, prawdopodobieństwo oblicza się w sposób pokazany w poniższym przykładzie klasyfikacji binarnej TensorFlow:

Wzór na prawdopodobieństwo sigmoidalne używany przez klasyfikator binarny TensorFlow

gdzie 0 to zbiór wag, cech, a b odchylenie.

Funkcję można rozłożyć na dwie części:

  • Model liniowy
  • Funkcja logistyczna

Model liniowy

Znasz już sposób obliczania wag. Wagi są obliczane za pomocą iloczynu skalarnego:Iloczyn skalarny wektora wagowego i wektora cech Y jest funkcją liniową wszystkich cech xi. Jeżeli model nie posiada cech, predykcja jest równa obciążeniu, b.

Wagi wskazują kierunek korelacji pomiędzy cechami xi i etykieta y. Dodatnia korelacja zwiększa prawdopodobieństwo klasy dodatniej, podczas gdy korelacja ujemna prowadzi prawdopodobieństwo bliżej 0 (tj. klasy ujemnej).

Model liniowy zwraca tylko liczbę rzeczywistą, co jest niezgodne z miarą prawdopodobieństwa zakresu [0,1]. Funkcja logistyczna jest wymagana do przekształcenia wyniku modelu liniowego na prawdopodobieństwo,

Funkcja logistyczna

Funkcja logistyczna, czyli funkcja sigmoidalna, ma kształt litery S, a wynik tej funkcji zawsze mieści się w przedziale od 0 do 1.

Poniższy wzór opisuje transformację, a wykres pokazuje, że powstała krzywa spłaszcza się w kierunku 0 po lewej stronie i w kierunku 1 po prawej stronie.

Wzór funkcji logistycznej, który odwzorowuje wynik liniowy na prawdopodobieństwo

Krzywa sigmoidalna w kształcie litery S ograniczona między 0 a 1
Przykład funkcji logistycznej

Wynik regresji liniowej łatwo jest zastąpić funkcją sigmoidalną. Wynikiem tego jest nowa liczba z prawdopodobieństwem od 0 do 1.

Klasyfikator może przekształcić prawdopodobieństwo w klasę

  • Wartości od 0 do 0.49 stają się klasą 0
  • Wartości od 0.5 do 1 stają się klasą 1

Gdy model wygeneruje klasy, trzeba mieć sposób na ocenę, czy te klasy są dobre.

Jak zmierzyć wydajność klasyfikatora liniowego?

Dokładność

Ogólną wydajność klasyfikatora mierzy się za pomocą metryki dokładności. Dokładność zbiera wszystkie prawidłowe wartości podzielone przez całkowitą liczbę obserwacji. Na przykład wartość dokładności wynosząca 80 procent oznacza, że ​​model jest poprawny w 80 procentach przypadków.

Wzór na dokładność zliczający poprawne przewidywania na podstawie całkowitej liczby obserwacji

Zmierz wydajność klasyfikatora liniowego za pomocą metryki dokładności

Można zauważyć niedociągnięcie tej metryki, szczególnie w przypadku klasy nierównowagi. Zbiór danych nierównowagi występuje, gdy liczba obserwacji na grupę nie jest równa. Powiedzmy, że próbujesz sklasyfikować rzadkie zdarzenie za pomocą funkcji logistycznej. Wyobraź sobie, że klasyfikator próbuje oszacować śmierć pacjenta po chorobie. W danych 5 procent pacjentów umiera. Możesz wytrenować klasyfikator, aby przewidywał liczbę zgonów i użyć metryki dokładności, aby ocenić wydajność. Jeśli klasyfikator przewiduje 0 zgonów dla całego zbioru danych, będzie poprawny w 95 procentach przypadków.

Macierz pomyłek

Lepszym sposobem oceny wydajności klasyfikatora jest spojrzenie na macierz zamieszania.

Macierz pomyłek binarnych pokazująca kwadraty TP, FP, FN i TN

Zmierz wydajność klasyfikatora liniowego za pomocą macierzy Confusion

matryca zamieszania wizualizuje dokładność klasyfikatora poprzez porównanie rzeczywistych i przewidywanych klas, jak pokazano w powyższym przykładzie Klasyfikatora liniowego. Macierz pomyłek binarnych składa się z kwadratów:

  • TP: True Positive: Przewidywane wartości prawidłowo przewidywane jako rzeczywiste dodatnie
  • FP: Przewidywane wartości błędnie przewidywały rzeczywistą wartość dodatnią. tj. wartości ujemne przewidywane jako dodatnie
  • FN: Fałszywie Negatywne: Wartości dodatnie przewidywane jako ujemne
  • TN: True Negative: Przewidywane wartości prawidłowo przewidywane jako rzeczywiste ujemne

Korzystając z macierzy zamieszania, łatwo jest porównać klasę rzeczywistą i klasę przewidywaną.

Precyzja i czułość

Matryca zamieszania zapewnia dobry wgląd w informacje o wartościach prawdziwie dodatnich i fałszywie dodatnich. W niektórych przypadkach lepiej jest mieć bardziej zwięzłe dane.

Precyzja

Metryka precyzji pokazuje dokładność klasy dodatniej. Mierzy prawdopodobieństwo, że przewidywanie klasy dodatniej jest prawidłowe.

Wzór na precyzję, prawdziwe wyniki dodatnie w porównaniu z przewidywanymi wynikami dodatnimi

Maksymalny wynik wynosi 1, gdy klasyfikator doskonale klasyfikuje wszystkie wartości dodatnie. Sama precyzja nie jest zbyt pomocna, ponieważ ignoruje klasę ujemną. Metryka jest zwykle łączona z metryką Recall. Przypomnienie jest również nazywane wrażliwością lub prawdziwie dodatnim współczynnikiem.

Wrażliwość

Czułość oblicza stosunek poprawnie wykrytych klas dodatnich. Metryka ta określa, jak dobrze model rozpoznaje klasę dodatnią.

Wzór na wrażliwość, prawdziwe pozytywy w porównaniu z rzeczywistymi pozytywami

Teoria jest już gotowa, więc dalsza część tego przewodnika będzie jej zastosowaniem w całym kodzie.

Klasyfikator liniowy z TensorFlow

W tym samouczku użyjemy zbioru danych spisowych. Celem jest wykorzystanie zmiennych ze zbioru danych spisowych do przewidywania poziomu dochodów. Należy pamiętać, że dochód jest zmienną binarną

  • z wartością 1, jeżeli dochód > 50 tys
  • 0 jeżeli dochód < 50 tys.

Ta zmienna jest Twoją etykietą

Ten zbiór danych zawiera osiem zmiennych kategorycznych:

  • miejsce pracy
  • Edukacja
  • małżeński
  • zawód
  • związek
  • wyścig
  • seks
  • ojczyźnie

ponadto sześć zmiennych ciągłych:

  • wiek
  • fnlwgt
  • edukacja_num
  • zysk kapitałowy
  • strata_kapitału
  • godziny_tydzień

Dzięki temu przykładowi klasyfikacji TensorFlow zrozumiesz, jak szkolić liniowe klasyfikatory TensorFlow za pomocą estymatora TensorFlow i jak poprawić metrykę dokładności.

Uwaga dotycząca wersji: Poniższy kod wykorzystuje API TensorFlow 1.x Estimator. tf-estimator pakiet został wydany w wersji finalnej z TensorFlow 2.15 i nie jest dostępny w TensorFlow 2.16 lub nowszych, dlatego należy uruchomić te fragmenty kodu w TensorFlow 1.x lub przenieść je za pomocą oficjalnej wersji przewodnik po migracji canned-estimatorKoncepcje, inżynieria funkcji i metryki pozostają takie same.

Postępujemy następująco:

  • Krok 1) Zaimportuj dane
  • Krok 2) Konwersja danych
  • Krok 3) Wytrenuj klasyfikator
  • Krok 4) Ulepsz model
  • Krok 5) Hiperparametr: Lasso i Ridge

Krok 1) Zaimportuj dane

Najpierw importujesz biblioteki używane w samouczku.

import tensorflow as tf
import pandas as pd

Następnie importujesz dane z archiwum UCI i definiujesz nazwy kolumn. Użyjesz COLUMNS, aby nazwać kolumny w ramce danych pandas.

Pamiętaj, że będziesz szkolić klasyfikator przy użyciu ramki danych Pandas.

## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital',
           'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
           'hours_week', 'native_country', 'label']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
PATH_test = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test"

Dane przechowywane online są już podzielone pomiędzy skład pociągowy i zestaw testowy.

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)

Zestaw pociągowy zawiera 32,561 16,281 obserwacji, a zestaw testowy XNUMX XNUMX

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

TensorFlow wymaga wartości logicznej do trenowania klasyfikatora. Musisz rzutować wartości z ciągu znaków na liczbę całkowitą. Etykieta jest przechowywana jako obiekt, jednak musisz ją przekonwertować na wartość liczbową. Poniższy kod tworzy słownik z wartościami do przekonwertowania i wykonuje pętlę po elemencie kolumny. Pamiętaj, że tę operację wykonujesz dwukrotnie: raz dla testu trenowania, a drugi dla zestawu testowego.

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]

W danych dotyczących pociągów jest 24 720 dochodów niższych niż 50 tys. i 7841 powyżej. Współczynnik jest prawie taki sam dla zbioru testowego, więc około 76 procent obu podziałów ma klasę ujemną.

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

Krok 2) Konwersja danych

Przed wytrenowaniem klasyfikatora liniowego za pomocą TensorFlow należy wykonać kilka kroków. Należy przygotować cechy, które zostaną uwzględnione w modelu. W regresji testowej użyjesz oryginalnych danych bez żadnej transformacji, dokładnie tak, jak… nauka-scikit Rurociąg będzie zaczynał się od surowych kolumn.

Estymator musi mieć listę funkcji do uczenia modelu. Dlatego dane kolumny wymagają konwersji na tensor.

Dobrą praktyką jest zdefiniowanie dwóch list obiektów w oparciu o ich typ, a następnie przekazanie ich w kolumnach feature_columns estymatora.

Zaczniesz od konwersji cech ciągłych, a następnie zdefiniujesz segment z danymi kategorycznymi.

Funkcje zbioru danych mają dwa formaty:

  • Liczba całkowita
  • przedmiot

Każda funkcja jest wymieniona w dwóch kolejnych zmiennych zgodnie z jej typem.

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

Feature_column jest wyposażona w obiekt numeric_column, który pomaga w transformacji zmiennych ciągłych na tensor. W poniższym kodzie konwertujesz wszystkie zmienne z CONTI_FEATURES na tensor o wartości liczbowej. Jest to konieczne do skonstruowania modelu. Wszystkie zmienne niezależne należy przekonwertować na odpowiedni typ tensora.

Poniżej piszemy kod, który pokazuje, co dzieje się za feature_column.numeric_column. Wydrukujemy przekonwertowaną wartość dla age. Służy to celom objaśniającym, dlatego nie ma potrzeby rozumienia Python Kod. Aby zrozumieć kody, zapoznaj się z oficjalną dokumentacją.

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

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

    ## Convert age
    if continuous == True:
        c = tf.feature_column.numeric_column(feature)
        feature_columns = [c]
    else: 
        c = tf.feature_column.categorical_column_with_hash_bucket(feature, hash_bucket_size=size) 
        c_indicator = tf.feature_column.indicator_column(c)
        feature_columns = [c_indicator]
    
## Use input_layer to print the value
    input_layer = tf.feature_column.input_layer(
        features=d,
        feature_columns=feature_columns
        )
    ## Create lookup table
    zero = tf.constant(0, dtype=tf.float32)
    where = tf.not_equal(input_layer, zero)
    ## Return lookup tble
    indices = tf.where(where)
    values = tf.gather_nd(input_layer, indices)
    ## Initiate graph
    sess = tf.Session()
    ## Print value
    print(sess.run(input_layer))
print_transformation(feature = "age", continuous = True) 
[[39.]
 [50.]
 [38.]
 ...
 [58.]
 [22.]
 [52.]]

Wartości są dokładnie takie same jak w df_train

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

Zgodnie z dokumentacją TensorFlow istnieją różne sposoby konwersji danych kategorycznych. Jeżeli lista słownictwa danej cechy jest znana i nie zawiera zbyt wielu wartości, możliwe jest utworzenie kolumny kategorycznej za pomocą kolumny kategorycznej_z_listą_słownictwa. Przypisuje do wszystkich unikalnych list słownictwa identyfikator.

Na przykład, jeśli status zmiennej ma trzy różne wartości:

  • mąż
  • Żona
  • Single

Następnie zostaną przypisane trzy identyfikatory. Na przykład mąż będzie miał identyfikator 1, żona będzie miał identyfikator 2 i tak dalej.

Dla celów ilustracyjnych możesz użyć tego kodu, aby przekonwertować zmienną obiektową na kolumnę kategorialną w TensorFlow.

Płeć może mieć tylko dwie wartości: męską lub żeńską. Podczas konwersji płci, TensorFlow utworzy dwie nowe kolumny: jedną dla mężczyzny i jedną dla kobiety. Jeśli płeć jest równa mężczyźnie, nowa kolumna „mężczyzna” będzie równa 1, a „kobieta” – 0. Przykład ten przedstawiono w poniższej tabeli:

wydziwianie seks po transformacji zły Płeć żeńska
1 zły => 1 0
2 zły => 1 0
3 Płeć żeńska => 0 1

W tensorflow:

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

Poniżej dodaliśmy Python kod, aby wydrukować kodowanie. Ponownie, nie musisz rozumieć kodu, celem jest zobaczenie transformacji

Jednak szybszym sposobem na transformację danych jest użycie metody categorical_column_with_hash_bucket. Modyfikacja zmiennych łańcuchowych w macierzy rzadkiej będzie przydatna. Macierz rzadka to macierz z przewagą zer. Metoda zajmuje się wszystkim. Wystarczy określić liczbę przedziałów i kolumnę kluczową. Liczba przedziałów to maksymalna liczba grup, jaką TensorFlow może utworzyć. Kolumna kluczowa to po prostu nazwa kolumny do konwersji.

W poniższym kodzie tworzysz pętlę obejmującą wszystkie funkcje kategoryczne.

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

Krok 3) Wytrenuj klasyfikator

TensorFlow zapewnia obecnie estymator regresji liniowej i klasyfikacji liniowej.

  • Regresja liniowa: LinearRegressor
  • Klasyfikacja liniowa: LinearClassifier

Składnia klasyfikatora liniowego jest taka sama jak w tutorialu regresji liniowej z wyjątkiem jednego argumentu, n_class. Musisz zdefiniować kolumnę funkcji, katalog modelu i porównać z regresorem liniowym; masz zdefiniowany numer klasy. W przypadku regresji logitowej liczba klas jest równa 2.

Model obliczy wagi kolumn zawartych w parametrach Continuous_features i categorical_features.

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

Wydajność

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': 
<tensorflow.python.training.server_lib.ClusterSpec object at 0x181f24c898>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

Teraz, gdy klasyfikator jest zdefiniowany, możesz utworzyć funkcję wejściową. Metoda jest taka sama jak w samouczku dotyczącym regresora liniowego. Tutaj używasz partii o rozmiarze 128 i tasujesz dane.

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)

Tworzysz funkcję z argumentami wymaganymi przez estymator liniowy, tj. liczbą epok, liczbą partii i tasujesz zbiór danych lub notatkę. Ponieważ używasz Pandy metodę przekazywania danych do modelu, musisz zdefiniować zmienne X jako ramkę danych pandy. Pamiętaj, że zapętlasz wszystkie dane przechowywane w FUNKCJE.

Wytrenujmy model za pomocą obiektu model.train. Używasz wcześniej zdefiniowanej funkcji, aby zasilić model odpowiednimi wartościami. Należy pamiętać, że rozmiar partii został ustawiony na 128, a liczba epok na Brak. Model zostanie przeszkolony w tysiącu kroków.

model.train(input_fn=get_input_fn(df_train, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
									 
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow: Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into ongoing/train/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 65.8282
INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)
INFO:tensorflow:global_step/sec: 118.386
INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)
INFO:tensorflow:global_step/sec: 110.542
INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)
INFO:tensorflow:global_step/sec: 199.03
INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)
INFO:tensorflow:global_step/sec: 167.488
INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)
INFO:tensorflow:global_step/sec: 220.155
INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)
INFO:tensorflow:global_step/sec: 199.016
INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)
INFO:tensorflow:global_step/sec: 197.531
INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)
INFO:tensorflow:global_step/sec: 208.479
INFO:tensorflow:loss = 22201.918, step = 901 (0.479 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train/model.ckpt.
INFO:tensorflow:Loss for final step: 5444.363.

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

Należy zauważyć, że strata zmniejszała się stopniowo w ciągu ostatnich 100 kroków, tj. z 901 do 1000.

Ostateczna strata po tysiącu iteracji wynosi 5444. Możesz oszacować swój model na zestawie testowym i zobaczyć jego wydajność. Aby ocenić wydajność swojego modelu, musisz użyć oceny obiektu. Zasilasz model zbiorem testowym i ustawiasz liczbę epok na 1, czyli dane trafią do modelu tylko raz.

model.evaluate(input_fn=get_input_fn(df_test, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
									  
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:22
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:23
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7615626, accuracy_baseline = 0.76377374, auc = 0.63300294, auc_precision_recall = 0.50891197, average_loss = 47.12155, global_step = 1000, label/mean = 0.23622628, loss = 5993.6406, precision = 0.49401596, prediction/mean = 0.18454961, recall = 0.38637546

{'accuracy': 0.7615626,
 'accuracy_baseline': 0.76377374,
 'auc': 0.63300294,
 'auc_precision_recall': 0.50891197,
 'average_loss': 47.12155,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 5993.6406,
 'precision': 0.49401596,
 'prediction/mean': 0.18454961,
 'recall': 0.38637546}

TensorFlow zwraca wszystkie metryki, których nauczyłeś się w części teoretycznej. Bez zaskoczenia dokładność jest duża ze względu na niewyważoną etykietę. W rzeczywistości model działa nieco lepiej niż przypuszczenie losowe. Wyobraźmy sobie, że model przewiduje wszystkie gospodarstwa domowe o dochodach niższych niż 50 tys., wówczas model ma dokładność na poziomie 70 proc. Po bliższej analizie widać, że przewidywanie i zapamiętywanie są dość niskie.

Krok 4) Ulepsz model

Teraz, gdy masz już model wzorcowy, możesz spróbować go ulepszyć, czyli zwiększyć dokładność. W poprzednim samouczku nauczyłeś się, jak poprawić siłę przewidywania za pomocą terminu interakcji. W tym samouczku powrócisz do tego pomysłu, dodając składnik wielomianowy do regresji.

Regresja wielomianowa jest pomocna, gdy dane wykazują nieliniowość. Istnieją dwa sposoby uchwycenia nieliniowości danych.

  • Dodaj składnik wielomianowy
  • Przekształć zmienną ciągłą w zmienną kategoryczną

Termin wielomianowy

Na poniższym obrazku możesz zobaczyć, czym jest regresja wielomianowa. Jest to równanie z X zmiennymi o różnej mocy. Regresja wielomianowa drugiego stopnia ma dwie zmienne, X i X kwadrat. Trzeci stopień ma trzy zmienne: X, X2i X3

Równania regresji wielomianowej drugiego i trzeciego stopnia

Co to jest regresja wielomianowa

Powyższy wykres przedstawia krzywą drugiego stopnia w odniesieniu do równania, na którym się opiera. Poniżej zbudowaliśmy wykres z dwiema zmiennymi, X i Y. Zależność ta jest oczywista i nieliniowa. Jeśli dodamy regresję liniową, zobaczymy, że model nie jest w stanie uchwycić wzorca (rysunek po lewej).

Teraz spójrz na lewy obrazek z poniższego obrazka, do regresji dodaliśmy pięcioskładnikowy (czyli y=x+x2+x3+x4+x5. Model teraz znacznie lepiej oddaje wzór. To jest potęga regresji wielomianowej.

Dopasowanie liniowe a dopasowanie wielomianu pięciowyrazowego na tym samym wykresie punktowym

Wróćmy do naszego przykładu. Wiek nie ma liniowej zależności od dochodów. W młodym wieku dochód może być stały bliski zeru, ponieważ dzieci i młodzi ludzie nie pracują. Następnie wzrasta w wieku produkcyjnym i maleje w okresie emerytalnym. Zwykle ma kształt odwróconego U. Jednym ze sposobów uchwycenia tego wzorca jest dodanie potęgi dwa do regresji.

Zobaczymy, czy zwiększy to dokładność.

Musisz dodać tę nową funkcję do zbioru danych i na listę funkcji ciągłych.

Dodajesz nową zmienną do zbioru danych pociągu i testu, więc wygodniej jest napisać funkcję.

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

Funkcja ma 3 argumenty:

  • df_t: zdefiniuj zbiór treningowy
  • df_te: zdefiniuj zestaw testowy
  • var_name = 'age': Zdefiniuj zmienną do przekształcenia

Możesz użyć obiektu pow(2) do podniesienia zmiennej wieku do kwadratu. Zauważ, że nowa zmienna nosi nazwę „new”

Teraz, gdy funkcja Square_var została napisana, możesz utworzyć nowe zbiory danych.

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

Jak widać, nowy zbiór danych ma jeszcze jedną funkcję.

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

Zmienna kwadratowa nazywana jest nową w zbiorze danych. Musisz dodać go do listy funkcji ciągłych.

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]

Note że zmieniłeś katalog Graph. Nie można trenować różnych modeli w tym samym katalogu. Oznacza to, że musisz zmienić ścieżkę argumentu katalog_modelu. Jeśli tego nie zrobisz, TensorFlow zgłosi błąd.

model_1 = tf.estimator.LinearClassifier(
    model_dir="ongoing/train1", 
    feature_columns=categorical_features+ continuous_features_new)
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': 
<tensorflow.python.training.server_lib.ClusterSpec object at 0x1820f04b70>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
FEATURES_NEW = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'new']
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES_NEW}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)

Teraz, gdy klasyfikator został zaprojektowany przy użyciu nowego zestawu danych, można trenować i oceniać model.

model_1.train(input_fn=get_input_fn(df_train, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into ongoing/train1/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 81.487
INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)
INFO:tensorflow:global_step/sec: 111.169
INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)
INFO:tensorflow:global_step/sec: 128.91
INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)
INFO:tensorflow:global_step/sec: 132.546
INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)
INFO:tensorflow:global_step/sec: 162.194
INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)
INFO:tensorflow:global_step/sec: 204.852
INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)
INFO:tensorflow:global_step/sec: 188.923
INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)
INFO:tensorflow:global_step/sec: 192.041
INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)
INFO:tensorflow:global_step/sec: 197.025
INFO:tensorflow:loss = 3309.5786, step = 901 (0.507 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train1/model.ckpt.
INFO:tensorflow:Loss for final step: 28861.898.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1820f04c88>
model_1.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:37
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:39
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7944229, accuracy_baseline = 0.76377374, auc = 0.6093755, auc_precision_recall = 0.54885805, average_loss = 111.0046, global_step = 1000, label/mean = 0.23622628, loss = 14119.265, precision = 0.6682401, prediction/mean = 0.09116262, recall = 0.2576703

{'accuracy': 0.7944229,
 'accuracy_baseline': 0.76377374,
 'auc': 0.6093755,
 'auc_precision_recall': 0.54885805,
 'average_loss': 111.0046,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 14119.265,
 'precision': 0.6682401,
 'prediction/mean': 0.09116262,
 'recall': 0.2576703}

Zmienna kwadratowa poprawiła dokładność z 0.76 do 0.79. Zobaczmy, czy można zrobić lepiej, łącząc razem termin „wiadrowania” i interakcji.

Bucketyzacja i interakcja

Jak widzieliśmy wcześniej, klasyfikator liniowy nie jest w stanie poprawnie uchwycić wzorca dochodów ze względu na wiek. Dzieje się tak dlatego, że uczy się pojedynczej wagi dla każdej cechy. Aby ułatwić klasyfikatorowi, jedną rzeczą, którą możesz zrobić, jest podzielenie tej funkcji. Buckowanie przekształca cechę liczbową w kilka określonych w zależności od zakresu, w jakim się ona znajduje, a każda z tych nowych funkcji wskazuje, czy wiek danej osoby mieści się w tym zakresie.

Dzięki tym nowym funkcjom model liniowy może uchwycić relację, ucząc się różnych wag dla każdego segmentu.

W TensorFlow odbywa się to za pomocą Bucketized_column. Musisz dodać zakres wartości w granicach.

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

Już wiesz, że wiek nie zależy od dochodów. Innym sposobem ulepszenia modelu jest interakcja. W języku TensorFlow jest to skrzyżowanie cech. Krzyżowanie cech to sposób na tworzenie nowych cech będących kombinacjami istniejących, co może być pomocne w przypadku klasyfikatora liniowego, który nie może modelować interakcji między cechami.

Możesz podzielić wiek za pomocą innej funkcji, np. Edukacja. Oznacza to, że niektóre grupy prawdopodobnie będą miały wysokie dochody, a inne niskie (pomyśl o doktorancie).

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

Aby utworzyć kolumnę zawierającą elementy krzyżowe, użyj kolumny cross_column ze zmiennymi do przekreślenia w nawiasach. Hash_bucket_size wskazuje maksymalne możliwości przekroczenia. Aby stworzyć interakcję pomiędzy zmiennymi (przynajmniej jedna zmienna musi być kategoryczna), możesz użyć tf.feature_column.crossed_column. Aby użyć tego obiektu, należy dodać w nawiasie kwadratowym zmienną, z którą ma nastąpić interakcja, oraz drugi argument, czyli rozmiar wiadra. Rozmiar segmentu to maksymalna liczba grup możliwa w ramach zmiennej. Tutaj ustawiasz ją na 1000, ponieważ nie znasz dokładnej liczby grup

age_buckets musi zostać podniesiony do kwadratu przed dodaniem go do kolumn funkcji. Dodajesz także nowe funkcje do kolumn funkcji i przygotowujesz estymator

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)

Wydajność

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train3', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1823021be0>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
FEATURES_imp = ['age','workclass', 'education', 'education_num', 'marital',
                'occupation', 'relationship', 'race', 'sex', 'native_country', 'new']

def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES_imp}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)

Można już przystąpić do oszacowania nowego modelu i sprawdzenia, czy poprawi on dokładność.

model_imp.train(input_fn=get_input_fn(df_train_new, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
									  
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into ongoing/train3/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 94.969
INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)
INFO:tensorflow:global_step/sec: 242.342
INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)
INFO:tensorflow:global_step/sec: 213.686
INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)
INFO:tensorflow:global_step/sec: 174.084
INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)
INFO:tensorflow:global_step/sec: 191.78
INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)
INFO:tensorflow:global_step/sec: 163.436
INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)
INFO:tensorflow:global_step/sec: 164.347
INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)
INFO:tensorflow:global_step/sec: 154.274
INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)
INFO:tensorflow:global_step/sec: 189.14
INFO:tensorflow:loss = 44.69645, step = 901 (0.531 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train3/model.ckpt.
INFO:tensorflow:Loss for final step: 44.18133.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1823021cf8>
model_imp.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
									  
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:52
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:54
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.8358209, accuracy_baseline = 0.76377374, auc = 0.88401634, auc_precision_recall = 0.69599575, average_loss = 0.35122654, global_step = 1000, label/mean = 0.23622628, loss = 44.67437, precision = 0.68986726, prediction/mean = 0.23320661, recall = 0.55408216


{'accuracy': 0.8358209,
 'accuracy_baseline': 0.76377374,
 'auc': 0.88401634,
 'auc_precision_recall': 0.69599575,
 'average_loss': 0.35122654,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 44.67437,
 'precision': 0.68986726,
 'prediction/mean': 0.23320661,
 'recall': 0.55408216}

Nowy poziom dokładności wynosi 83.58 proc. Jest o cztery procent wyższy od poprzedniego modelu.

Na koniec możesz dodać termin regularyzujący, aby zapobiec nadmiernemu dopasowaniu.

Krok 5) Hiperparametr: Lasso i Ridge

Twój model może cierpieć nadmierne dopasowanie or niedopasowanie.

  • Nadmierne dopasowanie: model nie jest w stanie uogólnić prognoz na nowe dane
  • Niedopasowanie: model nie jest w stanie uchwycić wzorca danych. tj. regresja liniowa, gdy dane są nieliniowe

Kiedy model ma wiele parametrów i stosunkowo małą ilość danych, prowadzi to do złych przewidywań. Wyobraź sobie, że jedna grupa ma tylko trzy obserwacje; model obliczy wagę dla tej grupy. Waga służy do przewidywania; jeśli obserwacje zbioru testowego dla tej konkretnej grupy różnią się całkowicie od zbioru uczącego, wówczas model dokona błędnej prognozy. Podczas oceny zestawu szkoleniowego dokładność jest dobra, ale niewystarczająca w przypadku zestawu testowego, ponieważ obliczone wagi nie są prawdziwe, co pozwala na uogólnienie wzorca. W tym przypadku nie pozwala na rozsądne przewidywanie na podstawie niewidocznych danych.

Aby zapobiec nadmiernemu dopasowaniu, regularyzacja daje Ci możliwość kontrolowania takiej złożoności i uczynienia jej bardziej uogólnioną. Istnieją dwie techniki regularyzacji:

  • L1: Lasso
  • L2: Grzbiet

W TensorFlow możesz dodać te dwa hiperparametry w optymalizatorze. Na przykład, im wyższy hiperparametr L2, waga jest zwykle bardzo niska i bliska zeru. Dopasowana linia będzie bardzo płaska, natomiast wartość L2 bliska zeru oznacza, że ​​wagi są zbliżone do regularnej regresji liniowej.

Możesz sam wypróbować inną wartość hiperparametrów i sprawdzić, czy możesz zwiększyć poziom dokładności.

Note że jeśli zmienisz hiperparametr, musisz usunąć folder continuing/train4, w przeciwnym razie model zostanie uruchomiony z poprzednio wytrenowanym modelem.

Zobaczmy, jaka jest dokładność w przypadku szumu

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

Wydajność

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train4', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1820d9c128>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
model_regu.train(input_fn=get_input_fn(df_train_new, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

Wydajność

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into ongoing/train4/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 77.4165
INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)
INFO:tensorflow:global_step/sec: 187.889
INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)
INFO:tensorflow:global_step/sec: 201.895
INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)
INFO:tensorflow:global_step/sec: 217.992
INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)
INFO:tensorflow:global_step/sec: 193.676
INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)
INFO:tensorflow:global_step/sec: 202.195
INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)
INFO:tensorflow:global_step/sec: 216.756
INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)
INFO:tensorflow:global_step/sec: 240.215
INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)
INFO:tensorflow:global_step/sec: 220.336
INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt.
INFO:tensorflow:Loss for final step: 43.4942.


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

Wydajność

INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:29:07
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:29:09
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.83833915, accuracy_baseline = 0.76377374, auc = 0.8869794, auc_precision_recall = 0.7014905, average_loss = 0.34691378, global_step = 1000, label/mean = 0.23622628, loss = 44.12581, precision = 0.69720596, prediction/mean = 0.23662092, recall = 0.5579823





{'accuracy': 0.83833915,
 'accuracy_baseline': 0.76377374,
 'auc': 0.8869794,
 'auc_precision_recall': 0.7014905,
 'average_loss': 0.34691378,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 44.12581,
 'precision': 0.69720596,
 'prediction/mean': 0.23662092,
 'recall': 0.5579823}

Dzięki temu hiperparametrowi nieznacznie zwiększasz metryki dokładności. Poniższa tabela zawiera wszystkie metryki zgłoszone przez cztery wywołania funkcji „evaluate” w tym samouczku.

Model Zestaw funkcji Dokładność AUC Precyzja Odwołanie
model Linia bazowa ciągła + kategoryczna 0.7615626 0.63300294 0.49401596 0.38637546
model_1 Wiek bazowy plus kwadrat wieku 0.7944229 0.6093755 0.6682401 0.2576703
model_imp Wiek w koszach plus skrzyżowane kolumny 0.8358209 0.88401634 0.68986726 0.55408216
model_regulacji Skrzyżowane kolumny plus L1 i L2 0.83833915 0.8869794 0.69720596 0.5579823

Należy zauważyć, że dokładność bazowa modelu, który zawsze przewiduje klasę większościową, wynosi 0.76377374, zatem tylko dwa ostatnie modele przewyższają trywialne przypuszczenie o użyteczny margines.

W następnym samouczku dowiesz się, jak ulepszyć klasyfikator liniowy za pomocą metoda jądra.

FAQ

Regresja logistyczna to jeden z rodzajów klasyfikatorów liniowych. Dopasowuje ona wynik liniowy, a następnie przeciska go przez sigmoidę, aby zwrócić skalibrowane prawdopodobieństwa. Inne klasyfikatory liniowe, takie jak liniowy SVM lub perceptron, mają wspólną granicę liniową, ale optymalizują inną stratę.

Liniowy SVM optymalizuje utratę zawiasów, a na granicę wpływają tylko punkty marginesu, co jest pomocne w przypadku małych, zaszumionych zbiorów danych. Regresja logistyczna trenuje szybciej na bardzo dużych zbiorach danych i zwraca oszacowania prawdopodobieństwa, co ma znaczenie, gdy potrzebny jest regulowany próg decyzyjny.

Nie. Pakiet tf-estimator został wydany w ostatniej wersji wraz z TensorFlow 2.15 i nie jest dostępny w wersjach TensorFlow 2.16 i nowszych. Uruchom ten samouczek w TensorFlow 1.x lub przenieś gotowy estymator do modelu liniowego Keras, korzystając z oficjalnego przewodnika migracji.

Biblioteki automatycznego wyszukiwania traktują poziomy L1, L2, współczynnik uczenia i granice przedziałów jako przestrzeń wyszukiwania, a następnie wykorzystują optymalizację bayesowską lub metody bandytów do wczesnego usuwania słabych prób. Zastępuje to ręczne przeszukiwanie sugerowane w tym samouczku i zazwyczaj znajduje lepszą parę regularyzacyjną.

Copilot szybko tworzy powtarzalne szablony feature_column, w tym wyrażenia listowe dla kolumn ciągłych i bloków międzykolumnowych. Traktuj wynik jako pierwszy szkic — weryfikuj każdą nazwę API z uruchomioną wersją, ponieważ Copilot łączy idiomy TensorFlow 1.x i 2.x.

Ustawia liczbę kontenerów, do których hashowana jest kolumna kategorii. Zbyt mała wartość wymusza kolizję niepowiązanych kategorii i dzielenie się wagą; zbyt duża wartość marnuje pamięć. Ustaw ją wygodnie powyżej liczby odrębnych wartości, tak jak w tym samouczku z wartością 1000.

Dodanie kwadratu składowej przesuwa model w kierunku bardziej pewnego przewidywania klasy większościowej. Precyzja wzrasta do 0.6682, a czułość spada do 0.2577, co jest typowym kompromisem między precyzją a czułością w przypadku niezrównoważonej etykiety, a nie błędem kodowania.

Użyj jądra, gdy żadna granica liniowa nie oddziela klas, nawet po podziale na segmenty i przekroczeniu cech. Jądra mapują dane do przestrzeni wielowymiarowej niejawnie, kosztem wolniejszego uczenia i słabszej interpretowalności niż przedstawione tutaj wagi liniowe.

Podsumuj ten post następująco: