Лінійна регресія з TensorFlow (приклади)

Зміст:

Anonim

Що таке лінійна регресія?

Лінійна регресія - це підхід у статистиці для моделювання взаємозв’язків між двома змінними. Це моделювання проводиться між скалярною реакцією та однією або кількома пояснювальними змінними. Зв'язок з однією пояснювальною змінною називається простою лінійною регресією, а для кількох пояснювальних змінних - багаторазовою лінійною регресією.

TensorFlow надає інструменти для повного контролю обчислень. Це робиться за допомогою API низького рівня. Крім того, TensorFlow оснащений широким спектром API для виконання багатьох алгоритмів машинного навчання. Це API високого рівня. TensorFlow називає їх оцінювачами

  • API низького рівня: побудуйте архітектуру, оптимізуйте модель з нуля. Для новачка це складно
  • API високого рівня: Визначте алгоритм. Це зручно для споживання. TensorFlow надає інструментальний інструмент оцінки викликів для побудови, навчання, оцінки та прогнозування.

У цьому посібнику ви будете використовувати лише оцінювачі . Обчислення швидші та легші у реалізації. Перша частина підручника пояснює, як використовувати оптимізатор градієнтного спуску для тренування лінійної регресії в TensorFlow. У другій частині ви використовуватимете набір даних Бостона, щоб передбачити ціну будинку за допомогою оцінювача TensorFlow.

Завантажте Boston DataSet

У цьому посібнику з регресії TensorFlow ви дізнаєтесь:

  • Що таке лінійна регресія?
  • Як тренувати модель лінійної регресії
  • Як тренувати лінійну регресію за допомогою TensorFlow
  • Панди
  • Рішення Numpy
  • Розчин тенсорфлоу

Як тренувати модель лінійної регресії

Перш ніж ми почнемо тренувати модель, давайте розглянемо, що таке лінійна регресія.

Уявіть, що у вас є дві змінні, x та y, і ваше завдання передбачити значення знання значення. Якщо побудувати дані, ви можете побачити позитивний зв’язок між вашою незалежною змінною x та залежною змінною y.

Ви можете помітити, якщо x = 1, y приблизно буде дорівнює 6, а якщо x = 2, y буде приблизно 8,5.

Це не дуже точний метод і схильний до помилок, особливо з набором даних із сотнями тисяч точок.

Лінійна регресія оцінюється за рівнянням. Змінна y пояснюється одним або багатьма коваріатами. У вашому прикладі є лише одна залежна змінна. Якщо вам потрібно написати це рівняння, воно буде:

З:

  • - вага, пов'язана з x
  • - залишок або похибка моделі. Він включає те, що модель не може дізнатися з даних

Уявіть, що вам підходить модель, і ви знайдете таке рішення для:

  • = 3,8
  • = 2,78

Ви можете підставити ці числа в рівняння, і воно стане:

y = 3,8 + 2,78x

Тепер у вас є кращий спосіб знайти значення для y. Тобто, ви можете замінити x будь-яким значенням, яке хочете передбачити y. На зображенні нижче ми замінили x у рівнянні на всі значення в наборі даних та побудували результат.

Червона лінія являє собою встановлене значення, тобто значення y для кожного значення x. Вам не потрібно бачити значення x, щоб передбачити y, для кожного x є будь-яке, що належить червоній лінії. Ви також можете передбачити значення x вище 2!

Якщо ви хочете поширити лінійну регресію на більше коваріатів, ви можете, додавши до моделі більше змінних. Різниця між традиційним аналізом та лінійною регресією полягає в тому, що лінійна регресія дивиться на те, як y буде реагувати на кожну змінну x, взяту незалежно.

Подивимось приклад. Уявіть, що ви хочете передбачити продажі магазину морозива. Набір даних містить різну інформацію, таку як погода (тобто дощова, сонячна, хмарна), інформація про клієнтів (тобто зарплата, стать, сімейний стан).

Традиційний аналіз спробує передбачити продаж, скажімо, обчислюючи середнє значення для кожної змінної та спробуючи оцінити продаж для різних сценаріїв. Це призведе до поганих прогнозів та обмежить аналіз за вибраним сценарієм.

Якщо ви використовуєте лінійну регресію, ви можете написати це рівняння:

Алгоритм знайде найкраще рішення для ваг; це означає, що він намагатиметься мінімізувати витрати (різниця між встановленою лінією та точками даних).

