Двоична класификация в TensorFlow: Пример за линеен класификатор

Съдържание:

Anonim

Двете най-често срещани контролирани учебни задачи са линейна регресия и линеен класификатор. Линейната регресия предсказва стойност, докато линейният класификатор предсказва клас. Този урок е фокусиран върху Линеен класификатор.

Какво е линеен класификатор?

А Linear Класификатор в Машинно обучение е метод за намиране на класа на обекта въз основа на характеристики му за статистическа класификация. Той взема решение за класификация въз основа на стойността на линейна комбинация от характеристики на даден обект. Линейният класификатор се използва в практически задачи като класификация на документи и проблеми с много променливи.

Проблемите с класификацията представляват приблизително 80 процента от задачата за машинно обучение. Класификацията има за цел да предскаже вероятността за всеки клас даден набор от входни данни. Етикетът (т.е. зависимата променлива) е дискретна стойност, наречена клас.

  1. Ако етикетът има само два класа, алгоритъмът на обучение е двоичен класификатор.
  2. Многокласовият класификатор се справя с етикетите с повече от два класа.

Например, типичен проблем с бинарната класификация е да се предскаже вероятността клиентът да направи втора покупка. Предсказването на вида животно, показвано на снимка, е многокласов проблем за класификация, тъй като съществуват повече от две разновидности на животни.

Теоретичната част на този урок поставя основния фокус върху бинарния клас. Ще научите повече за многокласовата изходна функция в следващ урок.

В този урок ще научите

  • Какво е линеен класификатор?
  • Как работи двоичният класификатор?
  • Как да се измери ефективността на линейния класификатор?
  • Точност
  • Матрица на объркване
  • Прецизност и чувствителност
  • Линеен класификатор с TensorFlow
  • Стъпка 1) Импортирайте данните
  • Стъпка 2) Преобразуване на данни
  • Стъпка 3) Обучете класификатора
  • Стъпка 4) Подобрете модела
  • Стъпка 5) Хиперпараметър: Lasso & Ridge

Как работи двоичният класификатор?

В предишния урок научихте, че функцията се състои от два вида променливи, зависима променлива и набор от характеристики (независими променливи). При линейната регресия зависима променлива е реално число без обхват. Основната цел е да се предскаже неговата стойност чрез минимизиране на средната квадратична грешка.

За двоичен класификатор TensorFlow етикетът може да има две възможни цели числа. В повечето случаи това е или [0,1], или [1,2]. Например целта е да се предскаже дали клиентът ще купи продукт или не. Етикетът се определя, както следва:

  • Y = 1 (клиентът е закупил продукта)
  • Y = 0 (клиентът не купува продукта)

Моделът използва характеристиките X, за да класифицира всеки клиент в най-вероятния клас, към който принадлежи, а именно, потенциален купувач или не.

Вероятността за успех се изчислява с логистична регресия . Алгоритъмът ще изчисли вероятност въз основа на характеристиката X и предсказва успех, когато тази вероятност е над 50 процента. По-формално вероятността се изчислява, както е показано в долния пример за двоична класификация на TensorFlow:

където 0 е наборът от тегла, характеристиките и b пристрастието.

Функцията може да бъде разложена на две части:

  • Линейният модел
  • Логистичната функция

Линеен модел

Вече сте запознати с начина на изчисляване на теглата. Теглата се изчисляват с помощта на точков продукт: Y е линейна функция на всички характеристики x i . Ако моделът няма характеристики, прогнозата е равна на отклонението, b.

Теглото показва посоката на корелация между характеристиките x i и етикета y. Положителната корелация увеличава вероятността за положителния клас, докато отрицателната корелация води вероятността по-близо до 0, (т.е. отрицателен клас).

Линейният модел връща само реално число, което е несъвместимо с вероятностната мярка за обхват [0,1]. Логистичната функция е необходима за преобразуване на изхода на линейния модел в вероятност,

Логистична функция

