Elastic Net Regularized ($\ell_1$ and $\ell_2$ penalized regression)



In [1]:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf

from sklearn import datasets



Generate some random (but constant, hence the random seed) datasets

Use pi as the bias term just so we have something to which to compare the model's intercept



In [2]:

X, y, coef = datasets.make_regression(n_samples=5000,
n_features=100,
n_targets=1,
noise=0.1,
bias=np.pi,
coef=True)




In [3]:

batch_size = 100



Initialize the tensorflow graph



In [4]:

session = tf.Session()



Create the model's tensorflow placeholders



In [5]:

x_data   = tf.placeholder(shape=[None, 100], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)



Create the regression variables



In [6]:

A = tf.Variable(tf.random_normal(shape=[100,1]))
b = tf.Variable(tf.random_normal(shape=[1,1]))



Create the model's operation



In [7]:



Create the elastic net loss function

LASSO regularization



In [8]:

elastic_parameter1 = tf.constant(1.)
l1_loss = tf.reduce_mean(tf.abs(A))
e1_term = tf.multiply(elastic_parameter1, l1_loss)



Ridge regularization



In [9]:

elastic_parameter2 = tf.constant(1.)
l2_loss = tf.reduce_mean(tf.square(A))
e2_term = tf.multiply(elastic_parameter2, l2_loss)



Elasticnet regularization



In [10]:



Optimizer setup



In [11]:

train_step = optimizer.minimize(enet_loss)




In [12]:

init = tf.global_variables_initializer()
session.run(init)




In [13]:

# Keep successive loss function values in a list for plotting
loss_vector = []

for i in range(5000):
random_index = np.random.choice(len(X), size=batch_size)
random_x = X[random_index]
random_y = np.transpose([y[random_index]])

session.run(train_step, feed_dict={x_data: random_x, y_target: random_y})
temp_loss = session.run(enet_loss, feed_dict={x_data: random_x, y_target: random_y})

loss_vector.append(temp_loss[0])




In [14]:

plt.plot(loss_vector, 'k-')
plt.title('Loss per step')
plt.xlabel('step')
plt.ylabel('loss')
plt.show()







In [ ]: