共计 2900 个字符,预计需要花费 8 分钟才能阅读完成。
回归问题是机器学习中一类重要的问题,可以作为一种预测系统或者作为推荐系统的模型,这里不重点讨论回归的理论,读者可自行百度。本文讨论的是对于一种系统:比如推荐系统或者预测系统,我们如何来挑选模型,及对模型的评价。
假设我们真实的模型是: y = 4*x + 3,用这个模型我们生成一系列带噪声的样本。实际中我们并不知道真实模型是什么样,那如何去根据数据找模型呢?
显然:
步骤1:给定一组模型的集合,比如有一次函数模型,二次函数模型,多项式模型,指数模型等等;
步骤2:根据模型集合,选择一种模型(函数),求出起参数;
问题来了:最好参数的原则如何定义?
一般而言有多种方法,其中一种就是均方误差最小。
步骤3:根据代价函数(均方误差最小函数)求出最优的模型参数;
问题又来了,如何求模型参数呢?
方法也有很多,对于机器学习或者深度学习来说,梯度下降法是比较好的选择。
最后,根据最优解确定参数。
步骤4:对多个函数集里面的函数重复步骤1~步骤3,得到各模型的最优参数,然后根据误差来确定一个或几个比较好的模型;
步骤5:测试数据集来测试选择的模型,交叉验证。
上述就是基本方法,下面有一些关键问题是实际中需要注意和理解的:
1、对于代价函数是凸函数的问题来说,用梯度下降法来求解是有全局最优解的,对于一些有局部最优解的cost fuction,初始化的条件很重要,如何选择也很重要,但往往没什么规则。
2、梯度下降法的迭代step选取很重要,若很小的话,收敛速度太慢,如果太大,容易错过最优解。对于多维空间的样本而言,很难通过高维空间的数据,比如高维的w和b来判断step的好坏,幸运的是可以通过lost值来判断step是大还是小:
1)如果lost是很缓慢的下降,说明step太小,可以适当调大;
2)如果lost很快的下降到一定值,并且基本不变,很有可能是step太大,lost在来回震荡;
3)如果lost比较合理的下降到一定值,且后续基本保持不变,则step应该比较合适。
3、为了加速收敛,可以让step一开始比较大,但随着迭代次数的增加慢慢减小,也可以采用随机梯度法。
4、当我们用一个模型,来回训练了多次,得到了多个最优参数时,如何通过一些数据来判断该模型是好还是坏,该如何改进呢?
主要的两个数据参考就是Error,Bias,Variance,简单来说:当一个模型n次训练得到的n个最优参数的模型,
1)这n个模型的Bias很大时,往往代表着模型不够复杂,训练数据不够多,属于underfitting;
2)这n个模型的Variance很大时,往往代表着模型太复杂,参数太多,属于overfitting,可以适当降低参数数量或者简化模型。
下面是用Tensorflow训练一个一次函数模型的实现:
1 #!/usr/bin/python
2 #-*- coding:utf-8 -*-
3 ############################
4 #File Name: LR_test1.py
5 #Author: yang
6 #Mail: milkyang2008@126.com
7 #Created Time: 2017-06-27 22:51:20
8 ############################
9
10 # import tensorflow lib
11 import numpy as np
12 import random
13 #sample point
14 x_sap = np.arange(-5,5,0.5)
15 y_sap = [4*i + 3 for i in x_sap]
16 x_a = [b1*(random.randint(90,120))/100 for b1 in x_sap]
17 y_a = [b2*(random.randint(90,120))/100 for b2 in y_sap]
18 #import matplotlib.pyplot as plt
19
20 import tensorflow as tf
21 #define variable
22 w = tf.Variable(tf.zeros([1]))
23 b = tf.Variable(tf.zeros([1]))
24 x = tf.placeholder(tf.float32)
25 y_ = tf.placeholder(tf.float32)
26
27 y = w * x + b
28
29 STEPS = 30000
30 step = 0.001
31
32 #sample point
33 #x_sap = np.arange(-5,5,0.5)
34 #y_sap = [4*i + 3 for i in x]
35 #x_a = [b1*(random.randint(90,120))/100 for b1 in x]
36 #y_a = [b2*(random.randint(90,120))/100 for b2 in y]
37
38 #cost_fuction
39 lost = tf.reduce_mean(tf.square(y_-y))
40 optimizer = tf.train.GradientDescentOptimizer(step)
41 train_step = optimizer.minimize(lost)
42
43 init_op = tf.initialize_all_variables()
44
45 with tf.Session() as sess:
46 sess.run(init_op)
47
48 for i in range(STEPS):
49 feed = {x: x_a, y_: y_a}
50 sess.run(train_step, feed_dict=feed)
51 if i % 100 ==0 :
52 print("After %d interation:" %i)
53 print("W: %f" % sess.run(w))
54 print("b: %f" % sess.run(b))
55 print("lost: %f" % sess.run(lost, feed_dict=feed))
56
真是模型为y = 4*x + 3;训练数据还加上了随机噪声;训练出的结果:经过30000次迭代,训练出的模型为:y = 3.98*x + 3.19;比较接近真实模型了。
After 29200 interation:
W: 3.980329
b: 3.189958
lost: 2.088752
After 29300 interation:
W: 3.980333
b: 3.190148
lost: 2.088748
After 29400 interation:
W: 3.980337
b: 3.190339
lost: 2.088745
After 29500 interation:
W: 3.980341
b: 3.190530
lost: 2.088742
After 29600 interation:
W: 3.980345
b: 3.190721
lost: 2.088738
After 29700 interation:
W: 3.980348
b: 3.190897
lost: 2.088736
After 29800 interation:
W: 3.980352
b: 3.191064
lost: 2.088732
After 29900 interation:
W: 3.980355
b: 3.191231
lost: 2.088729
厉害了我滴哥,深度学习框架玩起来了
@admin 哈哈,争取向站长看齐啊