Логистичната функция или сигмоидната функция има S-образна форма и изходът на тази функция винаги е между 0 и 1.

Пример за логистична функция

Лесно е да заместим изхода на линейната регресия в сигмоидната функция. Резултатът е ново число с вероятност между 0 и 1.

Класификаторът може да трансформира вероятността в клас

  • Стойности между 0 и 0,49 стават клас 0
  • Стойности между 0,5 до 1 стават клас 1

Как да се измери ефективността на линейния класификатор?

Точност

Цялостната ефективност на класификатора се измерва с метриката за точност. Точността събира всички правилни стойности, разделени на общия брой наблюдения. Например, стойност на точност от 80 процента означава, че моделът е правилен в 80 процента от случаите.

Измерете производителността на линейния класификатор, като използвате метрика за точност

Можете да забележите недостатък с този показател, особено за клас на дисбаланс. Набор от данни за дисбаланс възниква, когато броят на наблюденията на група не е равен. Да речем; се опитвате да класифицирате рядко събитие с логистична функция. Представете си, че класификаторът се опитва да оцени смъртта на пациент след заболяване. Според данните 5 процента от пациентите починаха. Можете да обучите класификатор, за да предскажете броя на смъртните случаи и да използвате показателя за точност, за да оцените резултатите. Ако класификаторът прогнозира 0 смърт за целия набор от данни, това ще бъде правилно в 95 процента от случая.

Матрица на объркване

По-добър начин за оценка на работата на класификатора е да се разгледа матрицата на объркването.

Измерете ефективността на линейния класификатор, използвайки матрица за объркване

Матрицата на объркването визуализира точността на класификатора чрез сравняване на действителните и прогнозираните класове, както е показано в горния пример за линеен класификатор. Матрицата на двоичното объркване се състои от квадрати:

  • TP: Истински положителни: Прогнозираните стойности са правилно предсказани като действителни положителни
  • FP: Прогнозираните стойности неправилно предсказват действително положително. т.е. отрицателните стойности се предвиждат като положителни
  • FN: False Negative: Положителните стойности се предвиждат като отрицателни
  • TN: Вярно отрицателно: Прогнозираните стойности са правилно предсказани като действителни отрицателни

От матрицата на объркването е лесно да сравните действителния клас и прогнозирания клас.

Прецизност и чувствителност

Матрицата на объркването дава добра представа за истинските положителни и фалшиво положителните резултати. В някои случаи е за предпочитане да има по-кратка метрика.

Прецизност

Метриката за прецизност показва точността на положителния клас. Той измерва колко вероятно е прогнозирането на положителния клас да е правилно.

Максималният резултат е 1, когато класификаторът перфектно класифицира всички положителни стойности. Точността сама по себе си не е много полезна, защото пренебрегва отрицателния клас. Метриката обикновено се сдвоява с метрика за извикване. Изземването се нарича още чувствителност или истински положителен процент.

Чувствителност

Чувствителността изчислява съотношението на положително откритите класове. Тази метрика показва колко добър е моделът за разпознаване на положителен клас.

Линеен класификатор с TensorFlow

За този урок ще използваме данните от преброяването. Целта е да се използват променливите в данните от преброяването, за да се предвиди нивото на доходите. Имайте предвид, че доходът е двоична променлива

  • със стойност 1, ако доходът> 50k
  • 0 ако доходът <50k.

Тази променлива е вашият етикет

Този набор от данни включва осем категорични променливи:

  • работно място
  • образование
  • брачен
  • професия
  • връзка
  • раса
  • секс
  • native_country

освен това шест непрекъснати променливи:

  • възраст
  • fnlwgt
  • номер на образованието
  • capital_gain
  • загуба на капитал
  • hours_week

Чрез този пример за класификация на TensorFlow ще разберете как да тренирате линейни класификатори на TensorFlow с оценител на TensorFlow и как да подобрите метриката на точността.

