Skip to content

Instantly share code, notes, and snippets.

@ShahStavan
Last active September 29, 2023 19:23
Show Gist options
  • Save ShahStavan/4f841c7f1a634690c2007c4da3ecab53 to your computer and use it in GitHub Desktop.
Save ShahStavan/4f841c7f1a634690c2007c4da3ecab53 to your computer and use it in GitHub Desktop.
Linear Regression with Regularization (without using sklearn or equivalent library) and Simple and Multiple Linear Regression with and without regularization using Sklearn
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyPA840Ri0F010krgnO0YHXL",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/ShahStavan/4f841c7f1a634690c2007c4da3ecab53/22bce539_practical_4.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "qi4S_bZFIXsb"
},
"outputs": [],
"source": [
"from sklearn.metrics import mean_absolute_error, mean_squared_error\n",
"import numpy as np\n",
"import pandas as pd\n",
"from sklearn import datasets\n",
"from sklearn.preprocessing import StandardScaler\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.linear_model import SGDRegressor\n",
"from sklearn.model_selection import train_test_split"
]
},
{
"cell_type": "code",
"source": [
"# Define the URL of the dataset\n",
"data_url = \"http://lib.stat.cmu.edu/datasets/boston\"\n",
"\n",
"# Read the dataset with proper column names and separator\n",
"column_names = [\n",
" \"CRIM\", \"ZN\", \"INDUS\", \"CHAS\", \"NOX\", \"RM\", \"AGE\", \"DIS\", \"RAD\", \"TAX\", \"PTRATIO\", \"B\", \"LSTAT\", \"MEDV\"\n",
"]\n",
"raw_df = pd.read_csv(data_url, sep=\"\\s+\", skiprows=22, header=None, names=column_names)\n"
],
"metadata": {
"id": "iuW56j49IhWs"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"housing = datasets.fetch_california_housing()\n",
"data=housing.data\n",
"data.shape"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "hEwpvMyEImyn",
"outputId": "bbc79adb-00d0-44af-9ccb-20b4546a459f"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(20640, 8)"
]
},
"metadata": {},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"source": [
"# Split data into train and test sets\n",
"x_train1=data[:15000,0:7]\n",
"x_test1=data[15000:,0:7]\n",
"y_train=data[:15000,7]\n",
"y_test=data[15000:,7]\n",
"\n",
"# Add bias term\n",
"x_train = np.ones((x_train1.shape[0], x_train1.shape[1] + 1))\n",
"x_train[:, 1:] = x_train1\n",
"\n",
"x_test = np.ones((x_test1.shape[0], x_test1.shape[1] + 1))\n",
"x_test[:, 1:] = x_test1\n",
"\n",
"# Standardize features\n",
"scaler = StandardScaler()\n",
"scaler.fit(x_train[:, 1:])\n",
"x_train[:, 1:] = scaler.transform(x_train[:, 1:])\n",
"x_test[:, 1:] = scaler.transform(x_test[:, 1:])\n",
"\n",
"# Initialize theta with random values\n",
"theta = np.random.uniform(0, 1, size=x_train.shape[1])\n"
],
"metadata": {
"id": "IoPd5b__I3fi"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# Hyperparameters\n",
"n_iterations = 1000\n",
"learning_rate = 0.01\n",
"\n",
"# Number of training examples (m) and features (n)\n",
"m=x_train.shape[0]\n",
"n=x_train.shape[1]\n",
"\n",
"# Initialize a list to store the cost history\n",
"cost_history = []\n",
"\n",
"# Gradient Descent\n",
"for iteration in range(n_iterations):\n",
" # Initialize gradient vector\n",
" gradient = np.zeros(x_train.shape[1])\n",
"\n",
" # Calculate predictions\n",
" predictions = np.dot(x_train, theta)\n",
"\n",
" # Calculate error\n",
" errors = predictions - y_train\n",
" s=0\n",
"\n",
" # Calculate cost (mean squared error)\n",
" for j in range(errors.size):\n",
" s=s+errors[j]*errors[j]\n",
" cost_history.append((1/2*m) * s)\n",
"\n",
" # Calculate gradients\n",
" for j in range(n):\n",
" gradient[j]=np.sum(errors*(x_train.T)[j])\n",
"\n",
"\n",
" # Update theta using gradient descent\n",
" theta -= (learning_rate / m) * gradient\n"
],
"metadata": {
"id": "fycoLZkPJVac"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"iteration=np.arange(1,n_iterations+1)\n",
"plt.plot(iteration,cost_history)\n",
"plt.title(\"Cost function curve\")\n",
"plt.xlabel(\"Iterations\")\n",
"plt.ylabel(\"Cost\")\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 472
},
"id": "u5gWWRSGKiX7",
"outputId": "5497be60-0935-4619-c625-24a444371f66"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"print(\"Theta : \",theta,\"\\n\\n \",theta.shape)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "83F6Tn46N1G9",
"outputId": "50becdd8-9ee0-4ee0-e777-cde04981db46"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Theta : [-1.19041950e+02 -2.98013845e-01 -2.18830584e-01 4.51273747e-01\n",
" -2.67761206e-01 -5.13885088e-02 3.41610593e-02 -1.79038326e+00] \n",
"\n",
" (8,)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"predictions=np.dot(x_test,theta)\n",
"predictions"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "mdB5eNedN5n1",
"outputId": "b7156a07-ed34-4dd3-a294-327647135505"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([-117.01075092, -116.58555421, -116.39039419, ..., -122.23571743,\n",
" -122.27462559, -122.30227714])"
]
},
"metadata": {},
"execution_count": 37
}
]
},
{
"cell_type": "code",
"source": [
"MAE=mean_absolute_error(y_true=y_test,y_pred=predictions)\n",
"MSE=mean_squared_error(y_true=y_test,y_pred=predictions)\n",
"print(\"MAE = \",MAE,\"\\nMSE = \",MSE)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "pCFBoVANN5m1",
"outputId": "5018909e-6574-4956-b51f-40273bf59260"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"MAE = 0.7512238841177775 \n",
"MSE = 0.8094834008389342\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"### 2. Multiple Linear Regression using Normal Equation"
],
"metadata": {
"id": "8Thex4jaODVW"
}
},
{
"cell_type": "code",
"source": [
"\n",
"# Calculate the coefficients (theta) using the Normal Equation\n",
"x_train_transpose = np.transpose(x_train)\n",
"xx = np.dot(x_train_transpose, x_train)\n",
"xx_inv = np.linalg.inv(xx)\n",
"theta = np.dot(np.dot(xx_inv, x_train_transpose), y_train)\n",
"\n",
"# Make predictions using the calculated coefficients\n",
"predictions = np.dot(x_test, theta)\n",
"\n",
"# Calculate Mean Absolute Error (MAE) and Mean Squared Error (MSE)\n",
"MAE = mean_absolute_error(y_true=y_test, y_pred=predictions)\n",
"MSE = mean_squared_error(y_true=y_test, y_pred=predictions)\n",
"\n",
"# Print the results\n",
"print(\"Theta:\\n\", theta)\n",
"print(\"\\nMAE:\", MAE)\n",
"print(\"MSE:\", MSE)\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "fD6VihfsN-mx",
"outputId": "cc0448d8-2bd5-4bbc-f7cd-a8ce4bf5ab7c"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Theta:\n",
" [-1.19041950e+02 -3.12839097e-01 -2.17991470e-01 4.90445461e-01\n",
" -3.04269042e-01 -5.08202119e-02 3.40663449e-02 -1.79408497e+00]\n",
"\n",
"MAE: 0.7485046322773274\n",
"MSE: 0.8055934931615918\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"### Simple Linear Regression using Gradient descent with inbuilt library"
],
"metadata": {
"id": "Ou7wrZgdOrCC"
}
},
{
"cell_type": "code",
"source": [
"\n",
"# Load data from the given URL\n",
"data_url = \"http://lib.stat.cmu.edu/datasets/boston\"\n",
"raw_df = pd.read_csv(data_url, sep=\"\\s+\", skiprows=22, header=None)\n",
"\n",
"# Remove rows with missing values\n",
"df = raw_df.dropna()\n",
"\n",
"# Extract features (x) and target (y)\n",
"data = np.array(df)\n",
"x = data[:, 0:10]\n",
"y = data[:, 10]\n",
"\n",
"# Standardize the features\n",
"scalar = StandardScaler()\n",
"x_scaled = scalar.fit_transform(x)\n",
"\n",
"# Split the data into training and testing sets\n",
"x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size=0.8, shuffle=True)\n",
"\n",
"# Create and train the SGDRegressor model\n",
"model = SGDRegressor(max_iter=1000, alpha=0.01)\n",
"model.fit(x_train, y_train)\n",
"\n",
"# Get the model parameters (coefficients)\n",
"parameters = model.coef_\n",
"print(\"Model Coefficients (Theta_1 to Theta_10):\", parameters)\n",
"\n",
"# Get the intercept (Theta_0)\n",
"theta0 = model.intercept_\n",
"print(\"Intercept (Theta_0):\", theta0)\n",
"\n",
"# Make predictions on the test data\n",
"predictions = model.predict(x_test)\n",
"\n",
"# Calculate and print the mean absolute error\n",
"absolute_error = mean_absolute_error(y_test, predictions)\n",
"print(\"Mean Absolute Error (MAE):\", absolute_error)\n",
"\n",
"# Calculate and print the mean squared error\n",
"mean_error = mean_squared_error(y_test, predictions)\n",
"print(\"Mean Squared Error (MSE):\", mean_error)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "G7WTKWloOp68",
"outputId": "13ff8238-949b-4ebd-b210-298318da758f"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Model Coefficients (Theta_1 to Theta_10): [ 0.03183344 -0.90938062 0.51084593 -0.15521076 -1.14944335 -0.37306988\n",
" 0.36059199 0.26946265 0.59068271 0.43558996]\n",
"Intercept (Theta_0): [18.46626708]\n",
"Mean Absolute Error (MAE): 1.2805017931292624\n",
"Mean Squared Error (MSE): 2.7411612080195584\n"
]
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment