版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
tensorflow----实战tensorflow实现房价预售模型
一、tensorflow实现房价预售模型前置知识
1.线性回归
在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或者多个称为回归系数模型参数线性组合。
用深度学习知识来说,就是基于最小二乘法的损失函数对线性方程进行拟合,建立模型。
2.线性回归式子推导
理想函数:
假设函数:这里添加x0=1
,主要是想转为矩阵相乘。这里θ
是行向量,所以在表达的时候写为列向量转置的形式。
误差:
损失函数:
经验风险函数:这里系数为1/2n
主要是为了后期方便后式子简单,但是,这并不影响我们优化的方向,最优的参数依然是不变的。
下面用梯度下降的优化算法算法:
θ0
和θ1
的每一轮迭代形式为:
α
是步长或者学习转换率,后面的是梯度。通过高等数学导数与方向导数的那一节知识,我们知道,f(x)
沿他的方向梯度增长是增长速度最快的,反过来,沿梯度方向下降,也是函数下降最快的方向,这样他能更快的到达局部极小值点。
求导过程:实质就复合函数求导过程。
j:表示第j轮迭代
多变量的线性回归和上面的式子一样,只是θ
向量和x
向量的维数更大了。
二、实战tensorflow实现房价预售模型
为了重点学习tensorflow
,这里就省略了对数据集的探索过程,直接给出房价的数据集是呈线性的状态,所以我们采用多元线性回归模型去预测房价。
1.数据处理
- 读取数据
- 将数据标准化
- 添加一列值为1的列(为了将数据转为矩阵的形式)
- 获取自变量数据集和因变量数据集
import tensorflow as tf
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_csv('D:\\深度学习区域\\房价预测数据集\\data1.csv', names=['square', 'roomNum', 'price'])
# 进行标准化操作,标准化不影响后期目标函数的优化
df = df.apply(lambda column: (column - column.mean()) / column.std())
# 在数据集的第一列添加一列值为1的ones
df['ones'] = 1
df = df[['ones', 'square', 'roomNum', 'price']]
# 提取前两列做为输入变量
X_data = np.array(df.iloc[:, :3])
Y_data = np.array(df['price']).reshape(len(df), 1)
print(X_data.shape, '\n', Y_data.shape)
结果:
2.创建回归模型(数据流图),并训练数据,得到最优模型
- 声明变量
- 构建模型
- 建立目标函数
- 设置优化算法
- 创建会话,训练模型
alpha = 0.01 # 学习率 alpha = 0.01
epoch = 500 # 训练全局变量的轮数
# 创建线性回归模型(数据流图)
# 1.声明变量
# 输入 X, 形状[47, 3]
X = tf.placeholder(tf.float32, X_data.shape)
# 输出 Y, 形状[47, 1]
Y = tf.placeholder(tf.float32, Y_data.shape)
# 权重变量W,形状[3, 1] 就是训练参数
W = tf.get_variable('Www', (3, 1), initializer=tf.constant_initializer()) # 用tf.constant_initializer()设置参数的初始值,为常数,默认为1
# 2.假设函数 h(x) = w0*x0 + w1*x1 + w2*x2
# 推理值 Y_pred 形状[47, 1]
Y_pred = tf.matmul(X, W)
# 3.建立目标函数
# 损失函数为最小二乘法, Y_pred - Y是形如[47, 1]的向量
emp_op = 1 / (2 * len(X_data)) * tf.matmul((Y_pred - Y), (Y_pred - Y), transpose_a=True)
# 4.优化算法
# 采用梯度下降的优化算法
opt = tf.train.GradientDescentOptimizer(learning_rate=alpha)
# 单步训练操作
train_op = opt.minimize(emp_op)
# 5.创建会话(运行环境)
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})
loss, w = sess.run([emp_op, W], feed_dict={X: X_data, Y: Y_data})
if e%10 == 0:
loss, w = sess.run([emp_op, W], feed_dict={X: X_data, Y: Y_data})
print('epoch:{} \t loss={} \t Model: y={}*x2 + {}*x1 + {}'.format(e, loss[0][0], w[1][0], w[2][0], w[0][0]))
结果:
可以看到上述最后一轮的函数就是训练500轮后最优的函数。