Ще продължим по следния начин:

  • Стъпка 1) Импортирайте данните
  • Стъпка 2) Преобразуване на данни
  • Стъпка 3) Обучете класификатора
  • Стъпка 4) Подобрете модела
  • Стъпка 5) Хиперпараметър: Lasso & Ridge

Стъпка 1) Импортирайте данните

Първо импортирате библиотеките, използвани по време на урока.

import tensorflow as tfimport pandas as pd 

След това импортирате данните от архива на UCI и дефинирате имената на колоните. Ще използвате КОЛОНИТЕ, за да именувате колоните в рамка за данни на pandas.

Имайте предвид, че ще обучавате класификатора, използвайки рамка за данни на Pandas.

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

Данните, съхранявани онлайн, вече са разделени между влаков комплект и тестов комплект.

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)

Комплектът влакове съдържа 32 561 наблюдения, а тестовият комплект 16 281

print(df_train.shape, df_test.shape)print(df_train.dtypes)(32561, 15) (16281, 15)age int64workclass objectfnlwgt int64education objecteducation_num int64marital objectoccupation objectrelationship objectrace objectsex objectcapital_gain int64capital_loss int64hours_week int64native_country objectlabel objectdtype: object

Tensorflow изисква булева стойност за обучение на класификатора. Трябва да прехвърлите стойностите от низ към цяло число. Етикетът се съхранява като обект, но трябва да го преобразувате в числова стойност. Кодът по-долу създава речник със стойностите, които да конвертирате и да преминете към елемента на колоната. Обърнете внимание, че извършвате тази операция два пъти, една за теста на влака и една за тестовия комплект

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]

В данните за влаковете има 24 720 дохода по-ниски от 50 000 и 7841 по-горе. Съотношението е почти същото за тестовия набор. Моля, вижте този урок за аспекти за повече.

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) Преобразуване на данни

Необходими са няколко стъпки, преди да тренирате линеен класификатор с Tensorflow. Трябва да подготвите функциите, които да включите в модела. В регресията на бенчмарка ще използвате оригиналните данни, без да прилагате никаква трансформация.

Оценителят трябва да има списък с функции, за да обучи модела. Следователно данните на колоната трябва да бъдат преобразувани в тензор.

Добра практика е да се дефинират два списъка с функции въз основа на техния тип и след това да се предадат в колоните на характеристиките на оценителя.

Ще започнете с преобразуване на непрекъснати функции, след което дефинирайте група с категоричните данни.

Характеристиките на набора от данни имат два формата:

  • Цяло число
  • Обект

Всяка характеристика е посочена в следващите две променливи според техните типове.

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

Колона_функция е снабдена с обект числова_колона, за да помогне при трансформацията на непрекъснатите променливи в тензор. В кода по-долу преобразувате всички променливи от CONTI_FEATURES в тензор с числова стойност. Това е задължително за конструиране на модела. Всички независими променливи трябва да бъдат преобразувани в правилния тип тензор.

По-долу пишем код, който да ви позволи да видите какво се случва зад feature_column.numeric_column. Ще отпечатаме преобразуваната стойност за възрастта. Тя е с обяснителна цел, поради което няма нужда да разбираме кода на python. Можете да се обърнете към официалната документация, за да разберете кодовете.

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

Стойностите са точно същите като в df_train

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

Според документацията на TensorFlow има различни начини за конвертиране на категорични данни. Ако речниковият списък на даден елемент е известен и няма много стойности, възможно е да се създаде категоричната колона с categorical_column_with_vocabulary_list. Той ще присвои на всеки уникален речников списък идентификатор.

Например, ако състоянието на променлива има три различни стойности:

  • Съпруг
  • Съпруга
  • Единична

Тогава ще бъдат приписани три ID. Например съпругът ще има ID 1, съпругата ID 2 и така нататък.

За целите на илюстрацията можете да използвате този код, за да конвертирате обектна променлива в категорична колона в TensorFlow.

