Бинарна класификација у ТенсорФлов-у: Пример линеарног класификатора

Преглед садржаја:

Anonim

Два најчешћа задатка учења под надзором су линеарна регресија и линеарни класификатор. Линеарна регресија предвиђа вредност док линеарни класификатор предвиђа класу. Овај водич је усмерен на Линеарни класификатор.

Шта је линеарни класификатор?

Пуни Класификатор у Мацхине Леарнинг је метод за проналажење класа неког објекта на основу својих карактеристика за статистичкој класификацији. Одлуку о класификацији доноси на основу вредности линеарне комбинације карактеристика објекта. Линеарни класификатор користи се у практичним проблемима попут класификације докумената и проблема који имају много променљивих.

Проблеми класификације представљају отприлике 80 процената задатка машинског учења. Класификација има за циљ да предвиди вероватноћу сваке класе с обзиром на скуп улазних података. Ознака (тј. Зависна променљива) је дискретна вредност, која се назива класа.

  1. Ако ознака има само две класе, алгоритам учења је бинарни класификатор.
  2. Вишеразредни класификатор бави се ознакама са више од две класе.

На пример, типичан бинарни проблем класификације је предвиђање вероватноће да купац изврши другу куповину. Предвиђање врсте животиња приказаних на слици представља проблем вишеразредне класификације, јер постоје више од две врсте животиња.

Теоријски део овог водича ставља примарни фокус на бинарну класу. У наредном упутству ћете научити више о функцији изласка из више класа.

У овом упутству ћете научити

  • Шта је линеарни класификатор?
  • Како функционише бинарни класификатор?
  • Како измерити перформансе линеарног класификатора?
  • Тачност
  • Матрица забуне
  • Прецизност и осетљивост
  • Линеарни класификатор са ТенсорФлов
  • Корак 1) Увезите податке
  • Корак 2) Конверзија података
  • Корак 3) Обучите класификатор
  • Корак 4) Побољшајте модел
  • Корак 5) Хиперпараметар: Лассо & Ридге

Како функционише бинарни класификатор?

У претходном упутству сте научили да се функција састоји од две врсте променљивих, зависне променљиве и скупа карактеристика (независне променљиве). У линеарној регресији, зависна променљива је реалан број без опсега. Примарни циљ је предвидети његову вредност минимизирањем средње квадратне грешке.

За бинарни класификатор ТенсорФлов ознака је могла имати две могуће целобројне вредности. У већини случајева то је или [0,1] или [1,2]. На пример, циљ је предвидети да ли ће купац купити производ или не. Ознака је дефинисана на следећи начин:

  • И = 1 (купац је купио производ)
  • И = 0 (купац не купује производ)

Модел користи карактеристике Кс за класификацију сваког купца у најизгледнију класу којој припада, наиме потенцијални купац или не.

Вероватноћа успеха израчунава се логистичком регресијом . Алгоритам ће израчунати вероватноћу на основу особине Кс и предвиђа успех када је та вероватноћа изнад 50 процената. Формалније, вероватноћа се израчунава како је приказано у доњем примеру Бенске класификације ТенсорФлов:

где је 0 скуп тежина, карактеристика и б пристрасност.

Функција се може раставити на два дела:

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

Линеарни модел

Већ сте упознати са начином израчунавања пондера. Пондери се израчунавају помоћу тачкастог производа: И је линеарна функција свих карактеристика к и . Ако модел нема карактеристике, предвиђање је једнако пристрасности, б.

Пондери показују смјер корелације између карактеристика к и и ознаке и. Позитивна корелација повећава вероватноћу позитивне класе, док негативна корелација доводи вероватноћу ближе 0, (тј. Негативна класа).

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

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

Логистичка функција или сигмоидна функција има облик слова С и излаз ове функције је увек између 0 и 1.

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

Лако је заменити излаз линеарне регресије у сигмоидну функцију. Резултат је нови број са вероватноћом између 0 и 1.

Класификатор може претворити вероватноћу у класу

  • Вредности између 0 и 0,49 постају класа 0
  • Вредности између 0,5 и 1 постају класа 1

