В этом посте мы обсудим проблему многомерной регрессии и ее решение с помощью тензорного потока библиотеки глубокого обучения Google.

Не забудьте прочитать предыдущий пост о начале работы с Tensorflow!

Покажите свою поддержку, подписавшись на нашу рассылку!

Изначально Tensorflow был разработан для построения более сложных нейронных сетей, используемых в таких задачах, как анализ временных рядов, встраивание слов, обработка изображений и обучение с подкреплением. Мы рассмотрим некоторые из упомянутых тем в будущих публикациях. Итак, разработчики создали API-интерфейс для оценки тензорного потока, который может легко обрабатывать более простые задачи, такие как регрессия и классификация. Сегодня мы будем использовать API оценки тензорного потока для решения задачи прогнозирования стоимости дома.

Я знаю, что проблема прогнозирования стоимости дома теперь стала клише для задач регрессии, но обычно эта задача связана с одной функцией, тогда как мы будем решать многомерную задачу с шестью функциями. Набор данных можно скачать здесь. Итак, приступим!

Начнем с получения набора данных с помощью метода pandas read_csv (). После прочтения набора данных, если вы хотите взглянуть на столбцы и на то, как выглядят некоторые из значений, вы можете использовать метод describe (), который возвращает первые несколько значений каждого столбца и заголовок столбца. Кроме того, я не объясняю необходимый импорт.

Следующим шагом является добавление набора данных в набор для обучения и тестирования. Мы делаем это с помощью метода scikit train_test_split (). Первые два аргумента этого метода - это два словаря:

  1. x_data - это словарь с шестью значениями столбцов, которые представляют шесть функций, на основе которых будет выполняться прогноз.
  2. y_val содержит только одно значение столбца, которое является меткой или целевым значением, которое мы будем прогнозировать.

Следующим шагом является масштабирование набора функций как для обучающего, так и для тестового набора. Мы будем использовать метод MinMaxScaler () из библиотеки предварительной обработки scikit. Сначала нам нужно создать экземпляр метода MinMaxScler, а затем нам нужно использовать методы fit () и transform (). Небольшая хитрость: вы можете использовать метод fit_transform () для выполнения обеих операций за один раз.

Теперь наш набор данных готов к загрузке в API оценщика. В API есть три основных метода:

  1. тренироваться
  2. оценивать
  3. предсказывать

Но сначала нам нужно создать модель оценки. Модель оценщика не принимает numpy массивов в качестве входных данных, она принимает только определенное значение тензора, которое должно быть создано с помощью метода tf.feature_column.numeric_column (), которое затем вводится в пустой словарь. Итак, мы перебираем столбцы, содержащие столбцы функций. Выражение df.columns [: - 1] разрезает набор данных, чтобы исключить последний столбец, поскольку это наша целевая переменная.

Затем нам нужно создать входную функцию, которую нужно передать модели оценщика в качестве аргумента. Для этого мы используем метод tf.estimator.inputs.pandas_input_fn () и передаем обучающий набор и размер пакета.

Теперь мы можем создать модель оценки. Поскольку мы будем использовать глубокую нейронную сеть для выполнения задачи регрессии, мы используем метод DNNRegressor () API-интерфейса оценщика. В API оценщика доступно несколько моделей, которые можно протестировать в различных сценариях. Подсказка: попробуйте метод DNNLinearCombinedRegressor (), который сочетает в себе линейный регрессор и регрессор DNN. Нам нужно передать количество нейронов для каждой скрытой единицы в качестве словаря в вышеуказанный метод. Вы можете поиграть с количеством слоев и количеством нейронов, чтобы улучшить модель. Кроме того, словарь столбцов функций, который мы создали на предыдущем шаге, перебирая нарезанный столбец, необходимо передать в качестве аргумента.

Следующим шагом будет обучение нашей модели. Для облегчения обучения используется синтаксис model.train (), который принимает входную функцию, созданную на предыдущем шаге, и количество шагов или эпох.

Наконец-то наша модель обучена и готова предсказывать цены на жилье!

Но, прежде чем фактически предсказать значения из набора тестов, мы используем метод оценки, чтобы оценить, насколько хорошо работает наша модель. Мы используем метод model.evaluate (), который имеет те же аргументы, что и метод train. Выходные данные включают среднюю потерю и общую потерю после общего количества шагов, указанного в аргументе.

Затем нам нужно создать новую функцию ввода с именем pred_input_func для метода прогнозирования. Мы делаем это с помощью того же метода tf.estimator.inputs.pandas_input_fn () и передаем тестовый набор: x_eval и y_eval. Метод прогнозирования также имеет те же аргументы, что и методы обучения и оценки.

Обратите внимание, что все три основных метода имеют одинаковые аргументы. Облегчает запоминание!

Метод прогноза возвращает тензорный объект, который должен храниться в списке, чтобы правильно визуализировать результаты для каждого значения набора тестов.

Но чтобы правильно оценить результат, нам нужно применить метод оценки к входной функции pred_input_func.

Все мы слышали термин «переоснащение». Один из простых способов проверить, переоснащается ли наша модель, - это сравнить общие потери от оценок функций обучающего и тестового ввода. Если потери в обучении низкие, а потери в тестах высокие, значит, наша модель переобучена и эпохи необходимо сократить. Если верно обратное, то наша модель не соответствует требованиям, и нам нужно либо увеличить эпохи, либо ввести больше обучающих данных.

Единственным недостатком задач многомерной регрессии является то, что мы не можем визуализировать или построить график наших результатов, поскольку количество измерений превышает три. Хотя, если ваша задача имеет только два параметра, вы можете использовать следующую библиотеку для визуализации 3D-модели ваших результатов: mpl_toolkits.mplot3d

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

Все, до следующего раза !!