Ridge和Lasso回归代码实现--Tensorflow部分

Ridge和Lasso回归代码实现–Tensorflow部分–潘登同学的机器学习笔记

python版本–3.6 ; Tensorflow版本–1.15.0 ;编辑器–Pycharm

文章目录

    • Ridge和Lasso回归代码实现--Tensorflow部分--潘登同学的机器学习笔记
  • Ridge回归
    • 代码
    • 结果
  • Lasso回归
    • 代码
    • 结果
  • ElasticNet
    • 代码
    • 结果

Ridge回归

  • 任务:

以iris数据集的除Sepal length的数据作为X, 以Sepal length作为Y, 用X去拟合Y;

前面已经很详细介绍过了, 这里直接看代码

代码

import matplotlib.pyplot as plt  # 画图库
import tensorflow as tf
import numpy as np  #矩阵库
from sklearn import datasets   #导入数据集
from tensorflow.python.framework import ops   #Loss函数优化器
ops.get_default_graph()
sess = tf.Session()

iris = datasets.load_iris()
X = np.array([x[1:4] for x in iris.data])
Y = np.array([y[0] for y in iris.data])

# 声明学习率, 批量大小, 占位符和模型变量
seed = 42
tf.set_random_seed(seed)
learning_rate = 0.01
batch_size = 25
x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
W = tf.Variable(tf.random_normal(shape=[3, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))

# 增加线性模型
model_output = tf.add(tf.matmul(x_data, W), b)

# 声明损失函数 MSE+L2, 其为批量损失的平均值, 初始化变量, 声明优化器
L2_regularization_param = tf.reduce_mean(tf.square(W))  # L2正则项
loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target - model_output)), L2_regularization_param), 0) # MSE+L2
# `tf.square` 表示向量的平方  `tf.reduce_mean` 表示计算张量在指定维度上的平均值, 如果没有指定就是普通的算平均值
init = tf.global_variables_initializer()  # 表示初始化操作
my_opt = tf.train.GradientDescentOptimizer(learning_rate)  # 表示选择梯度下降法作为优化器
train_step = my_opt.minimize(loss)  # 最小化Loss损失
sess.run(init)  # 运行初始化操作

# 迭代遍历, 并在随机选择的数据上进行模型训练, 迭代100次 每25次迭代输出变量值和损失值, 将其用于之后的可视化
loss_vec = []  # 储存loss随迭代次数的变化, 等一下用于画图
for i in range(100):
    rand_index = np.random.choice(len(X), size=batch_size)  # 随机挑选X, 用于小批量随机梯度下降
    rand_x = X[rand_index]
    rand_y = np.transpose([Y[rand_index]])
    # 目标:最优化损失
    sess.run(train_step, feed_dict={x_data:rand_x,
                                    y_target:rand_y})
    # 更新loss值
    temp_loss = sess.run(loss, feed_dict={x_data:rand_x,
                                          y_target:rand_y})
    loss_vec.append(temp_loss)
    # 每25次打印
    if (i+1) % 25 == 0:
        print('Step:', i+1, 'w为:', sess.run(W), 'b为:', sess.run(b)[0][0])
        print('Loss为:', temp_loss)

# 抽取系数, 创建最佳拟合直线
slope = sess.run(W)[0][0]
y_intercept = sess.run(b)[0][0]
best_fit = []
for i in X:
    best_fit.append(slope * i + y_intercept)
# 绘制两幅图 第一个是拟合直线(高维空间的画图就不画了) 另一个是迭代100次的L2正则损失
plt.figure(2)
plt.plot(loss_vec, 'k--')
plt.title('Ridge loss per Generation')
plt.xlabel('Generation')
plt.ylabel('loss')
plt.show()

结果

Ridge和Lasso回归代码实现--Tensorflow部分_第1张图片

Ridge和Lasso回归代码实现--Tensorflow部分_第2张图片

Lasso回归

  • 任务:

以iris数据集的除Sepal length的数据作为X, 以Sepal length作为Y, 用X去拟合Y;

代码

import matplotlib.pyplot as plt  # 画图库
import tensorflow as tf
import numpy as np  #矩阵库
from sklearn import datasets   #导入数据集
from tensorflow.python.framework import ops   #Loss函数优化器
ops.get_default_graph()
sess = tf.Session()

iris = datasets.load_iris()
X = np.array([x[1:4] for x in iris.data])
Y = np.array([y[0] for y in iris.data])

# 声明学习率, 批量大小, 占位符和模型变量
seed = 42
tf.set_random_seed(seed)
learning_rate = 0.01
batch_size = 25
x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
W = tf.Variable(tf.random_normal(shape=[3, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))

# 增加线性模型
model_output = tf.add(tf.matmul(x_data, W), b)

# 声明损失函数 MSE+L2, 其为批量损失的平均值, 初始化变量, 声明优化器
L1_regularization_param = tf.reduce_mean(tf.abs(W))  # L1正则项
loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target - model_output)), L1_regularization_param), 0) # MSE+L1
# `tf.square` 表示向量的平方  `tf.reduce_mean` 表示计算张量在指定维度上的平均值, 如果没有指定就是普通的算平均值
init = tf.global_variables_initializer()  # 表示初始化操作
my_opt = tf.train.GradientDescentOptimizer(learning_rate)  # 表示选择梯度下降法作为优化器
train_step = my_opt.minimize(loss)  # 最小化Loss损失
sess.run(init)  # 运行初始化操作