Како измерити перформансе линеарног класификатора?

Тачност

Укупне перформансе класификатора мере се метриком тачности. Тачност прикупља све тачне вредности подељене укупним бројем посматрања. На пример, вредност тачности од 80 процената значи да је модел тачан у 80 процената случајева.

Измерите перформансе Линеарног класификатора помоћу метрике тачности

Можете приметити недостатак ове метрике, посебно за класу неравнотеже. Скуп података о неравнотежи јавља се када број запажања по групи није једнак. Рецимо; покушавате да класификујете ретке догађаје са логистичком функцијом. Замислите да класификатор покушава да процени смрт пацијента након болести. Према подацима, 5 процената пацијената умире. Можете обучити класификатор за предвиђање броја смртних случајева и користити метрику тачности за процену перформанси. Ако класификатор предвиђа 0 смртних случајева за цео скуп података, то ће бити тачно у 95 посто случајева.

Матрица забуне

Бољи начин за процену перформанси класификатора је преглед матрице забуне.

Измерите перформансе Линеарног класификатора помоћу збуњујуће матрице

Матрица забуне приказује тачност класификатора поређењем стварних и предвиђених класа као што је приказано у горњем примеру Линеарног класификатора. Бинарна збуњујућа матрица састоји се од квадрата:

  • ТП: Тачно позитивно: Предвиђене вредности су тачно предвиђене као стварне позитивне
  • ФП: Предвиђене вредности су погрешно предвиделе стварну позитиву. тј. негативне вредности предвиђене као позитивне
  • ФН: Лажно негативно: Позитивне вредности предвиђене као негативне
  • ТН: Тачно негативно: Предвиђене вредности су тачно предвиђене као стварне негативне

Из матрице забуне лако је упоредити стварну класу и предвиђену класу.

Прецизност и осетљивост

Матрица забуне пружа добар увид у истинске позитивне и лажно позитивне. У неким случајевима је пожељно имати сажетију метрику.

Прецизност

Метрика прецизности показује тачност позитивне класе. Он мери колико је вероватно да је предвиђање позитивне класе тачно.

Максимална оцена је 1 када класификатор савршено класификује све позитивне вредности. Прецизност сама по себи није од велике помоћи јер игнорише негативну класу. Метрика је обично упарена са метриком опозива. Опозив се назива и осетљивост или истинска позитивна стопа.

Осетљивост

Осетљивост израчунава однос тачно откривених позитивних класа. Ова метрика показује колико је добар модел препознавање позитивне класе.

Линеарни класификатор са ТенсорФлов

За овај водич користићемо пописни скуп података. Сврха је употреба променљивих у пописном скупу података за предвиђање нивоа прихода. Имајте на уму да је приход бинарна променљива

  • са вредношћу 1 ако је приход> 50к
  • 0 ако је приход <50к.

Ова променљива је ваша ознака

Овај скуп података укључује осам категоријских променљивих:

  • радно место
  • образовање
  • брачно
  • занимање
  • однос
  • трка
  • секс
  • домовина

штавише, шест континуираних променљивих:

  • старост
  • фнлвгт
  • број_образовања
  • Капитални добитак
  • цапитал_лосс
  • хоурс_веек

Кроз овај пример класификације ТенсорФлов, разумећете како да обучавате линеарне класификаторе ТенсорФлов са процењивачем ТенсорФлов и како побољшати метрику тачности.

Наставићемо како следи:

  • Корак 1) Увезите податке
  • Корак 2) Конверзија података
  • Корак 3) Обучите класификатор
  • Корак 4) Побољшајте модел
  • Корак 5) Хиперпараметар: Лассо & Ридге

Корак 1) Увезите податке

Прво увозите библиотеке коришћене током водича.

import tensorflow as tfimport pandas as pd 

Затим увозите податке из архиве УЦИ-а и дефинишете имена колона. СТОЛПЦИМА ћете користити за именовање колона у оквиру података о пандама.

Имајте на уму да ћете класификатор обучити користећи Пандасов оквир података.

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