Як працює алгоритм

Алгоритм вибере випадкове число для кожного замінить значення х, щоб отримати передбачуване значення у. Якщо набір даних має 100 спостережень, алгоритм обчислює 100 передбачуваних значень.

Ми можемо обчислити помилку, зазначену в моделі, яка є різницею між передбачуваним значенням і реальним значенням. Позитивна помилка означає, що модель занижує прогноз y, а негативна похибка означає, що модель завищує прогноз y.

Ваша мета - мінімізувати квадрат помилки. Алгоритм обчислює середнє значення квадратної помилки. Цей етап називається мінімізацією помилки. Для лінійної регресії використовується середньоквадратична помилка , яка також називається MSE. Математично це:

Де:

  • посилається на передбачуване значення
  • y - реальні значення
  • m - кількість спостережень

Зверніть увагу, що математичне позначення середнього.

Мета - знайти найкраще, що мінімізує MSE

Якщо середня похибка велика, це означає, що модель працює погано, а ваги вибрані неправильно. Щоб виправити ваги, потрібно використовувати оптимізатор. Традиційний оптимізатор називається Gradient Descent .

Градієнтний спуск приймає похідну і зменшує або збільшує вагу. Якщо похідна позитивна, вага зменшується. Якщо похідна від’ємна, вага збільшується. Модель оновить ваги та перерахує помилку. Цей процес повторюється, поки помилка більше не змінюється. Кожен процес називається ітерацією . Крім того, градієнти множаться на швидкість навчання. Це вказує на швидкість навчання.

Якщо швидкість навчання занадто мала, для зближення алгоритму знадобиться дуже багато часу (тобто потрібно багато ітерацій). Якщо рівень навчання занадто високий, алгоритм може ніколи не сходитися.

Як видно з малюнка вище, модель повторює процес приблизно 20 разів, перш ніж знаходити стабільне значення ваг, отже, досягаючи найнижчої помилки.

Зверніть увагу , що похибка не дорівнює нулю, але стабілізується близько 5. Це означає, що модель робить типову помилку 5. Якщо ви хочете зменшити помилку, вам потрібно додати до моделі більше інформації, наприклад більше змінних або різні оцінювачі.

Ви пам’ятаєте перше рівняння

Остаточні ваги - 3,8 та 2,78. Відео нижче показує, як градієнтний спуск оптимізує функцію втрат, щоб знайти ці ваги

Як тренувати лінійну регресію за допомогою TensorFlow

Тепер, коли ви краще розумієте, що відбувається за капотом, ви готові використовувати API оцінювача, надане TensorFlow, для тренування вашої першої лінійної регресії за допомогою TensorFlow.

Ви будете використовувати набір даних Бостона, який включає наступні змінні

злочинний рівень злочинності на душу населення за містом
zn частка житлової землі, районованої для ділянок понад 25000 кв. футів.
indus частка нероздрібних ділових акрів на місто.
нокс концентрація оксидів азоту
rm середня кількість кімнат на житло
вік частка одиниць, зайнятих власниками, побудованих до 1940 року
дис зважені відстані до п'яти центрів зайнятості в Бостоні
податковий повна ставка податку на майно на 10000 доларів
ptratio співвідношення учнів та викладачів за містом
медв Середня вартість будинків, зайнятих власниками, у тисячах доларів

Ви створите три різні набори даних:

набір даних об'єктивний форму
Навчання Тренуйте модель і отримуйте ваги 400, 10
Оцінка Оцініть ефективність моделі за невидимими даними 100, 10
Передбачити Використовуйте модель для прогнозування вартості будинку за новими даними 6, 10

Завдання полягає у використанні особливостей набору даних для прогнозування вартості будинку.

Під час другої частини підручника ви дізнаєтесь, як використовувати TensorFlow із трьома різними способами імпорту даних:

  • З Пандами
  • З Numpy
  • Тільки TF

Зауважте, що всі варіанти дають однакові результати.

Ви дізнаєтесь, як використовувати API високого рівня для побудови, навчити оцінювати модель лінійної регресії TensorFlow. Якщо ви використовували API низького рівня, вам потрібно було вручну визначити:

  • Функція збитків
  • Оптимізація: Градієнтний спуск
  • Множення матриць
  • Графік і тензор

