Линеарна регресија са ТенсорФлов (примери)

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

Anonim

Шта је линеарна регресија?

Линеарна регресија је приступ у статистици за моделирање односа између две променљиве. Ово моделирање се врши између скаларног одговора и једне или више променљивих објашњења. Веза са једном променљивом објашњења назива се једноставна линеарна регресија, а за више варијабли објашњења назива се вишеструка линеарна регресија.

ТенсорФлов нуди алате за потпуну контролу прорачуна. То се ради помоћу АПИ-ја ниског нивоа. Поврх свега, ТенсорФлов је опремљен широким низом АПИ-ја за извођење многих алгоритама машинског учења. Ово је АПИ високог нивоа. ТенсорФлов их назива процењивачима

  • АПИ ниског нивоа: Изградите архитектуру, оптимизацију модела од нуле. Компликовано је за почетнике
  • АПИ високог нивоа: Дефинишите алгоритам. Једноставнији је за употребу. ТенсорФлов пружа алатку за процену позива за израду, обуку, процену и предвиђање.

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

Преузмите Бостон ДатаСет

У овом водичу за регресију ТенсорФлов научићете:

  • Шта је линеарна регресија?
  • Како обучити модел линеарне регресије
  • Како тренирати линеарну регресију са ТенсорФлов-ом
  • Панде
  • Нумпи решење
  • Решење Тенсорфлов

Како обучити модел линеарне регресије

Пре него што почнемо да тренирамо модел, погледајмо шта је линеарна регресија.

Замислите да имате две променљиве, к и и, а ваш задатак је да предвидите вредност познавања вредности. Ако зацртате податке, можете видети позитиван однос између ваше независне променљиве к и зависне променљиве и.

Можете приметити, ако је к = 1, и ће отприлике бити једнако 6, а ако је к = 2, и ће бити око 8,5.

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

Линеарна регресија вреднује се једначином. Варијабла и је објашњена једном или више коваријација. У вашем примеру постоји само једна зависна променљива. Ако морате да напишете ову једначину, то ће бити:

Са:

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

Замислите да одговарате моделу и пронађите следеће решење за:

  • = 3.8
  • = 2,78

Те бројеве можете заменити у једначини и она постаје:

и = 3,8 + 2,78к

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

Црвена линија представља уграђену вредност, односно вредности и за сваку вредност к. Не треба да видите вредност к да бисте предвидели и, за сваки к постоји било који који припада црвеној линији. Такође можете предвидети за вредности к веће од 2!

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

Да видимо пример. Замислите да желите да предвидете продају продавнице сладоледа. Скуп података садржи различите информације као што су време (тј. Кишно, сунчано, облачно), информације о купцима (тј. Плата, пол, брачни статус).

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

Ако користите линеарну регресију, можете написати ову једначину:

Алгоритам ће пронаћи најбоље решење за пондере; то значи да ће покушати да смањи трошкове (разлика између уграђене линије и тачака података).

Како алгоритам функционише

Алгоритам ће изабрати случајни број за сваки и замени вредност к да предвиђену вриједност и. Ако скуп података има 100 запажања, алгоритам израчунава 100 предвиђених вредности.

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

Ваш циљ је да минимизирате квадрат грешке. Алгоритам израчунава средњу вредност квадратне грешке. Овај корак се назива минимизирање грешке. За линеарну регресију је грешка средњег квадрата , која се такође назива МСЕ. Математички је:

Где:

  • односи на предвиђену вредност
  • и су стварне вредности
  • м је број посматрања

Имајте на уму да то је математички запис средње вредности.

Циљ је да се пронађу најбољи који смањују МСЕ

Ако је просечна грешка велика, то значи да модел има лоше резултате и да пондери нису правилно изабрани. Да бисте исправили тежине, потребно је да користите оптимизатор. Традиционални оптимизатор се назива Градиент Десцент .