Тенсорфлов захтева логичку вредност за обуку класификатора. Вредности морате пребацити из низа у цели број. Ознака се чува као објекат, међутим, морате је претворити у нумеричку вредност. Код у наставку креира речник са вредностима које треба претворити и пребацити преко ставке колоне. Имајте на уму да ову операцију изводите два пута, једну за тест воза, а другу за тест сет

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 хиљада и 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) Конверзија података

Потребно је неколико корака пре него што обучите линеарни класификатор са Тенсорфлов-ом. Треба да припремите карактеристике које ћете укључити у модел. У референтној регресији користићете оригиналне податке без примене било какве трансформације.

Процењивач треба да има листу карактеристика за обуку модела. Стога подаци колоне морају бити претворени у тензор.

Добра пракса је дефинисати две листе карактеристика на основу њиховог типа, а затим их проследити у колоне_процењивача својстава.

Започећете са претварањем континуираних карактеристика, а затим дефинишите сегмент са категоричким подацима.

Карактеристике скупа података имају два формата:

  • Цео број
  • Предмет

Свака карактеристика наведена је у следеће две променљиве према њиховим врстама.

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

Колона_ функције је опремљена нумеричким_колонама објекта који помаже у трансформацији континуираних променљивих у тензор. У доњем коду претворите све променљиве из ЦОНТИ_ФЕАТУРЕС у тензор са нумеричком вредношћу. Ово је обавезно за конструкцију модела. Све независне променљиве треба претворити у одговарајући тип тензора.

Испод напишемо код који ће вам омогућити да видите шта се дешава иза феатуре_цолумн.нумериц_цолумн. Исписаћемо претворену вредност за године. Ради објашњења, стога нема потребе за разумевањем питхон кода. Да бисте разумели кодове, можете се обратити службеној документацији.

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

Вредности су потпуно исте као у дф_траин

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

Према документацији ТенсорФлов-а, постоје различити начини за претварање категоријских података. Ако је списак речника неке функције познат и нема пуно вредности, могуће је створити категоричку колону са категоријалном_колумном_ са_вокабуларном_ листом. Свим јединственим списковима речника доделиће ИД.

На пример, ако статус променљиве има три различите вредности:

  • Муж
  • Жена
  • Једно

Тада ће се доделити три ИД-а. На пример, муж ће имати ИД 1, жена ИД 2 и тако даље.

Ради илустрације, овај код можете користити за претварање променљиве објекта у категорички ступац у ТенсорФлов-у.

Карактеристични пол може имати само две вредности: мушку или женску. Када претворимо карактеристични пол, Тенсорфлов ће створити 2 нове колоне, једну за мушке и једну за женске. Ако је пол једнак мушком, тада ће нова колона мушки бити једнака 1, а женска 0. 0. Овај пример је приказан у доњој табели:

редови

секс

након трансформације

Мушки

Женско

1

Мушки

=>

1

0

2

Мушки

=>

1

0

3

Женско

=>

0

1

У тензорфулу:

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

Испод смо додали Питхон код за штампање кодирања. Опет, не морате да разумете код, сврха је да видите трансформацију

Међутим, бржи начин трансформације података је коришћење методе цатегорицал_цолумн_витх_хасх_буцкет. Мењање променљивих низа у реткој матрици биће корисно. Проређена матрица је матрица са углавном нулом. Метода брине о свему. Треба да наведете само број сегмената и кључну колону. Број сегмената је максимална количина група које Тенсорфлов може да створи. Кључна колона је једноставно назив колоне за конверзију.

У доњем коду креирате петљу над свим категоријским карактеристикама.

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

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

ТенсорФлов тренутно нуди процењивач за линеарну регресију и линеарну класификацију.

  • Линеарна регресија: ЛинеарРегрессор
  • Линеарна класификација: ЛинеарЦлассифиер

Синтакса линеарног класификатора је иста као у водичу о линеарној регресији, осим једног аргумента, н_цласс. Треба да дефинишете колону карактеристика, директоријум модела и упоредите са линеарним регресором; морате дефинисати број часа. За логит регресију, број класе је једнак 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)

