摘要:特征組合有助于表示非線性關系。特征組合組合獨熱矢量在實踐中,機器學習模型很少會組合連續特征。通常情況下,這些特征將被進一步轉換為獨熱編碼表示,但這是以透明方式實現的。目前,特征列僅支持組合離散特征。
寫在前面:之前收藏了一個網友些的谷歌機器學習總結教程(感恩),可是突然斷更了,只能自己補完后面的筆記了。
特征組合也叫特征交叉
特征組合也叫特征交叉
特征組合也叫特征交叉(說三遍)
合成特征 (synthetic feature)和特征組合(Feature Crosses)不太一樣,特征交叉是特征組合的一個子集。
合成特征 (synthetic feature)一種特征,不在輸入特征之列,而是從一個或多個輸入特征衍生而來。通過標準化或縮放多帶帶創建的特征不屬于合成特征。合成特征包括以下類型:
將一個特征與其本身或其他特征相乘(稱為特征組合)。
兩個特征相除。
對連續特征進行分桶,以分為多個區間分箱。
特征組合 (feature cross):對非線性規律進行編碼通過將多帶帶的特征進行組合(相乘或求笛卡爾積)而形成的合成特征。特征組合有助于表示非線性關系。
對于下面的非線性問題。線性學習器畫的任何一條線都不能很好地預測樹的健康狀況。
要解決上圖所示的非線性問題,可以創建一個特征組合。特征組合是指通過將兩個或多個輸入特征相乘來對特征空間中的非線性規律進行編碼的合成特征?!癱ross”(組合)這一術語來自 cross product(向量積)。我們通過將 與 組合來創建一個名為x3的特征組合:
x3 = x1x2
我們像處理任何其他特征一樣來處理這個新建的x3特征組合。線性公式變為:
y = b + w1x1 + w2x2 + w3x3
雖然w3表示非線性信息,但您不需要改變線性模型的訓練方式來確定w3的值。
特征組合的種類通過采用隨機梯度下降法,可以有效地訓練線性模型。因此,在使用擴展的線性模型時輔以特征組合一直都是訓練大規模數據集的有效方法。我們可以創建很多不同種類的特征組合。例如:
[A X B]:將兩個特征的值相乘形成的特征組合。
[A x B x C x D x E]:將五個特征的值相乘形成的特征組合。
[A x A]:對單個特征的值求平方形成的特征組合。
特征組合 (Feature Crosses):組合獨熱矢量在實踐中,機器學習模型很少會組合連續特征。不過,機器學習模型卻經常組合獨熱特征矢量,將獨熱特征矢量的特征組合視為邏輯連接.例如,假設我們具有以下兩個特征:國家/地區和語言。對每個特征進行獨熱編碼會生成具有二元特征的矢量,這些二元特征可解讀為 country=USA, country=France 或language=English,language=Spanish。然后,如果您對這些獨熱編碼進行特征組合,則會得到可解讀為邏輯連接的二元特征,如下所示:
country:usa AND language:spanish
再舉一個例子,假設您對緯度和經度進行分箱,獲得多帶帶的獨熱 5 元素特征矢量。例如,指定的緯度和經度可以表示如下:
binned_latitude = [0, 0, 0, 1, 0] binned_longitude = [0, 1, 0, 0, 0]
假設您對這兩個特征矢量創建了特征組合:
binned_latitude X binned_longitude
此特征組合是一個 25 元素獨熱矢量(24 個 0 和 1 個 1)。該組合中的單個 1 表示緯度與經度的特定連接。然后,您的模型就可以了解到有關這種連接的特定關聯性。
假設我們更粗略地對緯度和經度進行分箱,如下所示:
binned_latitude(lat) = [ 0 < lat <= 10 10 < lat <= 20 20 < lat <= 30 ] binned_longitude(lon) = [ 0 < lon <= 15 15 < lon <= 30 ]
針對這些粗略分箱創建特征組合會生成具有以下含義的合成特征:
binned_latitude_X_longitude(lat, lon) = [ 0 < lat <= 10 AND 0 < lon <= 15 0 < lat <= 10 AND 15 < lon <= 30 10 < lat <= 20 AND 0 < lon <= 15 10 < lat <= 20 AND 15 < lon <= 30 20 < lat <= 30 AND 0 < lon <= 15 20 < lat <= 30 AND 15 < lon <= 30 ]
現在,假設我們的模型需要根據以下兩個特征來預測狗主人對狗狗的滿意程度:
行為類型(吠叫、叫、偎依等)
時段
如果我們根據這兩個特征構建以下特征組合:
[behavior type X time of day]
我們最終獲得的預測能力將遠遠超過任一特征多帶帶的預測能力。例如,如果狗狗在下午 5 點主人下班回來時(快樂地)叫喊,可能表示對主人滿意度的正面預測結果。如果狗狗在凌晨 3 點主人熟睡時(也許痛苦地)哀叫,可能表示對主人滿意度的強烈負面預測結果。
線性學習器可以很好地擴展到大量數據。對大規模數據集使用特征組合是學習高度復雜模型的一種有效策略。神經網絡可提供另一種策略。
特征組合 (Feature Crosses):Playground 練習
通過添加其他合成特征來改進線性回歸模型(這是前一個練習的延續)
使用輸入函數將 Pandas DataFrame 對象轉換為 Tensors,并在 fit() 和 predict() 中調用輸入函數
使用 FTRL 優化算法進行模型訓練
通過獨熱編碼、分箱和特征組合創建新的合成特征
代碼部分還是原來的部分,不做任何改變。需要的改變的是將原來的SGD梯度下降訓練學習器換成了TFRL訓練學習器。
FTRL算法融合了RDA算法能產生稀疏模型的特性和SGD算法能產生更有效模型的特性,也就是說能學習出有效的且稀疏的模型。
理解FTRL
my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
換為
my_optimizer = tf.train.FtrlOptimizer(learning_rate=learning_rate)使用分桶特征列訓練模型
分桶(分箱)特征
分桶也稱為分箱。
例如,我們可以將 population 分為以下 3 個分桶:
bucket_0 (< 5000):對應于人口分布較少的街區
bucket_1 (5000 - 25000):對應于人口分布適中的街區
bucket_2 (> 25000):對應于人口分布較多的街區
根據前面的分桶定義,以下 population 矢量:
[[10001], [42004], [2500], [18000]]
將變成以下經過分桶的特征矢量:
[[1], [2], [0], [1]]
這些特征值現在是分桶索引。請注意,這些索引被視為離散特征。通常情況下,這些特征將被進一步轉換為獨熱編碼表示,但這是以透明方式實現的。
要為分桶特征定義特征列,我們可以使用 bucketized_column(而不是使用 numeric_column),該列將數字列作為輸入,并使用 boundardies 參數中指定的分桶邊界將其轉換為分桶特征。以下代碼為 households 和 longitude 定義了分桶特征列;get_quantile_based_boundaries 函數會根據分位數計算邊界,以便每個分桶包含相同數量的元素。
def get_quantile_based_boundaries(feature_values, num_buckets): boundaries = np.arange(1.0, num_buckets) / num_buckets quantiles = feature_values.quantile(boundaries) return [quantiles[q] for q in quantiles.keys()] # Divide households into 7 buckets. households = tf.feature_column.numeric_column("households") bucketized_households = tf.feature_column.bucketized_column( households, boundaries=get_quantile_based_boundaries( california_housing_dataframe["households"], 7)) # Divide longitude into 10 buckets. longitude = tf.feature_column.numeric_column("longitude") bucketized_longitude = tf.feature_column.bucketized_column( longitude, boundaries=get_quantile_based_boundaries( california_housing_dataframe["longitude"], 10))
在前面的代碼塊中,兩個實值列(即 households 和 longitude)已被轉換為分桶特征列。剩下的任務是對其余的列進行分桶,然后運行代碼來訓練模型。您可以采用各種啟發法來確定分桶的范圍。本練習使用了分位數技巧,通過這種方式選擇分桶邊界后,每個分桶將包含相同數量的樣本。
def construct_feature_columns(): """Construct the TensorFlow Feature Columns. Returns: A set of feature columns """ households = tf.feature_column.numeric_column("households") longitude = tf.feature_column.numeric_column("longitude") latitude = tf.feature_column.numeric_column("latitude") housing_median_age = tf.feature_column.numeric_column("housing_median_age") median_income = tf.feature_column.numeric_column("median_income") rooms_per_person = tf.feature_column.numeric_column("rooms_per_person") # Divide households into 7 buckets. bucketized_households = tf.feature_column.bucketized_column( households, boundaries=get_quantile_based_boundaries( training_examples["households"], 7)) # Divide longitude into 10 buckets. bucketized_longitude = tf.feature_column.bucketized_column( longitude, boundaries=get_quantile_based_boundaries( training_examples["longitude"], 10)) # Divide latitude into 10 buckets. bucketized_latitude = tf.feature_column.bucketized_column( latitude, boundaries=get_quantile_based_boundaries( training_examples["latitude"], 10)) # Divide housing_median_age into 7 buckets. bucketized_housing_median_age = tf.feature_column.bucketized_column( housing_median_age, boundaries=get_quantile_based_boundaries( training_examples["housing_median_age"], 7)) # Divide median_income into 7 buckets. bucketized_median_income = tf.feature_column.bucketized_column( median_income, boundaries=get_quantile_based_boundaries( training_examples["median_income"], 7)) # Divide rooms_per_person into 7 buckets. bucketized_rooms_per_person = tf.feature_column.bucketized_column( rooms_per_person, boundaries=get_quantile_based_boundaries( training_examples["rooms_per_person"], 7)) feature_columns = set([ bucketized_longitude, bucketized_latitude, bucketized_housing_median_age, bucketized_households, bucketized_median_income, bucketized_rooms_per_person]) return feature_columns
分桶后運行結果:
_ = train_model( learning_rate=1.0, steps=500, batch_size=100, feature_columns=construct_feature_columns(), training_examples=training_examples, training_targets=training_targets, validation_examples=validation_examples, validation_targets=validation_targets)特征組合
組合兩個(或更多個)特征是使用線性模型來學習非線性關系的一種聰明做法。在我們的問題中,如果我們只使用 latitude 特征進行學習,那么該模型可能會發現特定緯度(或特定緯度范圍內,因為我們已經將其分桶)的城市街區更可能比其他街區住房成本高昂。longitude 特征的情況與此類似。但是,如果我們將 longitude 與 latitude 組合,產生的組合特征則代表一個明確的城市街區。如果模型發現某些城市街區(位于特定緯度和經度范圍內)更可能比其他街區住房成本高昂,那么這將是比多帶帶考慮兩個特征更強烈的信號。
目前,特征列 API 僅支持組合離散特征。要組合兩個連續的值(比如 latitude 或 longitude),我們可以對其進行分桶。
如果我們組合 latitude 和 longitude 特征(例如,假設 longitude 被分到 2 個分桶中,而 latitude 有 3 個分桶),我們實際上會得到 6 個組合的二元特征。當我們訓練模型時,每個特征都會分別獲得自己的權重。
使用特征組合訓練模型在模型中添加 longitude 與 latitude 的特征組合,訓練模型,然后確定結果是否有所改善。
可參閱有關 crossed_column() 的 TensorFlow API 文檔,了解如何為您的組合構建特征列。hash_bucket_size 可以設為 1000。
def construct_feature_columns(): """Construct the TensorFlow Feature Columns. Returns: A set of feature columns """ households = tf.feature_column.numeric_column("households") longitude = tf.feature_column.numeric_column("longitude") latitude = tf.feature_column.numeric_column("latitude") housing_median_age = tf.feature_column.numeric_column("housing_median_age") median_income = tf.feature_column.numeric_column("median_income") rooms_per_person = tf.feature_column.numeric_column("rooms_per_person") # Divide households into 7 buckets. bucketized_households = tf.feature_column.bucketized_column( households, boundaries=get_quantile_based_boundaries( training_examples["households"], 7)) # Divide longitude into 10 buckets. bucketized_longitude = tf.feature_column.bucketized_column( longitude, boundaries=get_quantile_based_boundaries( training_examples["longitude"], 10)) # Divide latitude into 10 buckets. bucketized_latitude = tf.feature_column.bucketized_column( latitude, boundaries=get_quantile_based_boundaries( training_examples["latitude"], 10)) # Divide housing_median_age into 7 buckets. bucketized_housing_median_age = tf.feature_column.bucketized_column( housing_median_age, boundaries=get_quantile_based_boundaries( training_examples["housing_median_age"], 7)) # Divide median_income into 7 buckets. bucketized_median_income = tf.feature_column.bucketized_column( median_income, boundaries=get_quantile_based_boundaries( training_examples["median_income"], 7)) # Divide rooms_per_person into 7 buckets. bucketized_rooms_per_person = tf.feature_column.bucketized_column( rooms_per_person, boundaries=get_quantile_based_boundaries( training_examples["rooms_per_person"], 7)) # YOUR CODE HERE: Make a feature column for the long_x_lat feature cross long_x_lat = tf.feature_column.crossed_column( set([bucketized_longitude, bucketized_latitude]), hash_bucket_size=1000) feature_columns = set([ bucketized_longitude, bucketized_latitude, bucketized_housing_median_age, bucketized_households, bucketized_median_income, bucketized_rooms_per_person, long_x_lat]) return feature_columns
程序運行:
_ = train_model( learning_rate=1.0, steps=500, batch_size=100, feature_columns=construct_feature_columns(), training_examples=training_examples, training_targets=training_targets, validation_examples=validation_examples, validation_targets=validation_targets)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41711.html
摘要:我們先看看的初始化函數的完整定義,看構造一個模型可以輸入哪些參數我們可以將類的構造函數中的參數分為以下幾組基礎參數我們訓練的模型存放到指定的目錄中??赐昴P偷臉嬙旌瘮岛?,我們大概知道和端的模型各對應什么樣的模型,模型需要輸入什么樣的參數。 Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右發布的一類用于分類和回歸的模型,并應用到了 Google Play ...
閱讀 3410·2023-04-26 02:41
閱讀 2462·2023-04-26 00:14
閱讀 2871·2021-08-11 10:22
閱讀 1288·2019-12-27 11:38
閱讀 3579·2019-08-29 18:34
閱讀 2386·2019-08-29 12:13
閱讀 2958·2019-08-26 18:26
閱讀 1862·2019-08-26 16:49