Tensorflow,Tensorflow Estimator之LinearRegressor

 2023-10-21 阅读 21 评论 0

摘要:LinearRegressor的基本格式 初始化 # 定義線性回歸器 linear_regressor = tf.estimator.LinearRegressor(feature_columns=feature_columns, # 自定義的特征列optimizer=my_optimizer # 選擇合適的優化函數 ) 訓練 linear_regressor.train(input_fn=lambda: m

LinearRegressor的基本格式

初始化

# 定義線性回歸器
linear_regressor = tf.estimator.LinearRegressor(feature_columns=feature_columns,  # 自定義的特征列optimizer=my_optimizer  # 選擇合適的優化函數
)

訓練

linear_regressor.train(input_fn=lambda: my_input_fn(my_feature, targets),  # 輸入函數喂取數據steps=100  # 訓練的步數
)

預測

# 預測數據
predictions = linear_regressor.predict(input_fn=lambda: my_input_fn(my_feature, targets, num_epochs=1, shuffle=False)
)

預測的格式:

{
'predictions': array([0.34],dtype=float32)
}

是一個字典類型的數據,與之前的DNNClassifier不同,這個僅僅是輸出了每一標簽對應的輸出值,每一項是一個標量。而神經網絡的更加復雜一些。。。

配合Dataset讀取數據

之前的神經網絡分類器DNNClassifier使用了隨機亂序的輸入,這里的方式類似,不過使用了數據迭代的方式進行:

def my_input_fn(features, targets, batch_size=1, shuffle=True, num_epochs=None):'''輸入函數,用于向回歸器喂取數據:param features: 特征列:param labels: 標簽:param targets: 目標值:param batch_size: batch size:param shuffle: 是否亂序:param num_epochs: epochs的數量:return: 數據和標簽'''# 把pandas數據轉換成dict的array類型,每一個# features = {key: np.array(value) for key, value in dict(features).items()}ds = Dataset.from_tensor_slices((dict(features), targets))ds = ds.batch(batch_size).repeat(num_epochs)if shuffle:ds.shuffle(10000)# 迭代方式,每次返回一個批次的數據features, labels = ds.make_one_shot_iterator().get_next()return features, labels

Tensorflow、使用make_one_shot_iterator().get_next()方法,每次yeild數據,直到訓練步數完成。

完整版代碼:

說明:這里的線性回歸只是一個測試的例子,如果觀察繪制的圖像或者最小二乘損失的話,誤差會很大的。不過,這僅僅是為了說明一般的使用方法。。忽略掉誤差吧。。。。。。。

import math
import os
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 Datasettf.logging.set_verbosity(tf.logging.INFO)
pd.options.display.max_rows = 10
# pd.options.display.float_format = '{:.1f}'.format()# 讀取數據
if not os.path.exists('data.csv'):california_housing_dataframe = pd.read_csv("https://storage.googleapis.com/mledu-datasets/california_housing_train.csv", sep=",")
else:california_housing_dataframe = pd.read_csv('data.csv')# 數據亂序操作
california_housing_dataframe = california_housing_dataframe.reindex(np.random.permutation(california_housing_dataframe.index))# 對median_house_value數據列進行標量化處理
california_housing_dataframe['median_house_value'] /= 1000.0
print(california_housing_dataframe.describe())# 確定標簽、標簽列、目標結果
my_feature = california_housing_dataframe[['total_rooms']]
feature_columns = [tf.feature_column.numeric_column(key='total_rooms')]
targets = california_housing_dataframe['median_house_value']# 設置梯度下降函數,同時設置最大下降范圍,防止梯度爆炸
my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.0000001)
my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)# 定義線性回歸器
linear_regressor = tf.estimator.LinearRegressor(feature_columns=feature_columns,optimizer=my_optimizer
)def my_input_fn(features, targets, batch_size=1, shuffle=True, num_epochs=None):'''輸入函數,用于向回歸器喂取數據:param features: 特征列:param labels: 標簽:param targets: 目標值:param batch_size: batch size:param shuffle: 是否亂序:param num_epochs: epochs的數量:return: 數據和標簽'''# 把pandas數據轉換成dict的array類型,每一個# features = {key: np.array(value) for key, value in dict(features).items()}ds = Dataset.from_tensor_slices((dict(features), targets))ds = ds.batch(batch_size).repeat(num_epochs)if shuffle:ds.shuffle(10000)# 迭代方式,每次返回一個批次的數據features, labels = ds.make_one_shot_iterator().get_next()return features, labels# 開始訓練
linear_regressor.train(input_fn=lambda: my_input_fn(my_feature, targets),steps=100
)# 預測數據
predictions = linear_regressor.predict(input_fn=lambda: my_input_fn(my_feature, targets, num_epochs=1, shuffle=False)
)predictions = np.array([item['predictions'][0] for item in predictions])MSE = metrics.mean_squared_error(predictions, targets)
RMSE = math.sqrt(MSE)
print("Mean Squared Error (on training data): %0.3f" % MSE)
print("Root Mean Squared Error (on training data): %0.3f" % RMSE)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_valueprint("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" % RMSE)calibration_data = pd.DataFrame()
calibration_data["predictions"] = pd.Series(predictions)
calibration_data["targets"] = pd.Series(targets)
print(calibration_data.describe())sample = california_housing_dataframe.sample(n=300)# 獲取最大最小值
x_0 = sample["total_rooms"].min()
x_1 = sample["total_rooms"].max()# 獲取權重和偏置項
weight = linear_regressor.get_variable_value('linear/linear_model/total_rooms/weights')[0]
bias = linear_regressor.get_variable_value('linear/linear_model/bias_weights')# 獲取有關的數據.
y_0 = weight * x_0 + bias
y_1 = weight * x_1 + bias# 追至直線
plt.plot([x_0, x_1], [y_0, y_1], c='r')# 坐標的名稱
plt.ylabel("median_house_value")
plt.xlabel("total_rooms")# 畫出圖的分散點
plt.scatter(sample["total_rooms"], sample["median_house_value"])# Display graph.
plt.show()

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/157015.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息