Креирате функцију са аргументима потребним за линеарни процењивач, тј. Бројем епоха, бројем серија и премешате скуп података или белешку. Будући да користите методу Пандас за прослеђивање података у модел, морате да дефинишете Кс променљиве као оквир података о пандама. Имајте на уму да прелазите преко свих података ускладиштених у ФЕАТУРЕС.

Обучимо модел са објектним моделом.траин. Функцију коју сте претходно дефинисали користите за напајање модела одговарајућим вредностима. Имајте на уму да сте величину серије поставили на 128, а број епоха на Ноне. Модел ће бити обучен у хиљаду корака.

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}

ТенсорФлов враћа све метрике које сте научили у теоријском делу. Без изненађења, тачност је велика због неуравнотежене налепнице. Заправо, модел има нешто боље резултате од случајних нагађања. Замислите да модел предвиђа сва домаћинства са приходом мањим од 50 хиљада, а модел тада има тачност од 70 процената. Помнијом анализом можете видети да су предвиђања и опозив прилично ниска.

Корак 4) Побољшајте модел

Сада када имате референтни модел, можете покушати да га побољшате, односно повећате тачност. У претходном водичу научили сте како побољшати моћ предвиђања помоћу термина интеракције. У овом упутству ћете поново посетити ову идеју додавањем полиномског појма регресији.

Полиномска регресија је кључна када у подацима постоји нелинеарност. Постоје два начина за бележење нелинеарности података.

  • Додајте полиномски појам
  • Укључи континуирану променљиву у категоричку променљиву

Полиномни појам

Са доње слике можете видети шта је полиномска регресија. То је једначина са Кс променљивих различите снаге. Полиномска регресија другог степена има две променљиве, Кс и Кс на квадрат. Трећи степен има три променљиве, Кс, Кс 2 и Кс 3

Шта је полиномска регресија

Испод смо конструисали графикон са две променљиве, Кс и И. Очигледно је да веза није линеарна. Ако додамо линеарну регресију, видећемо да модел није у стању да ухвати образац (лева слика).

Сада, погледајте леву слику са доње слике, регресији смо додали пет чланова (то је и = к + к 2 + к 3 + к 4 + к 5. Модел сада снима много бољи образац. Ово је моћ полиномске регресије.

Вратимо се нашем примеру. Старост није у линеарној вези са приходом. Рани узраст може имати паушални доходак близу нуле јер деца или млади људи не раде. Тада се повећава радна доб и смањује током пензионисања. То је типично обрнуто-У облик. Један од начина да се ухвати овај образац је додавање потенције две регресији.

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

Морате додати ову нову функцију у скуп података и на листу континуираних карактеристика.

Додајте нову променљиву у скуп података о возовима и тестирању, па је погодније написати функцију.

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 аргумента:

  • дф_т: дефинишите сет тренинга
  • дф_те: дефинишите тестни скуп
  • вар_наме = 'аге': Дефинишите променљиву за трансформацију

Објекат пов (2) можете користити за квадратно подешавање променљиве старости. Имајте на уму да је нова променљива названа „нова“

Сада када је написана функција скуаре_вар, можете креирати нове скупове података.

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_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. Да видимо да ли можете боље да комбинујете појам букетизације и интеракције.

Букетизација и интеракција

Као што сте раније видели, линеарни класификатор није у могућности да правилно ухвати образац старосног дохотка. То је зато што научи једну тежину за сваку особину. Да бисте класификатору олакшали, једна ствар коју можете да урадите је да ставите функцију у скуп. Скупљање претвара нумеричку особину у неколико одређених на основу опсега у који спада, а свака од ових нових карактеристика указује на то да ли старост особе спада у тај опсег.

Помоћу ових нових карактеристика линеарни модел може да ухвати однос учењем различитих тежина за сваку канту.

У ТенсорФлов-у то се ради са буцкетизед_цолумн. Треба да додате опсег вредности у границе.

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

Већ знате да је старост нелинеарна са приходом. Други начин за побољшање модела је интеракција. По речима ТенсорФлов, то је прелазак карактеристика. Укрштање обележја је начин за стварање нових карактеристика које су комбинације постојећих, што може бити корисно за линеарни класификатор који не може да моделира интеракције између обележја.

Можете подијелити старост помоћу друге функције попут образовања. Односно, неке групе ће вероватно имати висок приход, а друге ниске (Размислите о докторанту).

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

Да бисте креирали колону са унакрсним обележјима, користите укрштену колону са променљивим за укрштање у заграду. Величина хасх_буцкет_сизе указује на максималне могућности преласка. Да бисте креирали интеракцију између променљивих (најмање једна променљива мора бити категорична), можете да користите тф.феатуре_цолумн.цроссед_цолумн. Да бисте користили овај објекат, требате додати у квадратну заграду променљиву за интеракцију и други аргумент, величину сегмента. Величина сегмента је максимални број могућих група унутар променљиве. Овде га поставите на 1000 јер не знате тачан број група

аге_буцкетс мора бити квадрат пре додавања у колоне карактеристика. Такође додате нове функције у колоне са карактеристикама и припремите процењивач

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) Хиперпараметар: Лассо & Ридге

