Как обеспечить вложенность, обученную оценщиком?

Google искусственный интеллект TensorFlow GitHub

Автор: Лак Лакшманан, технический руководитель Google Cloud Platform

Оригинальная ссылка:Tickets.WeChat.QQ.com/Yes/MH ADSL Q э…

Если у вас есть разреженная категориальная переменная (переменная, которая может иметь несколько возможных значений), встраивание этой переменной в более низкие измерения может быть очень полезным. Наиболее известная форма такого вложения — вложение слов (такое как word2vec или вложение Glove), где все слова в языке представлены вектором примерно из 50 элементов. Идея состоит в том, что похожие слова расположены близко друг к другу в 50-мерном пространстве. Вместо быстрого кодирования категориальных переменных в связанных вопросах вы можете сделать то же самое с категориальными переменными, обучив гнездо с одним вопросом, а затем снова используя это гнездо. Пространство нижнего измерения вложенности является непрерывным, поэтому вложение может также служить входными данными для алгоритма кластеризации — вы можете найти естественные группировки категориальных переменных.

Вложенность помогает вам видеть леса, а не только деревья

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

В этой статье я покажу вам, как: Создание вложенности в моделях регрессии или классификации Представление категориальных переменных различными способами Математические расчеты с использованием столбцов признаков Распределить вывод вложенных и исходных моделей

Вы можете найти полный код в этой статье с дополнительным контекстом на GitHub. Здесь я покажу вам только ключевые фрагменты кода. Примечание: ссылка на GitHubGitHub.com/Googlecloud…

Использование моделей для прогнозирования спроса на велосипеды Давайте построим простую модель прогнозирования спроса, чтобы предсказать количество арендованных автомобилей на станции проката велосипедов с учетом дня недели и того, идет ли в этот день дождь. Необходимые данные взяты из общедоступного набора данных об аренде велосипедов в Нью-Йорке и данных о погоде NOAA:

Входные данные для модели следующие: День недели (целое число от 1 до 7) Идентификатор арендной станции (здесь мы используем хэш-сегмент, так как мы не знаем полного словаря. Набор данных содержит около 650 уникальных значений. Мы будем использовать большой хэш-сегмент, но встроим его в более низкое измерение позже посередине) Идет ли дождь (правда/ложь)

Метки, которые мы хотим предсказать, это num_trips.

Мы можем создать набор данных, выполнив этот запрос в BigQuery, чтобы объединить наборы данных о велосипедах и погоде с необходимыми агрегациями: Примечание: ссылка BigQuerycloud.google.com/bigquery/

1    #standardsql    
2    WITH bicycle_rentals AS (    
3        SELECT    
4            COUNT(starttime) as num_trips,    
5            EXTRACT(DATE from starttime) as trip_date,   
6            MAX(EXTRACT(DAYOFWEEK from starttime)) as day_of_week,    
7            start_station_id    
8    FROM `bigquery-public-data.new_york.citibike_trips`    
9    GROUP BY trip_date, start_station_id    
10    ),    
11
12    rainy_days AS    
13    (    
14    SELECT    
15    date,    
16    (MAX(prcp) > 5) AS rainy    
17    FROM (    
18    SELECT    
19        wx.date AS date,    
20        IF (wx.element = 'PRCP', wx.value/10, NULL) AS prcp    
21    FROM    
22        `bigquery-public-data.ghcn_d.ghcnd_2016` AS wx    
23        WHERE    
24            wx.id = 'USW00094728'    
25    )    
26    GROUP BY    
27      date    
28     )    
29
30    SELECT    
31        num_trips,    
32        day_of_week,    
33        start_station_id,    
34        rainy    
35    FROM bicycle_rentals AS bk    
36    JOIN rainy_days AS wx    
37    ON wx.date = bk.trip_date    

Напишите модель с оценщиком Чтобы написать модель, нам нужно использовать пользовательскую оценку в TensorFlow. Хотя это всего лишь линейная модель, мы не можем использовать LinearRegressor, потому что LinearRegressor скрывает все базовые операции со столбцами функций. Нам нужен доступ к выходным данным промежуточного слоя (выходным данным столбцов вложенных признаков), чтобы мы могли чисто писать линейные модели.

Чтобы использовать пользовательскую оценку, вам нужно написать функцию модели и передать ее конструктору оценки:

1 ef train_and_evaluate(output_dir, nsteps):
2 estimator = tf.estimator.Estimator(
3 model_fn = model_fn,
4 model_dir = output_dir)

Функция модели в пользовательской оценке состоит из следующих 5 частей:

1. Определите модель:

1    def model_fn(features, labels, mode):    
2        # linear model    
3        station_col = tf.feature_column.categorical_column_with_hash_bucket('start_station_id', 5000, tf.int32)    
4        station_embed = tf.feature_column.embedding_column(station_col, 2)  # embed dimension    
5        embed_layer = tf.feature_column.input_layer(features, station_embed)  6
7        cat_cols = [    
8            tf.feature_column.categorical_column_with_identity('day_of_week', num_buckets = 8),    
9            tf.feature_column.categorical_column_with_vocabulary_list('rainy', ['false', 'true'])    
10        ]    
11        cat_cols = [tf.feature_column.indicator_column(col) for col in cat_cols]    
12        other_inputs = tf.feature_column.input_layer(features, cat_cols)    
13
14        all_inputs = tf.concat([embed_layer, other_inputs], axis=1)    
15        predictions = tf.layers.dense(all_inputs, 1)  # linear model    