Градијентни спуст узима дериват и смањује или повећава тежину. Ако је дериват позитиван, тежина се смањује. Ако је дериват негативан, тежина се повећава. Модел ће ажурирати тежине и поново израчунати грешку. Овај поступак се понавља све док се грешка више не мења. Сваки процес назива се итерација . Поред тога, градијенти се множе са стопом учења. Указује на брзину учења.

Ако је стопа учења премала, биће потребно много времена да се алгоритам конвергира (тј. Захтева пуно итерација). Ако је стопа учења превисока, алгоритам се можда никада неће конвергирати.

Можете видети са горње слике, модел понавља поступак око 20 пута пре него што нађе стабилну вредност за пондере, чиме се постиже најмања грешка.

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

Сећате се прве једначине

Коначни пондери су 3,8 и 2,78. Видео у наставку приказује вам како градијентни спуст оптимизује функцију губитка да би се пронашли те тежине

Како тренирати линеарну регресију са ТенсорФлов-ом

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

Користићете Бостонски скуп података, који укључује следеће променљиве

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

Створићете три различита скупа података:

скуп података објективан облик
обука Обучити модел и добити тежине 400, 10
Процена Процените перформансе модела на невиђеним подацима 100, 10
Предвидите Користите модел за предвиђање вредности куће на новим подацима 6, 10

Циљеви су употреба карактеристика скупа података за предвиђање вредности куће.

Током другог дела водича научићете како да користите ТенсорФлов на три различита начина за увоз података:

  • Са Пандама
  • Са Нумпием
  • Само ТФ

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

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

  • Функција губитка
  • Оптимизуј: Градиентни спуст
  • Множење матрица
  • Графикон и тензор

Ово је заморно и сложеније за почетнике.

Панде

Морате да увезете потребне библиотеке за обуку модела.

import pandas as pdfrom sklearn import datasetsimport tensorflow as tfimport itertools 

Корак 1) Увезите податке помоћу панде.

Ви дефинишете имена колона и чувате их у КОЛОНАМА. Можете да користите пд.реад_цсв () за увоз података.

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age","dis", "tax", "ptratio", "medv"]

траининг_сет = пд.реад_цсв ("Е: /бостон_траин.цсв", скипинитиалспаце = Труе, скипровс = 1, намес = ЦОЛУМНС)

тест_сет = пд.реад_цсв ("Е: /бостон_тест.цсв", скипинитиалспаце = Труе, скипровс = 1, намес = ЦОЛУМНС)

предицтион_сет = пд.реад_цсв ("Е: /бостон_предицт.цсв", скипинитиалспаце = Труе, скипровс = 1, намес = ЦОЛУМНС)

Можете да одштампате облик података.

print(training_set.shape, test_set.shape, prediction_set.shape) 

Оутпут

(400, 10) (100, 10) (6, 10)

Имајте на уму да је ознака, тј. Ваш и, укључена у скуп података. Дакле, треба да дефинишете две друге листе. Један који садржи само карактеристике и онај са именом само ознаке. Ове две листе ће рећи вашем проценитељу које су карактеристике у скупу података и које је име колоне ознака

То се ради помоћу доњег кода.

FEATURES = ["crim", "zn", "indus", "nox", "rm","age", "dis", "tax", "ptratio"]LABEL = "medv" 

Корак 2) Претворите податке

Морате претворити нумеричке променљиве у одговарајући формат. Тенсорфлов пружа метод за претварање континуиране променљиве: тф.феатуре_цолумн.нумериц_цолумн ().

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

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

feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES] 

Корак 3) Дефинишите процењивач

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

  • Регресор
    • ДННРегрессор
    • ЛинеарРегрессор
    • ДННЛинеаЦомбинедРегрессор
  • Класификатор
    • ДННЦлассифиер
    • ЛинеарЦлассифиер
    • ДННЛинеаЦомбинедЦлассифиер

У овом упутству ћете користити Линеар Регрессор. Да бисте приступили овој функцији, потребно је да користите тф.естиматор.

