Hands-On Machine Learning with Scikit Learn and Tensor Flow Chapter 4

This is a jupyter notebook representing some of the code in Hands-On Machine Learning with Scikit Learn and Tensor Flow Chapter 4. In the future, I'm sure that there will be more markdown interspersed with code, but this notebook is primarily code.

This is an Example of Converting Jupyter Notebooks to HTML

  1. This is a jupyter notebook representing some of the code in Hands-On Machine Learning with Scikit Learn and Tensor Flow Chapter 4
  2. I wanted to include this notebook to test out the system for converting jupyter notebooks to HTML
  3. I plan to use jupyter notebooks for recording notes on machine learning / data science
  4. In the future, I'm sure that there will be more markdown interspersed with code, but this notebook is primarily code.
import numpy as np
import matplotlib.pyplot as plt
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

X_b = np.c_[np.ones((100,1)),X] # ass x_0 to each instance
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(f"Equation is y = {theta_best[0][0]} + {theta_best[1][0]}  x_1 + Gaussian Noise")
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new] # add x0 = 1 to each instance
y_predict = X_new_b.dot(theta_best)
plt.plot(X,y,"b.")
plt.plot(X_new,y_predict,"r-")
plt.axis([0, 2, 0, 15])
plt.xlabel('$\mathregular{x_1}$',fontsize=14,fontweight="bold")
plt.ylabel('y',fontsize=14,fontweight="bold",rotation=90)
plt.show()


out[2]

Equation is y = 3.7342382361579816 + 3.270422188173451 x_1 + Gaussian Noise

Jupyter Notebook Image

<Figure size 640x480 with 1 Axes>

from sklearn.linear_model import LinearRegression
import scipy
lin_reg = LinearRegression()
lin_reg.fit(X,y)
print(f"Intercept: {lin_reg.intercept_}, Coefficient: {lin_reg.coef_}")
print(lin_reg.predict(X_new))
out[3]

Intercept: [4.12665766], Coefficient: [[2.92117212]]
[[4.12665766]
[9.9690019 ]]

eta = 0.1  # learning rate
n_iterations = 1000
m = 100

theta = np.random.randn(2,1)  # random initialization

for iteration in range(n_iterations):
    gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
    theta = theta - eta * gradients

X_new_b.dot(theta)

theta_path_bgd = []

def plot_gradient_descent(theta, eta, theta_path=None):
    m = len(X_b)
    plt.plot(X, y, "b.")
    n_iterations = 1000
    for iteration in range(n_iterations):
        if iteration < 10:
            y_predict = X_new_b.dot(theta)
            style = "b-" if iteration > 0 else "r--"
            plt.plot(X_new, y_predict, style)
        gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
        theta = theta - eta * gradients
        if theta_path is not None:
            theta_path.append(theta)
    plt.xlabel("$x_1$", fontsize=18)
    plt.axis([0, 2, 0, 15])
    plt.title(r"$\eta = {}$".format(eta), fontsize=16)
out[4]
np.random.seed(42)
theta = np.random.randn(2,1)  # random initialization

plt.figure(figsize=(10,4))
plt.subplot(131); plot_gradient_descent(theta, eta=0.02)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.subplot(132); plot_gradient_descent(theta, eta=0.1, theta_path=theta_path_bgd)
plt.subplot(133); plot_gradient_descent(theta, eta=0.5)

plt.show()
out[5]

C:\Users\fmb20\AppData\Local\Temp\ipykernel_9064\567835344.py:25: RuntimeWarning: invalid value encountered in subtract
theta = theta - eta * gradients

Jupyter Notebook Image

<Figure size 1000x400 with 3 Axes>

n_epochs = 50
t0, t1 = 5, 50
 # learning schedule hyperparameters
def learning_schedule(t):
  return t0 / (t + t1)
theta = np.random.randn(2,1)
 # random initialization
for epoch in range(n_epochs):
  for i in range(m):
    random_index = np.random.randint(m)
    xi = X_b[random_index:random_index+1]
    yi = y[random_index:random_index+1]
    gradients = 2 * xi.T.dot(xi.dot(theta) - yi)
    eta = learning_schedule(epoch * m + i)
    theta = theta - eta * gradients