Мы возьмем столбец прокатной станции и поместим его в корзину на основе хэш-кода. Используйте этот трюк, чтобы не создавать полный словарный запас. В Нью-Йорке всего около 650 станций проката велосипедов, поэтому с 5000 ведер хэша мы можем значительно снизить вероятность столкновений. Затем, встраивая идентификаторы пунктов проката в несколько измерений, мы также узнаем, какие пункты проката похожи друг на друга, по крайней мере, в случае аренды автомобилей под дождем. Наконец, идентификатор каждой станции проката представлен в виде двумерного вектора. Число 2 определяет, насколько точно пространство нижнего измерения представляет информацию в категориальной переменной. Здесь я произвольно выбрал 2, но на практике нам нужно настроить этот гиперпараметр для достижения наилучшей производительности.

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

Оба набора входных данных объединяются для создания широкого входного слоя, который затем передается через выходной узел в некоторый плотный слой. Таким образом, вы написали линейную модель на более низком уровне. Это эквивалентно написанию LinearRegressor следующим образом:

1    station_embed = 
2            tf.feature_column.embedding_column(    
tf.feature_column.categorical_column_with_hash_bucket('start_station_id', 5000, tf.int32), 2)    
3    feature_cols = [    
4        tf.feature_column.categorical_column_with_identity('day_of_week', num_buckets = 8),    
5        station_embed,    
6        tf.feature_column.categorical_column_with_vocabulary_list('rainy', ['false', 'true'])    
7    ]    
8        estimator = tf.estimator.LinearRegressor(    
9                            model_dir = output_dir,    
10                          feature_columns = feature_cols)    

Обратите внимание, что LinearRegressor скрывает все входные_слои, индикаторные_столбцы и т. д. Однако я хочу получить доступ к вложенности станций проката, поэтому показываю.

2. Используйте модуль регрессии, чтобы задать спецификацию оценщика. Для задач регрессии мы можем использовать оптимизатор ftrl, чтобы минимизировать среднеквадратичную ошибку (LinearRegressor использует этот оптимизатор по умолчанию, поэтому я также использую его):

1    my_head = tf.contrib.estimator.regression_head()    
2    spec = my_head.create_estimator_spec(    
3        features = features, mode = mode,    
4        labels = labels, logits = predictions,    
5        optimizer = tf.train.FtrlOptimizer(learning_rate = 0.1)  
6    )    

3 — 4.创建输出字典
通常情况下,我们只会发送预测,但在这个例子中,我们想回送预测和嵌套:

1    # 3. Create predictions    
2    predictions_dict = {    
3        "predicted": predictions,    
4        "station_embed": embed_layer    
5    }    
6    
7    # 4. Create export outputs    
8    export_outputs = {    
9        "predict_export_outputs": tf.estimator.export.PredictOutput(outputs = predictions_dict)    
10    }    

Еще одна причина, по которой мы используем здесь пользовательский оценщик, заключается в его способности изменять export_outputs.

5. Отправьте обратно EstimatorSpec с предсказанными результатами и экспортируйте замененный вывод:

1    # 5. Return EstimatorSpec    
2    return spec._replace(predictions = predictions_dict,  
3                            export_outputs = export_outputs)    

Теперь мы обучаем модель как обычно.

прогноз звонков Затем экспортированную модель можно обслуживать с помощью TensorFlow Serving или, при желании, развернуть в Cloud ML Engine (фактически управляемая TF Serving), а затем вызывать для прогнозирования. Вы также можете использовать gcloud для вызова локальной модели (он может предоставить более удобный интерфейс, чем save_model_cli для этой цели):

1    EXPORTDIR=./model_trained/export/exporter/
2    MODELDIR=$(ls $EXPORTDIR | tail -1)
3    gcloud ml-engine local predict --model-dir=${EXPORTDIR}/${MODELDIR} --json-instances=./test.json

Что находится в test.json? {"day_of_week": 4, "start_station_id": 435, "дождливый": "true"} {"day_of_week": 4, "start_station_id": 521, "дождливый": "true"} {"day_of_week": 4, "start_station_id": 3221, "дождливый": "true"} {"day_of_week": 4, "start_station_id": 3237, "дождливый": "true"}

Как видите, я отправил 4 экземпляра, соответствующие пунктам проката 435, 521, 3221 и 3237.

Первые две остановки находятся на Манхэттене, в районе с высокой активностью аренды (как для пассажиров, так и для туристов). Последние две остановки находятся на Лонг-Айленде, где прокат велосипедов не распространен (возможно, только по выходным). Полученный результат содержит предсказанное количество поездок (наши метки) и вложенность пунктов проката:

В этом примере первое измерение вложения практически равно нулю во всех случаях. Итак, нам нужна только одномерная вложенность. Глядя на второе измерение, становится ясно, что станция Манхэттен имеет положительные значения (0,0081, 0,0011), а станция Лонг-Айленд имеет отрицательные значения (-0,0025, -0,0031).

Это то, что мы получили исключительно из модели машинного обучения, просто взглянув на прокат велосипедов в разные даты в этих двух местах! Если у вас есть категориальные переменные в ваших моделях TensorFlow, попробуйте назначить гнезда из этих моделей. Может быть, они принесут новый анализ данных!

Добро пожаловать в официальный публичный аккаунт Google WeChat TensorFlow!

Не перепечатывать без разрешения! Нарушение должно быть расследовано!