Функцији су потребна два аргумента:

  • феатуре_цолумнс: Садржи променљиве које треба укључити у модел
  • модел_дир: путања за чување графа, чување параметара модела итд

Тенсорфлов ће аутоматски створити датотеку под називом воз у вашем радном директоријуму. Морате да користите ову путању за приступ Тенсорбоард-у, као што је приказано у доњем примеру регресије ТенсорФлов-а.

estimator = tf.estimator.LinearRegressor(feature_columns=feature_cols,model_dir="train") 

Оутпут

INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': '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}

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

На пример, ако ваши подаци садрже 100 запажања, а ви одредите величину серије од 10, то значи да ће модел видети 10 запажања за сваку итерацију (10 * 10).

Када модел види све податке, завршава једну епоху . Епоха дефинише колико пута желите да модел види податке. Боље је овај корак подесити на ниједан и пустити да модел изврши понављање колико пута.

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

ТенсорФлов олакшава ова два корака. Када подаци иду у цевовод, он зна колико им је запажања потребно (групно) и да ли мора да меша податке.

Да бисте Тенсорфлов упутили како да храни модел, можете да користите пандас_инпут_фн. За овај објекат је потребно 5 параметара:

  • к: подаци о карактеристикама
  • и: подаци етикете
  • батцх_сизе: батцх. Подразумевано 128
  • нум_епоцх: Број епоха, подразумевано 1
  • насумично премештање: мешање података или не. Подразумевано, Ниједно

Модел требате хранити више пута, тако да дефинишете функцију која ће поновити овај поступак. све ове функције гет_инпут_фн.

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) 

Уобичајена метода за процену перформанси модела је:

  • Обучи модел
  • Процените модел у другом скупу података
  • Направите предвиђање

Процењивач Тенсорфлов пружа три различите функције за лако извођење ова три корака.

Корак 4) : Обучите модел

За процену модела можете користити воз процене. Проценитељу воза је потребан инпут_фн и одређени број корака. Функцију коју сте претходно креирали можете користити за храњење модела. Затим упутите модел да се понови 1000 пута. Имајте на уму да, ако не наведете број епоха, дозвољавате да се модел понавља 1000 пута. Ако подесите број епоха на 1, тада ће се модел поновити 4 пута: У комплету за обуку има 400 записа, а величина серије је 128

  1. 128 редова
  2. 128 редова
  3. 128 редова
  4. 16 редова

Због тога је лакше поставити број епоха на ниједно и дефинисати број итерација као што је приказано испод испод примера класификације ТенсорФлов.