Функционалният пол може да има само две стойности: мъжки или женски. Когато преобразуваме характерния пол, Tensorflow ще създаде 2 нови колони, една за мъже и една за жени. Ако полът е равен на мъжкия, тогава новата колона мъжки ще бъде равна на 1, а женската на 0. Този пример е показан в таблицата по-долу:

редове

секс

след трансформация

мъжки

женски пол

1

мъжки

=>

1

0

2

мъжки

=>

1

0

3

женски пол

=>

0

1

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

По-долу добавихме Python код, за да отпечатаме кодирането. Отново не е нужно да разбирате кода, целта е да видите трансформацията

По-бърз начин за трансформиране на данните обаче е използването на метода categorical_column_with_hash_bucket. Промяната на низ променливи в оскъдна матрица ще бъде полезна. Разредената матрица е матрица с предимно нула. Методът се грижи за всичко. Трябва само да посочите броя на сегментите и ключовата колона. Броят на групите е максималният брой групи, които Tensorflow може да създаде. Ключовата колона е просто името на колоната за конвертиране.

В кода по-долу създавате цикъл за всички категорични функции.

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

Стъпка 3) Обучете класификатора

Понастоящем TensorFlow предоставя оценка за линейна регресия и линейна класификация.

  • Линейна регресия: LinearRegressor
  • Линейна класификация: LinearClassifier

Синтаксисът на линейния класификатор е същият като в урока за линейна регресия, с изключение на един аргумент, n_class. Трябва да дефинирате колоната на характеристиките, директорията на модела и да сравните с линейния регресор; имате дефиниране на номера на класа. За logit регресия, броят на класа е равен на 2.

Моделът ще изчислява теглата на колоните, съдържащи се в непрекъснати и характеристики.

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

ИЗХОД:

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}

Сега, когато класификаторът е дефиниран, можете да създадете функция за въвеждане. Методът е същият като в урока за линеен регресор. Тук използвате размер на партидата от 128 и разбърквате данните.

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)

Създавате функция с аргументите, изисквани от линейния оценител, т.е. брой епохи, брой партиди и разбърквате набора от данни или бележката. Тъй като използвате метода Pandas за предаване на данните в модела, трябва да дефинирате X променливите като рамка за данни pandas. Обърнете внимание, че обхождате всички данни, съхранявани в ХАРАКТЕРИСТИКИ.

Нека тренираме модела с обектния модел.train. Използвате предварително дефинираната функция, за да захранвате модела със съответните стойности. Обърнете внимание, че сте задали размера на партидата на 128 и броя на епохите на None. Моделът ще бъде обучен над хиляда стъпки.

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.

Обърнете внимание, че загубата намалява впоследствие през последните 100 стъпки, т.е. от 901 на 1000.

Крайната загуба след хиляда повторения е 5444. Можете да оцените модела си на тестовия набор и да видите производителността. За да оцените ефективността на вашия модел, трябва да използвате оценката на обекта. Захранвате модела с тестовия набор и задавате броя на епохите на 1, т.е. данните ще отиват в модела само веднъж.

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

TensorFlow връща всички показатели, които сте научили в теоретичната част. Без изненада точността е голяма поради небалансирания етикет. Всъщност моделът се представя малко по-добре от случайно предположение. Представете си, че моделът предсказва всички домакинства с доходи по-ниски от 50 000, тогава моделът има точност от 70 процента. При по-внимателен анализ можете да видите, че прогнозите и изземването са доста ниски.

Стъпка 4) Подобрете модела

Сега, когато имате модел за сравнение, можете да се опитате да го подобрите, т.е. да увеличите точността. В предишния урок научихте как да подобрите силата на прогнозиране с термин за взаимодействие. В този урок ще преразгледате тази идея, като добавите полиномиален член към регресията.

Полиномиалната регресия е от съществено значение, когато в данните има нелинейност. Има два начина за улавяне на нелинейността в данните.

  • Добавете многочленен член
  • Включете непрекъснатата променлива в категорична променлива

