回归是基于已有的数据对新的数据进行预测,除了标准的线形回归,还会有戴明回归、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机器学习实战指南》