Что такое линейная регрессия?
Линейная регрессия - это статистический подход к моделированию отношений между двумя переменными. Это моделирование выполняется между скалярным откликом и одной или несколькими независимыми переменными. Связь с одной независимой переменной называется простой линейной регрессией, а для нескольких независимых переменных - множественной линейной регрессией.
TensorFlow предоставляет инструменты для полного контроля над вычислениями. Это делается с помощью низкоуровневого API. Вдобавок ко всему, TensorFlow оснащен огромным набором API-интерфейсов для выполнения множества алгоритмов машинного обучения. Это высокоуровневый API. TensorFlow называет их оценщиками.
- Низкоуровневый API: построение архитектуры, оптимизация модели с нуля. Это сложно для новичка
- API высокого уровня: определите алгоритм. Это удобно. TensorFlow предоставляет набор инструментов для оценки вызовов для построения, обучения, оценки и составления прогнозов.
В этом руководстве вы будете использовать только оценщики . Вычисления выполняются быстрее и их легче реализовать. В первой части учебника объясняется, как использовать оптимизатор градиентного спуска для обучения линейной регрессии в TensorFlow. Во второй части вы будете использовать набор данных Boston для прогнозирования цены дома с помощью оценщика TensorFlow.
Скачать Boston DataSet
В этом руководстве по регрессии TensorFlow вы узнаете:
- Что такое линейная регрессия?
- Как обучить модель линейной регрессии
- Как тренировать линейную регрессию с помощью TensorFlow
- Панды
- Numpy решение
- Решение Tensorflow
Как обучить модель линейной регрессии
Прежде чем мы начнем обучать модель, давайте посмотрим, что такое линейная регрессия.
Представьте, что у вас есть две переменные, x и y, и ваша задача - предсказать ценность знания значения. Если вы построите график данных, вы увидите положительную взаимосвязь между вашей независимой переменной x и зависимой переменной y.
Вы можете заметить, что если x = 1, y будет примерно равно 6, а если x = 2, y будет около 8,5.
Это не очень точный метод и подвержен ошибкам, особенно с набором данных из сотен тысяч точек.
Линейная регрессия оценивается с помощью уравнения. Переменная y объясняется одной или несколькими ковариатами. В вашем примере есть только одна зависимая переменная. Если вам нужно написать это уравнение, оно будет:
С:
- вес, связанный с x
- - невязка или ошибка модели. Он включает в себя то, что модель не может узнать из данных.
Представьте, что вы подходите под эту модель и находите следующее решение для:
- = 3,8
- = 2,78
Вы можете подставить эти числа в уравнение, и оно станет следующим:
у = 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 - количество наблюдений
Обратите внимание, это Является математическим обозначением среднего.
Цель состоит в том, чтобы найти лучшее, что минимизирует MSE.
Если средняя ошибка велика, это означает, что модель работает плохо и веса выбраны неправильно. Чтобы скорректировать веса, вам нужно использовать оптимизатор. Традиционный оптимизатор называется « Градиентный спуск» .
Градиентный спуск берет производную и уменьшает или увеличивает вес. Если производная положительна, вес уменьшается. Если производная отрицательна, вес увеличивается. Модель обновит веса и пересчитает ошибку. Этот процесс повторяется до тех пор, пока ошибка не исчезнет. Каждый процесс называется итерацией . Кроме того, градиенты умножаются на скорость обучения. Это указывает на скорость обучения.
Если скорость обучения слишком мала, для сходимости алгоритма потребуется очень много времени (т.е. потребуется много итераций). Если скорость обучения слишком высока, алгоритм может никогда не сойтись.
Как видно из рисунка выше, модель повторяет процесс примерно 20 раз, прежде чем найти стабильное значение весов, что позволяет достичь минимальной ошибки.
Обратите внимание , что ошибка не равна нулю, а стабилизируется около 5. Это означает, что модель делает типичную ошибку 5. Если вы хотите уменьшить ошибку, вам необходимо добавить в модель дополнительную информацию, например, больше переменных или использовать разные оценщики.
Вы помните первое уравнение
Окончательные веса - 3,8 и 2,78. На видео ниже показано, как градиентный спуск оптимизирует функцию потерь, чтобы найти эти веса.
Как тренировать линейную регрессию с помощью TensorFlow
Теперь, когда вы лучше понимаете, что происходит за кулисами, вы готовы использовать API-интерфейс оценщика, предоставляемый TensorFlow, для обучения вашей первой линейной регрессии с помощью TensorFlow.
Вы будете использовать Boston Dataset, который включает следующие переменные
кричать | уровень преступности на душу населения по городам |
---|---|
zn | доля земли под жилую застройку зонирована под участки площадью более 25000 кв. футов. |
Инд | доля акров, не относящихся к розничной торговле, на город. |
nox | концентрация оксидов азота |
rm | среднее количество комнат в доме |
возраст | доля жилых единиц, построенных до 1940 г. |
дис | взвешенные расстояния до пяти Бостонских центров занятости |
налог | полная ставка налога на имущество за 10 000 долларов |
ptratio | соотношение учеников и учителей по городам |
medv | Средняя стоимость домов, занимаемых владельцами, в тысячах долларов |
Вы создадите три разных набора данных:
набор данных | цель | форма |
---|---|---|
Обучение персонала | Обучите модель и получите веса | 400, 10 |
Оценка | Оцените производительность модели на невидимых данных | 100, 10 |
Предсказывать | Используйте модель для прогнозирования стоимости дома на основе новых данных | 6, 10 |
Целью является использование характеристик набора данных для прогнозирования стоимости дома.
Во второй части руководства вы узнаете, как использовать TensorFlow с тремя различными способами импорта данных:
- С пандами
- С Numpy
- Только ТФ
Обратите внимание, что все параметры дают одинаковые результаты.
Вы узнаете, как использовать высокоуровневый API для создания, обучения и оценки модели линейной регрессии TensorFlow. Если вы использовали низкоуровневый API, вам нужно было вручную определить:
- Функция потерь
- Оптимизировать: градиентный спуск
- Умножение матриц
- График и тензор
Это утомительно и сложнее для новичка.
Панды
Вам необходимо импортировать необходимые библиотеки для обучения модели.
import pandas as pdfrom sklearn import datasetsimport tensorflow as tfimport itertools
Шаг 1) Импортируйте данные с помощью panda.
Вы определяете имена столбцов и сохраняете их в 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
- LinearRegressor
- DNNLineaCombinedRegressor
- Классификатор
- DNNClassifier
- LinearClassifier
- 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':, '_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: данные метки
- batch_size: партия. По умолчанию 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)
Обычный метод оценки производительности модели заключается в следующем:
- Обучите модель
- Оцените модель в другом наборе данных
- Сделайте прогноз
Оценщик тензорного потока предоставляет три различные функции для простого выполнения этих трех шагов.
Шаг 4) : Обучите модель
Вы можете использовать поезд оценщиков для оценки модели. Оценщику поездов требуется input_fn и количество шагов. Вы можете использовать функцию, которую вы создали выше, для кормления модели. Затем вы поручаете модели выполнить итерацию 1000 раз. Обратите внимание, что вы не указываете количество эпох, вы позволяете модели повторяться 1000 раз. Если вы установите количество эпох на 1, то модель будет повторяться 4 раза: в обучающем наборе 400 записей, а размер пакета равен 128.
- 128 рядов
- 128 рядов
- 128 рядов
- 16 рядов
Следовательно, проще установить для количества эпох значение none и определить количество итераций, как показано в приведенном ниже примере классификации 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"). values
test_set_n = pd.read_csv ("E: /boston_test.csv"). values
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
Последний раздел посвящен решению TensorFlow. Этот метод немного сложнее другого.
Обратите внимание, что если вы используете блокнот Jupyter, вам необходимо перезапустить и очистить ядро, чтобы запустить этот сеанс.
TensorFlow создал отличный инструмент для передачи данных в конвейер. В этом разделе вы сами создадите функцию input_fn.
Шаг 1) Определите путь и формат данных
Прежде всего, вы объявляете две переменные с путем к файлу csv. Обратите внимание, что у вас есть два файла: один для набора для обучения, а другой для набора для тестирования.
import tensorflow as tf
df_train = "E:/boston_train.csv"
df_eval = "E:/boston_test.csv"
Затем вам нужно определить столбцы, которые вы хотите использовать, из файла csv. Мы будем использовать все. После этого вам нужно объявить тип переменной.
Переменная с плавающей запятой определяется как [0.]
COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age","dis", "tax", "ptratio", "medv"]RECORDS_ALL = [[0.0], [0.0], [0.0], [0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]]
Шаг 2) Определите функцию input_fn
Функцию можно разбить на три части:
- Импортировать данные
- Создайте итератор
- Потребляйте данные
Ниже приведен общий код для определения функции. Код будет объяснен после
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), чтобы пропустить первую строку. На этом этапе вы только читаете данные и исключаете заголовок из конвейера. Чтобы накормить модель, нужно отделить элементы от метки. Метод, используемый для применения любого преобразования к данным, - это карта.
Этот метод вызывает функцию, которую вы создадите, чтобы указать, как преобразовать данные. Вкратце, вам необходимо передать данные в объекте TextLineDataset, исключить заголовок и применить преобразование, указанное функцией.
- 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 использует вывод TextLineDataset для чтения файла 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':, '_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 линейной регрессии. Вам необходимо определить:
- Столбцы характеристик. Если непрерывно: tf.feature_column.numeric_column (). Вы можете заполнить список с пониманием списка Python
- Оценщик: tf.estimator.LinearRegressor (feature_columns, model_dir)
- Функция для импорта данных, размера пакета и эпохи: input_fn ()
После этого вы готовы тренироваться, оценивать и делать прогнозы с помощью train (), Assessment () и Forecast ().