Многочленен термин

От снимката по-долу можете да видите какво е полиномиална регресия. Това е уравнение с X променливи с различна мощност. Полиномиалната регресия от втора степен има две променливи, X и X на квадрат. Трета степен има три променливи, X, X 2 и X 3

Какво е полиномиална регресия

По-долу изградихме графика с две променливи, X и Y. Очевидно е, че връзката не е линейна. Ако добавим линейна регресия, можем да видим, че моделът не е в състояние да улови модела (лява снимка).

Сега, погледнете лявата снимка от картинката по-долу, добавихме пет членове към регресията (т.е. y = x + x 2 + x 3 + x 4 + x 5. Моделът сега улавя много по-добре модела. Това е силата на полиномиалната регресия.

Да се ​​върнем към нашия пример. Възрастта не е в линейна връзка с дохода. Ранната възраст може да има равни доходи, близки до нулата, тъй като децата или младите хора не работят. Тогава тя се увеличава в трудоспособна възраст и намалява по време на пенсиониране. Обикновено е с обърната форма U. Един от начините за улавяне на този модел е чрез добавяне на степен две към регресията.

Да видим дали увеличава точността.

Трябва да добавите тази нова функция към набора от данни и в списъка с непрекъсната функция.

Добавяте новата променлива в набора от данни за влак и тест, така че е по-удобно да напишете функция.

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

Функцията има 3 аргумента:

  • df_t: дефинирайте обучителния набор
  • df_te: дефинирайте тестовия набор
  • var_name = 'age': Определете променливата за трансформиране

Можете да използвате обекта pow (2) за квадратиране на променливата възраст. Имайте предвид, че новата променлива е наречена „нова“

Сега, когато е написана функцията square_var, можете да създадете новите набори от данни.

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

Както можете да видите, новият набор от данни има още една функция.

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

Квадратната променлива се нарича нова в набора от данни. Трябва да го добавите към списъка с непрекъснати функции.

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]

Обърнете внимание, че сте променили директорията на графиката. Не можете да обучавате различни модели в една и съща директория. Това означава, че трябва да промените пътя на аргумента model_dir. Ако не го направите, TensorFlow ще изведе грешка.

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)

Сега, когато класификаторът е проектиран с новия набор от данни, можете да обучавате и оценявате модела.

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}

Квадратната променлива подобри точността от 0.76 на 0.79. Нека да видим дали можете да се справите по-добре, като комбинирате термина за пакетиране и взаимодействие заедно.

Бюкетизация и взаимодействие

Както видяхте преди, линейният класификатор не може да улови правилно модела на възрастта-доход. Това е така, защото научава едно тегло за всяка функция. За да улесните класификатора, едно нещо, което можете да направите, е да добавите функцията в група. Сгрупирането преобразува числова характеристика в няколко определени въз основа на обхвата, в който попада, и всяка от тези нови функции показва дали възрастта на човек попада в този диапазон.

С тези нови функции линейният модел може да улови връзката, като научи различни тегла за всяка кофа.

В TensorFlow това се прави с bucketized_column. Трябва да добавите диапазона от стойности в границите.

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

Вече знаете, че възрастта е нелинейна с доходите. Друг начин за подобряване на модела е чрез взаимодействие. По думата на TensorFlow това е пресичане на характеристики. Пресичането на характеристики е начин за създаване на нови функции, които са комбинации от съществуващи, което може да бъде полезно за линеен класификатор, който не може да моделира взаимодействия между характеристики.

Можете да разбиете възрастта с друга функция като образование. Тоест някои групи вероятно имат високи доходи, а други ниски (Помислете за докторанта).

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

За да създадете кръст с кръстосани характеристики, използвате кръстосана колона с променливите, които да пресечете в скоба. Hash_bucket_size показва максималните възможности за преминаване. За да създадете взаимодействие между променливи (поне една променлива трябва да бъде категорична), можете да използвате tf.feature_column.crossed_column. За да използвате този обект, трябва да добавите в квадратна скоба променливата за взаимодействие и втори аргумент, размера на сегмента. Размерът на сегмента е максималният брой групи, възможни в рамките на променлива. Тук го задавате на 1000, тъй като не знаете точния брой групи

