1. 問題描述
根據已知的房價數據,對新的房子進行價格預測。這種屬於典型的監督類學習算法。
2. 算法選擇以及原理
2.1 算法圖
這裏我們用一種比較好理解的機器學習算法來進行建模:線性迴歸。看下面的圖,很容易理解,找出一條線對數據點進行擬合使得目標函數最小話,下圖是對單變量進行擬合還可以針對多變量進行建模。
2.2 算法公式
第一步:定義擬合曲線。
第二步:轉化成矩陣運算,這裏的X0就是爲了維度增加的。
第三步:計算誤差函數,將模型值與真實值進行比較得到誤差。
第四步:採用梯度下降進行模型優化,求偏導確定方向,a表示步長,下圖理解下。
上面寫的是單變量的模型,多變量的模型類似,不做贅述。
3. 使用TensorFlow實現預測算法
3.1 數據可視化
數據說明:自己構造啦[因爲沒有找到合適的數據],自己造一個三列的數據
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
df1 = pd.read_csv('data1.csv', names=['square', 'bedrooms', 'price'])
ig = plt.figure()
# 設置座標
ax.set_xlabel('square')
ax.set_ylabel('bedrooms')
ax.set_zlabel('price')
ax.scatter3D(df1['square'], df1['bedrooms'], df1['price'], c=df1['price'], cmap='Greens')
3.2 數據標準化
上面的圖可以看出,不同軸的數據差異很大。這種情況下不便於計算。需要我們進行標準化處理。常見的有兩種標準化方案:線性標準化、正則標準化(下面採用的標準化方式);
def normalize_feature(df):
return df.apply(lambda column: (column - column.mean()) / column.std())
df = normalize_feature(df1)
df.head()
#使用同樣的代碼繪製圖像
還有我們需要補齊一列,處理得到矩陣輸入矩陣和輸出矩陣,用於訓練模型
# 用ones補齊x0這一列
ones = pd.DataFrame({'ones': np.ones(len(df))})
df = pd.concat([ones, df], axis=1)
# 獲取數據矩陣X,輸出矩陣Y
X_data = np.array(df[df.columns[0:3]])
y_data = np.array(df[df.columns[-1]]).reshape(len(df), 1)
3.4 創建數據流圖
import tensorflow as tf
alpha = 0.01 # 學習率 alpha
epoch = 500 # 訓練全量數據集的輪數
# 輸入 X,輸出 y
X = tf.placeholder(tf.float32, X_data.shape)
y = tf.placeholder(tf.float32, y_data.shape)
# 權重變量 W
W = tf.get_variable("weights", (X_data.shape[1], 1), initializer=tf.constant_initializer())
# 假設函數 h(x) = w0*x0+w1*x1+w2*x2, 其中x0恆爲1
# 推理值 y_pred 形狀[47,1]
y_pred = tf.matmul(X, W)
# 損失函數採用最小二乘法,y_pred - y。
loss_op = 1 / (2 * len(X_data)) * tf.matmul((y_pred - y), (y_pred - y), transpose_a=True)
# 隨機梯度下降優化器 opt
opt = tf.train.GradientDescentOptimizer(learning_rate=alpha)
# 單輪訓練操作 train_op
train_op = opt.minimize(loss_op)
接下來數據流圖已經創建好了,創建session來運行數據流圖
with tf.Session() as sess:
# 初始化全局變量
sess.run(tf.global_variables_initializer())
# 開始訓練模型,因爲訓練集較小,所以每輪都使用全量數據訓練
for e in range(1, epoch + 1):
sess.run(train_op, feed_dict={X: X_data, y: y_data})
3.5 可視化數據流圖
當系統複雜的時候要很好的去診斷模型是否正確是一件並不容易的事情,我們需要去可視化的工具去看模型的流圖確認流程的準確性。
下面的代碼和上面的很像,但是結構更好,展示的效果更美好
import tensorflow as tf
alpha = 0.01 # 學習率 alpha
epoch = 500 # 訓練全量數據集的輪數
with tf.name_scope('input'):
X = tf.placeholder(tf.float32, X_data.shape, name='X')
y = tf.placeholder(tf.float32, y_data.shape, name='y')
with tf.name_scope('hypothesis'):
W = tf.get_variable("weights",
(X_data.shape[1], 1),
initializer=tf.constant_initializer())
y_pred = tf.matmul(X, W, name='y_pred')
with tf.name_scope('loss'):
loss_op = 1 / (2 * len(X_data)) * tf.matmul((y_pred - y), (y_pred - y), transpose_a=True)
with tf.name_scope('train'):
train_op = tf.train.GradientDescentOptimizer(learning_rate=alpha).minimize(loss_op)
3.6 可視化參數訓練情況
使用下面的命令啓動tensorboard,然後就可以各種完啦
tensorboard --logdir ./ --host localhost
4. TODO
1、我們沒有分別使用測試集和訓練集合進行訓練。
2、沒有做超參數alpha的學習調整。
3、初始值的設定隨機。
4、在可視化的時候沒有考慮準確率和召回率等評估指標。
5、沒法在線預測,只能訓練離線模型。
6、當數據量大的時候,怎樣考慮模型的並行、軟件的分佈式部署等等。