Це нудно і складніше для початківців.

Панди

Вам потрібно імпортувати необхідні бібліотеки для навчання моделі.

import pandas as pdfrom sklearn import datasetsimport tensorflow as tfimport itertools 

Крок 1) Імпортуйте дані за допомогою panda.

Ви визначаєте імена стовпців і зберігаєте їх у СТОЛЬБАХ. Ви можете використовувати pd.read_csv () для імпортування даних.

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

training_set = pd.read_csv ("E: /boston_train.csv", skipinitialspace = True, skiprows = 1, імена = СТОЛПЦІ)

test_set = pd.read_csv ("E: /boston_test.csv", skipinitialspace = True, skiprows = 1, names = COLUMNS)

prediction_set = pd.read_csv ("E: /boston_predict.csv", skipinitialspace = True, skiprows = 1, names = COLUMNS)

Ви можете надрукувати форму даних.

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

Вихідні дані

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

Зверніть увагу, що мітка, тобто ваш y, включена до набору даних. Тож вам потрібно визначити ще два списки. Той, що містить лише особливості, і той, що має лише назву етикетки. Ці два списки повідомлять вашому оцінювачу, які функції в наборі даних і яке ім’я стовпця є міткою

Це робиться з кодом нижче.

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

Крок 2) Перетворення даних

Вам потрібно перетворити числові змінні у відповідний формат. Tensorflow забезпечує метод перетворення безперервної змінної: tf.feature_column.numeric_column ().

На попередньому кроці ви визначаєте список функцій, які ви хочете включити в модель. Тепер ви можете використовувати цей список для перетворення їх у числові дані. Якщо ви хочете виключити функції у вашій моделі, сміливо опускайте одну або кілька змінних у списку ОСОБЛИВОСТІ перед тим, як створювати характеристики_колі

Зверніть увагу, що ви будете використовувати розуміння списку Python зі списком ОСОБЛИВОСТІ, щоб створити новий список з назвою feature_cols. Це допоможе вам уникнути написання дев'яти разів tf.feature_column.numeric_column (). Розуміння списку - це більш швидкий і чистий спосіб створення нових списків

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

Крок 3) Визначте оцінювач

На цьому кроці вам потрібно визначити оцінювач. На даний момент Tensorflow пропонує 6 попередньо побудованих оцінювачів, у тому числі 3 для завдання класифікації та 3 для завдання регресії TensorFlow:

  • Регресор
    • DNNRegressor
    • LinearRegressor
    • DNNLineaCombinedRegressor
  • Класифікатор
    • Класифікатор DNN
    • LinearClassifier
    • DNNLineaCombinedClassifier

У цьому посібнику ви будете використовувати Linear Regressor. Щоб отримати доступ до цієї функції, вам потрібно використовувати tf.estimator.

Функція потребує двох аргументів:

  • стовпці_функцій: Містить змінні, які потрібно включити в модель
  • model_dir: шлях до збереження графіку, збереження параметрів моделі тощо

Tensorflow автоматично створить файл із назвою train у вашому робочому каталозі. Вам потрібно скористатися цим шляхом для доступу до Tensorboard, як показано в наведеному нижче прикладі регресії TensorFlow.

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}

Хитра частина з TensorFlow - це спосіб годувати модель. Tensorflow призначений для роботи з паралельними обчисленнями та дуже великим набором даних. Через обмеження ресурсів машини неможливо подати модель усіма даними одночасно. Для цього потрібно щоразу подавати пакет даних. Зауважте, що мова йде про величезний набір даних з мільйонами або більше записами. Якщо ви не додасте пакет, ви отримаєте помилку пам'яті.

Наприклад, якщо ваші дані містять 100 спостережень і ви визначили розмір партії 10, це означає, що модель побачить 10 спостережень для кожної ітерації (10 * 10).

Коли модель побачила всі дані, вона закінчує одну епоху . Епоха визначає, скільки разів ви хочете, щоб модель бачила дані. Краще встановити для цього кроку значення none і нехай модель виконує ітераційну кількість разів.

Друга інформація, яку слід додати, - це якщо ви хочете перетасувати дані перед кожною ітерацією. Під час навчання важливо перетасувати дані, щоб модель не вивчила конкретний шаблон набору даних. Якщо модель дізнається деталі базового шаблону даних, їй складно буде узагальнити прогноз для невидимих ​​даних. Це називається переобладнанням . Модель добре працює на даних навчання, але не може правильно передбачити невидимі дані.