age_buckets трябва да бъде на квадрат, преди да го добавите към колоните на характеристиките. Също така добавяте новите функции към колоните за функции и подготвяте оценката

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)

ИЗХОД

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)

Готови сте да оцените новия модел и да видите дали той подобрява точността.

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}

Новото ниво на точност е 83,58 процента. Той е с четири процента по-висок от предишния модел.

И накрая, можете да добавите термин за узаконяване, за да предотвратите пренастройване.

Стъпка 5) Хиперпараметър: Lasso & Ridge

Вашият модел може да страдат от прекомерно нагаждане или underfitting .

  • Пренастройване: Моделът не е в състояние да обобщи прогнозата на нови данни
  • Underfitting: Моделът не може да улови модела на данните. т.е. линейна регресия, когато данните са нелинейни

Когато даден модел има много параметри и относително малко количество данни, това води до лоши прогнози. Представете си, че една група има само три наблюдения; моделът ще изчисли тегло за тази група. Тежестта се използва за прогнозиране; ако наблюденията на тестовия набор за тази конкретна група са напълно различни от тренировъчния набор, тогава моделът ще направи грешна прогноза. По време на оценяването с тренировъчния набор точността е добра, но не е добра с тестовия набор, тъй като изчислените тегла не са верни за обобщаване на модела. В този случай тя не прави разумна прогноза за невидими данни.

За да се предотврати прекаленото оборудване, регуларизацията ви дава възможност да контролирате такава сложност и да я направите по-обобщаваща. Има две техники за регулиране:

  • L1: Ласо
  • L2: Ридж

В TensorFlow можете да добавите тези два хиперпараметра в оптимизатора. Например, колкото по-висок е хиперпараметърът L2, теглото има тенденция да бъде много ниско и близо до нула. Монтираната линия ще бъде много плоска, докато L2 близо до нула предполага, че тежестите са близки до редовната линейна регресия.

Можете сами да опитате различната стойност на хиперпараметрите и да видите дали можете да увеличите нивото на точност.

Обърнете внимание, че ако промените хиперпараметъра, трябва да изтриете папката текущ / train4, в противен случай моделът ще стартира с предварително обучения модел.

Нека да видим как е точността с шум

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

ИЗВЪН

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)

ИЗВЪН

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)

ИЗХОД

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}

С този хиперпараметър леко увеличавате показателите за точност. В следващия урок ще научите как да подобрите линеен класификатор с помощта на метод на ядрото.

Обобщение

За да обучите модел, трябва:

  • Дефинирайте характеристиките: Независими променливи: X
  • Определете етикета: Зависима променлива: y
  • Изграждане на влак / комплект за изпитване
  • Определете първоначалното тегло
  • Определете функцията за загуба: MSE
  • Оптимизирайте модела: Градиентно спускане
  • Определете:
    • Скорост на обучение
    • Брой епоха
    • Размер на партидата
    • Номер на класа

В този урок научихте как да използвате API на високо ниво за класификатор на линейна регресия. Трябва да дефинирате:

  1. Колони с функции. Ако е непрекъснато: tf.feature_column.numeric_column (). Можете да попълните списък с разбиране на списъка на python
  2. Оценителят: tf.estimator.LinearClassifier (feature_columns, model_dir, n_classes = 2)
  3. Функция за импортиране на данните, размера на партидата и епохата: input_fn ()

След това сте готови да тренирате, оценявате и правите прогнози с train (), оценка () и прогнозиране ()

За да подобрите производителността на модела, можете:

  • Използвайте полиномиална регресия
  • Термин за взаимодействие: tf.feature_column.crossed_column
  • Добавете параметър за регулиране