# 迭代遍历, 并在随机选择的数据上进行模型训练, 迭代100次 每25次迭代输出变量值和损失值, 将其用于之后的可视化
loss_vec = []  # 储存loss随迭代次数的变化, 等一下用于画图
for i in range(100):
    rand_index = np.random.choice(len(X), size=batch_size)  # 随机挑选X, 用于小批量随机梯度下降
    rand_x = X[rand_index]
    rand_y = np.transpose([Y[rand_index]])
    # 目标:最优化损失
    sess.run(train_step, feed_dict={x_data:rand_x,
                                    y_target:rand_y})
    # 更新loss值
    temp_loss = sess.run(loss, feed_dict={x_data:rand_x,
                                          y_target:rand_y})
    loss_vec.append(temp_loss)
    # 每25次打印
    if (i+1) % 25 == 0:
        print('Step:', i+1, 'w为:', sess.run(W), 'b为:', sess.run(b)[0][0])
        print('Loss为:', temp_loss)

# 抽取系数, 创建最佳拟合直线
slope = sess.run(W)[0][0]
y_intercept = sess.run(b)[0][0]
best_fit = []
for i in X:
    best_fit.append(slope * i + y_intercept)
# 绘制两幅图 第一个是拟合直线(高维空间的画图就不画了) 另一个是迭代100次的L2正则损失
plt.figure(2)
plt.plot(loss_vec, 'k--')
plt.title('Lasso loss per Generation')
plt.xlabel('Generation')
plt.ylabel('loss')
plt.show()

结果

Ridge和Lasso回归代码实现--Tensorflow部分_第3张图片

Ridge和Lasso回归代码实现--Tensorflow部分_第4张图片

ElasticNet

还记得吗? ElasticNet是即用L1也用L2

  • 任务:

以iris数据集的除Sepal length的数据作为X, 以Sepal length作为Y, 用X去拟合Y;

代码

import matplotlib.pyplot as plt  # 画图库
import tensorflow as tf
import numpy as np  #矩阵库
from sklearn import datasets   #导入数据集
from tensorflow.python.framework import ops   #Loss函数优化器
ops.get_default_graph()
sess = tf.Session()

iris = datasets.load_iris()
X = np.array([x[1:4] for x in iris.data])
Y = np.array([y[0] for y in iris.data])

# 声明学习率, 批量大小, 占位符和模型变量
seed = 42
tf.set_random_seed(seed)
learning_rate = 0.01
batch_size = 25
x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
W = tf.Variable(tf.random_normal(shape=[3, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))

# 增加线性模型
model_output = tf.add(tf.matmul(x_data, W), b)

# 声明损失函数 MSE+L2, 其为批量损失的平均值, 初始化变量, 声明优化器
L1_regularization_param = tf.reduce_mean(tf.abs(W))  # L1正则项
L2_regularization_param = tf.reduce_mean(tf.square(W))  # L2正则项
regularization_param = tf.add(L1_regularization_param, L2_regularization_param) # L1 + L2
loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target - model_output)), regularization_param), 0) # MSE+ L1 + L2
# `tf.square` 表示向量的平方  `tf.reduce_mean` 表示计算张量在指定维度上的平均值, 如果没有指定就是普通的算平均值
init = tf.global_variables_initializer()  # 表示初始化操作
my_opt = tf.train.GradientDescentOptimizer(learning_rate)  # 表示选择梯度下降法作为优化器
train_step = my_opt.minimize(loss)  # 最小化Loss损失
sess.run(init)  # 运行初始化操作

# 迭代遍历, 并在随机选择的数据上进行模型训练, 迭代100次 每25次迭代输出变量值和损失值, 将其用于之后的可视化
loss_vec = []  # 储存loss随迭代次数的变化, 等一下用于画图
for i in range(100):
    rand_index = np.random.choice(len(X), size=batch_size)  # 随机挑选X, 用于小批量随机梯度下降
    rand_x = X[rand_index]
    rand_y = np.transpose([Y[rand_index]])
    # 目标:最优化损失
    sess.run(train_step, feed_dict={x_data:rand_x,
                                    y_target:rand_y})
    # 更新loss值
    temp_loss = sess.run(loss, feed_dict={x_data:rand_x,
                                          y_target:rand_y})
    loss_vec.append(temp_loss)
    # 每25次打印
    if (i+1) % 25 == 0:
        print('Step:', i+1, 'w为:', sess.run(W), 'b为:', sess.run(b)[0][0])
        print('Loss为:', temp_loss)

# 抽取系数, 创建最佳拟合直线
slope = sess.run(W)[0][0]
y_intercept = sess.run(b)[0][0]
best_fit = []
for i in X:
    best_fit.append(slope * i + y_intercept)
# 绘制两幅图 第一个是拟合直线(高维空间的画图就不画了) 另一个是迭代100次的L2正则损失
plt.figure(2)
plt.plot(loss_vec, 'k--')
plt.title('ElasticNet loss per Generation')
plt.xlabel('Generation')
plt.ylabel('loss')
plt.show()

结果

Ridge和Lasso回归代码实现--Tensorflow部分_第5张图片

Ridge和Lasso回归代码实现--Tensorflow部分_第6张图片

Ridge和Lasso回归代码实现–Tensorflow部分就是这样了, 继续下一章吧!pd的Machine Learning

你可能感兴趣的:(Tensorflow,tensorflow,回归,python)