estimator.train(input_fn=get_input_fn(training_set,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 train/model.ckpt.INFO:tensorflow:loss = 83729.64, step = 1INFO:tensorflow:global_step/sec: 238.616INFO:tensorflow:loss = 13909.657, step = 101 (0.420 sec)INFO:tensorflow:global_step/sec: 314.293INFO:tensorflow:loss = 12881.449, step = 201 (0.320 sec)INFO:tensorflow:global_step/sec: 303.863INFO:tensorflow:loss = 12391.541, step = 301 (0.327 sec)INFO:tensorflow:global_step/sec: 308.782INFO:tensorflow:loss = 12050.5625, step = 401 (0.326 sec)INFO:tensorflow:global_step/sec: 244.969INFO:tensorflow:loss = 11766.134, step = 501 (0.407 sec)INFO:tensorflow:global_step/sec: 155.966INFO:tensorflow:loss = 11509.922, step = 601 (0.641 sec)INFO:tensorflow:global_step/sec: 263.256INFO:tensorflow:loss = 11272.889, step = 701 (0.379 sec)INFO:tensorflow:global_step/sec: 254.112INFO:tensorflow:loss = 11051.9795, step = 801 (0.396 sec)INFO:tensorflow:global_step/sec: 292.405INFO:tensorflow:loss = 10845.855, step = 901 (0.341 sec)INFO:tensorflow:Saving checkpoints for 1000 into train/model.ckpt.INFO:tensorflow:Loss for final step: 5925.9873.

Можете да проверите да ли ће Тенсорбоард извршити следећу команду:

activate hello-tf# For MacOStensorboard --logdir=./train# For Windowstensorboard --logdir=train 

Корак 5) Процените свој модел

Уклапање вашег модела у тест сет можете да процените помоћу доњег кода:

ev = estimator.evaluate(input_fn=get_input_fn(test_set,num_epochs=1,n_batch = 128,shuffle=False)) 

Оутпут

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-13-01:43:13INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-13-01:43:13INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896

Губитак можете одштампати помоћу доњег кода:

loss_score = ev["loss"]print("Loss: {0:f}".format(loss_score)) 

Оутпут

Loss: 3215.895996

Модел има губитак од 3215. Можете да проверите збирну статистику да бисте добили идеју о томе колика је грешка.

training_set['medv'].describe()

Оутпут

count 400.000000mean 22.625500std 9.572593min 5.00000025% 16.60000050% 21.40000075% 25.025000max 50.000000Name: medv, dtype: float64 

Из горње сумарне статистике знате да је просечна цена куће 22 хиљаде, са минималном ценом од 9 хиљада, а максималном 50 хиљада. Модел прави типичну грешку од 3 хиљаде долара.

Корак 6) Направите предвиђање

На крају, можете да користите процену процене ТенсорФлов да бисте проценили вредност 6 бостонских кућа.

y = estimator.predict(input_fn=get_input_fn(prediction_set,num_epochs=1,n_batch = 128,shuffle=False)) 

Да бисте одштампали процењене вредности, можете да користите овај код:

predictions = list(p["predictions"] for p in itertools.islice(y, 6))print("Predictions: {}".format(str(predictions))) 

Оутпут

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.Predictions: [array([32.297546], dtype=float32), array([18.96125], dtype=float32), array([27.270979], dtype=float32), array([29.299236], dtype=float32), array([16.436684], dtype=float32), array([21.460876], dtype=float32)]

Модел предвиђа следеће вредности:

Кућа

Предвиђање

1

32.29

2

18.96

3

27.27

4

29.29

5

16.43

7

21.46

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

Нумпи решење

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

траининг_сет_н = пд.реад_цсв ("Е: /бостон_траин.цсв"). вредности

тест_сет_н = пд.реад_цсв ("Е: /бостон_тест.цсв"). вредности

предицтион_сет_н = пд.реад_цсв ("Е: /бостон_предицт.цсв"). вредности

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

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

def prepare_data(df):X_train = df[:, :-3]y_train = df[:,-3]return X_train, y_train 

Помоћу функције можете раздвојити налепницу од карактеристика скупа података о возу / процени

X_train, y_train = prepare_data(training_set_n)X_test, y_test = prepare_data(test_set_n) 

Морате изузети последњу колону скупа података предвиђања јер садржи само НаН

x_predict = prediction_set_n[:, :-2] 

Потврдите облик низа. Имајте на уму да ознака не би требала имати димензију, то значи (400,).

print(X_train.shape, y_train.shape, x_predict.shape) 

Оутпут

(400, 9) (400,) (6, 9) 

Колоне карактеристика можете конструисати на следећи начин:

feature_columns = [ tf.feature_column.numeric_column('x', shape=X_train.shape[1:])] 

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

estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns,model_dir="train1") 

Оутпут

INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': '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} 

Можете користити нумпи процјену да податке унесете у модел, а затим обучите модел. Имајте на уму да смо претходно дефинисали функцију инпут_фн да бисмо олакшали читљивост.

# Train the estimatortrain_input = tf.estimator.inputs.numpy_input_fn(x={"x": X_train},y=y_train,batch_size=128,shuffle=False,num_epochs=None)estimator.train(input_fn = train_input,steps=5000) 

