School of Electronics and Computer Science
University of Southampton
COMP6245 (2019/20): Foundations of Machine Learning Lab 4 (of 6)
Issue 30 October 2019
Feedback 16 November 2019
In this Lab, you are expected to work independently; i.e. you may only discuss
with or ask questions from a demonstrator or the lecturer. You are, of course, free to
refer to the cited texts or access information from Web-based resources (indeed, this
is recommended).
Objective
• Implementing linear regression
• Regularization using quadratic and sparsity-inducing penalties
• Implementing sparse regression on a realistic problem in chemoinformatics
1 Linear Least Squares Regression:
We will work with the Diabetes dataset from the UCI Machine Learning repository 
taken from the package sklearn. Load the data and inspect the features and targets. It
is usually a good idea to plot a few histograms of the targets and pair-wise scatters of the
features in any new problem you are tasked to solve.
• Implement a linear predictor that is solved by the pseudo-inverse method:
a =
(
Y t Y
)−1
Y t f ,
where Y is the N × p input matrix and f is the N × 1 vector of responses.
• Solve the same problem using the linear model from sklearn and compare the
results.
2 Regularization
Tikhonov regularization minimizes the mean squared error with a quadratic penalty on
the weights  (available online in https://web.stanford.edu/~hastie/Papers/ESLII.
pdf):
min
a
||f − Y a||22 + γ ||a||22
Derive and implement a regularized regression. Show, using two bar graphs of the weights
side by side to the same scale, how the two solutions differ.
1
Figure 1: Solutions of Linear and Regularized Regressions
3 Sparse Regression
L1 regularization is a method for achieving sparse solutions . It minimizes:
min
a
||f − Y a||22 + γ ||a||1
We will use the sklearn package for implementing its solution. For the Diabetes problem
considered above, solve the lasso problem and plot the resulting weights as a bar graph.
Observe how the number of non-zero weights change with the regularization parameter
γ. Your comparisons should look similar to Fig. 1. In each of these cases, compare the
prediction errors. In the case of the sparse regression, would you say the features with
nonzero weights are more meaningful (to answer, you have to find the source of the data
and look at the variables)?
Regularization Path
In implementing the lasso it is convenient to study the regularization path (Fig. 2, Image
taken from https://scikit-learn.org/stable/auto_examples/linear_model/plot_
lasso_lars.html) Implement and study the regularization path for the six-variable illus-
Figure 2: Regularization Path: How regression coefficients change with hyperparameter.
trative example considered in .
4 Solubility Prediction:
We will now look at a large problem of predicting solubility of chemical compounds from
features derived from their molecular structure. Predicting function from structural vari-
2
ables is an important problem because it is easy to define and synthesize small chemical
compounds, but very expensive to test them experimentally. Hence the step known as in
silico screening is increasingly popular. The dataset we will use is from Huuskonen et al.
 and the problem has also been considered recently in Pirashvili et al.  using more
