-
用tensorflow实现弹性网络回归算法
2020-09-20 21:51:44主要介绍了用tensorflow实现弹性网络回归算法 -
弹性网络_正则化(3):弹性网络回归
2021-01-13 23:40:58引言:在前面一小节中我们...在这种情况下,还要一种折中的办法,就是选择弹性网络回归(Elastic Net Regression)。1. lasso回归与岭回归的异同如下,如果已知模型中的很多变量为无关变量,如astrological offset和a...引言:在前面一小节中我们指出,在含有多个参数的模型中,如何做出对模型的优化。岭回归更好?还是lasso回归更优?参考:正则化(2):与岭回归相似的 Lasso 回归。在这种情况下,还要一种折中的办法,就是选择弹性网络回归(Elastic Net Regression)。1. lasso回归与岭回归的异同
如下,如果已知模型中的很多变量为无关变量,如astrological offset和airspeed scalar等,我们倾向于选择lasso回归,从而使得拟合模型更加简洁和便于解读。
Size = y-intercept + slope x Weight + diet differece x Hight Fat Diet +
+ astrological offset x Sign + airspeed scalar x Airspeed of Swallow
如下,如果模型中有非常多的变量,我们无法知道其是否是无关变量,如基于10000个基因的表达预测小鼠体积。在这种情况下,我们应该选择lasso回归,还是岭回归呢?
答案是弹性网络回归(Elastic Net Regression)。听名字非常炫酷,有弹性的回归,意味着它非常灵活能适应多用场景。简单来说,弹性网络回归是lasso回归和岭回归的结合版本。
2. 弹性网络回归是lasso回归和岭回归的结合版
公式解读:弹性网络回归包含lasso回归和岭回归非惩罚项,两种惩罚项的λ系数不同(lasso回归λ1,岭回归λ2)。基于使用多个不同λ1和λ2的交叉验证,以寻找最佳λ1和λ2的取值。
当λ1 = 0,λ2 = 0时,弹性网络回归与最初的最小二乘法线性回归拟合的模型一致。
当λ1 = 0,λ2 > 0时,弹性网络回归与lasso回归拟合的模型一致。
当λ1>0,λ2 = 0时,弹性网络回归与岭回归拟合的模型一致。
当λ1>0,λ2>0时,弹性网络回归为岭回归和lasso回归的结合版本。
3. 弹性网络回归具有lasso回归与岭回归的优点
弹性网络回归善于解决含有相关性参数的模型:lasso回归筛选出相关的参数,并缩减其他无关参数;同时岭回归缩减所有相关性的参数。
通过二者的结合,弹性网络回归可以筛选和缩减具有相关性的参数,将他们保留在模型中或者从模型中移除。在处理具有相关性的参数时,弹性网络回归能够表现出良好的性能。
参考视频:
1.岭回归。
https://www.youtube.com/watch?v=Q81RR3yKn30&list=PLblh5JKOoLUICTaGLRoHQDuF_7q2GfuJF&index=19
2.lasso回归。
https://www.youtube.com/watch?v=NGf0voTMlcs&list=PLblh5JKOoLUICTaGLRoHQDuF_7q2GfuJF&index=20
3.弹性网络回归。
https://www.youtube.com/watch?v=1dKRdX9bfIo&list=PLblh5JKOoLUICTaGLRoHQDuF_7q2GfuJF&index=22
编辑:吕琼
校审:罗鹏
-
用TensorFlow实现弹性网络回归算法
2018-02-24 17:03:25本文使用多线性回归的方法实现弹性网络回归算法,以iris数据集为训练数据,用花瓣长度、花瓣宽度和花萼宽度三个特征预测花萼长度。 # Elastic Net Regression # 弹性网络回归 #-------------------------...弹性网络回归算法(Elastic Net Regression)是综合lasso回归和岭回归的一种回归算法,通过在损失函数中增加L1和L2正则项。
本文使用多线性回归的方法实现弹性网络回归算法,以iris数据集为训练数据,用花瓣长度、花瓣宽度和花萼宽度三个特征预测花萼长度。
# Elastic Net Regression # 弹性网络回归 #---------------------------------- # # This function shows how to use TensorFlow to # solve elastic net regression. # y = Ax + b # # We will use the iris data, specifically: # y = Sepal Length # x = Pedal Length, Petal Width, Sepal Width import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from sklearn import datasets from tensorflow.python.framework import ops ### # Set up for TensorFlow ### ops.reset_default_graph() # Create graph sess = tf.Session() ### # Obtain data ### # Load the data # iris.data = [(Sepal Length, Sepal Width, Petal Length, Petal Width)] iris = datasets.load_iris() x_vals = np.array([[x[1], x[2], x[3]] for x in iris.data]) y_vals = np.array([y[0] for y in iris.data]) ### # Setup model ### # make results reproducible seed = 13 np.random.seed(seed) tf.set_random_seed(seed) # Declare batch size batch_size = 50 # Initialize placeholders x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32) y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32) # Create variables for linear regression A = tf.Variable(tf.random_normal(shape=[3,1])) b = tf.Variable(tf.random_normal(shape=[1,1])) # Declare model operations model_output = tf.add(tf.matmul(x_data, A), b) # Declare the elastic net loss function # 对于弹性网络回归算法,损失函数包含斜率的L1正则和L2正则。 # 创建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.multiply(elastic_param1, l1_a_loss) e2_term = tf.multiply(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) # Declare optimizer my_opt = tf.train.GradientDescentOptimizer(0.0001) train_step = my_opt.minimize(loss) ### # Train model ### # Initialize variables init = tf.global_variables_initializer() sess.run(init) # Training loop loss_vec = [] for i in range(1000): rand_index = np.random.choice(len(x_vals), size=batch_size) rand_x = 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}) loss_vec.append(temp_loss[0]) if (i+1)%250==0: print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)) + ' b = ' + str(sess.run(b))) print('Loss = ' + str(temp_loss)) ### # Extract model results ### # Get the optimal coefficients [[sw_coef], [pl_coef], [pw_ceof]] = sess.run(A) [y_intercept] = sess.run(b) ### # Plot results ### # Plot loss over time plt.plot(loss_vec, 'k-') plt.title('Loss per Generation') plt.xlabel('Generation') plt.ylabel('Loss') plt.show()
结果:
Step #250 A = [[ 0.93870646] [-0.37139279] [ 0.27290201]] b = [[-0.36246276]] Loss = [ 23.83867645] Step #500 A = [[ 1.26683569] [ 0.14753909] [ 0.42754883]] b = [[-0.2424359]] Loss = [ 2.98364353] Step #750 A = [[ 1.33217096] [ 0.28339788] [ 0.45837855]] b = [[-0.20850581]] Loss = [ 1.82120061] Step #1000 A = [[ 1.33412337] [ 0.32563502] [ 0.45811999]] b = [[-0.19569117]] Loss = [ 1.64923525]
-
tensorflow实现弹性网络回归
2018-01-01 18:16:52弹性网络回归的特点是在线性回归的损失函数上加上L1和L2正则化项。import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from sklearn import datasets sess = tf.Session()iris = ...弹性网络回归的特点是在线性回归的损失函数上加上L1和L2正则化项。
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from sklearn import datasets
sess = tf.Session()iris = datasets.load_iris()
x_vals = np.array([[x[1],x[2],x[3]] for x in iris.data])
y_vals = np.array([y[0] for y in iris.data])batch_size = 50
learning_rate = 0.001
x_data = tf.placeholder(shape=[None,3],dtype = tf.float32)
y_target = tf.placeholder(shape = [None,1],dtype = tf.float32)A = 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,A),b)
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.multiply(elastic_param1,l1_a_loss)
e2_term = tf.multiply(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)init = tf.global_variables_initializer()
sess.run(init)my_opt = tf.train.GradientDescentOptimizer(learning_rate)
train_step = my_opt.minimize(loss)loss_vec = []
for i in range(1000):
rand_index = np.random.choice(len(x_vals),size = batch_size)
rand_x = 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})
loss_vec.append(temp_loss[0])
if (i+1)%250 == 0:
print(‘Step# ‘+str(i+1)+’A= ‘+str(sess.run(A))+’ b= ‘+str(sess.run(b)))
print(‘Loss= ‘+str(temp_loss))
plt.plot(loss_vec,’r–’,label=’LOSS’)
plt.legend(loc=’upper right’)
plt.title(‘Loss function’)
plt.xlabel(‘Generation’)
plt.ylabel(‘Loss’)
plt.show() -
线性回归(五)---弹性网络回归
2020-06-01 15:58:55弹性网络回归 弹性网络ElasticNet是同时使用了系数向量的 l1 范数和 l2 范数的线性回归模型,使得可以学习得到类似于Lasso的一个稀疏模型,同时还保留了 Ridge 的正则化属性,结合了二者的优点,尤其适用于有多个...弹性网络回归
弹性网络ElasticNet是同时使用了系数向量的 l1 范数和 l2 范数的线性回归模型,使得可以学习得到类似于Lasso的一个稀疏模型,同时还保留了 Ridge 的正则化属性,结合了二者的优点,尤其适用于有多个特征彼此相关的场合。
主要参数说明
alpha: a值。
fit_intercept:一个布尔值,指定是否需要计算b值。如果为False,那么不计算b值(模型会认为你已经将数据中心化了)。
max_iter:整数值,指定最大迭代次数。
normalize:一个布尔值。如果为True,那么训练样本会在回归之前被归一化。
copy_X:一个布尔值,如果为True,则会复制X值
precompute:一个布尔值或者一个序列。他决定是否提前计算Gram矩阵来加速计算。
tol:一个浮点数,指定判断迭代收敛与否的阈值。
warm_start:一个布尔值,如为True,那么使用前一次训练结果继续训练。否则重头开始训练。
positive:一个布尔值,如为Ture,那么强制要求全中响亮的分量都为整数。
selection:一个字符串,可以为‘cyclic’(更新时候,从前向后一次选择权重向量的一个分量来更新)或者‘random’(随机选择权重向量的一个分量来更新),他指定了当每轮迭代的时候,选择权重向量的一个分量来更新
random_state:一个整数或者一个RandomState实例,或者为None。如果为整数,则他指定了随机数生成器种子。如果为RandomState实例,则指定了随机数生成器。如果为None,则使用默认的随机数生成器。
%config InteractiveShell.ast_node_interactivity = 'all' #同时输出多行结果 from sklearn.linear_model import ElasticNet reg = ElasticNet(alpha=1.0, l1_ratio=0.7) X = [[3], [8]] y = [1, 2] reg.fit(X, y) ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.7, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False) #参数含义和lasso和ridge类似 reg.predict([[6]]) reg.coef_ reg.intercept_
ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.7, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False) ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.7, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False) array([1.54198473]) array([0.08396947]) 1.0381679389312977
#修改参数比较结果 reg = ElasticNet(alpha=1.0, l1_ratio=0.3) # 修改参数,进行对比 reg.fit(X, y) ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.3, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False) reg.predict([[6]]) reg.coef_ reg.intercept_
ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.3, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False) ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.3, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False) array([1.56834532]) array([0.13669065]) 0.748201438848921
#利用IRIS数据集进行弹性网络回归 import pandas as pd import numpy as np from sklearn.datasets import load_iris from sklearn import linear_model from sklearn import metrics #导入IRIS数据集 iris = load_iris() #特征矩阵 X=iris.data #目标向量 y=iris.target from sklearn.cross_validation import train_test_split #导入数据划分包 #以20%的数据构建测试样本,剩余作为训练样本 X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.20,random_state =1) elastic= linear_model.ElasticNet(alpha=0.1,l1_ratio=0.5) # 设置lambda值,l1_ratio值 elastic.fit(X_train,y_train) #使用训练数据进行参数求解 y_hat2 = elastic.predict(X_test) #对测试集的预测 print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat2))) #计算RMSE
ElasticNet(alpha=0.1, copy_X=True, fit_intercept=True, l1_ratio=0.5, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False) RMSE: 0.25040264500501913
-
3.4 tensorflow弹性网络回归算法Elastic Net Regression
2020-08-19 01:09:37弹性网络回归算法(Elastic Net Regression)综合了Lasso回归和岭回归,即损失函数同时包含了L1正则和L2正则. import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from sklearn import ... -
MADlib——基于SQL的数据挖掘解决方案(16)——回归之弹性网络回归
2018-02-05 16:32:17一、弹性网络回归简介 要想理解弹性网络(Elastic Net)回归,正则化是必须要首先知道的,其次是岭回归和Lasso回归,知道了这些,弹性网络回归自然也就明白了。 1. 正则化 假设利用最小二乘法来做线性回归,最小... -
TensorFlow(四) 用TensorFlow实现弹性网络回归算法(多线性回归)
2018-06-12 15:07:00弹性网络回归算法是综合lasso回归和岭回归的一种回归算法,通过在损失函数中增加L1正则和L2正则项,进而控制单个系数对结果的影响 import tensorflow as tf import numpy as np import matplotlib.pyplot as ... -
php-ml 逻辑回归,TensorFlow ML cookbook 第三章6-8节 套索和岭回归、弹性网络回归and Logistic回归...
2021-03-24 12:05:352、如何实现弹性网络回归?3、如何实施Logistic回归?4、如何理解将线性回归转化为二元分类?上一篇:TensorFlow ML cookbook 第三章4、5节 理解线性回归中的损失函数和实施戴明回归实现套索和岭回归这里也有办法限制... -
线性回归、岭回归、lasso回归、弹性网络回归算法,附带python实现
2019-10-08 20:38:40线性回归 算法简介 线性回归,就是利用数理统计中的回归分析,来确定两种或两种以上变量间,相互依赖的定量关系的一种统计分析方法。 线性回归试图学得: 求解w和b的关键在于衡量f(xi)与yi之间的差别.由于均方... -
岭回归,Lasso回归及弹性网络回归原理及R实现
2020-10-24 09:53:48Table of Contents 收缩方法 岭回归 Lasso回归 弹性网络回归 加载R包 准备数据 计算惩戒线性回归 准备数据 R函数 计算岭回归 计算lasso回归 计算弹性网络回归 模型比较 收缩方法 岭回归 岭回归缩小了回归系数,因此... -
线性回归(六)岭回归、lasso回归和弹性网络回归比较
2020-06-03 11:28:47: [158.41] [ 34 0 170 165 170 165 170 165] : [176.03076923] 岭回归、lasso回归、弹性网络回归预测结果比较 #以iris数据为例 #导入基本程序包 import pandas as pd import numpy as np from sklearn.datasets ... -
基于自适应弹性网络回归的目标跟踪(OBJECT TRACKING WITH ADAPTIVE ELASTIC NET REGRESSION)阅读笔记
2018-08-31 19:46:34基于自适应弹性网络回归的目标跟踪(OBJECT TRACKING WITH ADAPTIVE ELASTIC NET REGRESSION)阅读笔记 摘要 近年来,各种基于回归的跟踪方法取得了很大的成功,然而,在大多数方法中,提取的所有特征都是用来表示... -
用Tensorflow实现弹性网络回归算法
2018-11-28 15:22:46测试平台:win10 pycharm tensorflow-1.12.0 python-3.6 import tensorflow as tf import matplotlib.pyplot as plt import numpy as np from sklearn import datasets as ds import os os.environ['TF_CPP_MIN_... -