{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from sklearn import linear_model\n", "from sklearn import datasets\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Generalized Linear Models

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

1) Ordinary Least Squares

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(442, 1)\n", "(442, 1)\n" ] } ], "source": [ "dataset = datasets.load_diabetes()\n", "X = dataset.data[:, np.newaxis, 2]\n", "Y = dataset.target.reshape(442, 1)\n", "\n", "print(X.shape)\n", "print(Y.shape)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[152.13348416]] [[949.43525847]]\n" ] } ], "source": [ "# Implementation\n", "b = np.zeros((X.shape[1], 1))\n", "W = np.zeros((X.shape[1], 1))\n", "learning_rate = 0.001\n", "iterations = 10000\n", "for _ in range(iterations):\n", " y_hat = b.T + np.dot(X, W.T)\n", " err = Y - y_hat\n", " error = np.sum(np.square(err), axis = 0)\n", " \n", " db = -2*np.sum(err)\n", " dW = -2*np.sum(np.dot(X.T, err), axis = 0)\n", " \n", " b = b - learning_rate*db\n", " W = W - learning_rate*dW\n", "\n", "print(b, W)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[152.13348416] [[949.43526038]]\n" ] } ], "source": [ "# Using sklearn\n", "reg = linear_model.LinearRegression(fit_intercept = True, normalize = False, n_jobs = -1)\n", "reg.fit(X, Y)\n", "print(reg.intercept_, reg.coef_)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(X, Y, 'bo')\n", "plt.plot(X, y_hat, color = 'red')\n", "plt.xlabel('X values')\n", "plt.ylabel('Predicted Values')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

2) Ridge Regression

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[152.13348416]] [[527.46403355]]\n" ] } ], "source": [ "# Implementation\n", "b = np.zeros((X.shape[1], 1))\n", "W = np.zeros((X.shape[1], 1))\n", "learning_rate = 0.001\n", "iterations = 10000\n", "alpha = 0.8\n", "\n", "for _ in range(iterations):\n", " y_hat = b.T + np.dot(X, W.T)\n", " err = Y - y_hat\n", " error = np.sum(np.square(err), axis = 0) + alpha*np.sum(np.square(W))\n", " \n", " db = -2*np.sum(err)\n", " dW = -2*np.sum(np.dot(X.T, err), axis = 0) + 2*alpha*W\n", " \n", " b = b - learning_rate*db\n", " W = W - learning_rate*dW\n", "\n", "print(b, W)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[152.13348416] [[527.46403355]]\n" ] } ], "source": [ "# Using sklearn\n", "reg = linear_model.Ridge(alpha = 0.8, fit_intercept = True, normalize = False, max_iter = 10000, solver = 'auto')\n", "reg.fit(X, Y)\n", "print(reg.intercept_, reg.coef_)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(X, Y, 'bo')\n", "plt.plot(X, y_hat, color = 'red')\n", "plt.xlabel('X values')\n", "plt.ylabel('Predicted Values')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[152.13348416] [[863.12296399]] 0.1\n" ] } ], "source": [ "# To do cross validation for alpha in Ridge Regression\n", "# Just use a for loop in the implementation to iterarate over all values of the alphas\n", "\n", "# In sklearn use RidgeCV\n", "reg = linear_model.RidgeCV(alphas = (0.1, 0.2, 0.3, 0.4), fit_intercept = True, normalize = False, scoring = None, cv = None, gcv_mode = None)\n", "reg.fit(X, Y)\n", "print(reg.intercept_, reg.coef_, reg.alpha_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

3) Lasso

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[152.13348416]] [[533.82717351]]\n" ] } ], "source": [ "# Implementation when you update all paramters for a iteration\n", "b = np.zeros((X.shape[1], 1))\n", "W = np.zeros((X.shape[1], 1))\n", "learning_rate = 0.1\n", "alpha = 0.8\n", "iterations = 10000\n", "\n", "for _ in range(iterations):\n", " y_hat = b + np.dot(X, W.T)\n", " err = Y - y_hat\n", " error = np.sum(np.square(err), axis = 0) / (2*X.shape[0]) + alpha*np.sum(W, axis = 1)\n", "\n", " for a in range(W.shape[0] + 1):\n", " if a == 0:\n", " db = (-1/(2*X.shape[0])) * (2*np.sum(err, axis = 0))\n", " b = b - learning_rate*db\n", " else:\n", " if W[a-1, 0] >= 0:\n", " dw_a = (-1/(2*X.shape[0])) * (2*np.sum(np.dot(err.T, X[:, a-1].reshape(X.shape[0], X.shape[1])), axis = 0)) + alpha\n", " W[a-1, 0] = W[a-1, 0] - learning_rate*dw_a\n", " else:\n", " dw_a = (-1/(2*X.shape[0])) * (2*np.sum(np.dot(err.T, X[:, a-1].reshape(X.shape[0], X.shape[1])), axis = 0)) - alpha\n", " W[a-1, 0] = W[a-1, 0] - learning_rate*dw_a\n", " \n", "print(b, W)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[152.13348416]] [[595.76544198]]\n" ] } ], "source": [ "# When you update a single paramter for a iteration\n", "b = np.zeros((X.shape[1], 1))\n", "W = np.zeros((X.shape[1], 1))\n", "learning_rate = 0.2\n", "alpha = 0.8\n", "iterations = 40000\n", "\n", "a = 0\n", "\n", "for _ in range(iterations):\n", " y_hat = b + np.dot(X, W.T)\n", " err = Y - y_hat\n", " error = np.sum(np.square(err), axis = 0) / (2*X.shape[0]) + np.sum(np.abs(W), axis = 0)\n", "\n", " if a == W.shape[0]+1:\n", " a = 0\n", " \n", " if a == 0:\n", " db = (-1/(2*X.shape[0])) * (2*np.sum(err, axis = 0))\n", " b = b - learning_rate*db\n", " a += 1\n", " else:\n", " if W[a-1, 0] >= 0:\n", " dw_a = (-1/(2*X.shape[0])) * (2*np.sum(np.dot(err.T, X[:, a-1].reshape(X.shape[0], X.shape[1])), axis = 0)) + alpha\n", " W[a-1, 0] = W[a-1, 0] - learning_rate*dw_a\n", " a += 1\n", " else:\n", " dw_a = (-1/(2*X.shape[0])) * (2*np.sum(np.dot(err.T, X[:, a-1].reshape(X.shape[0], X.shape[1])), axis = 0)) - alpha\n", " W[a-1, 0] = W[a-1, 0] - learning_rate*dw_a\n", " a += 1\n", " \n", "print(b, W)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[152.13348416] [595.83526038]\n" ] } ], "source": [ "reg = linear_model.Lasso(alpha = 0.8, fit_intercept = True, normalize = False, precompute = False, max_iter = 40000, positive = False, selection = 'cyclic')\n", "reg.fit(X, Y)\n", "print(reg.intercept_, reg.coef_)\n", "# precompute -> If you want to use gram matrix to speed up calulations\n", "# tol -> Check until the update is smaller than tol" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(X, Y, 'bo')\n", "plt.plot(X, y_hat, color = 'red')\n", "plt.xlabel('X values')\n", "plt.ylabel('Predicted Values')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# sklearn has another class called lasso_path that computes the coefficients along\n", "# the full path of possible values for lower-level tasks." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "152.1334841628967 [948.48582512]\n" ] } ], "source": [ "# To do cross validation dor alpha using Lasoo use LassoCV class\n", "reg = linear_model.LassoCV(eps = 0.001, n_alphas = 3, alphas = None, fit_intercept = True, normalize = False, precompute = 'auto', verbose = False, n_jobs = -1, positive = False, selection = 'cyclic')\n", "reg.fit(X, Y.ravel())\n", "print(reg.intercept_, reg.coef_)\n", "# eps -> length of path\n", "# alphas -> List of alphas. If None than it selects automatically" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

4) Multi-task Lasso

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 }