Оутпут

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 train1/model.ckpt.INFO:tensorflow:loss = 83729.64, step = 1INFO:tensorflow:global_step/sec: 490.057INFO:tensorflow:loss = 13909.656, step = 101 (0.206 sec)INFO:tensorflow:global_step/sec: 788.986INFO:tensorflow:loss = 12881.45, step = 201 (0.126 sec)INFO:tensorflow:global_step/sec: 736.339INFO:tensorflow:loss = 12391.541, step = 301 (0.136 sec)INFO:tensorflow:global_step/sec: 383.305INFO:tensorflow:loss = 12050.561, step = 401 (0.260 sec)INFO:tensorflow:global_step/sec: 859.832INFO:tensorflow:loss = 11766.133, step = 501 (0.117 sec)INFO:tensorflow:global_step/sec: 804.394INFO:tensorflow:loss = 11509.918, step = 601 (0.125 sec)INFO:tensorflow:global_step/sec: 753.059INFO:tensorflow:loss = 11272.891, step = 701 (0.134 sec)INFO:tensorflow:global_step/sec: 402.165INFO:tensorflow:loss = 11051.979, step = 801 (0.248 sec)INFO:tensorflow:global_step/sec: 344.022INFO:tensorflow:loss = 10845.854, step = 901 (0.288 sec)INFO:tensorflow:Saving checkpoints for 1000 into train1/model.ckpt.INFO:tensorflow:Loss for final step: 5925.985.Out[23]:

Исти корак реплицирате другим проценитељем да бисте проценили свој модел

eval_input = tf.estimator.inputs.numpy_input_fn(x={"x": X_test},y=y_test,shuffle=False,batch_size=128,num_epochs=1)estimator.evaluate(eval_input,steps=None) 

Оутпут

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-13-01:44:00INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-13-01:44:00INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.158947, global_step = 1000, loss = 3215.8945Out[24]:{'average_loss': 32.158947, 'global_step': 1000, 'loss': 3215.8945}

Напокон, можете израчунати предвиђање. Требало би да буде слично пандама.

test_input = tf.estimator.inputs.numpy_input_fn(x={"x": x_predict},batch_size=128,num_epochs=1,shuffle=False)y = estimator.predict(test_input)predictions = list(p["predictions"] for p in itertools.islice(y, 6))print("Predictions: {}".format(str(predictions))) 

Оутпут

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.Predictions: [array([32.297546], dtype=float32), array([18.961248], dtype=float32), array([27.270979], dtype=float32), array([29.299242], dtype=float32), array([16.43668], dtype=float32), array([21.460878], dtype=float32)]

Решење Тенсорфлов

Последњи одељак посвећен је решењу ТенсорФлов. Ова метода је знатно компликованија од друге.

Имајте на уму да ако користите Јупитер бележницу, морате поново покренути и очистити кернел да бисте покренули ову сесију.

ТенсорФлов је створио одличан алат за прослеђивање података у цевовод. У овом одељку ћете сами направити функцију инпут_фн.

Корак 1) Дефинишите путању и формат података

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

import tensorflow as tf
df_train = "E:/boston_train.csv"
df_eval = "E:/boston_test.csv"

Затим из цсв датотеке треба да дефинишете колоне које желите да користите. Користићемо све. После тога треба да декларишете тип променљиве која је то.

Флоатс променљива је дефинисана са [0.]

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age","dis", "tax", "ptratio", "medv"]RECORDS_ALL = [[0.0], [0.0], [0.0], [0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]] 

Корак 2) Дефинишите функцију инпут_фн

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

  1. Увезите податке
  2. Направите итератор
  3. Потрошите податке

Испод је општи код за дефинисање функције. Шифра ће бити објашњена након