sophisticated machinery. Have a skim-read through the introductory and results sections
of these papers.
Data used in  with several additional features and more compounds is available in the
excel spread sheet Husskonen Solubility Features.xlsx.
• Load the data, split into training and test sets, implement a linear regression and
plot the predicted solubilities against the true solubilities on the training and test
sets. To facilitate comparison, draw the two scatter plots side by side to the same
scale on both axes.
• Implement a lasso regularized solution and plot graphs of how the prediction error
(on the test data) and the corresponding number of non-zero coefficients change with
increasing regularization.
• Are you able to make any comment comparing your results to those claimed in 
or ?
Report
Write a short report of no more than four pages, summarising your work.
Appendix: Snippets of Code
1. Linear regression on diabetes dataset
from sklearn import datasets
from sklearn.linear_model import LinearRegression
# Load data, inspect and do exploratory plots
#
Y = diabetes.data
f = diabetes.target
NumData, NumFeatures = Y.shape
print(NumData, NumFeatures)
print(f.shape)
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(12, 4))
ax.hist(f, bins=40)
ax.set_title("Distribution of Target", fontsize=14)
ax.scatter(Y[:,6], Y[:,7], c=’m’, s=3)
ax.set_title("Scatter of Two Inputs", fontsize=14)
2. Comparing pseudo-inverse solution to sklearn output
3
# Linear regression using sklearn
#
lin = LinearRegression()
lin.fit(Y, f)
fh1 = lin.predict(Y)
# Pseudo-incerse solution to linear regression
#
a = np.linalg.inv(Y.T @ Y) @ Y.T @ f
fh2 = Y @ a
# Plot predictions to check if they look the same!
#
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10,5))
ax.scatter(f, fh1, c=’c’, s=3)
ax.grid(True)
ax.set_title("Sklearn", fontsize=14)
ax.scatter(f, fh2, c=’m’, s=3)
ax.grid(True)
ax.set_title("Pseudoinverse", fontsize=14)
3. Tikhanov Tegularizer
gamma = 0.5
aR = np.linalg.inv(Y.T @ Y + gamma*np.identity(NumFeatures)) @ Y.T @ f
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(8,4))
ax.bar(np.arange(len(a)), a)
ax.set_title(’Pseudo-inverse solution’, fontsize=14)
ax.grid(True)
ax.set_ylim(np.min(a), np.max(a))
ax.bar(np.arange(len(aR)), aR)
ax.set_title(’Regularized solution’, fontsize=14)
ax.grid(True)
ax.set_ylim(np.min(a), np.max(a))
4. Sparsity inducing (lasso) regularizer
from sklearn.linear_model import Lasso
ll = Lasso(alpha=0.2)
ll.fit(Y, f)
yh_lasso = ll.predict(Y)
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10,4))
ax.bar(np.arange(len(a)), a)
ax.set_title(’Pseudo-inverse solution’, fontsize=14)
ax.grid(True)
ax.set_ylim(np.min(a), np.max(a))
ax.bar(np.arange(len(ll.coef_)), ll.coef_)
ax.set_title(’Lasso solution’, fontsize=14)
ax.grid(True)
ax.set_ylim(np.min(a), np.max(a))
5. Lasso Regularization path on a synthetic example:
4
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import lasso_path
from sklearn import datasets
# Synthetic data:
# Problem taken from Hastie, et al., Statistical Learning with Sparsity
# Z1, Z2 ~ N(0,1)
# Y = 3*Z1 -1.5*Z2 + 10*N(0,1) Noisy response
# Noisy inputs (the six are in two groups of three each)
# Xj= Z1 + 0.2*N(0,1) for j = 1,2,3, and
# Xj= Z2 + 0.2*N(0,1) for j = 4,5,6.
N = 100
y = np.empty(0)
X = np.empty([0,6])
for i in range(N):
Z1= np.random.randn()
Z2= np.random.randn()
y = np.append(y, 3*Z1 - 1.5*Z2 + 2*np.random.randn())
Xarr = np.array([Z1,Z1,Z1,Z2,Z2,Z2])+ np.random.randn(6)/5
X = np.vstack ((X, Xarr.tolist()))
# Compute regressions with Lasso and return paths
#
alphas_lasso, coefs_lasso, _ = lasso_path(X, y, fit_intercept=False)
# Plot each coefficient
#
fig, ax = plt.subplots(figsize = (8,4))
for i in range(6):
ax.plot(alphas_lasso, coefs_lasso[i,:])
ax.grid(True)
ax.set_xlabel("Regularization")
ax.set_ylabel("Regression Coefficients")
6. Predicting Solubility of Chemical Compounds
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
print(sol.shape)
colnames = sol.columns
print(colnames)
f = sol["LogS.M."].values
fig, ax = plt.subplots(figsize=(4,4))
ax.hist(f, bins=40, facecolor=’m’)
ax.set_title("Histogram of Log Solubility", fontsize=14)
ax.grid(True)
5
Y = sol[colnames[5:len(colnames)]]
N, p = Y.shape
print(Y.shape)
print(f.shape)
# Split data into training and test sets
#
from sklearn.model_selection import train_test_split
Y_train, Y_test, f_train, f_test = train_test_split(Y, f, test_size=0.3)
# Regularized regression
#
gamma = 2.3
a = np.linalg.inv(Y_train.T @ Y_train + gamma*np.identity(p)) @ Y_train.T @ f_train
fh_train = Y_train @ a.values
fh_test = Y_test @ a.values
# Plot training and test predictions
#
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10,4))
ax.scatter(f_train, fh_train, c=’m’, s=3)
ax.grid(True)
ax.set_title("Training Data", fontsize=14)
ax.scatter(f_test, fh_test, c=’m’, s=3)
ax.grid(True)
ax.set_title("Test Data", fontsize=14)
# Over to you for implementing Lasso
#
References
 K. Bache and M. Lichman, “UCI machine learning repository.” http://archive.ics.
uci.edu/ml, 2013.
 T. Hastie, R. Tibshirani, and J. Friedman, The Elements of Statistical Learning.
Springer, 2008.
 T. Hastie, R. Tibshirani, and M. Wainwright, Statistical Learning with Sparsity: The
Lasso and Generalizations. Chapman & Hall/CRC, 2015.
 J. Huuskonen, M. Salo, and J. Taskinen, “Aqueous solubility prediction of drugs based
on molecular topology and neural network modeling,” Journal of Chemical Information
and Computer Sciences, vol. 38, no. 3, pp. 450–456, 1998.
 M. Pirashvili, L. Steinberg, B. G. F., M. Niranjan, J. G. Frey, and J. Brodzki, “Im-
proved understanding of aqueous solubility modeling through topological data analy-
sis,” Journal of Cheminformatics, vol. 10, no. 1, p. 54, 2018.
Mahesan Niranjan November 2014
6  Email:51zuoyejun

@gmail.com