步驟:
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ù)步驟:
- 將Pandas的Series 轉(zhuǎn)化為Numpy的字典
- 構(gòu)造Tensorflow的 Dataset API 構(gòu)造dataset對(duì)象
- 將數(shù)據(jù)拆分為 batch_size 大小的多批
- 循環(huán) num_epochs 次,如果num_epochs為0則循環(huán)無數(shù)次
- shuffle 如果為True,則對(duì)數(shù)據(jù)進(jìn)行隨機(jī)處理
- 迭代器,傳遞下一批數(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)練模型:
調(diào)用 train()訓(xùn)練模型
-
將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()