Підручник з лінійної регресії з TensorFlow [Приклади]
Що таке лінійна регресія?
Linear Regression це підхід у статистиці для моделювання зв’язків між двома змінними. Це моделювання виконується між скалярною відповіддю та однією або декількома пояснювальними змінними. Зв’язок з однією пояснювальною змінною називається простою лінійною регресією, а для кількох пояснювальних змінних – множинною лінійною регресією.
TensorFlow надає інструменти для повного контролю над обчисленнями. Це робиться за допомогою API низького рівня. Крім того, TensorFlow оснащено широким набором API для виконання багатьох завдань навчання за допомогою машини алгоритми. Це API високого рівня. TensorFlow називає їх оцінювачами
- API низького рівня: Побудова архітектури, оптимізація моделі з нуля. Для початківця це складно
- API високого рівня: Визначте алгоритм. Це легше зручно. TensorFlow надає інструментарій під назвою оцінювач конструювати, тренувати, оцінювати та робити прогнози.
У цьому підручнику ви будете використовувати тільки оцінювачі. Обчислення відбуваються швидше і їх легше реалізувати. У першій частині підручника пояснюється, як використовувати оптимізатор градієнтного спуску для навчання лінійної регресії в TensorFlow. У другій частині ви будете використовувати набір даних Бостона, щоб передбачити ціну будинку за допомогою оцінювача TensorFlow.
Як навчити модель лінійної регресії
Перш ніж почати навчання моделі, давайте подивимося, що таке лінійна регресія.
Уявіть, що у вас є дві змінні, x і y, і ваше завдання полягає в тому, щоб передбачити значення, знаючи значення . Якщо ви побудуєте дані, ви побачите позитивний зв’язок між незалежною змінною x і залежною змінною y.
Ви можете помітити, що якщо x=1, y буде приблизно дорівнювати 6, а якщо x=2, y буде близько 8.5.
Це не дуже точний метод і схильний до помилок, особливо з набором даних із сотнями тисяч точок.
Лінійна регресія обчислюється за допомогою рівняння. Змінна y пояснюється однією або багатьма коваріантами. У вашому прикладі є лише одна залежна змінна. Якщо вам потрібно написати це рівняння, воно буде таким:
З:
це упередженість. тобто якщо x=0, y=
це вага, пов’язана з x
є залишком або помилкою моделі. Він містить те, що модель не може дізнатися з даних
Уявіть, що ви відповідаєте моделі та знаходите наступне рішення для:
= 3.8
= 2.78
Ви можете підставити ці числа в рівняння, і воно стане:
y= 3.8 + 2.78x
Тепер у вас є кращий спосіб знайти значення для y. Тобто ви можете замінити x на будь-яке значення y, яке хочете передбачити. На зображенні нижче ми замінили x у рівнянні на всі значення в наборі даних і побудували результат.
Червона лінія представляє підігнане значення, тобто значення y для кожного значення x. Вам не потрібно бачити значення x, щоб передбачити y, для кожного x є будь-який, який належить до червоної лінії. Ви також можете прогнозувати для значень x, вищих за 2!
Якщо ви хочете поширити лінійну регресію на більше коваріантів, це можна зробити, додавши до моделі більше змінних. Різниця між традиційним аналізом і лінійною регресією полягає в тому, що лінійна регресія розглядає, як реагує y на кожну змінну x, взяту окремо.
Давайте розглянемо приклад. Уявіть, що ви хочете передбачити продажі в магазині морозива. Набір даних містить різну інформацію, наприклад погоду (тобто дощова, сонячна, хмарна), інформацію про клієнтів (тобто зарплату, стать, сімейний стан).
Традиційний аналіз намагатиметься передбачити продаж, скажімо, обчисливши середнє значення для кожної змінної та спробувати оцінити продаж для різних сценаріїв. Це призведе до поганих прогнозів і обмежить аналіз вибраним сценарієм.
Якщо ви використовуєте лінійну регресію, ви можете написати таке рівняння:
Алгоритм знайде найкраще рішення для ваг; це означає, що він намагатиметься мінімізувати витрати (різниця між підігнаною лінією та точками даних).
Як працює алгоритм
Алгоритм вибере випадкове число для кожного та
і замініть значення x, щоб отримати прогнозоване значення y. Якщо набір даних містить 100 спостережень, алгоритм обчислює 100 прогнозованих значень.
Ми можемо обчислити похибку, зазначив моделі, яка є різницею між прогнозованим значенням і реальним значенням. Позитивна помилка означає, що модель недооцінює прогноз y, а негативна помилка означає, що модель переоцінює прогноз y.
Ваша мета — мінімізувати квадрат помилки. Алгоритм обчислює середнє значення квадратичної помилки. Цей крок називається мінімізацією помилки. Для лінійної регресії це Середня квадратична помилка, також називається MSE. Математично це:
де:
ваги так
відноситься до прогнозованого значення
- y — справжні значення
- m – кількість спостережень
Зверніть увагу, що означає, що він використовує транспонування матриць. The
є математичним записом середнього значення.
Мета — знайти найкращого які мінімізують MSE
Якщо середня похибка велика, це означає, що модель працює погано, а ваги вибрано неправильно. Для корекції ваг потрібно використовувати оптимізатор. Традиційний оптимізатор називається Градієнтний спуск.
Градієнтний спуск приймає похідну та зменшує або збільшує вагу. Якщо похідна позитивна, вага зменшується. Якщо похідна від’ємна, вага збільшується. Модель оновить ваги та повторно обчислить помилку. Цей процес повторюється, доки помилка більше не змінюється. Кожен процес називається an ітерація. Крім того, градієнти множаться на швидкість навчання. Це вказує на швидкість навчання.
Якщо швидкість навчання надто мала, для збіжності алгоритму знадобиться дуже багато часу (тобто вимагає багато ітерацій). Якщо швидкість навчання надто висока, алгоритм може ніколи не сходитися.
Як видно на зображенні вище, модель повторює процес приблизно 20 разів, перш ніж знайти стабільне значення вагових коефіцієнтів, досягаючи найменшої похибки.
Зверніть увагу, що, похибка не дорівнює нулю, але стабілізується біля 5. Це означає, що типова похибка моделі дорівнює 5. Якщо ви хочете зменшити похибку, вам потрібно додати більше інформації до моделі, наприклад більше змінних, або використовувати інші оцінювачі .
Ви пам'ятаєте перше рівняння
Кінцеві ваги 3.8 і 2.78. У відео нижче показано, як градієнтний спуск оптимізує функцію втрат, щоб знайти ці вагові коефіцієнти
Як тренувати лінійну регресію за допомогою TensorFlow
Тепер, коли ви краще розумієте, що відбувається за капотом, ви готові використовувати API оцінювача, наданий TensorFlow, щоб навчити свою першу лінійну регресію за допомогою TensorFlow.
Ви будете використовувати Бостонський набір даних, який включає наступні змінні
крим | Рівень злочинності на душу населення по містах |
---|---|
zn | частка житлової землі, зонованої для ділянок понад 25,000 XNUMX кв. |
інд | частка акрів нероздрібного бізнесу на місто. |
nox | концентрація оксидів азоту |
rm | середня кількість кімнат на житло |
вік | Частка квартир, які займають власники, побудованих до 1940 року |
відстань | зважені відстані до п’яти центрів зайнятості Бостона |
податок | ставка податку на повну вартість майна за 10,000 XNUMX доларів США |
ptratio | Співвідношення учнів/вчителів за містами |
медв | Середня вартість будинків, які займають власники, у тисячах доларів |
Ви створите три різні набори даних:
набору даних | мета | формувати |
---|---|---|
Навчання | Тренуйте модель і отримайте ваги | 400, 10 |
Оцінка | Оцініть продуктивність моделі на невидимих даних | 100, 10 |
Прогнозуйте | Використовуйте модель для прогнозування вартості будинку на основі нових даних | 6, 10 |
Метою є використання функцій набору даних для прогнозування вартості будинку.
У другій частині підручника ви дізнаєтесь, як використовувати TensorFlow із трьома різними способами імпорту даних:
- З пандами
- З Пустотливий
- Тільки TF
Зауважте, що всі варіанти забезпечують ті самі результати.
Ви дізнаєтесь, як використовувати високорівневий API для створення, навчання та оцінки моделі лінійної регресії TensorFlow. Якщо ви використовували API низького рівня, вам потрібно було вручну визначити:
- Функція втрат
- Оптимізація: градієнтний спуск
- Множення матриць
- Граф і тензор
Це нудно і складніше для початківців.
Панди
Вам потрібно імпортувати необхідні бібліотеки для навчання моделі.
import pandas as pd from sklearn import datasets import tensorflow as tf import itertools
Крок 1) Імпортуйте дані за допомогою панда.
Ви визначаєте назви стовпців і зберігаєте їх у COLUMNS. Ви можете використовувати 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, names=COLUMNS)
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().
На попередньому кроці ви визначаєте список функцій, які хочете включити в модель. Тепер ви можете використовувати цей список, щоб перетворити їх у числові дані. Якщо ви хочете виключити функції у своїй моделі, не соромтеся відкинути одну або кілька змінних у списку FEATURES, перш ніж створювати Feature_cols
Зверніть увагу, що ви будете використовувати Python розуміння списку зі списком FEATURES, щоб створити новий список під назвою 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
- Лінійний регресор
- DNNLineaCombinedRegressor
- Класифікатор
- DNNClassifier
- Лінійний класифікатор
- DNNLineaCombinedClassifier
У цьому підручнику ви будете використовувати лінійний регресор. Щоб отримати доступ до цієї функції, вам потрібно використовувати tf.estimator.
Для функції потрібні два аргументи:
- feature_columns: містить змінні для включення в модель
- 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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a215dc550>, '_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: дані мітки
- розмір_партії: партія. За замовчуванням 128
- num_epoch: номер епохи, за замовчуванням 1
- shuffle: перемішувати чи ні дані. За замовчуванням немає
Вам потрібно подати модель багато разів, щоб визначити функцію для повторення цього процесу. все це функція 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
- 128 рядів
- 128 рядів
- 128 рядів
- 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 = 1 INFO:tensorflow:global_step/sec: 238.616 INFO:tensorflow:loss = 13909.657, step = 101 (0.420 sec) INFO:tensorflow:global_step/sec: 314.293 INFO:tensorflow:loss = 12881.449, step = 201 (0.320 sec) INFO:tensorflow:global_step/sec: 303.863 INFO:tensorflow:loss = 12391.541, step = 301 (0.327 sec) INFO:tensorflow:global_step/sec: 308.782 INFO:tensorflow:loss = 12050.5625, step = 401 (0.326 sec) INFO:tensorflow:global_step/sec: 244.969 INFO:tensorflow:loss = 11766.134, step = 501 (0.407 sec) INFO:tensorflow:global_step/sec: 155.966 INFO:tensorflow:loss = 11509.922, step = 601 (0.641 sec) INFO:tensorflow:global_step/sec: 263.256 INFO:tensorflow:loss = 11272.889, step = 701 (0.379 sec) INFO:tensorflow:global_step/sec: 254.112 INFO:tensorflow:loss = 11051.9795, step = 801 (0.396 sec) INFO:tensorflow:global_step/sec: 292.405 INFO: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 MacOS tensorboard --logdir=./train # For Windows tensorboard --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:13 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-13-01:43:13 INFO: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.000000 mean 22.625500 std 9.572593 min 5.000000 25% 16.600000 50% 21.400000 75% 25.025000 max 50.000000 Name: medv, dtype: float64
З наведеної вище підсумкової статистики ви знаєте, що середня ціна будинку становить 22 тисячі, мінімальна ціна 9 тисяч і максимальна 50 тисяч. Модель робить типову похибку в 3 тисячі доларів.
Крок 6) Зробіть прогноз
Нарешті, ви можете використовувати оцінювач TensorFlow predict, щоб оцінити вартість 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-1000 INFO: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”).values
test_set_n = pd.read_csv(“E:/boston_test.csv”).values
prediction_set_n = pd.read_csv(“E:/boston_predict.csv”).values
Крок 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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a218d8f28>, '_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 estimapor, щоб передати дані в модель, а потім навчити модель. Зверніть увагу, що ми визначили функцію 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 = 1 INFO:tensorflow:global_step/sec: 490.057 INFO:tensorflow:loss = 13909.656, step = 101 (0.206 sec) INFO:tensorflow:global_step/sec: 788.986 INFO:tensorflow:loss = 12881.45, step = 201 (0.126 sec) INFO:tensorflow:global_step/sec: 736.339 INFO:tensorflow:loss = 12391.541, step = 301 (0.136 sec) INFO:tensorflow:global_step/sec: 383.305 INFO:tensorflow:loss = 12050.561, step = 401 (0.260 sec) INFO:tensorflow:global_step/sec: 859.832 INFO:tensorflow:loss = 11766.133, step = 501 (0.117 sec) INFO:tensorflow:global_step/sec: 804.394 INFO:tensorflow:loss = 11509.918, step = 601 (0.125 sec) INFO:tensorflow:global_step/sec: 753.059 INFO:tensorflow:loss = 11272.891, step = 701 (0.134 sec) INFO:tensorflow:global_step/sec: 402.165 INFO:tensorflow:loss = 11051.979, step = 801 (0.248 sec) INFO:tensorflow:global_step/sec: 344.022 INFO: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]: <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1b6ea860>
Ви повторюєте той самий крок за допомогою іншого засобу оцінки, щоб оцінити свою модель
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:00 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-13-01:44:00 INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.158947, global_step = 1000, loss = 3215.8945 Out[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-1000 INFO: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
Останній розділ присвячений рішенню 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
Функцію можна розділити на три частини:
- Імпортуйте дані
- Створіть ітератор
- Споживайте дані
Нижче наведено загальний код для визначення функції. Код буде пояснено пізніше
def input_fn(data_file, batch_size, num_epoch = None): # Step 1 def 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 the Dataset 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 3 iterator = dataset.make_one_shot_iterator() features, labels = iterator.get_next() return features, labels
** Імпортуйте дані**
Для файлу csv метод набору даних читає по одному рядку. Щоб створити набір даних, потрібно використовувати об’єкт TextLineНабір даних. Ваш набір даних має заголовок, тому вам потрібно використовувати skip(1), щоб пропустити перший рядок. На цьому етапі ви лише читаєте дані та виключаєте заголовок із конвеєра. Щоб годувати модель, потрібно відокремити риси від етикетки. Метод, який використовується для застосування будь-яких перетворень до даних, це map.
Цей метод викликає функцію, яку ви створите, щоб надати вказівки, як трансформувати дані. У двох словах, вам потрібно передати дані в TextLineОб’єкт набору даних, виключіть заголовок і застосуйте перетворення, яке виконується функцією. Пояснення коду
- tf.data.TextLineDataset(data_file): цей рядок читає файл csv
- .skip(1) : пропускає заголовок
- .map(parse_csv)): аналізує записи на тензори. Вам потрібно визначити функцію, яка б наказувала об’єкту карти. Ви можете викликати цю функцію parse_csv.
Ця функція аналізує файл csv за допомогою методу tf.decode_csv і оголошує функції та мітку. Функції можуть бути оголошені як словник або кортеж. Ви використовуєте словниковий метод, тому що це зручніше. Пояснення коду
- tf.decode_csv(value, record_defaults= RECORDS_ALL): метод decode_csv використовує вихідні дані TextLineНабір даних для читання файлу csv. record_defaults повідомляє TensorFlow про тип стовпців.
- dict(zip(_CSV_COLUMNS, columns)): заповнити словник усіма стовпцями, витягнутими під час цієї обробки даних
- features.pop('median_house_value'): Виключіть цільову змінну зі змінної функції та створіть змінну мітки
Набір даних потребує додаткових елементів для ітеративної подачі тензорів. Дійсно, вам потрібно додати метод repeat, щоб дозволити набору даних продовжувати необмежено довго подавати модель. Якщо ви не додасте метод, модель виконає лише одну ітерацію, а потім видасть помилку, оскільки в конвеєрі більше не подається даних.
Після цього ви можете контролювати розмір партії за допомогою пакетного методу. Це означає, що ви повідомляєте набору даних, скільки даних ви хочете передати в конвеєр для кожної ітерації. Якщо встановити великий розмір партії, модель працюватиме повільно.
Крок 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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1820a010f0>, '_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. Якщо ви не використовуєте a лямбда-функція, ви не можете навчити модель.
# 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 = 1 INFO:tensorflow:global_step/sec: 72.5646 INFO:tensorflow:loss = 13909.657, step = 101 (1.380 sec) INFO:tensorflow:global_step/sec: 101.355 INFO:tensorflow:loss = 12881.449, step = 201 (0.986 sec) INFO:tensorflow:global_step/sec: 109.293 INFO:tensorflow:loss = 12391.541, step = 301 (0.915 sec) INFO:tensorflow:global_step/sec: 102.235 INFO:tensorflow:loss = 12050.5625, step = 401 (0.978 sec) INFO:tensorflow:global_step/sec: 104.656 INFO:tensorflow:loss = 11766.134, step = 501 (0.956 sec) INFO:tensorflow:global_step/sec: 106.697 INFO:tensorflow:loss = 11509.922, step = 601 (0.938 sec) INFO:tensorflow:global_step/sec: 118.454 INFO:tensorflow:loss = 11272.889, step = 701 (0.844 sec) INFO:tensorflow:global_step/sec: 114.947 INFO:tensorflow:loss = 11051.9795, step = 801 (0.870 sec) INFO:tensorflow:global_step/sec: 111.484 INFO: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]: <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x18225eb8d0>
Ви можете оцінити відповідність вашої моделі тестовому набору за допомогою коду нижче:
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:02 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-13-02:06:02 INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896 average_loss, was: 32.158958435058594 loss, was: 3215.89599609375 global_step, was: 1000
Останнім кроком є прогнозування значення на основі значення , матриць ознак. Ви можете написати словник зі значеннями, які ви хочете передбачити. Ваша модель має 9 функцій, тому вам потрібно вказати значення для кожної. Модель забезпечить прогноз для кожного з них.
У наведеному нижче коді ви записали значення кожної функції, яка міститься у файлі df_predict csv.
Вам потрібно написати нову функцію 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-1000 INFO: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. Ви повинні визначити:
- Функціональні стовпці. Якщо безперервно: tf.feature_column.numeric_column(). Ви можете заповнити список за допомогою розуміння списків Python
- Оцінювач: tf.estimator.LinearRegressor(feature_columns, model_dir)
- Функція для імпорту даних, розміру партії та епохи: input_fn()
Після цього ви готові тренуватися, оцінювати та робити прогнози за допомогою train(), evaluate() і predict()