TensorFlow 中的线性回归
前面 有篇博文 讲了讲Ubuntu环境下安装TensorFlow,今天来说一说在TensorFlow中如何进行线性回归。
训练数据
本次使用的训练数据是美国房价数据,做了一些预处理,完整数据可从这里下载,原始数据共有1460行81列,其中我选用了LotArea(房屋面积)和SalePrice(售价)两个变量来分别作为自变量和因变量,处理后样本个数为1140个,也就是说全部训练数据是一个11402的矩阵,部分数据如下所示:
训练部分数据*
模型
本次使用的是线性回归模型 其中$W$为权重,$b$为偏置。
具体地,$x$ 即为LotArea,$y$ 即为SalePrice。
开始训练
使用TensorFlow训练模型大致是这样的步骤:
1. 设置各种超参数,例如学习率,迭代次数等;
2. 定义变量和模型;
3. 初始化变量;
4. 正式开始训练.
废话不多说上完整代码,代码里有注释:
1 | from __future__ import print_function, division |
结果如下,
1 | Epoch: 0050 cost= 2283274240.000 W= 20.3469 b= 12945.2 |
几个问题
- 在迭代次数相同的情况下,调节学习率能非常有效的改变损失的下降速度,刚开始学习率是0.001,结果非常的不好,损失比现在的大0.3e09左右,一步一步加大学习率效果显著,即使现在的2也不算大(对于这个问题),但是对于其他问题,要具体情况具体分析,这个学习率或许太过激进;
至于优化算法为什么不选用更为常见的
tf.train.GradientDescentOptimize
,刚开始我也是用的这个算法,结果发现cost
,W
,b
都是nan
,Not a Number,后来当我每一次迭代都输出结果的时候,发现原来这几个值异常迅速的增大,导致超出了表示范围,如下,学习率为 0.0011
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Epoch: 0001 W= 1541.27 b= -0.811313
Epoch: 0001 W= -121530.0 b= -13.6312
Epoch: 0001 W= 1.33729e+07 b= 1185.87
Epoch: 0001 W= -1.05648e+09 b= -110841.0
Epoch: 0001 W= 9.3181e+10 b= 9.23441e+06
Epoch: 0001 W= -8.717e+12 b= -8.39367e+08
Epoch: 0001 W= 2.77678e+14 b= 4.59572e+10
Epoch: 0001 W= -1.31328e+16 b= -1.76138e+12
Epoch: 0001 W= 1.43194e+18 b= 1.27263e+14
Epoch: 0001 W= -1.7716e+20 b= -1.48503e+16
Epoch: 0001 W= 1.74557e+22 b= 1.64051e+18
Epoch: 0001 W= -1.80845e+24 b= -1.65567e+20
Epoch: 0001 W= 5.76078e+25 b= 9.54297e+21
Epoch: 0001 W= -6.32776e+27 b= -5.585e+23
Epoch: 0001 W= 6.40024e+29 b= 5.93388e+25
Epoch: 0001 W= -3.14474e+31 b= -4.18503e+27
Epoch: 0001 W= 1.4992e+33 b= 2.01299e+29
Epoch: 0001 W= -1.23312e+35 b= -1.26103e+31
Epoch: 0001 W= inf b= inf
Epoch: 0001 W= nan b= nan
Epoch: 0001 W= nan b= nan其实就是正负跳的太厉害,而且貌似收敛不了。即使我减小学习率也是杯水车薪,后来试用了这个Adam(Adaptive Moment Estimation)算法,结果没有那个问题了,其实还有其他的算法,我还没有来得及一个一个试,如果想了解各种梯度下降算法,可以参考这篇文章:An overview of gradient descent optimization algorithms
- 其实在这种简单的模型上,我个人觉得使用 sklearn 效率更高点(当然 TensorFlow 的定制性比较强,更为底层),我用 sklearn 实现了一次,效果很好,基本就是傻瓜式操作,效果如图, 可以看到两种方法得出的结果还是差不多的(当然TF更为繁琐些)。另外在耗时上,sklearn 也要明显快于 TF, sklearn 几乎是秒出,TF 每次迭代大概需要 11 秒。
目录
END
暂且就是这些,今天折腾了大半天,不容易啊,还是自己太嫩啦:)