Учебное пособие по линейной регрессии с TensorFlow [Примеры]
Что такое линейная регрессия?
Линейная регрессия это подход в статистике для моделирования отношений между двумя переменными. Это моделирование выполняется между скалярным откликом и одной или несколькими объясняющими переменными. Связь с одной объясняющей переменной называется простой линейной регрессией, а для более чем одной объясняющей переменной - множественной линейной регрессией.
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
Вы можете подставить эти числа в уравнение, и оно станет:
у= 3.8 + 2.78х
Теперь у вас есть лучший способ найти значения для y. То есть вы можете заменить x любым значением, которое хотите предсказать y. На изображении ниже мы заменили x в уравнении всеми значениями в наборе данных и отобразили результат.
Красная линия представляет подобранное значение, то есть значения y для каждого значения x. Вам не нужно видеть значение x, чтобы предсказать y, для каждого x есть любой, который принадлежит красной линии. Вы также можете прогнозировать значения x выше 2!
Если вы хотите расширить линейную регрессию на большее количество ковариат, вы можете добавить в модель больше переменных. Разница между традиционным анализом и линейной регрессией заключается в том, что линейная регрессия смотрит на то, как y будет реагировать на каждую переменную x, взятую независимо.
Давайте посмотрим пример. Представьте, что вы хотите спрогнозировать продажи магазина мороженого. Набор данных содержит различную информацию, такую как погода (т. е. дождливая, солнечная, пасмурная), информация о клиентах (т. е. зарплата, пол, семейное положение).
Традиционный анализ попытается предсказать продажу, скажем, вычислив среднее значение для каждой переменной и попытавшись оценить продажу для различных сценариев. Это приведет к плохим прогнозам и ограничит анализ выбранным сценарием.
Если вы используете линейную регрессию, вы можете написать это уравнение:
Алгоритм найдет лучшее решение для весов; это означает, что он попытается минимизировать стоимость (разницу между подобранной линией и точками данных).
Как работает алгоритм
Алгоритм выберет случайное число для каждого и
и замените значение x, чтобы получить прогнозируемое значение y. Если набор данных содержит 100 наблюдений, алгоритм вычисляет 100 прогнозируемых значений.
Мы можем вычислить ошибку, отметил модели, которая представляет собой разницу между прогнозируемым значением и реальным значением. Положительная ошибка означает, что модель недооценивает прогноз y, а отрицательная ошибка означает, что модель переоценивает прогноз y.
Ваша цель — минимизировать квадрат ошибки. Алгоритм вычисляет среднее значение квадратичной ошибки. Этот шаг называется минимизацией ошибки. Для линейной регрессии Среднеквадратическая ошибка, также называемый MSE. Математически это:
Где:
весы такие
относится к прогнозируемому значению
- y - реальные значения
- m — количество наблюдений
Обратите внимание, что означает, что он использует транспонирование матриц.
это математическое обозначение среднего значения.
Цель – найти лучшее которые минимизируют MSE
Если средняя ошибка велика, это означает, что модель работает плохо и веса выбраны неправильно. Для корректировки весов необходимо использовать оптимизатор. Традиционный оптимизатор называется Градиентный спуск.
Градиентный спуск берет производную и уменьшает или увеличивает вес. Если производная положительна, вес уменьшается. Если производная отрицательна, вес увеличивается. Модель обновит веса и повторно вычислит ошибку. Этот процесс повторяется до тех пор, пока ошибка больше не изменится. Каждый процесс называется итерация. Кроме того, градиенты умножаются на скорость обучения. Это указывает на скорость обучения.
Если скорость обучения слишком мала, алгоритму потребуется очень много времени для сходимости (т. е. потребуется много итераций). Если скорость обучения слишком высока, алгоритм может никогда не сойтись.
На рисунке выше видно, что модель повторяет процесс около 20 раз, прежде чем найти стабильное значение весов, тем самым достигая наименьшей ошибки.
Обратите внимание, что, ошибка не равна нулю, а стабилизируется около 5. Это означает, что модель допускает типичную ошибку 5. Если вы хотите уменьшить ошибку, вам нужно добавить в модель больше информации, например больше переменных, или использовать другие оценки. .
Вы помните первое уравнение
Итоговые веса — 3.8 и 2.78. На видео ниже показано, как градиентный спуск оптимизирует функцию потерь, чтобы найти эти веса.
Как обучить линейную регрессию с помощью TensorFlow
Теперь, когда вы лучше понимаете, что происходит за «капотом», вы готовы использовать API-интерфейс оценщика, предоставляемый TensorFlow, для обучения своей первой линейной регрессии с помощью TensorFlow.
Вы будете использовать Бостонский набор данных, который включает следующие переменные.
кричать | уровень преступности на душу населения по городам |
---|---|
zn | доля жилых земель, зонированных для участков площадью более 25,000 XNUMX кв. футов. |
промышл | доля площадей под неторговую деятельность на город. |
оксидов азота | концентрация оксидов азота |
rm | среднее количество комнат в жилище |
возраст | доля квартир, занимаемых владельцами, построенных до 1940 г. |
рас | взвешенные расстояния до пяти центров занятости Бостона |
налог | Полная ставка налога на имущество за 10,000 доллар США XNUMX XNUMX |
ptratio | соотношение учеников и учителей по городам |
медв | Средняя стоимость домов, занимаемых владельцами, в тысячах долларов |
Вы создадите три разных набора данных:
Набор данных | цель | формировать |
---|---|---|
Обучение | Обучите модель и получите веса | 400, 10 |
Оценка | Оцените производительность модели на невидимых данных | 100, 10 |
прогнозировать | Используйте модель для прогнозирования стоимости дома на основе новых данных. | 6, 10 |
Цель состоит в том, чтобы использовать особенности набора данных для прогнозирования стоимости дома.
Во второй части руководства вы узнаете, как использовать TensorFlow с тремя различными способами импорта данных:
- С пандами
- Для пользователя Numpy
- Только ТФ
Обратите внимание, что все варианты обеспечить те же результаты.
Вы узнаете, как использовать высокоуровневый 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)
Predict_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:
- REGRESSOR
- ДННРегрессор
- Линейный регрессор
- ДННЛинеаКомбинедРегрессор
- классифицировать
- ДННКлассификатор
- ЛинейныйКлассификатор
- 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).
Когда модель просмотрела все данные, она завершает один эпоха. Эпоха определяет, сколько раз модель должна видеть данные. Лучше установить для этого шага значение «Нет» и позволить модели выполнить определенное количество итераций.
Вторая информация, которую следует добавить, — хотите ли вы перетасовать данные перед каждой итерацией. Во время обучения важно перетасовать данные, чтобы модель не запоминала конкретный шаблон набора данных. Если модель изучает детали базовой структуры данных, ей будет трудно обобщить прогноз для невидимых данных. Это называется переобучения. Модель хорошо работает с обучающими данными, но не может правильно прогнозировать невидимые данные.
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)
Обычный метод оценки производительности модели заключается в следующем:
- Тренируй модель
- Оцените модель в другом наборе данных
- Сделать прогноз
Оценщик тензорного потока предоставляет три различные функции, позволяющие легко выполнить эти три шага.
Шаг 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 для оценки стоимости 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_input_fn.
Training_set_n = pd.read_csv("E:/boston_train.csv").values
test_set_n = pd.read_csv("E:/boston_test.csv").values
Predict_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. Этот метод немного сложнее предыдущего.
Обратите внимание, что если вы используете Jupyter ноутбук, вам необходимо перезагрузить и очистить ядро, чтобы запустить этот сеанс.
TensorFlow создал отличный инструмент для передачи данных в конвейер. В этом разделе вы самостоятельно создадите функцию input_fn.
Шаг 1) Определите путь и формат данных
Прежде всего, вы объявляете две переменные с путем к файлу csv. Обратите внимание, что у вас есть два файла: один для обучающего набора, а другой для тестового набора.
import tensorflow as tf
df_train = "E:/boston_train.csv"
df_eval = "E:/boston_test.csv"
Затем вам нужно определить столбцы, которые вы хотите использовать, из CSV-файла. Мы будем использовать все. После этого вам нужно объявить тип переменной.
Переменная Float определяется как [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), чтобы пропустить первую строку. На этом этапе вы только читаете данные и исключаете заголовок из конвейера. Чтобы подать модель, вам нужно отделить функции от метки. Метод, используемый для применения любого преобразования к данным, — это карта.
Этот метод вызывает функцию, которую вы создадите, чтобы указать, как преобразовать данные. Короче говоря, вам нужно передать данные в 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'): исключить целевую переменную из переменной объекта и создать переменную метки.
Набору данных нужны дополнительные элементы для итеративной подачи тензоров. Действительно, вам нужно добавить повторение метода, чтобы позволить набору данных продолжать бесконечно пополнять модель. Если вы не добавите метод, модель выполнит итерацию только один раз, а затем выдаст ошибку, поскольку в конвейер больше не подаются данные.
После этого вы можете контролировать размер пакета с помощью пакетного метода. Это означает, что вы сообщаете набору данных, сколько данных вы хотите передать в конвейер для каждой итерации. Если вы установите большой размер пакета, модель будет работать медленно.
Шаг 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. Если вы не используете лямбда-функция, вы не можете обучить модель.
# 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 функций, поэтому вам необходимо указать значение для каждой. Модель предоставит прогноз для каждого из них.
В приведенном ниже коде вы записали значения каждой функции, которая содержится в 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-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(), Assessment() и Predict().