亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

全部開發者教程

TensorFlow 入門教程

使用 Estimator 實現 Boosting Tree 模型

在學習 TensorFlow 的過程之中,最好的方式是結合示例來進行學習,并且加以相應的訓練。因此這節課我們就來學習一下 Estimator 模型的一個經典示例:Boosting Tree 模型,也被稱作提升樹模型。

在這節課程之中,我們會學習什么是 Boosting Tree ,它的一些簡單的工作原理,同時學習如何使用 Estimator 來實現一個簡單的 Boosting Tree 模型。

1. 什么是 Boosting

首先,Boosting 是機器學習中的集成學習的一種。

那么什么是集成學習呢?簡單來說,集成學習就是使用多個模型來一同學習,最后在每個模型都得到預測結果后再經過進一步的集成處理得到最終預測結果的一種學習方法。值得注意的是,不同的集成學習方法有著不同的集成方法,常見的包括 Bagging、Boosting 等集成方法

下面我們可以簡單的了解一下這兩種集成方法(我們的重點在集成,因此省略掉了相應的采樣工作)。

  • Bagging 集成方法:這種集成方法的思想比較簡單,在每個模型都得到一個結果之后,我們會采用一種更加民主的方式進行:
    • 對于回歸問題,我們使用的是取均值操作;
    • 對于分類問題,我們采用的是投票方法,也就是選取出現次數最多的那個
    • 在 Bagging 之中,每個模型的重要性是相同的。
  • Boosting 集成方法:這種集成方法就是我們這節課要采用的,相對復雜一些:
    • 我們首先采用加法線性組合對各個模型進行處理;
    • 然后我們得到每個模型的錯誤率;
    • 最后對于錯誤率小的模型,我們會減少它的權重(話語權),反而提升一些錯誤率高的模型的權重(話語權)。
    • 在 Boosting 之中,每個模型的重要性是不同的。

既然了解了什么是 Boosting 方法,那么我們便要簡單學習一下提升樹的基礎模型:決策樹。

2. 什么是決策樹(Tree)

決策樹其實很簡單,我們日常生活中用到的例子非常多,舉個簡單的分類的例子:

我中午餓了,要去吃飯,學校里面一共有兩個餐廳,而我一共有4個選擇:

  • A餐廳:價格貴;
  • B餐廳:價格便宜;
  • 吃泡面:不用出宿舍,前提是宿舍售賣機有賣;
  • 點外賣:不用出宿舍。

那么,我們的決策樹就如下圖所示:如果我想出門而且有錢,我就去 A 餐廳;如果我想出門但是卻錢不多,那么我就去 B 餐廳;倘若我不想出宿舍而剛剛好宿舍有賣泡面,我就可以直接吃泡面;到那時如果沒有泡面的話,我就只能點外賣。

圖片描述

這只是一個簡單的理解,而具體的優化的細節涉及到許多的數學原理,這里就不過多解釋了。

3. 如何在 TensorFlow 的 Estimator 之中使用提升樹

既然我們了解了 Boosting ,也知道了 Tree ,那么接下來就是了解如何在 Estimator 之中使用Boosting Tree。在這節課之中,我們依然使用泰坦尼克數據集為示例來進行演示,這是我們接觸過的一個二分類問題。

其實在 Estimator 之中,已經包含一個內置的 API 來向我們提供一個提升樹分類器,剛剛好符合我們對數據分類的要求。

tf.estimator.BoostedTreesClassifier()

通過該API我們可以直接構造一個用于分類的提升樹。

4. 具體的實現細節

首先我們和之前一樣,進行數據的獲取:

import numpy as np
import pandas as pd
import tensorflow as tf

x_train = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/train.csv')
x_test = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/eval.csv')
y_train = x_train.pop('survived')
y_test = x_test.pop('survived')

然后我們要定義連序列以及離散列:

categories = ['sex', 'n_siblings_spouses', 'parch', 'class', 'deck', 'embark_town', 'alone']
numeric = ['age', 'fare']

然后我們就要定義特征列了:

def one_hot_cat_column(feature_name, vocab):
  return tf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_list(feature_name, vocab))

feature_columns = []
for feature_name in categories:
  feature_columns.append(one_hot_cat_column(feature_name, x_train[feature_name].unique()))

for feature_name in numeric:
  feature_columns.append(tf.feature_column.numeric_column(feature_name,dtype=tf.float32))

在第一個 one_hot_cat_column 函數之中,我們對于特征列進行了獨熱編碼。并且我們對于離散列與連續列進行了不同的處理。

然后我們定義輸入函數,這里我們仍然定義了兩個輸入函數,一個為訓練使用,另一個為測試使用:

def train_input_fn(x, y):
  dataset = tf.data.Dataset.from_tensor_slices((dict(x), y))
  dataset = dataset.shuffle(len(y_train)).repeat().batch(32)
  return dataset

def test_input_fn(x, y):
  dataset = tf.data.Dataset.from_tensor_slices((dict(x), y)).batch(32)
  return dataset

train_input = lambda: train_input_fn(x_train, y_train)
test_input = lambda: test_input_fn(x_test, y_eval)

在這之后,我們便需要定義我們的提升樹模型了:

estimator = tf.estimator.BoostedTreesClassifier(feature_columns, n_batches_per_layer=len(y_train) // 32)

這里的第一個參數 feature_columns 就是特征列,這個很好理解;關鍵是第二個參數,大家要記住的是, n_batches_per_layer 這個參數需要是樣本的數量與批次大小的商,因為這里我們的批次大小為 32 ,因此我們設置其為 (y_train) // 32 。

最后便是模型的訓練了:

estimator.train(train_input, max_steps=100)
result = estimator.evaluate(test_input)
print(pd.Series(result))

于是我們可以的得到輸出:

accuracy                  0.787879
accuracy_baseline         0.625000
auc                       0.835384
auc_precision_recall      0.825271
average_loss              0.554901
label/mean                0.375000
loss                      0.552625
precision                 0.747126
prediction/mean           0.454899
recall                    0.656566
global_step             100.000000
dtype: float64

于是我們可以得到了我們訓練結果: 78% 的準確率。

為了做對比,大家可以采用一個簡單的線性分類器來做對比,也就是:

tf.estimator.LinearClassifier(feature_columns)

通過對比,大家就可以看到集成學習的優勢。

5. 小結

在這節課之中,我們學習了什么是集成學習以及集成學習的兩種常用的集成方法。同時我們也了解了什么是決策樹。最后我們在實踐中學習了如何使用 Estimator 來實現一個提升樹模型。

圖片描述