回归是基于已有的数据对新的数据进行预测, 除了标准的线形回归, 还会有戴明回归, lasso 回归, 岭回归, 弹性网络回归, 逻辑回归等, 具体的定义和差别会在下文实现中体现.
tensorflow 作为流行的机器学习框架, 有诸多现成的 API 可以调用, 在线形回归的实现中, 使用这些 API 可以非常便捷的实现.
1, 首先准备数据 , 这里采用 sklearn 的数据 iris 数据集
- from sklearn import datasets
- import numpy as np
- import tensorflow as tf
- x_vals=np.array([x[3] for x in iris.data])
- y_vals=np.array([y[0] for y in iris.data])
2, 声明训练参数
- learning_rate=0.05
- batch_size=25
- x_data=tf.placeholder(shape=[None,1],dtype=tf.float32)
- y_target=tf.placeholder(shape=[None,1],dtype=tf.float32)
- A=tf.Variable(tf.random_normal(shape=[1,1]))
- b=tf.Variable(tf.random_normal(shape=[1,1]))
3, 配置模型
model_output=tf.add(tf.matmul(x_data,A),b)
4, 声明损失函数
- #这里使用 L2 正则损失函数
- loss=tf.reduce_mean(tf.square(y_target-model_output))
- #这里使用 L1 正则损失函数
- loss=tf.reduce_mean(tf.abs(y_target-model_output))
- #这里是戴明回归的损失函数
- demming_numerator=tf.abs(tf.sub(y_target,tf.add(tf.matmul(x_data,A),b)))
- demming_denominator=tf.sqrt(tf.add(tf.square(A),1))
- loss=tf.reduce_mean(tf.truediv(demming_numerator,demming_denominator))
- #lasso 回归, 增加损失函数
- lasso_param=tf.constant(0.9)
- heavyside_step=tf.truediv(1,tf.add(1,tf.exp(tf.mul(-100,tf.sub(A,lasso_param)))))
- regularization_param=tf.mul(heavyside_step,0.9)
- loss=tf.add(tf.reduce_mean(tf.square(y_target-model_output)),regularization_param)
- #岭回归算法, 增加了 L2 正则项
- ridge_param=tf.constant(1)
- ridge_loss=tf.reduce_mean(tf.square(A))
- loss=tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target-model_output)),tf.mul(ridge_param,ridge_loss)),0)
弹性网络回归, 增加了 L1 和 L2 正则项
- elastic_param1=tf.constant(1)
- elastic_param2=tf.constant(1)
- l1_a_loss=tf.reduce_mean(tf.abs(A))
- l2_a_loss=tf.reduce_mean(tf.square(A))
- e1_term=tf.mul(elastic_param1,l1_a_loss)
- e2_term=tf.mul(elastic_param2,l2_a_loss)
- loss=tf.expand_dims(tf.add(tf.add(tf.reduce_mean(tf.square(y_target-model_output)),e1_term),e2_term),0)
5, 运行图
- init=tf.global_variables_initializer()
- sess.run(init)
6, 训练图
设置优化因子
- my_opt=tf.train.GradientDescentOptimizer(learning_rate)
- train_step=my_opt.minimize(loss)
- for i in range(steps):
- rand_index=np.random.choice(len(x_vals),size=batch_size)
- rand_x=np.transpose([x_vals[rand_index]])
- rand_y=np.transpose([y_vals[rand_index]])
- sess.run(train_step,feed_dict={
- x_data:rand_x,y_target:rand_y
- })
- temp_loss=sess.run(loss,feed_dict={
- x_data:rand_x,y_target:rand_y
- })
代码参考书籍《tensorflow 机器学习实战指南》
来源: http://www.bubuko.com/infodetail-2974290.html