Tensorflow-官方快速入門系列-編程練習(xí)-first_steps_with_tensorflow

步驟:

1. 加載數(shù)據(jù)集:

import pandas as pd

# 用pd.read_scv 加載scv數(shù)據(jù) 
pd.read_scv(file, sep)
california_housing_dataframe = pd.read_csv("https://download.mlcc.google.cn/mledu-datasets/california_housing_train.csv", sep=',')

# 用 reindex函數(shù) 隨機(jī)化所有數(shù)據(jù)
# 用np.random.permutation()函數(shù)隨機(jī)排列dataframe的index
california_housing_dataframe = california_housing_dataframe.reindex(np.random.permutation(california_housing_dataframe.index))

# 修改房?jī)r(jià)為以千為單位便于調(diào)節(jié)
california_housing_dataframe = california_housing_dataframe["median_house_value"] /= 1000.0

# 測(cè)試數(shù)據(jù),輸出摘要
california_housing_dataframe.describe()

2. 配置模型參數(shù):

# 原理:
# 將房?jī)r(jià) median_house_value 作為預(yù)測(cè)目標(biāo)
# 將房間數(shù) total_rooms 作為特征
# 采用Estimator API提供的 LinearRegressor接口
  • 定義特征并配置特征列
    特征有分類數(shù)據(jù)數(shù)值數(shù)據(jù)兩種
    本次使用的特征total-rooms 是數(shù)值數(shù)據(jù)
    特征列:僅儲(chǔ)存對(duì)特征數(shù)據(jù)的描述,不包含數(shù)據(jù)本身。

      # 獲取特征數(shù)據(jù):total-rooms
      my_feature = california_housing_dataframe[["total-rooms"]]
      
       # 定義特征列
      feature_columns = [tf.feature_column.numeric_column("total_rooms")] 
    
  • 定義目標(biāo):
    獲取目標(biāo)

      # 獲取 median_house_value
       targets = california_housing_dataframe["median_house_value"]
    
  • 配置 LinearRegressor:
    用LinearRegressor配置線性回歸模型
    用GradientDescentOptimizer訓(xùn)練模型
    用clip_gradients_by_norm 配置梯度裁剪,以免梯度過大

    # 定義訓(xùn)練:
    my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.0000001)
    my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)
    
    # 定義線性模型:
    # 采用 my_optimizer 訓(xùn)練
    # feature_columns 是特征列
    linear_regressor = tf.estimator.LinearRegressor(feature_columns = feature_columns, optimizer = my_optimizer)
    
  • 定義輸入函數(shù):
    LinearRegressor是一個(gè)框架,沒有數(shù)據(jù)輸入, 因此需要輸入函數(shù)來進(jìn)行數(shù)據(jù)輸入,告訴tensorflow如何進(jìn)行預(yù)處理,以及在訓(xùn)練期間如何批處理,隨機(jī)處理及重復(fù)數(shù)據(jù)

    步驟:

    1. 將Pandas的Series 轉(zhuǎn)化為Numpy的字典
    2. 構(gòu)造Tensorflow的 Dataset API 構(gòu)造dataset對(duì)象
    3. 將數(shù)據(jù)拆分為 batch_size 大小的多批
    4. 循環(huán) num_epochs 次,如果num_epochs為0則循環(huán)無數(shù)次
    5. shuffle 如果為True,則對(duì)數(shù)據(jù)進(jìn)行隨機(jī)處理
    6. 迭代器,傳遞下一批數(shù)據(jù)
    # 定義函數(shù)
    def my_input_function(features, targets, batch_size = 1, shuffle = True, num_epochs = None)
        
        # 將pandas的series類型轉(zhuǎn)化為字典
        features = {key: np.array(value) for key, value in dict(features).items()}
        
        # 創(chuàng)建dataset類型
        ds = Dataset.from_tensor_slices((features, targets))  # 數(shù)據(jù)最多占用2G空間
        ds = ds.batch(batch_size).repeat(num_epochs)
    
        # shuffle
        if shuffle:
            ds = ds.shuffle(buffer_size = 10000)
    
        # 返回?cái)?shù)據(jù)集
        features, labels = ds.make_one_iterator().get_next()
    
        return features, labels
    
  • 訓(xùn)練模型:

    1. 調(diào)用 train()訓(xùn)練模型

    2. 將my_input_function 封裝在 lambda

        # 訓(xùn)練模型 
        _ = linear_regressor.train(input_fn = lambda:my_input_fn(my_feature, targets), steps=100)
      
  • 評(píng)估模型:
    做一次預(yù)測(cè)

        # 獲取預(yù)測(cè)所需數(shù)據(jù)
        prediction_input_function = lambda: my_input_fn(my_feature, targets, num_epochs=1, shuffle=False)
    
        # 進(jìn)行預(yù)測(cè)
        predictions = linear_regressor.predict(input_fn=prediction_input_fn)
    
        # 將預(yù)測(cè)結(jié)果轉(zhuǎn)化為array形式便于計(jì)算MSE等
        predictions = np.array([item['predictions'][0] for item in predictions])
    
        # 計(jì)算MSE和RMSE并輸出:
        mean_squared_error = metrics.mean_squared_error(predictions, targets)
        root_mean_squared_error = math.sqrt(mean_squared_error)
        print("Mean Squared Error (on training data): %0.3f" % mean_squared_error)
        print("Root Mean Squared Error (on training data): %0.3f" % root_mean_squared_error)
    
        # 為了評(píng)估效果,打印labels的max和min
        min_house_value = california_housing_dataframe["median_house_value"].min()
        max_house_value = california_housing_dataframe["median_house_value"].max()
        min_max_difference = max_house_value - min_house_value
    
        print("Min. Median House Value: %0.3f" % min_house_value)
        print("Max. Median House Value: %0.3f" % max_house_value)
        print("Difference between Min. and Max.: %0.3f" % min_max_difference)
        print("Root Mean Squared Error: %0.3f" % root_mean_squared_error)
    
    
        # 用pd.describe()進(jìn)行評(píng)價(jià)
        # 創(chuàng)建一個(gè)dataframe類型容器
        calibration_data = pd.DataFrame()
        # 將預(yù)測(cè)值和目標(biāo)值分別作為兩列輸入到dataframe容器中
        calibration_data["predictions"] = pd.Series(predictions)
        calibration_data["targets"] = pd.Series(targets)
        # 輸出discribe來觀察預(yù)測(cè)值和目標(biāo)值之間的關(guān)系
        print(calibration_data.describe())
    
    
        # 通過繪制曲線來觀察預(yù)測(cè)值和目標(biāo)值之間的關(guān)系
        # 獲取數(shù)據(jù)
        sample = california_housing_dataframe.sample(n=300)
        # 定義橫軸范圍
        x_0 = sample["total_rooms"].min()
        x_1 = sample["total_rooms"].max()
        # 獲取線性回歸的權(quán)重Weight和偏置值bias
        weight = linear_regressor.get_variable_value('linear/linear_model/total_rooms/weights')[0]
        bias = linear_regressor.get_variable_value('linear/linear_model/bias_weights')
        # 用兩端點(diǎn)確定擬合的直線
        y_0 = weight * x_0 + bias 
        y_1 = weight * x_1 + bias
        # 繪制直線
        plt.plot([x_0, x_1], [y_0, y_1], c='r')
        # 定義坐標(biāo)軸
        plt.ylabel("median_house_value")
        plt.xlabel("total_rooms")
        # 繪制原數(shù)據(jù)散點(diǎn)圖
        plt.scatter(sample["total_rooms"], sample["median_house_value"])
        # 顯示
        plt.show()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容