def input_fn(data_file, batch_size, num_epoch = None):# Step 1def parse_csv(value):columns = tf.decode_csv(value, record_defaults= RECORDS_ALL)features = dict(zip(COLUMNS, columns))#labels = features.pop('median_house_value')labels = features.pop('medv')return features, labels# Extract lines from input files using theDataset API. dataset = (tf.data.TextLineDataset(data_file) # Read text file.skip(1) # Skip header row.map(parse_csv))dataset = dataset.repeat(num_epoch)dataset = dataset.batch(batch_size)# Step 3iterator = dataset.make_one_shot_iterator()features, labels = iterator.get_next()return features, labels 

** Увези податке **

За ЦСВ датотеку метода скупа података чита један по један ред. Да бисте изградили скуп података, потребно је да користите објекат ТектЛинеДатасет. Ваш скуп података има заглавље, тако да морате да прескочите (1) да бисте прескочили први ред. У овом тренутку само читате податке и изузимате заглавље у цевоводу. Да бисте нахранили модел, морате да одвојите функције од налепнице. Метода која се користи за примену било које трансформације на податке је мапа.

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

  • тф.дата.ТектЛинеДатасет (датотека_датотека): Овај ред чита цсв датотеку
  • .скип (1): прескочите заглавље
  • .мап (парсе_цсв)): рашчланити записе у тензореМорате дефинисати функцију која ће упутити објекат мапе. Ову функцију можете назвати парсе_цсв.

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

  • тф.децоде_цсв (валуе, рецорд_дефаултс = РЕЦОРДС_АЛЛ): метода децоде_цсв користи излаз ТектЛинеДатасет за читање цсв датотеке. рецорд_дефаултс упућује ТенсорФлов о типу колона.
  • дицт (зип (_ЦСВ_ЦОЛУМНС, колоне)): Попуните речник свим колонама издвојеним током ове обраде података
  • феатурес.поп ('медиан_хоусе_валуе'): Изузмите циљну променљиву из променљиве обележја и креирајте променљиву ознаке

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

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

Корак 3) Направите итератор

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

Најједноставнији начин стварања оператора је методом маке_оне_схот_итератор.

После тога можете да креирате функције и ознаке из итератора.

Корак 4) Унесите податке

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

Имајте на уму да штампа функције у речнику и налепницу као низ.

Приказаће се први ред цсв датотеке. Можете покушати да покренете овај код више пута са различитим величинама серије.

next_batch = input_fn(df_train, batch_size = 1, num_epoch = None)with tf.Session() as sess:first_batch = sess.run(next_batch)print(first_batch) 

Оутпут

({'crim': array([2.3004], dtype=float32), 'zn': array([0.], dtype=float32), 'indus': array([19.58], dtype=float32), 'nox': array([0.605], dtype=float32), 'rm': array([6.319], dtype=float32), 'age': array([96.1], dtype=float32), 'dis': array([2.1], dtype=float32), 'tax': array([403.], dtype=float32), 'ptratio': array([14.7], dtype=float32)}, array([23.8], dtype=float32))

Корак 4) Дефинишите колону карактеристика

Морате да дефинишете нумеричке колоне на следећи начин:

X1= tf.feature_column.numeric_column('crim')X2= tf.feature_column.numeric_column('zn')X3= tf.feature_column.numeric_column('indus')X4= tf.feature_column.numeric_column('nox')X5= tf.feature_column.numeric_column('rm')X6= tf.feature_column.numeric_column('age')X7= tf.feature_column.numeric_column('dis')X8= tf.feature_column.numeric_column('tax')X9= tf.feature_column.numeric_column('ptratio') 

Имајте на уму да је потребно комбиновати све променљиве у сегменту

base_columns = [X1, X2, X3,X4, X5, X6,X7, X8, X9] 

Корак 5) Изградите модел

Модел можете обучити помоћу процењивача ЛинеарРегрессор.

model = tf.estimator.LinearRegressor(feature_columns=base_columns, model_dir='train3') 

Оутпут

INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': '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}

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