TensorFlow робить ці два кроки простими. Коли дані надходять у конвеєр, він знає, скільки спостережень йому потрібно (пакетне), і якщо йому доводиться перетасовувати дані.

Щоб навчити Tensorflow, як годувати модель, ви можете використовувати pandas_input_fn. Цей об’єкт потребує 5 параметрів:

  • x: дані функції
  • y: дані мітки
  • batch_size: batch. За замовчуванням 128
  • num_epoch: кількість епох, за замовчуванням 1
  • перетасувати: перетасувати дані чи не. За замовчуванням немає

Вам потрібно подавати модель багато разів, щоб ви визначили функцію для повторення цього процесу. вся ця функція get_input_fn.

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) 

Звичайним методом оцінки роботи моделі є:

  • Тренуйте модель
  • Оцініть модель в іншому наборі даних
  • Зробити прогноз

Оцінювач Tensorflow забезпечує три різні функції для легкого виконання цих трьох кроків.

Крок 4) : Навчіть модель

Для оцінки моделі можна використовувати інструмент оцінки. Оцінювачу поїздів потрібні input_fn та кілька кроків. Ви можете використовувати функцію, яку ви створили вище, для подачі моделі. Потім ви доручаєте моделі повторити 1000 разів. Зверніть увагу, що ви не вказуєте кількість епох, ви дозволяєте моделі повторюватись 1000 разів. Якщо встановити кількість епох на 1, то модель буде повторюватися 4 рази: у навчальному наборі є 400 записів, а розмір партії - 128

  1. 128 рядів
  2. 128 рядів
  3. 128 рядів
  4. 16 рядів

Отже, простіше встановити кількість епох на нуль та визначити кількість ітерацій, як показано на нижче під прикладом класифікації TensorFlow.

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.

Ви можете перевірити, чи Tensorboard виконає таку команду:

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) Зробіть прогноз

Нарешті, ви можете скористатись прогнозом TensorFlow, щоб оцінити вартість 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

Зверніть увагу, що ми не знаємо справжнього значення. У підручнику глибокого навчання ви спробуєте перемогти лінійну модель

Рішення Numpy

У цьому розділі пояснюється, як тренувати модель за допомогою оцінювача Numpy для подачі даних. Метод є тим самим, крім того, що ви будете використовувати оцінювач numpy_input_fn.

training_set_n = pd.read_csv ("E: /boston_train.csv"). значення

test_set_n = pd.read_csv ("E: /boston_test.csv"). значення

prediction_set_n = pd.read_csv ("E: /boston_predict.csv"). значення

Крок 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) 

Вам потрібно виключити останній стовпець набору даних прогнозування, оскільки він містить лише NaN

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} 

Ви можете використовувати оцінку numpy, щоб подати дані в модель, а потім навчити модель. Зверніть увагу, що ми визначаємо функцію input_fn раніше, щоб полегшити читабельність.

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

Розчин тенсорфлоу

Останній розділ присвячений рішенню TensorFlow. Цей метод набагато складніший, ніж інший.

Зверніть увагу, що якщо ви використовуєте блокнот Jupyter, вам потрібно перезапустити та очистити ядро, щоб запустити цей сеанс.

TensorFlow створив чудовий інструмент для передачі даних у конвеєр. У цьому розділі ви створите функцію input_fn самостійно.

Крок 1) Визначте шлях та формат даних

Перш за все, ви оголошуєте дві змінні із шляхом до файлу csv. Зверніть увагу, що у вас є два файли, один для навчального набору та один для набору для тестування.

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

Потім вам потрібно визначити стовпці, які ви хочете використовувати з файлу csv. Ми використаємо всі. Після цього вам потрібно оголосити тип змінної.

Змінна floats визначається як [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) Визначте функцію input_fn

Функцію можна розділити на три частини:

  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 

** Імпорт даних **

Для CSV-файлу метод набору даних зчитує по одному рядку. Для побудови набору даних потрібно використовувати об’єкт TextLineDataset. Ваш набір даних має заголовок, тому вам потрібно використовувати skip (1), щоб пропустити перший рядок. На цьому етапі ви лише читаєте дані та виключаєте заголовок у конвеєрі. Щоб подати модель, потрібно відокремити функції від етикетки. Метод, який використовується для застосування будь-якого перетворення до даних, - це map.

