国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

特征組合&特征交叉 (Feature Crosses)

Freeman / 1354人閱讀

摘要:特征組合有助于表示非線性關(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í)

代碼部分練習(xí) 學(xué)習(xí)目標(biāo):

通過添加其他合成特征來改進(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

相關(guān)文章

  • TensorFlow Wide And Deep 模型詳解與應(yīng)用

    摘要:我們先看看的初始化函數(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 ...

    opengps 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Freeman

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<