# Train the estimatormodel.train(steps =1000,input_fn= lambda : input_fn(df_train,batch_size=128, num_epoch = None)) 

Оутпут

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 train3/model.ckpt.INFO:tensorflow:loss = 83729.64, step = 1INFO:tensorflow:global_step/sec: 72.5646INFO:tensorflow:loss = 13909.657, step = 101 (1.380 sec)INFO:tensorflow:global_step/sec: 101.355INFO:tensorflow:loss = 12881.449, step = 201 (0.986 sec)INFO:tensorflow:global_step/sec: 109.293INFO:tensorflow:loss = 12391.541, step = 301 (0.915 sec)INFO:tensorflow:global_step/sec: 102.235INFO:tensorflow:loss = 12050.5625, step = 401 (0.978 sec)INFO:tensorflow:global_step/sec: 104.656INFO:tensorflow:loss = 11766.134, step = 501 (0.956 sec)INFO:tensorflow:global_step/sec: 106.697INFO:tensorflow:loss = 11509.922, step = 601 (0.938 sec)INFO:tensorflow:global_step/sec: 118.454INFO:tensorflow:loss = 11272.889, step = 701 (0.844 sec)INFO:tensorflow:global_step/sec: 114.947INFO:tensorflow:loss = 11051.9795, step = 801 (0.870 sec)INFO:tensorflow:global_step/sec: 111.484INFO:tensorflow:loss = 10845.855, step = 901 (0.897 sec)INFO:tensorflow:Saving checkpoints for 1000 into train3/model.ckpt.INFO:tensorflow:Loss for final step: 5925.9873.Out[8]:

Можете да процените одговарајући модел на тест скупу помоћу доњег кода:

results = model.evaluate(steps =None,input_fn=lambda: input_fn(df_eval, batch_size =128, num_epoch = 1))for key in results:print(" {}, was: {}".format(key, results[key])) 

Оутпут

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-13-02:06:02INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-13-02:06:02INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896average_loss, was: 32.158958435058594loss, was: 3215.89599609375global_step, was: 1000

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

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

Морате да напишете нову функцију инпут_фн јер у скупу података нема ознаке. Можете користити АПИ фром_тенсор из скупа података.

prediction_input = {'crim': [0.03359,5.09017,0.12650,0.05515,8.15174,0.24522],'zn': [75.0,0.0,25.0,33.0,0.0,0.0],'indus': [2.95,18.10,5.13,2.18,18.10,9.90],'nox': [0.428,0.713,0.453,0.472,0.700,0.544],'rm': [7.024,6.297,6.762,7.236,5.390,5.782],'age': [15.8,91.8,43.4,41.1,98.9,71.7],'dis': [5.4011,2.3682,7.9809,4.0220,1.7281,4.0317],'tax': [252,666,284,222,666,304],'ptratio': [18.3,20.2,19.7,18.4,20.2,18.4]}def test_input_fn():dataset = tf.data.Dataset.from_tensors(prediction_input)return dataset# Predict all our prediction_inputpred_results = model.predict(input_fn=test_input_fn) 

Коначно, штампате предвиђања.

for pred in enumerate(pred_results):print(pred) 

Оутпут

INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.(0, {'predictions': array([32.297546], dtype=float32)})(1, {'predictions': array([18.96125], dtype=float32)})(2, {'predictions': array([27.270979], dtype=float32)})(3, {'predictions': array([29.299236], dtype=float32)})(4, {'predictions': array([16.436684], dtype=float32)})(5, {'predictions': array([21.460876], dtype=float32)})INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-5000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. (0, {'predictions': array([35.60663], dtype=float32)}) (1, {'predictions': array([22.298521], dtype=float32)}) (2, {'predictions': array([25.74533], dtype=float32)}) (3, {'predictions': array([35.126694], dtype=float32)}) (4, {'predictions': array([17.94416], dtype=float32)}) (5, {'predictions': array([22.606628], dtype=float32)})

Резиме

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

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

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

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

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