Цей метод викликає функцію, яку ви створите, щоб проінструктувати, як перетворити дані. У двох словах вам потрібно передати дані в об'єкт TextLineDataset, виключити заголовок і застосувати перетворення, яке вказує функція.

  • tf.data.TextLineDataset (файл_даних): Цей рядок читає файл csv
  • .skip (1): пропустити заголовок
  • .map (parse_csv)): синтаксичний розбір записів на тензори Вам потрібно визначити функцію для вказівки об’єкту карти. Ви можете викликати цю функцію parse_csv.

Ця функція аналізує файл csv методом tf.decode_csv та оголошує функції та мітку. Функції можуть бути оголошені як словник або кортеж. Ви використовуєте словниковий метод, оскільки він є більш зручним. Пояснення коду

  • tf.decode_csv (value, record_defaults = RECORDS_ALL): метод decode_csv використовує вихідні дані TextLineDataset для читання файлу csv. record_defaults вказує TensorFlow про тип стовпців.
  • dict (zip (_CSV_COLUMNS, стовпці)): заповніть словник усіма стовпцями, вилученими під час цієї обробки даних
  • features.pop ('median_house_value'): Виключіть цільову змінну зі змінної функції та створіть змінну мітки

Набору даних потрібні додаткові елементи, щоб ітеративно подавати тензори. Дійсно, вам потрібно додати метод повторення, щоб дозволити набору даних продовжувати необмежений час, щоб подавати модель. Якщо ви не додасте метод, модель повторить лише один раз, а потім видасть помилку, оскільки більше даних не подається в конвеєр.

Після цього ви можете контролювати розмір партії за допомогою пакетного методу. Це означає, що ви повідомляєте набору даних, скільки даних ви хочете передати в конвеєр для кожної ітерації. Якщо ви встановите великий розмір партії, модель буде повільною.

Крок 3) Створіть ітератор

Тепер ви готові до другого кроку: створіть ітератор для повернення елементів у наборі даних.

Найпростіший спосіб створення оператора - це метод make_one_shot_iterator.

Після цього ви можете створити функції та мітки з ітератора.

Крок 4) Споживаємо дані

Ви можете перевірити, що відбувається за допомогою функції input_fn. Вам потрібно викликати функцію під час сеансу для споживання даних. Ви намагаєтесь із розміром партії, рівним 1.

Зверніть увагу, що він друкує функції у словнику та мітку як масив.

Він покаже перший рядок csv-файлу. Ви можете спробувати запустити цей код багато разів з різним розміром партії.

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) Створення моделі

Ви можете навчити модель за допомогою оцінювача LinearRegressor.

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}

Вам потрібно використовувати лямбда-функцію, щоб дозволити записати аргумент у функції inpu_fn. Якщо ви не використовуєте лямбда-функцію, ви не можете навчити модель.

# 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 функцій, тому вам потрібно вказати значення для кожної. Модель надасть прогноз для кожного з них.

У наведеному нижче коді ви записали значення кожної функції, яка міститься у файлі CSV df_predict.

Вам потрібно написати нову функцію input_fn, оскільки в наборі даних немає мітки. Ви можете використовувати API from_tensor із набору даних.

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

Резюме

Щоб навчити модель, потрібно:

  • Визначте ознаки: Незалежні змінні: X
  • Визначте мітку: Залежна змінна: y
  • Побудуйте поїзд / випробувальний комплект
  • Визначте початкову вагу
  • Визначте функцію збитків: MSE
  • Оптимізуйте модель: Градієнтний спуск
  • Визначте:
    • Швидкість навчання
    • Номер епохи
    • Розмір партії

У цьому підручнику ви дізналися, як використовувати API високого рівня для оцінювача TensorFlow лінійної регресії. Вам потрібно визначити:

  1. Стовпці об’єктів. Якщо безперервно: tf.feature_column.numeric_column (). Ви можете заповнити список розумінням списку python
  2. Оцінювач: tf.estimator.LinearRegressor (стовпці_функцій, модель_директора)
  3. Функція імпорту даних, розміру партії та епохи: input_fn ()

Після цього ви готові тренуватися, оцінювати та робити прогнози за допомогою train (), оцінювати () та передбачати ()