Ваш модел може патити од прекомерне или недовољне опреме .

  • Прекомерно прилагођавање: Модел није у стању да генерише предвиђање на нове податке
  • Ундерфиттинг: Модел није у стању да ухвати образац података. тј. линеарна регресија када су подаци нелинеарни

Када модел има пуно параметара и релативно малу количину података, то доводи до лоших предвиђања. Замислите, једна група има само три запажања; модел ће израчунати пондер за ову групу. Пондер се користи за предвиђање; ако се запажања скупа тестова за ову одређену групу потпуно разликују од скупа тренинга, тада ће модел направити погрешно предвиђање. Током вредновања са сетом за обуку, тачност је добра, али није добра са тест сетом, јер израчунати пондери нису истинити за уопштавање обрасца. У овом случају, не даје разумно предвиђање за невиђене податке.

Да би се спречило прекомерно опремање, регуларизација вам даје могућности да контролишете такву сложеност и учините је уопштенијом. Постоје две технике регуларизације:

  • Л1: Ласо
  • Л2: Риџ

У ТенсорФлов можете да додате ова два хиперпараметара у оптимизатор. На пример, што је хиперпараметар Л2 већи, тежина је врло мала и близу нуле. Уграђена линија ће бити врло равна, док Л2 близу нуле подразумева да су пондери близу правилне линеарне регресије.

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

Имајте на уму да ако промените хиперпараметар, потребно је да избришете фасциклу цуррент / траин4, иначе ће се модел покренути са претходно обученим моделом.

Да видимо како је тачност са хипером

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}

Овим хиперпараметром мало повећавате показатеље тачности. У следећем упутству ћете научити како побољшати линеарни класификатор помоћу методе језгра.

Резиме

Да бисте обучили модел, потребно је:

  • Дефинисати особине: Независне променљиве: Кс
  • Дефинисати ознаку: Зависна променљива: и
  • Направите воз / испитни склоп
  • Дефинишите почетну тежину
  • Дефинисати функцију губитка: МСЕ
  • Оптимизирајте модел: Градиентни спуст
  • Дефинисати:
    • Стопа учења
    • Број епоха
    • Величина серије
    • Број одељења

У овом упутству сте научили како да користите АПИ високог нивоа за класификатор линеарне регресије. Треба да дефинишете:

  1. Колумне са карактеристикама. Ако је континуирано: тф.феатуре_цолумн.нумериц_цолумн (). Можете попунити листу са разумевањем питхон листе
  2. Процењивач: тф.естиматор.ЛинеарЦлассифиер (феатуре_цолумнс, модел_дир, н_цлассес = 2)
  3. Функција за увоз података, величине серије и епохе: инпут_фн ()

Након тога, спремни сте за тренинг, процену и предвиђање са траин (), евалуација () и предвиђање ()

Да бисте побољшали перформансе модела, можете:

  • Користите полиномску регресију
  • Термин интеракције: тф.феатуре_цолумн.цроссед_цолумн
  • Додајте параметар регуларизације