out[6]
from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(max_iter=1000,tol=1e-3,penalty=None,eta0=0.1)
sgd_reg.fit(X,y.ravel())
sgd_reg.intercept_, sgd_reg.coef_
out[7]

(array([3.61918732]), array([3.16298191]))

import numpy as np
import numpy.random as rnd

np.random.seed(42)
m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1)
plt.plot(X, y, "b.")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([-3, 3, 0, 10])
from sklearn.preprocessing import PolynomialFeatures
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)
X[0]
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X_poly, y)
lin_reg.intercept_, lin_reg.coef_
X_new=np.linspace(-3, 3, 100).reshape(100, 1)
X_new_poly = poly_features.transform(X_new)
y_new = lin_reg.predict(X_new_poly)
plt.plot(X, y, "b.")
plt.plot(X_new, y_new, "r-", linewidth=2, label="Predictions")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.legend(loc="upper left", fontsize=14)
plt.axis([-3, 3, 0, 10])
plt.show()


from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

for style, width, degree in (("g-", 1, 300), ("b--", 2, 2), ("r-+", 2, 1)):
    polybig_features = PolynomialFeatures(degree=degree, include_bias=False)
    std_scaler = StandardScaler()
    lin_reg = LinearRegression()
    polynomial_regression = Pipeline([
            ("poly_features", polybig_features),
            ("std_scaler", std_scaler),
            ("lin_reg", lin_reg),
        ])
    polynomial_regression.fit(X, y)
    y_newbig = polynomial_regression.predict(X_new)
    plt.plot(X_new, y_newbig, style, label=str(degree), linewidth=width)

plt.plot(X, y, "b.", linewidth=3)
plt.legend(loc="upper left")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.title("Example of Underfitting / Fitting / Overfitting Data")
plt.axis([-3, 3, 0, 10])
plt.show()
out[8]
Jupyter Notebook Image

<Figure size 640x480 with 1 Axes>

Jupyter Notebook Image

<Figure size 640x480 with 1 Axes>

from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline

def plot_learning_curves(model, X, y):
  X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)
  train_errors, val_errors = [], []
  for m in range(1, len(X_train)):
    model.fit(X_train[:m], y_train[:m])
    y_train_predict = model.predict(X_train[:m])
    y_val_predict = model.predict(X_val)
    train_errors.append(mean_squared_error(y_train[:m], y_train_predict))
    val_errors.append(mean_squared_error(y_val, y_val_predict))
  plt.plot(np.sqrt(train_errors), "r-+", linewidth=2, label="train")
  plt.plot(np.sqrt(val_errors), "b-", linewidth=3, label="val")

lin_reg = LinearRegression()
plot_learning_curves(lin_reg, X, y)
polynomial_regression = Pipeline([
("poly_features", PolynomialFeatures(degree=10, include_bias=False)),
("lin_reg", LinearRegression()),
])
plot_learning_curves(polynomial_regression, X, y)

out[9]
Jupyter Notebook Image

<Figure size 640x480 with 1 Axes>

from sklearn import datasets
iris = datasets.load_iris()
list(iris.keys())
out[10]

['data',

'target',

'frame',

'target_names',

'DESCR',

'feature_names',

'filename',

'data_module']

X = iris['data'][:,3:] # petalk width
import numpy as np 
y = (iris['target'] == 2).astype(np.int16) # 1 if Iris-Virginica, else 0

out[11]
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
log_reg = LogisticRegression()
log_reg.fit(X,y)
X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = log_reg.predict_proba(X_new)
plt.plot(X_new, y_proba[:, 1], "g-", label="Iris-Virginica")
plt.plot(X_new, y_proba[:, 0], "b--", label="Not Iris-Virginica")
out[12]

[<matplotlib.lines.Line2D at 0x201b17f6b50>]

Jupyter Notebook Image

<Figure size 640x480 with 1 Axes>