1. 程式人生 > >google機器學習框架tensorflow學習筆記(六)

google機器學習框架tensorflow學習筆記(六)

使用Tensorflow的基本步驟

設定

首先載入必要的庫
import math

from IPython import display
from matplotlib import cm
from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
from sklearn import metrics
import tensorflow as tf
from tensorflow.python.data import Dataset

tf.logging.set_verbosity(tf.logging.ERROR)
pd.options.display.max_rows = 10
pd.options.display.float_format = '{:.1f}'.format

接下來載入資料集。

california_housing_dataframe=pd.read_csv("https://storage.googleapis.com/mledu-datasets/california_housing_train.csv", sep=",")

我們將對資料進行隨機化處理,以確保不會出現任何病態排序結果(可能會損害隨機梯度下降法的效果)。此外,我們會將  median_house_value  調整為以千為單位,這樣,模型就能夠以常用範圍內的學習速率較為輕鬆地學習這些資料。
california_housing_dataframe = california_housing_dataframe.reindex(
    np.random.permutation(california_housing_dataframe.index))
california_housing_dataframe["median_house_value"] /= 1000.0
california_housing_dataframe
檢查資料

建議您在使用資料之前,先對它有一個初步的瞭解。

我們會輸出關於各列的一些實用統計資訊快速摘要:樣本數、均值、標準偏差、最大值、最小值和各種分位數。

california_housing_dataframe.describe()

構建第一個模型

我們將嘗試預測 median_house_value,它將是我們的標籤(有時也稱為目標)。我們將使用 total_rooms 作為輸入特徵。

注意:我們使用的是城市街區級別的資料,因此該特徵表示相應街區的房間總數。

為了訓練模型,我們將使用 TensorFlow Estimator API 提供的 LinearRegressor 介面。此 API 負責處理大量低級別模型搭建工作,並會提供執行模型訓練、評估和推理的便利方法。


第一步:定義特徵並配置特徵列

為了將我們的訓練資料匯入 TensorFlow,我們需要指定每個特徵包含的資料型別。在本練習及今後的練習中,我們主要會使用以下兩類資料:

  • 分類資料:一種文字資料。在本練習中,我們的住房資料集不包含任何分類特徵,但您可能會看到的示例包括家居風格以及房地產廣告詞。

  • 數值資料:一種數字(整數或浮點數)資料以及您希望視為數字的資料。有時您可能會希望將數值資料(例如郵政編碼)視為分類資料(我們將在稍後的部分對此進行詳細說明)。

在 TensorFlow 中,我們使用一種稱為“特徵列”的結構來表示特徵的資料型別。特徵列僅儲存對特徵資料的描述;不包含特徵資料本身。

一開始,我們只使用一個數值輸入特徵 total_rooms。以下程式碼會從 california_housing_dataframe 中提取 total_rooms 資料,並使用 numeric_column 定義特徵列,這樣會將其資料指定為數值:

# Define the input feature: total_rooms.
my_feature = california_housing_dataframe[["total_rooms"]]

# Configure a numeric feature column for total_rooms.
feature_columns = [tf.feature_column.numeric_column("total_rooms")]
注意total_rooms 資料的形狀是一維陣列(每個街區的房間總數列表)。這是 numeric_column 的預設形狀,因此我們不必將其作為引數傳遞。

第二步:定義目標 接下來,我們將定義目標,也就是  median_house_value 。同樣,我們可以從  california_housing_dataframe  中提取它: # Define the label.
targets = california_housing_dataframe["median_house_value"]

第三步:配置LinearRegressor

接下來,我們將使用 LinearRegressor 配置線性迴歸模型,並使用 GradientDescentOptimizer(它會實現小批量隨機梯度下降法 (SGD))訓練該模型。learning_rate引數可控制梯度步長的大小。

注意:為了安全起見,我們還會通過 clip_gradients_by_norm 梯度裁剪應用到我們的優化器。梯度裁剪可確保梯度大小在訓練期間不會變得過大,梯度過大會導致梯度下降法失敗。

# Use gradient descent as the optimizer for training the model.
my_optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.0000001)
my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)

# Configure the linear regression model with our feature columns and optimizer.
# Set a learning rate of 0.0000001 for Gradient Descent.
linear_regressor = tf.estimator.LinearRegressor(
    feature_columns=feature_columns,
    optimizer=my_optimizer
)

第四步:定義輸入函式

要將加利福尼亞州住房資料匯入 LinearRegressor,我們需要定義一個輸入函式,讓它告訴 TensorFlow 如何對資料進行預處理,以及在模型訓練期間如何批處理、隨機處理和重複資料。

首先,我們將 Pandas 特徵資料轉換成 NumPy 陣列字典。然後,我們可以使用 TensorFlow Dataset API 根據我們的資料構建 Dataset 物件,並將資料拆分成大小為 batch_size 的多批資料,以按照指定週期數 (num_epochs) 進行重複。

注意:如果將預設值 num_epochs=None 傳遞到 repeat(),輸入資料會無限期重複。

然後,如果 shuffle 設定為 True,則我們會對資料進行隨機處理,以便資料在訓練期間以隨機方式傳遞到模型。buffer_size 引數會指定 shuffle 將從中隨機抽樣的資料集的大小。

最後,輸入函式會為該資料集構建一個迭代器,並向 LinearRegressor 返回下一批資料。
def my_input_fn(features, targets, batch_size=1, shuffle=True, num_epochs=None):
    """Trains a linear regression model of one feature.
  
    Args:
      features: pandas DataFrame of features
      targets: pandas DataFrame of targets
      batch_size: Size of batches to be passed to the model
      shuffle: True or False. Whether to shuffle the data.
      num_epochs: Number of epochs for which data should be repeated. None = repeat indefinitely
    Returns:
      Tuple of (features, labels) for next data batch
    """
  
    # Convert pandas data into a dict of np arrays.
    features = {key:np.array(value) for key,value in dict(features).items()}
 
    # Construct a dataset, and configure batching/repeating
    ds = Dataset.from_tensor_slices((features,targets)) # warning: 2GB limit
    ds = ds.batch(batch_size).repeat(num_epochs)
    
    # Shuffle the data, if specified
    if shuffle:
      ds = ds.shuffle(buffer_size=10000)
    
    # Return the next batch of data
    features, labels = ds.make_one_shot_iterator().get_next()
    return features, labels

未完待續