如果您有一個稀疏分類變量(可以有多個可能的值的變量),將該變量嵌入到較低維度可能會非常有用。這種最廣為人知的嵌入形式就是詞嵌套(例如 word2vec 或 Glove 嵌套),即語言中的所有詞匯都用一個包含約 50 個元素的向量表示。其理念是相似的詞匯在 50 維空間中距離很近。您可以使用分類變量進行相同操作,即使用一個問題訓(xùn)練嵌套,然后再次使用該嵌套,而非對相關(guān)問題中的分類變量進行獨熱編碼。嵌套的較低維度空間是連續(xù)的,所以該嵌套還可以充當聚類算法的輸入 — 您可以找到分類變量的自然分組。
嵌套可以幫助您看到森林,而不僅僅是樹木
要提供使用估算器訓(xùn)練的嵌套,您可以連同普通預(yù)測輸出一起,發(fā)出分類變量的較低維度表征。嵌套權(quán)重保存在 SavedModel 中,并且有一個分享文件本身的選項?;蛘?,您也可以為機器學(xué)習(xí)團隊的客戶端按需提供嵌套,這些客戶端現(xiàn)在只是松散耦合到您選擇的模型架構(gòu),所以這樣可能更容易維護。每次有更新更好的版本替代您的模型時,客戶端都會獲得更新后的嵌套。
在本文中,我會向您展示如何:
在回歸模型或分類模型中創(chuàng)建嵌套
以不同方法表示分類變量
使用特征列進行數(shù)學(xué)計算
分發(fā)嵌套及原始模型的輸出
您可以在 GitHub 上找到本文中的完整代碼,其中包含更多上下文。在這里,我只向您展示關(guān)鍵代碼段。
用模型來預(yù)測自行車需求
我們來構(gòu)建一個簡單的需求預(yù)測模型,在已知星期幾和當天是否下雨的前期下,預(yù)測自行車租賃站的租車數(shù)量。所需數(shù)據(jù)來自紐約市自行車租賃和NOAA 氣象數(shù)據(jù)的公開數(shù)據(jù)集:
模型的輸入如下:
星期幾(1–7 的整數(shù))
租賃站 ID(由于不知道完整詞匯,這里我們使用哈希存儲分區(qū)。該數(shù)據(jù)集有大約 650 個唯一值。我們會使用一個很大的哈希存儲分區(qū),但之后會將其嵌入到較低維度中)
是否下雨(真/假)
我們想要預(yù)測的標簽為 num_trips。
我們可以通過在BigQuery中運行這個查詢來創(chuàng)建數(shù)據(jù)集,從而加入自行車和天氣數(shù)據(jù)集,并進行必要的聚合:
注:BigQuery 鏈接
https://cloud.google.com/bigquery/
1#standardsql
2WITH bicycle_rentals AS (
3SELECT
4COUNT(starttime) as num_trips,
5EXTRACT(DATE from starttime) as trip_date,
6MAX(EXTRACT(DAYOFWEEK from starttime)) as day_of_week,
7start_station_id
8FROM `bigquery-public-data.new_york.citibike_trips`
9GROUP BY trip_date, start_station_id
10),
11
12rainy_days AS
13(
14SELECT
15date,
16(MAX(prcp) > 5) AS rainy
17FROM (
18SELECT
19 wx.date AS date,
20IF (wx.element = 'PRCP', wx.value/10, NULL) AS prcp
21FROM
22`bigquery-public-data.ghcn_d.ghcnd_2016` AS wx
23WHERE
24wx.id = 'USW00094728'
25)
26GROUP BY
27 date
28 )
29
30SELECT
31num_trips,
32day_of_week,
33start_station_id,
34rainy
35FROM bicycle_rentals AS bk
36JOIN rainy_days AS wx
37ON wx.date = bk.trip_date
使用估算器編寫模型
要編寫模型,我們需要在 TensorFlow 中使用自定義估算器。雖然這只是一個線性模型,但我們不能使用 LinearRegressor,因為 LinearRegressor 會隱藏所有底層特征列運算。我們需要訪問中間層輸出(嵌套特征列的輸出),這樣我們就可以清晰地編寫線性模型。
要使用自定義估算器,您需要編寫一個模型函數(shù),并將其傳遞給估算器構(gòu)造函數(shù):
1ef train_and_evaluate(output_dir, nsteps):
2estimator = tf.estimator.Estimator(
3model_fn = model_fn,
4model_dir = output_dir)
自定義估算器中的模型函數(shù)包括下列 5 個部分:
1.定義模型:
1def model_fn(features, labels, mode):
2# linear model
3station_col = tf.feature_column.categorical_column_with_hash_bucket('start_station_id', 5000, tf.int32)
4station_embed = tf.feature_column.embedding_column(station_col, 2) # embed dimension
5embed_layer = tf.feature_column.input_layer(features, station_embed) 6
7cat_cols = [
8tf.feature_column.categorical_column_with_identity('day_of_week', num_buckets = 8),
9tf.feature_column.categorical_column_with_vocabulary_list('rainy', ['false', 'true'])
10]
11cat_cols = [tf.feature_column.indicator_column(col) for col in cat_cols]
12other_inputs = tf.feature_column.input_layer(features, cat_cols)
13
14all_inputs = tf.concat([embed_layer, other_inputs], axis=1)
15predictions = tf.layers.dense(all_inputs, 1) # linear model
我們將選取租賃站列,并根據(jù)其哈希代碼將其放入一個存儲分區(qū)。使用這個技巧可以避免構(gòu)建完整詞匯。紐約只有大約 650 個自行車租賃站,所以擁有 5000 個哈希存儲分區(qū),我們就可以大大減少沖突的幾率。然后,將租賃站 ID 嵌入到少數(shù)維度中,我們還會了解到哪些租賃站彼此相似,至少在雨天租車的情況下相似。最后,用二維向量表示每個租賃站的 ID。數(shù)字 2 控制較低維度空間代表分類變量中信息的準確程度。這里我隨意選擇了 2,但實際上,我們需要調(diào)節(jié)此超參數(shù),以實現(xiàn)最佳性能。
其他兩個分類列均使用其實際詞匯創(chuàng)建,然后進行了獨熱編碼(指示器列對數(shù)據(jù)進行了獨熱編碼)。
這兩組輸入都經(jīng)過級聯(lián),以創(chuàng)建一個寬輸入層,然后通過一個輸出節(jié)點傳遞到某個密集層。這樣,您就在較低層級編寫了一個線性模型。這相當于編寫了一個 LinearRegressor,如下所示:
1station_embed =
2tf.feature_column.embedding_column(
tf.feature_column.categorical_column_with_hash_bucket('start_station_id', 5000, tf.int32), 2)
3feature_cols = [
4tf.feature_column.categorical_column_with_identity('day_of_week', num_buckets = 8),
5station_embed,
6tf.feature_column.categorical_column_with_vocabulary_list('rainy', ['false', 'true'])
7]
8estimator = tf.estimator.LinearRegressor(
9model_dir = output_dir,
10feature_columns = feature_cols)
請注意,LinearRegressor 會將 input_layer、indicator_column 等全部隱藏起來。但是,我想訪問租賃站的嵌套,所以將其顯示了出來。
2.使用回歸模塊設(shè)置估算器規(guī)范
對于回歸問題,我們可以使用 Ftrl 優(yōu)化器將均方誤差最小化( LinearRegressor 默認使用此優(yōu)化器,所以我也使用這個):
1my_head = tf.contrib.estimator.regression_head()
2spec = my_head.create_estimator_spec(
3features = features, mode = mode,
4labels = labels, logits = predictions,
5optimizer = tf.train.FtrlOptimizer(learning_rate = 0.1)
6)
3 — 4.創(chuàng)建輸出字典
通常情況下,我們只會發(fā)送預(yù)測,但在這個例子中,我們想回送預(yù)測和嵌套:
1# 3. Create predictions
2predictions_dict = {
3"predicted": predictions,
4"station_embed": embed_layer
5}
6
7# 4. Create export outputs
8export_outputs = {
9"predict_export_outputs": tf.estimator.export.PredictOutput(outputs = predictions_dict)
10}
這里,我們使用自定義估算器的另一個原因在于它能夠更改 export_outputs。
5.回送帶有預(yù)測結(jié)果的 EstimatorSpec,并導(dǎo)出替換過的輸出:
1# 5. Return EstimatorSpec
2return spec._replace(predictions = predictions_dict,
3export_outputs = export_outputs)
現(xiàn)在,我們照常訓(xùn)練模型。
調(diào)用預(yù)測
然后,可以使用TensorFlow Serving提供導(dǎo)出的模型,或者可以選擇將其部署到Cloud ML Engine(實際是托管的 TF Serving),隨后調(diào)用進行預(yù)測。您也可以使用gcloud調(diào)用本地模型(它可以針對此用途提供比saved_model_cli更方便的界面):
1EXPORTDIR=./model_trained/export/exporter/
2MODELDIR=$(ls $EXPORTDIR | tail -1)
3gcloud ml-engine local predict --model-dir=${EXPORTDIR}/${MODELDIR} --json-instances=./test.json
test.json 中有什么?
{“day_of_week”: 4, “start_station_id”: 435, “rainy”:“true”}
{“day_of_week”: 4, “start_station_id”: 521, “rainy”:“true”}
{“day_of_week”: 4, “start_station_id”: 3221, “rainy”:“true”}
{“day_of_week”: 4, “start_station_id”: 3237, “rainy”:“true”}
正如您看到的,我發(fā)送了 4 個實例,分別對應(yīng)租賃站 435、521、3221 和 3237。
前面兩個站位于曼哈頓,這一區(qū)域的租賃活動非常頻繁(既為通勤族也為游客提供租賃服務(wù))。后面兩個站位于長島,這個區(qū)域的自行車租賃并不普及(可能只在周末提供服務(wù))。產(chǎn)生的輸出包含預(yù)測的旅行數(shù)量(我們的標簽)和租賃站的嵌套:
在本例中,嵌套的第一個維度在全部情況下幾乎為零。所以,我們只需要一個維度嵌套。查看第二個維度,非常清楚地顯示曼哈頓站有正值 (0.0081, 0.0011),而長島站有負值 (-0.0025, -0.0031)。
這是我們單純通過機器學(xué)習(xí)模型得到的信息,僅考察這兩個地點在不同日期的自行車租賃情況!如果您的 TensorFlow 模型中有分類變量,可以試試從這些模型中分配嵌套。也許他們會帶來新的數(shù)據(jù)分析!
-
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1201瀏覽量
24622 -
嵌套
+關(guān)注
關(guān)注
0文章
15瀏覽量
7923
原文標題:如何提供使用估算器訓(xùn)練的嵌套?
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論