摘要:特征組合有助于表示非線性關(guān)系。特征組合組合獨(dú)熱矢量在實(shí)踐中,機(jī)器學(xué)習(xí)模型很少會(huì)組合連續(xù)特征。通常情況下,這些特征將被進(jìn)一步轉(zhuǎn)換為獨(dú)熱編碼表示,但這是以透明方式實(shí)現(xiàn)的。目前,特征列僅支持組合離散特征。
寫在前面:之前收藏了一個(gè)網(wǎng)友些的谷歌機(jī)器學(xué)習(xí)總結(jié)教程(感恩),可是突然斷更了,只能自己補(bǔ)完后面的筆記了。
特征組合也叫特征交叉
特征組合也叫特征交叉
特征組合也叫特征交叉(說三遍)
合成特征 (synthetic feature)和特征組合(Feature Crosses)不太一樣,特征交叉是特征組合的一個(gè)子集。
合成特征 (synthetic feature)一種特征,不在輸入特征之列,而是從一個(gè)或多個(gè)輸入特征衍生而來。通過標(biāo)準(zhǔn)化或縮放多帶帶創(chuàng)建的特征不屬于合成特征。合成特征包括以下類型:
將一個(gè)特征與其本身或其他特征相乘(稱為特征組合)。
兩個(gè)特征相除。
對(duì)連續(xù)特征進(jìn)行分桶,以分為多個(gè)區(qū)間分箱。
特征組合 (feature cross):對(duì)非線性規(guī)律進(jìn)行編碼通過將多帶帶的特征進(jìn)行組合(相乘或求笛卡爾積)而形成的合成特征。特征組合有助于表示非線性關(guān)系。
對(duì)于下面的非線性問題。線性學(xué)習(xí)器畫的任何一條線都不能很好地預(yù)測(cè)樹的健康狀況。
要解決上圖所示的非線性問題,可以創(chuàng)建一個(gè)特征組合。特征組合是指通過將兩個(gè)或多個(gè)輸入特征相乘來對(duì)特征空間中的非線性規(guī)律進(jìn)行編碼的合成特征。“cross”(組合)這一術(shù)語來自 cross product(向量積)。我們通過將 與 組合來創(chuàng)建一個(gè)名為x3的特征組合:
x3 = x1x2
我們像處理任何其他特征一樣來處理這個(gè)新建的x3特征組合。線性公式變?yōu)椋?br>y = b + w1x1 + w2x2 + w3x3
雖然w3表示非線性信息,但您不需要改變線性模型的訓(xùn)練方式來確定w3的值。
特征組合的種類通過采用隨機(jī)梯度下降法,可以有效地訓(xùn)練線性模型。因此,在使用擴(kuò)展的線性模型時(shí)輔以特征組合一直都是訓(xùn)練大規(guī)模數(shù)據(jù)集的有效方法。我們可以創(chuàng)建很多不同種類的特征組合。例如:
[A X B]:將兩個(gè)特征的值相乘形成的特征組合。
[A x B x C x D x E]:將五個(gè)特征的值相乘形成的特征組合。
[A x A]:對(duì)單個(gè)特征的值求平方形成的特征組合。
特征組合 (Feature Crosses):組合獨(dú)熱矢量在實(shí)踐中,機(jī)器學(xué)習(xí)模型很少會(huì)組合連續(xù)特征。不過,機(jī)器學(xué)習(xí)模型卻經(jīng)常組合獨(dú)熱特征矢量,將獨(dú)熱特征矢量的特征組合視為邏輯連接.例如,假設(shè)我們具有以下兩個(gè)特征:國家/地區(qū)和語言。對(duì)每個(gè)特征進(jìn)行獨(dú)熱編碼會(huì)生成具有二元特征的矢量,這些二元特征可解讀為 country=USA, country=France 或language=English,language=Spanish。然后,如果您對(duì)這些獨(dú)熱編碼進(jìn)行特征組合,則會(huì)得到可解讀為邏輯連接的二元特征,如下所示:
country:usa AND language:spanish
再舉一個(gè)例子,假設(shè)您對(duì)緯度和經(jīng)度進(jìn)行分箱,獲得多帶帶的獨(dú)熱 5 元素特征矢量。例如,指定的緯度和經(jīng)度可以表示如下:
binned_latitude = [0, 0, 0, 1, 0] binned_longitude = [0, 1, 0, 0, 0]
假設(shè)您對(duì)這兩個(gè)特征矢量創(chuàng)建了特征組合:
binned_latitude X binned_longitude
此特征組合是一個(gè) 25 元素獨(dú)熱矢量(24 個(gè) 0 和 1 個(gè) 1)。該組合中的單個(gè) 1 表示緯度與經(jīng)度的特定連接。然后,您的模型就可以了解到有關(guān)這種連接的特定關(guān)聯(lián)性。
假設(shè)我們更粗略地對(duì)緯度和經(jīng)度進(jìn)行分箱,如下所示:
binned_latitude(lat) = [ 0 < lat <= 10 10 < lat <= 20 20 < lat <= 30 ] binned_longitude(lon) = [ 0 < lon <= 15 15 < lon <= 30 ]
針對(duì)這些粗略分箱創(chuàng)建特征組合會(huì)生成具有以下含義的合成特征:
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 ]
現(xiàn)在,假設(shè)我們的模型需要根據(jù)以下兩個(gè)特征來預(yù)測(cè)狗主人對(duì)狗狗的滿意程度:
行為類型(吠叫、叫、偎依等)
時(shí)段
如果我們根據(jù)這兩個(gè)特征構(gòu)建以下特征組合:
[behavior type X time of day]
我們最終獲得的預(yù)測(cè)能力將遠(yuǎn)遠(yuǎn)超過任一特征多帶帶的預(yù)測(cè)能力。例如,如果狗狗在下午 5 點(diǎn)主人下班回來時(shí)(快樂地)叫喊,可能表示對(duì)主人滿意度的正面預(yù)測(cè)結(jié)果。如果狗狗在凌晨 3 點(diǎn)主人熟睡時(shí)(也許痛苦地)哀叫,可能表示對(duì)主人滿意度的強(qiáng)烈負(fù)面預(yù)測(cè)結(jié)果。
線性學(xué)習(xí)器可以很好地?cái)U(kuò)展到大量數(shù)據(jù)。對(duì)大規(guī)模數(shù)據(jù)集使用特征組合是學(xué)習(xí)高度復(fù)雜模型的一種有效策略。神經(jīng)網(wǎng)絡(luò)可提供另一種策略。
特征組合 (Feature Crosses):Playground 練習(xí)
通過添加其他合成特征來改進(jìn)線性回歸模型(這是前一個(gè)練習(xí)的延續(xù))
使用輸入函數(shù)將 Pandas DataFrame 對(duì)象轉(zhuǎn)換為 Tensors,并在 fit() 和 predict() 中調(diào)用輸入函數(shù)
使用 FTRL 優(yōu)化算法進(jìn)行模型訓(xùn)練
通過獨(dú)熱編碼、分箱和特征組合創(chuàng)建新的合成特征
代碼部分還是原來的部分,不做任何改變。需要的改變的是將原來的SGD梯度下降訓(xùn)練學(xué)習(xí)器換成了TFRL訓(xùn)練學(xué)習(xí)器。
FTRL算法融合了RDA算法能產(chǎn)生稀疏模型的特性和SGD算法能產(chǎn)生更有效模型的特性,也就是說能學(xué)習(xí)出有效的且稀疏的模型。
理解FTRL
my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
換為
my_optimizer = tf.train.FtrlOptimizer(learning_rate=learning_rate)使用分桶特征列訓(xùn)練模型
分桶(分箱)特征
分桶也稱為分箱。
例如,我們可以將 population 分為以下 3 個(gè)分桶:
bucket_0 (< 5000):對(duì)應(yīng)于人口分布較少的街區(qū)
bucket_1 (5000 - 25000):對(duì)應(yīng)于人口分布適中的街區(qū)
bucket_2 (> 25000):對(duì)應(yīng)于人口分布較多的街區(qū)
根據(jù)前面的分桶定義,以下 population 矢量:
[[10001], [42004], [2500], [18000]]
將變成以下經(jīng)過分桶的特征矢量:
[[1], [2], [0], [1]]
這些特征值現(xiàn)在是分桶索引。請(qǐng)注意,這些索引被視為離散特征。通常情況下,這些特征將被進(jìn)一步轉(zhuǎn)換為獨(dú)熱編碼表示,但這是以透明方式實(shí)現(xiàn)的。
要為分桶特征定義特征列,我們可以使用 bucketized_column(而不是使用 numeric_column),該列將數(shù)字列作為輸入,并使用 boundardies 參數(shù)中指定的分桶邊界將其轉(zhuǎn)換為分桶特征。以下代碼為 households 和 longitude 定義了分桶特征列;get_quantile_based_boundaries 函數(shù)會(huì)根據(jù)分位數(shù)計(jì)算邊界,以便每個(gè)分桶包含相同數(shù)量的元素。
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))
在前面的代碼塊中,兩個(gè)實(shí)值列(即 households 和 longitude)已被轉(zhuǎn)換為分桶特征列。剩下的任務(wù)是對(duì)其余的列進(jìn)行分桶,然后運(yùn)行代碼來訓(xùn)練模型。您可以采用各種啟發(fā)法來確定分桶的范圍。本練習(xí)使用了分位數(shù)技巧,通過這種方式選擇分桶邊界后,每個(gè)分桶將包含相同數(shù)量的樣本。
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
分桶后運(yùn)行結(jié)果:
_ = 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)特征組合
組合兩個(gè)(或更多個(gè))特征是使用線性模型來學(xué)習(xí)非線性關(guān)系的一種聰明做法。在我們的問題中,如果我們只使用 latitude 特征進(jìn)行學(xué)習(xí),那么該模型可能會(huì)發(fā)現(xiàn)特定緯度(或特定緯度范圍內(nèi),因?yàn)槲覀円呀?jīng)將其分桶)的城市街區(qū)更可能比其他街區(qū)住房成本高昂。longitude 特征的情況與此類似。但是,如果我們將 longitude 與 latitude 組合,產(chǎn)生的組合特征則代表一個(gè)明確的城市街區(qū)。如果模型發(fā)現(xiàn)某些城市街區(qū)(位于特定緯度和經(jīng)度范圍內(nèi))更可能比其他街區(qū)住房成本高昂,那么這將是比多帶帶考慮兩個(gè)特征更強(qiáng)烈的信號(hào)。
目前,特征列 API 僅支持組合離散特征。要組合兩個(gè)連續(xù)的值(比如 latitude 或 longitude),我們可以對(duì)其進(jìn)行分桶。
如果我們組合 latitude 和 longitude 特征(例如,假設(shè) longitude 被分到 2 個(gè)分桶中,而 latitude 有 3 個(gè)分桶),我們實(shí)際上會(huì)得到 6 個(gè)組合的二元特征。當(dāng)我們訓(xùn)練模型時(shí),每個(gè)特征都會(huì)分別獲得自己的權(quán)重。
使用特征組合訓(xùn)練模型在模型中添加 longitude 與 latitude 的特征組合,訓(xùn)練模型,然后確定結(jié)果是否有所改善。
可參閱有關(guān) crossed_column() 的 TensorFlow API 文檔,了解如何為您的組合構(gòu)建特征列。hash_bucket_size 可以設(shè)為 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
程序運(yùn)行:
_ = 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)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41711.html
摘要:我們先看看的初始化函數(shù)的完整定義,看構(gòu)造一個(gè)模型可以輸入哪些參數(shù)我們可以將類的構(gòu)造函數(shù)中的參數(shù)分為以下幾組基礎(chǔ)參數(shù)我們訓(xùn)練的模型存放到指定的目錄中。看完模型的構(gòu)造函數(shù)后,我們大概知道和端的模型各對(duì)應(yīng)什么樣的模型,模型需要輸入什么樣的參數(shù)。 Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右發(fā)布的一類用于分類和回歸的模型,并應(yīng)用到了 Google Play ...
閱讀 3403·2023-04-26 02:41
閱讀 2445·2023-04-26 00:14
閱讀 2823·2021-08-11 10:22
閱讀 1276·2019-12-27 11:38
閱讀 3571·2019-08-29 18:34
閱讀 2375·2019-08-29 12:13
閱讀 2951·2019-08-26 18:26
閱讀 1834·2019-08-26 16:49