S*******e 发帖数: 525 | 1 刚开始看一些Spark ML和Tensorflow的基本东西,看到下便两个程序的结果很糊涂:
为什么这么大的差异?
https://github.com/backstopmedia/tensorflowbook/blob/master/chapters/04_
machine_learning_basics/linear_regression.py
在以上程序加一行 print("w=", W.eval(), "b=", b.eval()), 得到结果是
w= [[ 3.5245235 ]
[ 1.50171268]] b= 1.14499
所以 y=3.5245235x1 + 1.50171268x2 +1.14499
我用同样的数据 (格式附后)
https://github.com/apache/spark/blob/master/examples/src/main/java/org/
apache/spark/examples/ml/JavaLinearRegressionWithElasticNetExample.java
结果是:
Coefficients: [0.3827266230806965,5.1690760222564425] Intercept: 82.
22008153614573
numIterations: 6
objectiveHistory: [0.5,0.41583549697777683,0.15548328325638935,0.
15439025905767773,0.15432368309706285,0.15432368309449543]
所以
y=0.3827266230806965x1+5.1690760222564425x2 + 82.22008153614573
两者差这么大,比较糊涂。请大牛指点迷津。
Spark inputfile 数据格式
354 1:84 2:46
190 1:73 2:20
405 1:65 2:52
263 1:70 2:30
451 1:76 2:57
302 1:69 2:25
288 1:63 2:28
385 1:72 2:36
402 1:79 2:57
365 1:75 2:44
209 1:27 2:24
290 1:89 2:31
346 1:65 2:52
254 1:57 2:23
395 1:59 2:60
434 1:69 2:48
220 1:60 2:34
374 1:79 2:51
308 1:75 2:50
220 1:82 2:34
311 1:59 2:46
181 1:67 2:23
274 1:85 2:37
303 1:55 2:40
244 1:63 2:30 |
l*******m 发帖数: 1096 | 2 老弟,应该学学ml ABC. 你那个spark的,第一iterations 太少,第二,加iterations
也不会算对,因为你用的是elastic net regularization. 你改应该改的参数了吗。第
三,估计你没normalize data, 会导致收敛不好的
【在 S*******e 的大作中提到】 : 刚开始看一些Spark ML和Tensorflow的基本东西,看到下便两个程序的结果很糊涂: : 为什么这么大的差异? : https://github.com/backstopmedia/tensorflowbook/blob/master/chapters/04_ : machine_learning_basics/linear_regression.py : 在以上程序加一行 print("w=", W.eval(), "b=", b.eval()), 得到结果是 : w= [[ 3.5245235 ] : [ 1.50171268]] b= 1.14499 : 所以 y=3.5245235x1 + 1.50171268x2 +1.14499 : 我用同样的数据 (格式附后) : https://github.com/apache/spark/blob/master/examples/src/main/java/org/
|
l*******m 发帖数: 1096 | 3 我看了看tf code, 这个作者水平太差,误人子弟! 还thread, 根本没有用 thread,
写法也不好,还旧。而且也没有normalize data。你最好找一些真正专家的code.
iterations
【在 l*******m 的大作中提到】 : 老弟,应该学学ml ABC. 你那个spark的,第一iterations 太少,第二,加iterations : 也不会算对,因为你用的是elastic net regularization. 你改应该改的参数了吗。第 : 三,估计你没normalize data, 会导致收敛不好的
|
w***g 发帖数: 5958 | 4 笑死 刚刚还有人说小白特别喜欢写教程
【在 l*******m 的大作中提到】 : 我看了看tf code, 这个作者水平太差,误人子弟! 还thread, 根本没有用 thread, : 写法也不好,还旧。而且也没有normalize data。你最好找一些真正专家的code. : : iterations
|
S*******e 发帖数: 525 | 5 大牛笑完之后,也要提携我们这些门外汉呀 :-).
我看这书,还觉得不错,觉得一些概念讲得蛮清楚的 (比烙印写的什么Packt
Publishing的书好很多), 没想到也是半瓶水。
还是不懂这个问题啊。在http://stackoverflow.com/questions/41884411/puzzled-by-linear-regression-results-from-spark-ml-and-tensorflow 问了,那儿说SPARK的线性回归模型不是线性回归(这真奇芭),去掉
.setRegParam(0.3)
.setElasticNetParam(0.8);
又 .setMaxIter(1000), 结果1iteration, 结果就出来了,也和原先的结果差不多啊:
Coefficients: [0.4173620987945001,5.21659080879135] Intercept: 77.
98253861487616
numIterations: 1
objectiveHistory: [0.0]
【在 w***g 的大作中提到】 : 笑死 刚刚还有人说小白特别喜欢写教程
|
g****t 发帖数: 31659 | 6 1.
Let x=1,2,3,4,。。。
你自己用方程z=100*x+2
造一列z。
对这组( x,z)用spark试验一下,
算出来是100和2,那就是线性回归,不然就不是呗。
2.
Linear regression就跟个操作系统类似,无数坑。
【在 S*******e 的大作中提到】 : 大牛笑完之后,也要提携我们这些门外汉呀 :-). : 我看这书,还觉得不错,觉得一些概念讲得蛮清楚的 (比烙印写的什么Packt : Publishing的书好很多), 没想到也是半瓶水。 : 还是不懂这个问题啊。在http://stackoverflow.com/questions/41884411/puzzled-by-linear-regression-results-from-spark-ml-and-tensorflow 问了,那儿说SPARK的线性回归模型不是线性回归(这真奇芭),去掉 : .setRegParam(0.3) : .setElasticNetParam(0.8); : 又 .setMaxIter(1000), 结果1iteration, 结果就出来了,也和原先的结果差不多啊: : Coefficients: [0.4173620987945001,5.21659080879135] Intercept: 77. : 98253861487616 : numIterations: 1
|
S*******e 发帖数: 525 | 7 谢谢大牛们的慧眼。结果极可能TensorFlow 的code错了。这儿是一个结果分析:http://tempforum.neas-seminars.com/Attachment4373.aspx 结果和Spark ML 的(改正后)一致 。现在请大牛们看看怎么修改那个TensorFlow的code。谢谢。 |
l*******m 发帖数: 1096 | 8 你spark用的是什么solver?这个你要搞清楚。
TF是GD。我昨天说了,这code没有normalize data。这样会出现很多问题。最好的方法
是作normalization。比较形象说,这两维数据还是比较均匀的,主要是bi a s比较大
,learning rate太小,循环太少,它爬不上去
当然,你这个数据很简单。有几个方法都行
- 初始化 b = tf.Variable(80.0)
- 增加iteration
- 加大 learning_rate = 0.001
【在 S*******e 的大作中提到】 : 谢谢大牛们的慧眼。结果极可能TensorFlow 的code错了。这儿是一个结果分析:http://tempforum.neas-seminars.com/Attachment4373.aspx 结果和Spark ML 的(改正后)一致 。现在请大牛们看看怎么修改那个TensorFlow的code。谢谢。
|
S*******e 发帖数: 525 | 9 那个SparkML 例子 的算法是最小二乘法。 看来梯度法比较需要技巧和“deep
understanding”。 试了试这几个方法,还不行。现在知道这个东西坑又多又大(估计
暂时不像有些人说的ML已是大白菜), 不再纠结这个了。
多多感谢。
【在 l*******m 的大作中提到】 : 你spark用的是什么solver?这个你要搞清楚。 : TF是GD。我昨天说了,这code没有normalize data。这样会出现很多问题。最好的方法 : 是作normalization。比较形象说,这两维数据还是比较均匀的,主要是bi a s比较大 : ,learning rate太小,循环太少,它爬不上去 : 当然,你这个数据很简单。有几个方法都行 : - 初始化 b = tf.Variable(80.0) : - 增加iteration : - 加大 learning_rate = 0.001
|
w***g 发帖数: 5958 | 10 这么快就放弃了? 你那个tensorflow的例子我已經调通了。
实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。
想听的发包子过来,半个钟头后我给你们分析。
Update:
这个竟然是一本书的配套代码,书要卖$23。突然我就觉得
job security暴涨了。这种书卖越多越好。大家不要给它
提交补丁,最好初学者都死在这书上,我们老司机就安全了。
【在 S*******e 的大作中提到】 : 那个SparkML 例子 的算法是最小二乘法。 看来梯度法比较需要技巧和“deep : understanding”。 试了试这几个方法,还不行。现在知道这个东西坑又多又大(估计 : 暂时不像有些人说的ML已是大白菜), 不再纠结这个了。 : 多多感谢。
|
|
|
l*******m 发帖数: 1096 | 11 我看看这本书的排行榜,估计人家一年能卖500-1000本。一年也能小一万刀
【在 w***g 的大作中提到】 : 这么快就放弃了? 你那个tensorflow的例子我已經调通了。 : 实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。 : 想听的发包子过来,半个钟头后我给你们分析。 : Update: : 这个竟然是一本书的配套代码,书要卖$23。突然我就觉得 : job security暴涨了。这种书卖越多越好。大家不要给它 : 提交补丁,最好初学者都死在这书上,我们老司机就安全了。
|
S*******e 发帖数: 525 | 12 我很穷,就只转一个吧。 多谢大牛
【在 w***g 的大作中提到】 : 这么快就放弃了? 你那个tensorflow的例子我已經调通了。 : 实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。 : 想听的发包子过来,半个钟头后我给你们分析。 : Update: : 这个竟然是一本书的配套代码,书要卖$23。突然我就觉得 : job security暴涨了。这种书卖越多越好。大家不要给它 : 提交补丁,最好初学者都死在这书上,我们老司机就安全了。
|
w***g 发帖数: 5958 | 13 只有你发了,我估计别人没有真的去看代码。我给你一些提示,
你再改改看。
1. 注意Y和Y_predicted的形状。如果Y和Y_predicted的
形状不一样,tf.squared_difference会发生什么?
2. 为什么傻逼作者要把learning_rate設得这么异乎寻常
地低? 如果设成0.01会发生什么问题?
把learning_rate降低是正确的fix吗? 还能怎么解决
这个问题?
(再提示:Spark的loss function有啥区别?)
还有一些罗嗦的错就不说了, 不影响这个程序运行。
书的作者对tensorflow完全没有概念。这书的tensorflow
代码最好完全不要看。
我其实也调了一个钟头。虽然自己写代码没问题,
要找别人代码里的坑还是很难。
【在 S*******e 的大作中提到】 : 我很穷,就只转一个吧。 多谢大牛
|
d********g 发帖数: 10550 | 14 这个现象最好的例子:谭浩强 :)
【在 w***g 的大作中提到】 : 这么快就放弃了? 你那个tensorflow的例子我已經调通了。 : 实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。 : 想听的发包子过来,半个钟头后我给你们分析。 : Update: : 这个竟然是一本书的配套代码,书要卖$23。突然我就觉得 : job security暴涨了。这种书卖越多越好。大家不要给它 : 提交补丁,最好初学者都死在这书上,我们老司机就安全了。
|
l*******m 发帖数: 1096 | 15 看来支持广播的ops都是坑。
所以什么事物都是又两面性的,TF比较抽象,不好学。这本是个缺点,但是又是机会。
比如keras都要进TF的repo了。keras一些high-level APIs有错误很久了(不是bug),
直到最近才fix。那个作者也是自以为是SB一个.
【在 w***g 的大作中提到】 : 只有你发了,我估计别人没有真的去看代码。我给你一些提示, : 你再改改看。 : 1. 注意Y和Y_predicted的形状。如果Y和Y_predicted的 : 形状不一样,tf.squared_difference会发生什么? : 2. 为什么傻逼作者要把learning_rate設得这么异乎寻常 : 地低? 如果设成0.01会发生什么问题? : 把learning_rate降低是正确的fix吗? 还能怎么解决 : 这个问题? : (再提示:Spark的loss function有啥区别?) : 还有一些罗嗦的错就不说了, 不影响这个程序运行。
|
S*******e 发帖数: 525 | 16 多谢大牛。 是的, Y 是Tensor("ToFloat_1:0", shape=(25,), dtype=float32)。
Y_predicted 是Tensor("add:0", shape=(25, 1), dtype=float32)。 我用
Y_predicted = tf.reshape(Y_predicted, [25])
好像loss overflow了。不知怎么改Cost 函数
我刚看这些东西, Java比较熟。 Python仅初级水平。
【在 w***g 的大作中提到】 : 只有你发了,我估计别人没有真的去看代码。我给你一些提示, : 你再改改看。 : 1. 注意Y和Y_predicted的形状。如果Y和Y_predicted的 : 形状不一样,tf.squared_difference会发生什么? : 2. 为什么傻逼作者要把learning_rate設得这么异乎寻常 : 地低? 如果设成0.01会发生什么问题? : 把learning_rate降低是正确的fix吗? 还能怎么解决 : 这个问题? : (再提示:Spark的loss function有啥区别?) : 还有一些罗嗦的错就不说了, 不影响这个程序运行。
|
w***g 发帖数: 5958 | 17 1. reduce_sum vs reduce_mean:
reduce_sum会导致你的gradient和minibatch size相关,以至于
需要根据不同的minibatch size调整learning_rate。
用reduce_mean没这个问题。
2. mean(sqr(error)) vs sqrt(mean(sqr(error)))
和上面的相似,前者的问题是需要根据error绝对值调整learning_rate。
error太大甚至会溢出。
上面这两个都是数学上等价,但是实现上的坑。
你把这两个改了, 用learning_rate = 0.01,隔1000个
iteration打印状态,就能看到正常收敛了。
【在 S*******e 的大作中提到】 : 多谢大牛。 是的, Y 是Tensor("ToFloat_1:0", shape=(25,), dtype=float32)。 : Y_predicted 是Tensor("add:0", shape=(25, 1), dtype=float32)。 我用 : Y_predicted = tf.reshape(Y_predicted, [25]) : 好像loss overflow了。不知怎么改Cost 函数 : 我刚看这些东西, Java比较熟。 Python仅初级水平。
|
S*******e 发帖数: 525 | 18 Getting closer:
def loss(X, Y):
Y_predicted = inference(X)
print(Y_predicted)
Y_predicted = tf.reshape(Y_predicted, [25])
print(Y)
print(Y_predicted)
print (Y-Y_predicted)
return tf.sqrt(tf.reduce_mean(tf.squared_difference(Y, Y_predicted)))
training_steps = 100000
结果是:
w= [[ 0.40486234]
[ 5.21126223]] b= 79.0806
我还得仔细琢磨一下这是怎么“数学等价”的。 还有一点觉得糊涂,这怎么需要这么
多steps 啊。
不过, 我觉得自己当时只是好奇看看Spark ML能不能很好地做线性回归。结果这一试
, 学了好多。多谢大牛们。。。你们真的很厉害。
【在 w***g 的大作中提到】 : 1. reduce_sum vs reduce_mean: : reduce_sum会导致你的gradient和minibatch size相关,以至于 : 需要根据不同的minibatch size调整learning_rate。 : 用reduce_mean没这个问题。 : 2. mean(sqr(error)) vs sqrt(mean(sqr(error))) : 和上面的相似,前者的问题是需要根据error绝对值调整learning_rate。 : error太大甚至会溢出。 : 上面这两个都是数学上等价,但是实现上的坑。 : 你把这两个改了, 用learning_rate = 0.01,隔1000个 : iteration打印状态,就能看到正常收敛了。
|
w***g 发帖数: 5958 | 19 我用gnuplot拟合出来就差不多是这个结果。spark那个应该是因为非标准扩展导致结果
有点偏差。
数学等价就是一个的最优解也是另一个的最优解。
【在 S*******e 的大作中提到】 : Getting closer: : def loss(X, Y): : Y_predicted = inference(X) : print(Y_predicted) : Y_predicted = tf.reshape(Y_predicted, [25]) : print(Y) : print(Y_predicted) : print (Y-Y_predicted) : return tf.sqrt(tf.reduce_mean(tf.squared_difference(Y, Y_predicted))) : training_steps = 100000
|
g****t 发帖数: 31659 | 20 应该就是一个是精确的最小二乘法。另一个是梯度或者别的办法近似求解?
精确的最小二乘法不应该有什么大问题。前面就是叠加。最后一步
3*3矩阵求逆那步用一下cholesky就够了。他的数很少。
若是近似方法,这个作者给的数据集太小。估计iid什么的也没测。
所以可能会对参数敏感。
: 这么快就放弃了? 你那个tensorflow的例子我已經调通了。
: 实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。
: 想听的发包子过来,半个钟头后我给你们分析。
: Update:
: 这个竟然是一本书的配套代码,书要卖$23。突然我就觉得
: job security暴涨了。这种书卖越多越好。大家不要给它
: 提交补丁,最好初学者都死在这书上,我们老司机就安全了。
【在 w***g 的大作中提到】 : 我用gnuplot拟合出来就差不多是这个结果。spark那个应该是因为非标准扩展导致结果 : 有点偏差。 : 数学等价就是一个的最优解也是另一个的最优解。
|
|
|
w***g 发帖数: 5958 | 21 spark那个加了elastic net regularization,就是精确解数值上也会不一样.
而且有可能是sgd. 可能还没收敛。
【在 g****t 的大作中提到】 : 应该就是一个是精确的最小二乘法。另一个是梯度或者别的办法近似求解? : 精确的最小二乘法不应该有什么大问题。前面就是叠加。最后一步 : 3*3矩阵求逆那步用一下cholesky就够了。他的数很少。 : 若是近似方法,这个作者给的数据集太小。估计iid什么的也没测。 : 所以可能会对参数敏感。 : : : 这么快就放弃了? 你那个tensorflow的例子我已經调通了。 : : 实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。 : : 想听的发包子过来,半个钟头后我给你们分析。 : : Update:
|
d******c 发帖数: 2407 | 22 我觉得github的星就是fashion而已,多少人是真的看过code试过之后再加星,又有多
少人是看了两眼就加星?
还有fork,有多少fork的实际从来没碰过?
应该写个程序统计一下
【在 w***g 的大作中提到】 : 这么快就放弃了? 你那个tensorflow的例子我已經调通了。 : 实在错的太离谱了。这种垃圾repository竟然有81个星我也是醉了。 : 想听的发包子过来,半个钟头后我给你们分析。 : Update: : 这个竟然是一本书的配套代码,书要卖$23。突然我就觉得 : job security暴涨了。这种书卖越多越好。大家不要给它 : 提交补丁,最好初学者都死在这书上,我们老司机就安全了。
|
S*******e 发帖数: 525 | 23 我变了learing_rate=.0001, 又增加了train_steps 到100000, 结果还是有较大的误
差(w= [[ 0.39436]
[ 5.20597]] b= 80.0349)(比较SparkML和Excel的一个包)。
我又试了AdamOptimizer (原来是GDOptimizer), 结果和上面的SparkML(最小二乘法
,我没试它的GD法)和Excel的一致w= [[ 0.41736]
[ 5.2165]] b= 79.98。这么看来, GD方法是不是对这个问题不太好? |