Skip to content

Instantly share code, notes, and snippets.

@AmirOfir
Created December 23, 2019 20:44
Show Gist options
  • Save AmirOfir/fc0900343ee413f005780e5439c0a620 to your computer and use it in GitHub Desktop.
Save AmirOfir/fc0900343ee413f005780e5439c0a620 to your computer and use it in GitHub Desktop.
Deep learning exe2.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Deep learning exe2.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/AmirOfir/fc0900343ee413f005780e5439c0a620/deep-learning-exe2.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BWeXoCUtvbsB",
"colab_type": "text"
},
"source": [
"# Student grade prediction\n",
"A machine learning project by Nurit Biber & Amir Ofir\n",
"\n",
"Dataset is available at https://www.kaggle.com/dipam7/student-grade-prediction \\\n",
"(Direct download @ https://cutt.ly/me6hvg3)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "2ZZEffLKa0dZ",
"colab_type": "code",
"colab": {}
},
"source": [
"import pandas as pd"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "DYRX7sCfbA7A",
"colab_type": "code",
"outputId": "a39e06bf-313b-4dc5-87ce-6ce8d5197d2a",
"colab": {
"resources": {
"http://localhost:8080/nbextensions/google.colab/files.js": {
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7Ci8vIE1heCBhbW91bnQgb2YgdGltZSB0byBibG9jayB3YWl0aW5nIGZvciB0aGUgdXNlci4KY29uc3QgRklMRV9DSEFOR0VfVElNRU9VVF9NUyA9IDMwICogMTAwMDsKCmZ1bmN0aW9uIF91cGxvYWRGaWxlcyhpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IHN0ZXBzID0gdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKTsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIC8vIENhY2hlIHN0ZXBzIG9uIHRoZSBvdXRwdXRFbGVtZW50IHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsCiAgLy8gdG8gdXBsb2FkRmlsZXNDb250aW51ZSBmcm9tIFB5dGhvbi4KICBvdXRwdXRFbGVtZW50LnN0ZXBzID0gc3RlcHM7CgogIHJldHVybiBfdXBsb2FkRmlsZXNDb250aW51ZShvdXRwdXRJZCk7Cn0KCi8vIFRoaXMgaXMgcm91Z2hseSBhbiBhc3luYyBnZW5lcmF0b3IgKG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgeWV0KSwKLy8gd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGFzeW5jaHJvbm91cyBzdGVwcyBhbmQgdGhlIFB5dGhvbiBzaWRlIGlzIGdvaW5nCi8vIHRvIHBvbGwgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzdGVwLgovLyBUaGlzIHVzZXMgYSBQcm9taXNlIHRvIGJsb2NrIHRoZSBweXRob24gc2lkZSBvbiBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcCwKLy8gdGhlbiBwYXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgc3RlcCBhcyB0aGUgaW5wdXQgdG8gdGhlIG5leHQgc3RlcC4KZnVuY3Rpb24gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpIHsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIGNvbnN0IHN0ZXBzID0gb3V0cHV0RWxlbWVudC5zdGVwczsKCiAgY29uc3QgbmV4dCA9IHN0ZXBzLm5leHQob3V0cHV0RWxlbWVudC5sYXN0UHJvbWlzZVZhbHVlKTsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQudmFsdWUucHJvbWlzZSkudGhlbigodmFsdWUpID0+IHsKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByb21pc2UgdmFsdWUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIG5leHQKICAgIC8vIHN0ZXAgb2YgdGhlIGdlbmVyYXRvci4KICAgIG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIG5leHQudmFsdWUucmVzcG9uc2U7CiAgfSk7Cn0KCi8qKgogKiBHZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGJldHdlZW4gZWFjaCBhc3luYyBzdGVwIG9mIHRoZSB1cGxvYWQKICogcHJvY2Vzcy4KICogQHBhcmFtIHtzdHJpbmd9IGlucHV0SWQgRWxlbWVudCBJRCBvZiB0aGUgaW5wdXQgZmlsZSBwaWNrZXIgZWxlbWVudC4KICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIG91dHB1dCBkaXNwbGF5LgogKiBAcmV0dXJuIHshSXRlcmFibGU8IU9iamVjdD59IEl0ZXJhYmxlIG9mIG5leHQgc3RlcHMuCiAqLwpmdW5jdGlvbiogdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKSB7CiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7CiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CgogIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvdXRwdXRJZCk7CiAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCiAgY29uc3QgcGlja2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsKICAgICAgcmVzb2x2ZShlLnRhcmdldC5maWxlcyk7CiAgICB9KTsKICB9KTsKCiAgY29uc3QgY2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgaW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsKTsKICBjYW5jZWwudGV4dENvbnRlbnQgPSAnQ2FuY2VsIHVwbG9hZCc7CiAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjYW5jZWwub25jbGljayA9ICgpID0+IHsKICAgICAgcmVzb2x2ZShudWxsKTsKICAgIH07CiAgfSk7CgogIC8vIENhbmNlbCB1cGxvYWQgaWYgdXNlciBoYXNuJ3QgcGlja2VkIGFueXRoaW5nIGluIHRpbWVvdXQuCiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9LCBGSUxFX0NIQU5HRV9USU1FT1VUX01TKTsKICB9KTsKCiAgLy8gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcGljayB0aGUgZmlsZXMuCiAgY29uc3QgZmlsZXMgPSB5aWVsZCB7CiAgICBwcm9taXNlOiBQcm9taXNlLnJhY2UoW3BpY2tlZFByb21pc2UsIHRpbWVvdXRQcm9taXNlLCBjYW5jZWxQcm9taXNlXSksCiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdzdGFydGluZycsCiAgICB9CiAgfTsKCiAgaWYgKCFmaWxlcykgewogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2U6IHsKICAgICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICAgIH0KICAgIH07CiAgfQoKICBjYW5jZWwucmVtb3ZlKCk7CgogIC8vIERpc2FibGUgdGhlIGlucHV0IGVsZW1lbnQgc2luY2UgZnVydGhlciBwaWNrcyBhcmUgbm90IGFsbG93ZWQuCiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKCiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBsaS5hcHBlbmQoc3BhbihmaWxlLm5hbWUsIHtmb250V2VpZ2h0OiAnYm9sZCd9KSk7CiAgICBsaS5hcHBlbmQoc3BhbigKICAgICAgICBgKCR7ZmlsZS50eXBlIHx8ICduL2EnfSkgLSAke2ZpbGUuc2l6ZX0gYnl0ZXMsIGAgKwogICAgICAgIGBsYXN0IG1vZGlmaWVkOiAkewogICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZERhdGUgPyBmaWxlLmxhc3RNb2RpZmllZERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbi9hJ30gLSBgKSk7CiAgICBjb25zdCBwZXJjZW50ID0gc3BhbignMCUgZG9uZScpOwogICAgbGkuYXBwZW5kQ2hpbGQocGVyY2VudCk7CgogICAgb3V0cHV0RWxlbWVudC5hcHBlbmRDaGlsZChsaSk7CgogICAgY29uc3QgZmlsZURhdGFQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7CiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CiAgICB9KTsKICAgIC8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHJlYWR5LgogICAgbGV0IGZpbGVEYXRhID0geWllbGQgewogICAgICBwcm9taXNlOiBmaWxlRGF0YVByb21pc2UsCiAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgYWN0aW9uOiAnY29udGludWUnLAogICAgICB9CiAgICB9OwoKICAgIC8vIFVzZSBhIGNodW5rZWQgc2VuZGluZyB0byBhdm9pZCBtZXNzYWdlIHNpemUgbGltaXRzLiBTZWUgYi82MjExNTY2MC4KICAgIGxldCBwb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAocG9zaXRpb24gPCBmaWxlRGF0YS5ieXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZpbGVEYXRhLmJ5dGVMZW5ndGggLSBwb3NpdGlvbiwgTUFYX1BBWUxPQURfU0laRSk7CiAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZmlsZURhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CgogICAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICAgICAgeWllbGQgewogICAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgICBhY3Rpb246ICdhcHBlbmQnLAogICAgICAgICAgZmlsZTogZmlsZS5uYW1lLAogICAgICAgICAgZGF0YTogYmFzZTY0LAogICAgICAgIH0sCiAgICAgIH07CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPQogICAgICAgICAgYCR7TWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCl9JSBkb25lYDsKICAgIH0KICB9CgogIC8vIEFsbCBkb25lLgogIHlpZWxkIHsKICAgIHJlc3BvbnNlOiB7CiAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgIH0KICB9Owp9CgpzY29wZS5nb29nbGUgPSBzY29wZS5nb29nbGUgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYiA9IHNjb3BlLmdvb2dsZS5jb2xhYiB8fCB7fTsKc2NvcGUuZ29vZ2xlLmNvbGFiLl9maWxlcyA9IHsKICBfdXBsb2FkRmlsZXMsCiAgX3VwbG9hZEZpbGVzQ29udGludWUsCn07Cn0pKHNlbGYpOwo=",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 74
}
},
"source": [
"from google.colab import files\n",
"uploaded = files.upload()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <input type=\"file\" id=\"files-333e9ee9-4a9b-43ec-993e-927b32f1e6ce\" name=\"files[]\" multiple disabled />\n",
" <output id=\"result-333e9ee9-4a9b-43ec-993e-927b32f1e6ce\">\n",
" Upload widget is only available when the cell has been executed in the\n",
" current browser session. Please rerun this cell to enable.\n",
" </output>\n",
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"Saving student-mat.csv to student-mat.csv\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "9aBfe0P-bN92",
"colab_type": "code",
"colab": {}
},
"source": [
"import io\n",
"df = pd.read_csv(io.StringIO(uploaded['student-mat.csv'].decode('utf-8')))"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "vGdo8Z3Sbp57",
"colab_type": "code",
"outputId": "4083c252-3cc7-4b9f-ae62-e60c4aad1cf3",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 215
}
},
"source": [
"df.head()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>school</th>\n",
" <th>sex</th>\n",
" <th>age</th>\n",
" <th>address</th>\n",
" <th>famsize</th>\n",
" <th>Pstatus</th>\n",
" <th>Medu</th>\n",
" <th>Fedu</th>\n",
" <th>Mjob</th>\n",
" <th>Fjob</th>\n",
" <th>reason</th>\n",
" <th>guardian</th>\n",
" <th>traveltime</th>\n",
" <th>studytime</th>\n",
" <th>failures</th>\n",
" <th>schoolsup</th>\n",
" <th>famsup</th>\n",
" <th>paid</th>\n",
" <th>activities</th>\n",
" <th>nursery</th>\n",
" <th>higher</th>\n",
" <th>internet</th>\n",
" <th>romantic</th>\n",
" <th>famrel</th>\n",
" <th>freetime</th>\n",
" <th>goout</th>\n",
" <th>Dalc</th>\n",
" <th>Walc</th>\n",
" <th>health</th>\n",
" <th>absences</th>\n",
" <th>G1</th>\n",
" <th>G2</th>\n",
" <th>G3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>GP</td>\n",
" <td>F</td>\n",
" <td>18</td>\n",
" <td>U</td>\n",
" <td>GT3</td>\n",
" <td>A</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>at_home</td>\n",
" <td>teacher</td>\n",
" <td>course</td>\n",
" <td>mother</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>5</td>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>GP</td>\n",
" <td>F</td>\n",
" <td>17</td>\n",
" <td>U</td>\n",
" <td>GT3</td>\n",
" <td>T</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>at_home</td>\n",
" <td>other</td>\n",
" <td>course</td>\n",
" <td>father</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>5</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>GP</td>\n",
" <td>F</td>\n",
" <td>15</td>\n",
" <td>U</td>\n",
" <td>LE3</td>\n",
" <td>T</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>at_home</td>\n",
" <td>other</td>\n",
" <td>other</td>\n",
" <td>mother</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>10</td>\n",
" <td>7</td>\n",
" <td>8</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>GP</td>\n",
" <td>F</td>\n",
" <td>15</td>\n",
" <td>U</td>\n",
" <td>GT3</td>\n",
" <td>T</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>health</td>\n",
" <td>services</td>\n",
" <td>home</td>\n",
" <td>mother</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>15</td>\n",
" <td>14</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>GP</td>\n",
" <td>F</td>\n",
" <td>16</td>\n",
" <td>U</td>\n",
" <td>GT3</td>\n",
" <td>T</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>other</td>\n",
" <td>other</td>\n",
" <td>home</td>\n",
" <td>father</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>10</td>\n",
" <td>10</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" school sex age address famsize Pstatus ... Walc health absences G1 G2 G3\n",
"0 GP F 18 U GT3 A ... 1 3 6 5 6 6\n",
"1 GP F 17 U GT3 T ... 1 3 4 5 5 6\n",
"2 GP F 15 U LE3 T ... 3 3 10 7 8 10\n",
"3 GP F 15 U GT3 T ... 1 5 2 15 14 15\n",
"4 GP F 16 U GT3 T ... 2 5 4 6 10 10\n",
"\n",
"[5 rows x 33 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "0w0-Rv-6gBDa",
"colab_type": "code",
"outputId": "bc2c4777-7c21-4c78-be3b-64a0ca35a40a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 319
}
},
"source": [
"columns = df.columns;\n",
"for coloumn in columns :\n",
" if (not str(df[coloumn].dtype).startswith(\"int\")):\n",
" print(\"Coloum Name:\",coloumn, \", Type:\", df[coloumn].dtype, \", Unique values:\", df[coloumn].unique())\n",
" values = df[coloumn].unique()\n",
" convertor = dict(zip(values,range(len(values))))\n",
" df[coloumn] = [convertor[item] for item in df[coloumn]]\n",
"\n",
"print(\"Total:\", len(df.columns), \"Columns\")"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Coloum Name: school , Type: object , Unique values: ['GP' 'MS']\n",
"Coloum Name: sex , Type: object , Unique values: ['F' 'M']\n",
"Coloum Name: address , Type: object , Unique values: ['U' 'R']\n",
"Coloum Name: famsize , Type: object , Unique values: ['GT3' 'LE3']\n",
"Coloum Name: Pstatus , Type: object , Unique values: ['A' 'T']\n",
"Coloum Name: Mjob , Type: object , Unique values: ['at_home' 'health' 'other' 'services' 'teacher']\n",
"Coloum Name: Fjob , Type: object , Unique values: ['teacher' 'other' 'services' 'health' 'at_home']\n",
"Coloum Name: reason , Type: object , Unique values: ['course' 'other' 'home' 'reputation']\n",
"Coloum Name: guardian , Type: object , Unique values: ['mother' 'father' 'other']\n",
"Coloum Name: schoolsup , Type: object , Unique values: ['yes' 'no']\n",
"Coloum Name: famsup , Type: object , Unique values: ['no' 'yes']\n",
"Coloum Name: paid , Type: object , Unique values: ['no' 'yes']\n",
"Coloum Name: activities , Type: object , Unique values: ['no' 'yes']\n",
"Coloum Name: nursery , Type: object , Unique values: ['yes' 'no']\n",
"Coloum Name: higher , Type: object , Unique values: ['yes' 'no']\n",
"Coloum Name: internet , Type: object , Unique values: ['no' 'yes']\n",
"Coloum Name: romantic , Type: object , Unique values: ['no' 'yes']\n",
"Total: 33 Columns\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "NZfvAI6-ayq2",
"colab_type": "code",
"outputId": "3ea41d2a-77d2-4088-edb1-bbd94e587943",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 470
}
},
"source": [
"import numpy as np\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"y = np.asarray([df.G3]).T\n",
"X = df.drop('G3', axis=1)\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.2)\n",
"print(\"X_train:\")\n",
"print(X_train.head())\n",
"print(X_train.shape)\n",
"\n",
"print(\"\\nX_test:\")\n",
"print(X_test.head())\n",
"print(X_test.shape)\n",
"\n",
"print(\"\\ny_train:\")\n",
"# print(y_train.head)\n",
"print(y_train.shape)\n",
"\n",
"print(\"\\ny_test:\")\n",
"# print(y_test.head())\n",
"print(y_test.shape)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"X_train:\n",
" school sex age address famsize ... Walc health absences G1 G2\n",
"41 0 1 15 0 1 ... 4 5 8 12 12\n",
"206 0 0 16 0 0 ... 2 4 5 7 7\n",
"368 1 0 18 0 0 ... 2 4 0 11 10\n",
"218 0 0 17 0 0 ... 4 3 3 7 7\n",
"392 1 1 21 1 0 ... 3 3 3 10 8\n",
"\n",
"[5 rows x 32 columns]\n",
"(316, 32)\n",
"\n",
"X_test:\n",
" school sex age address famsize ... Walc health absences G1 G2\n",
"345 0 0 18 0 0 ... 3 1 7 13 13\n",
"16 0 0 16 0 0 ... 2 2 6 13 14\n",
"6 0 1 16 0 1 ... 1 3 0 12 12\n",
"129 0 1 16 1 0 ... 5 4 8 18 18\n",
"358 1 1 18 0 1 ... 2 3 4 10 10\n",
"\n",
"[5 rows x 32 columns]\n",
"(79, 32)\n",
"\n",
"y_train:\n",
"(316, 1)\n",
"\n",
"y_test:\n",
"(79, 1)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "RWVAspMukIiq",
"colab_type": "code",
"outputId": "6d92b4fb-39fb-4eaf-edd4-a18921e996c1",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 101
}
},
"source": [
"%tensorflow_version '1.x' # <-- This ensures that colab will use 1.x version and more important will disable the annoying notificatoin massage\n",
"import tensorflow as tf"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Unknown TensorFlow version: '1.x' # <-- This ensures that colab will use 1.x version and more important will disable the annoying notificatoin massage\n",
"Currently selected TF version: 1.x\n",
"Available versions:\n",
" * 1.x\n",
" * 2.x\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tAuX8cKRckjn",
"colab_type": "text"
},
"source": [
"## Linear Regression with BGD"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tLRB4Q1679_M",
"colab_type": "text"
},
"source": [
"\n",
"Started with basic linear regression: $h(x)=Wx+b$ where $h(x) \\in \\mathbb{R}$ \\\n",
"Loss function: MSE.\n",
"Learning rate: 0.1\n",
"\n",
"Result: NaN\n",
"On high learning rate the loss is nan, it seems due to multiples updates with \n",
"higher learning rate model parameters values vanishes."
]
},
{
"cell_type": "code",
"metadata": {
"id": "kKo5aEGH79jj",
"colab_type": "code",
"outputId": "552ca3ab-934c-4e66-db3c-8506b47defa5",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 185
}
},
"source": [
"features = len(df.columns) -1\n",
"x = tf.placeholder(tf.float32, [None, features])\n",
"y_ = tf.placeholder(tf.float32, [None, 1])\n",
"W = tf.Variable(tf.zeros([features,1]))\n",
"b = tf.Variable(tf.zeros([1]))\n",
"y = tf.matmul(x,W) + b\n",
"loss = tf.reduce_mean(tf.pow(y - y_, 2))\n",
"update = tf.train.GradientDescentOptimizer(0.1).minimize(loss)\n",
"data_x = np.array(X_train)\n",
"data_y = np.array(y_train)\n",
"sess = tf.Session()\n",
"sess.run(tf.global_variables_initializer())\n",
"for i in range(0,100000):\n",
" sess.run(update, feed_dict = {x:data_x, y_:data_y})\n",
" if i % 10000 == 0 :\n",
" print('Iteration:' , i , ' b:' , sess.run(b), ' loss:', loss.eval(session=sess, feed_dict = {x:data_x, y_:data_y}))"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Iteration: 0 b: [2.101899] loss: 1970063.2\n",
"Iteration: 10000 b: [nan] loss: nan\n",
"Iteration: 20000 b: [nan] loss: nan\n",
"Iteration: 30000 b: [nan] loss: nan\n",
"Iteration: 40000 b: [nan] loss: nan\n",
"Iteration: 50000 b: [nan] loss: nan\n",
"Iteration: 60000 b: [nan] loss: nan\n",
"Iteration: 70000 b: [nan] loss: nan\n",
"Iteration: 80000 b: [nan] loss: nan\n",
"Iteration: 90000 b: [nan] loss: nan\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vrOfbJfw1giv",
"colab_type": "text"
},
"source": [
"First learning is for learning rate hyperparameter: Trying to find a starting point for the learning rate decay. used 5000 epochs, Result: 0.001\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "5ijRUtEpcAPM",
"colab_type": "code",
"outputId": "36df4419-5af4-4c4e-93a0-06f21994ea41",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 50
}
},
"source": [
"import math\n",
"\n",
"features = len(df.columns) -1\n",
"x = tf.placeholder(tf.float32, [None, features])\n",
"y_ = tf.placeholder(tf.float32, [None, 1])\n",
"W = tf.Variable(tf.zeros([features,1]))\n",
"b = tf.Variable(tf.zeros([1]))\n",
"y = tf.matmul(x,W) + b\n",
"loss = tf.reduce_mean(tf.pow(y - y_, 2))\n",
"learning_rate = tf.placeholder(tf.float32, [])\n",
"update = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)\n",
"data_x = np.array(X_train)\n",
"data_y = np.array(y_train)\n",
"\n",
"lr = 1e-1\n",
"found_lr = False\n",
"while (not found_lr and lr > 1e-6):\n",
" lr = lr / 10\n",
" sess = tf.Session()\n",
" sess.run(tf.global_variables_initializer())\n",
" for i in range(0,5000):\n",
" sess.run(update, feed_dict = {x:data_x, y_:data_y, learning_rate: lr})\n",
" if math.isnan(sess.run(b)):\n",
" print('lr', lr, 'is too high')\n",
" break\n",
" found_lr = not math.isnan(sess.run(b))\n",
"\n",
"print('Result learning rate:', lr)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"lr 0.01 is too high\n",
"Result learning rate: 0.001\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Tw-6-QuaEgTk",
"colab_type": "text"
},
"source": [
"\n",
"Second learning is for a reference for the loss - used 200,000 epochs, Result: expecting to get values lower than 3.16"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ZdWh2ioZ4nyr",
"colab_type": "code",
"outputId": "1f250948-9cc6-4a7e-b03c-9619f2649486",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 423
}
},
"source": [
"features = len(df.columns) -1\n",
"x = tf.placeholder(tf.float32, [None, features])\n",
"y_ = tf.placeholder(tf.float32, [None, 1])\n",
"W = tf.Variable(tf.zeros([features,1]))\n",
"b = tf.Variable(tf.zeros([1]))\n",
"y = tf.matmul(x,W) + b\n",
"loss = tf.reduce_mean(tf.pow(y - y_, 2))\n",
"learning_rate = tf.placeholder(tf.float32, [])\n",
"update = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)\n",
"data_x = np.array(X_train)\n",
"data_y = np.array(y_train)\n",
"\n",
"sess = tf.Session()\n",
"sess.run(tf.global_variables_initializer())\n",
"\n",
"for i in range(0,200000):\n",
" sess.run(update, feed_dict = {x:data_x, y_:data_y, learning_rate: 0.001})\n",
" if i % 10000 == 0 :\n",
" print('Iteration:' , i , ' b:' , sess.run(b), ' loss:', loss.eval(session=sess, feed_dict = {x:data_x, y_:data_y}), \\\n",
" 'test loss:', loss.eval(session=sess, feed_dict={x:X_test, y_:y_test}))"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/math_grad.py:1375: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
"Iteration: 0 b: [0.02066456] loss: 22.666239 test loss: 19.392223\n",
"Iteration: 10000 b: [-0.08223689] loss: 3.1688268 test loss: 4.027796\n",
"Iteration: 20000 b: [-0.15390438] loss: 3.1655788 test loss: 4.061615\n",
"Iteration: 30000 b: [-0.21997419] loss: 3.1649954 test loss: 4.071245\n",
"Iteration: 40000 b: [-0.28218237] loss: 3.1645925 test loss: 4.074576\n",
"Iteration: 50000 b: [-0.34102684] loss: 3.1642401 test loss: 4.076316\n",
"Iteration: 60000 b: [-0.3967231] loss: 3.1639247 test loss: 4.077658\n",
"Iteration: 70000 b: [-0.44943964] loss: 3.1636434 test loss: 4.0788846\n",
"Iteration: 80000 b: [-0.49932468] loss: 3.1633914 test loss: 4.0800295\n",
"Iteration: 90000 b: [-0.546519] loss: 3.1631658 test loss: 4.0810943\n",
"Iteration: 100000 b: [-0.59119356] loss: 3.1629634 test loss: 4.0821266\n",
"Iteration: 110000 b: [-0.6334551] loss: 3.162783 test loss: 4.083137\n",
"Iteration: 120000 b: [-0.67343646] loss: 3.1626208 test loss: 4.084108\n",
"Iteration: 130000 b: [-0.71126014] loss: 3.162476 test loss: 4.0850143\n",
"Iteration: 140000 b: [-0.7470617] loss: 3.1623466 test loss: 4.0858803\n",
"Iteration: 150000 b: [-0.7809175] loss: 3.1622303 test loss: 4.0867333\n",
"Iteration: 160000 b: [-0.8129519] loss: 3.1621265 test loss: 4.087547\n",
"Iteration: 170000 b: [-0.8432623] loss: 3.1620338 test loss: 4.0883203\n",
"Iteration: 180000 b: [-0.8719136] loss: 3.1619506 test loss: 4.0890555\n",
"Iteration: 190000 b: [-0.8990501] loss: 3.1618757 test loss: 4.0897307\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8decg4NZ1qL8",
"colab_type": "text"
},
"source": [
"**Third attempt** \\\n",
"The test loss was higher than the train loss, so we want to use regularization.\n",
"\n",
"To estimate a large number of parameters, and to penalize some of them because we believe they should have little effect compared to the others.\n",
"\n",
"Lasso, or Least Absolute Shrinkage and Selection Operator, is quite similar conceptually to ridge regression. It also adds a penalty for non-zero coefficients, but unlike ridge regression which penalizes sum of squared coefficients (the so-called L2 penalty), lasso penalizes the sum of their absolute values (L1 penalty). As a result, for high values of λ, many coefficients are exactly zeroed under lasso, which is never the case in ridge regression.\n",
"\n",
"regularization using Lasso (to eliminate some of your input variable as not contributing to the output.) - not good, Loss increased by 3.4114296 \n",
"\n",
"lambda is 0.5, Loss 4.2\n",
"\n",
"lambda is 0.05, Loss is 3.4\n",
"\n",
"lambda is 0.005, Loss is 3.19\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "F6x46Hmz9vtf",
"colab_type": "code",
"outputId": "4a3bc211-045d-4375-ecde-60f89413b629",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
}
},
"source": [
"features = len(df.columns) -1\n",
"x = tf.placeholder(tf.float32, [None, features])\n",
"y_ = tf.placeholder(tf.float32, [None, 1])\n",
"W = tf.Variable(tf.truncated_normal([features,1]))\n",
"b = tf.Variable(tf.truncated_normal([1]))\n",
"y = tf.matmul(x,W) + b\n",
"lambda_p = tf.placeholder(tf.float32, [])\n",
"loss = tf.reduce_mean(tf.pow(y - y_, 2)) + lambda_p*tf.reduce_sum(tf.abs(W))\n",
"\n",
"#hp\n",
"lambda_ = 0.5\n",
"epochs = 200000\n",
"lr = 0.001\n",
"\n",
"update = tf.train.GradientDescentOptimizer(lr).minimize(loss)\n",
"data_x = np.array(X_train)\n",
"data_y = np.array(y_train)\n",
"\n",
"while lambda_ >= 0.005:\n",
" sess = tf.Session()\n",
" sess.run(tf.global_variables_initializer())\n",
" for i in range(0,epochs):\n",
" sess.run(update, feed_dict = {x:data_x, y_:data_y, lambda_p:lambda_})\n",
"\n",
" if i % 10000 == 0 :\n",
" print('Iteration:' , i , ' b:' , sess.run(b), ' loss:', loss.eval(session=sess, feed_dict = {x:data_x, y_:data_y, lambda_p:lambda_}), \\\n",
" 'test loss:', loss.eval(session=sess, feed_dict={x:X_test, y_:y_test, lambda_p:lambda_}))\n",
" print('Iteration:' , i , ' b:' , sess.run(b), ' loss:', loss.eval(session=sess, feed_dict = {x:data_x, y_:data_y, lambda_p:lambda_}), \\\n",
" 'test loss:', loss.eval(session=sess, feed_dict={x:X_test, y_:y_test, lambda_p:lambda_}))\n",
" lambda_ = lambda_ * 0.1"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Iteration: 0 b: [-1.2448394] loss: 446.092 test loss: 505.0837\n",
"Iteration: 10000 b: [-1.2366536] loss: 4.2090144 test loss: 4.3121123\n",
"Iteration: 20000 b: [-1.2509599] loss: 4.208384 test loss: 4.3120313\n",
"Iteration: 30000 b: [-1.2639827] loss: 4.208607 test loss: 4.311116\n",
"Iteration: 40000 b: [-1.2758116] loss: 4.207839 test loss: 4.310723\n",
"Iteration: 50000 b: [-1.2865922] loss: 4.20835 test loss: 4.311414\n",
"Iteration: 60000 b: [-1.2964098] loss: 4.2084227 test loss: 4.3115354\n",
"Iteration: 70000 b: [-1.3053275] loss: 4.2083583 test loss: 4.3128314\n",
"Iteration: 80000 b: [-1.3134434] loss: 4.208119 test loss: 4.3112426\n",
"Iteration: 90000 b: [-1.3208462] loss: 4.208597 test loss: 4.312049\n",
"Iteration: 100000 b: [-1.3275822] loss: 4.207746 test loss: 4.311511\n",
"Iteration: 110000 b: [-1.3337083] loss: 4.208672 test loss: 4.312983\n",
"Iteration: 120000 b: [-1.3392861] loss: 4.20749 test loss: 4.310263\n",
"Iteration: 130000 b: [-1.3443674] loss: 4.208694 test loss: 4.312286\n",
"Iteration: 140000 b: [-1.3489777] loss: 4.2082424 test loss: 4.31272\n",
"Iteration: 150000 b: [-1.3531823] loss: 4.2089543 test loss: 4.312708\n",
"Iteration: 160000 b: [-1.3570113] loss: 4.2083025 test loss: 4.3114796\n",
"Iteration: 170000 b: [-1.3604795] loss: 4.2084785 test loss: 4.312836\n",
"Iteration: 180000 b: [-1.3636631] loss: 4.208489 test loss: 4.3129187\n",
"Iteration: 190000 b: [-1.3665302] loss: 4.20874 test loss: 4.3138857\n",
"Iteration: 199999 b: [-1.3691506] loss: 4.2087064 test loss: 4.3133845\n",
"Iteration: 0 b: [-0.49451715] loss: 65.19959 test loss: 50.782513\n",
"Iteration: 10000 b: [-0.57819426] loss: 3.4036527 test loss: 4.135394\n",
"Iteration: 20000 b: [-0.6162882] loss: 3.403234 test loss: 4.138874\n",
"Iteration: 30000 b: [-0.65235555] loss: 3.4030986 test loss: 4.1400976\n",
"Iteration: 40000 b: [-0.6862988] loss: 3.402985 test loss: 4.1406655\n",
"Iteration: 50000 b: [-0.7182551] loss: 3.4028797 test loss: 4.14114\n",
"Iteration: 60000 b: [-0.74835384] loss: 3.4027915 test loss: 4.1414933\n",
"Iteration: 70000 b: [-0.77670497] loss: 3.4027095 test loss: 4.1419044\n",
"Iteration: 80000 b: [-0.8034115] loss: 3.4026403 test loss: 4.1422253\n",
"Iteration: 90000 b: [-0.82857037] loss: 3.4025753 test loss: 4.1426387\n",
"Iteration: 100000 b: [-0.85227036] loss: 3.4025195 test loss: 4.142913\n",
"Iteration: 110000 b: [-0.87459654] loss: 3.4024663 test loss: 4.143241\n",
"Iteration: 120000 b: [-0.8956284] loss: 3.402424 test loss: 4.1435614\n",
"Iteration: 130000 b: [-0.9154391] loss: 3.4023795 test loss: 4.1438174\n",
"Iteration: 140000 b: [-0.9340992] loss: 3.402348 test loss: 4.1441135\n",
"Iteration: 150000 b: [-0.9516742] loss: 3.4023166 test loss: 4.144362\n",
"Iteration: 160000 b: [-0.9682367] loss: 3.4022915 test loss: 4.1446505\n",
"Iteration: 170000 b: [-0.98383826] loss: 3.4022648 test loss: 4.144847\n",
"Iteration: 180000 b: [-0.99853486] loss: 3.402245 test loss: 4.145137\n",
"Iteration: 190000 b: [-1.0123883] loss: 3.4022212 test loss: 4.145303\n",
"Iteration: 199999 b: [-1.025407] loss: 3.4022064 test loss: 4.1454816\n",
"Iteration: 0 b: [-0.21967678] loss: 19.626837 test loss: 23.752216\n",
"Iteration: 10000 b: [-0.2472825] loss: 3.2050009 test loss: 4.044961\n",
"Iteration: 20000 b: [-0.3060216] loss: 3.1954894 test loss: 4.069978\n",
"Iteration: 30000 b: [-0.3596664] loss: 3.1947806 test loss: 4.080019\n",
"Iteration: 40000 b: [-0.41024393] loss: 3.194455 test loss: 4.083156\n",
"Iteration: 50000 b: [-0.45830417] loss: 3.1942022 test loss: 4.0846205\n",
"Iteration: 60000 b: [-0.5039743] loss: 3.1939852 test loss: 4.0856843\n",
"Iteration: 70000 b: [-0.5472756] loss: 3.1937933 test loss: 4.0866733\n",
"Iteration: 80000 b: [-0.5882894] loss: 3.1936226 test loss: 4.0876155\n",
"Iteration: 90000 b: [-0.6271324] loss: 3.1934693 test loss: 4.0885167\n",
"Iteration: 100000 b: [-0.66387415] loss: 3.1933324 test loss: 4.089353\n",
"Iteration: 110000 b: [-0.6986723] loss: 3.1932096 test loss: 4.0901613\n",
"Iteration: 120000 b: [-0.7315952] loss: 3.1931002 test loss: 4.090959\n",
"Iteration: 130000 b: [-0.76273155] loss: 3.193002 test loss: 4.09172\n",
"Iteration: 140000 b: [-0.7921859] loss: 3.192914 test loss: 4.0924406\n",
"Iteration: 150000 b: [-0.82008624] loss: 3.1928358 test loss: 4.0931163\n",
"Iteration: 160000 b: [-0.84644866] loss: 3.1927648 test loss: 4.093757\n",
"Iteration: 170000 b: [-0.87142605] loss: 3.1927016 test loss: 4.094393\n",
"Iteration: 180000 b: [-0.89506555] loss: 3.1926453 test loss: 4.0949965\n",
"Iteration: 190000 b: [-0.9174101] loss: 3.1925948 test loss: 4.0955715\n",
"Iteration: 199999 b: [-0.938545] loss: 3.1925495 test loss: 4.0961175\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "E0UrU9be7see",
"colab_type": "text"
},
"source": [
"**Forth attempt**\\\n",
"regularization using Ridge - it helped! loss is 3.0893621\n",
"\n",
"From the discussion so far we have concluded that we would like to decrease the model complexity, that is the number of predictors. We could use the forward or backward selection for this, but that way we would not be able to tell anything about the removed variables' effect on the response. Removing predictors from the model can be seen as settings their coefficients to zero. Instead of forcing them to be exactly zero, let's penalize them if they are too far from zero, thus enforcing them to be small in a continuous way. This way, we decrease model complexity while keeping all variables in the model. This, basically, is what Ridge Regression does."
]
},
{
"cell_type": "code",
"metadata": {
"id": "o8qqkr_23dkV",
"colab_type": "code",
"outputId": "3262c661-b345-4504-9f1c-9ad6041c9950",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
}
},
"source": [
"features = len(df.columns) -1\n",
"x = tf.placeholder(tf.float32, [None, features])\n",
"y_ = tf.placeholder(tf.float32, [None, 1])\n",
"W = tf.Variable(tf.truncated_normal([features,1]))\n",
"b = tf.Variable(tf.truncated_normal([1]))\n",
"y = tf.matmul(x,W) + b\n",
"\n",
"#HP\n",
"lambda_p = tf.placeholder(tf.float32, [])\n",
"lambda_ = 0.1\n",
"epochs = 200000\n",
"lr = 0.001\n",
"\n",
"loss = tf.reduce_mean(tf.pow(y - y_, 2)) + lambda_p*tf.nn.l2_loss(W)\n",
"update = tf.train.GradientDescentOptimizer(lr).minimize(loss)\n",
"data_x = np.array(X_train)\n",
"data_y = np.array(y_train)\n",
"\n",
"while (lambda_ >= 0.000625):\n",
" sess = tf.Session()\n",
" sess.run(tf.global_variables_initializer())\n",
" for i in range(0,epochs):\n",
" sess.run(update, feed_dict = {x:data_x, y_:data_y, lambda_p: lambda_})\n",
" if i % 10000 == 0 :\n",
" print('Iteration:' , i , ' b:' , sess.run(b), ' loss:', loss.eval(session=sess, feed_dict = {x:data_x, y_:data_y, lambda_p:lambda_}), \\\n",
" 'test loss:', loss.eval(session=sess, feed_dict={x:X_test, y_:y_test, lambda_p:lambda_}))\n",
" print('For', lambda_, 'loss', loss.eval(session=sess, feed_dict = {x:data_x, y_:data_y, lambda_p: lambda_}), \\\n",
" 'test loss:', loss.eval(session=sess, feed_dict={x:X_test, y_:y_test, lambda_p:lambda_}))\n",
" lambda_ *= 0.5"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Iteration: 0 b: [0.78770304] loss: 197.66028 test loss: 149.79544\n",
"Iteration: 10000 b: [0.6692443] loss: 3.278898 test loss: 4.030655\n",
"Iteration: 20000 b: [0.55047846] loss: 3.274402 test loss: 4.061916\n",
"Iteration: 30000 b: [0.43717343] loss: 3.2730691 test loss: 4.065865\n",
"Iteration: 40000 b: [0.33054042] loss: 3.2719226 test loss: 4.0675006\n",
"Iteration: 50000 b: [0.23041685] loss: 3.2709134 test loss: 4.068942\n",
"Iteration: 60000 b: [0.13643633] loss: 3.2700248 test loss: 4.0703425\n",
"Iteration: 70000 b: [0.04822523] loss: 3.269242 test loss: 4.0717216\n",
"Iteration: 80000 b: [-0.03457005] loss: 3.268551 test loss: 4.07308\n",
"Iteration: 90000 b: [-0.11228119] loss: 3.2679439 test loss: 4.074392\n",
"Iteration: 100000 b: [-0.18522158] loss: 3.2674084 test loss: 4.075681\n",
"Iteration: 110000 b: [-0.25368378] loss: 3.2669368 test loss: 4.0769134\n",
"Iteration: 120000 b: [-0.31793755] loss: 3.266521 test loss: 4.0781174\n",
"Iteration: 130000 b: [-0.3782491] loss: 3.2661548 test loss: 4.0792656\n",
"Iteration: 140000 b: [-0.43485808] loss: 3.2658324 test loss: 4.0803795\n",
"Iteration: 150000 b: [-0.4879921] loss: 3.265548 test loss: 4.0814285\n",
"Iteration: 160000 b: [-0.5378611] loss: 3.265298 test loss: 4.0824585\n",
"Iteration: 170000 b: [-0.58466625] loss: 3.2650776 test loss: 4.0834284\n",
"Iteration: 180000 b: [-0.62860894] loss: 3.264883 test loss: 4.0843515\n",
"Iteration: 190000 b: [-0.6698305] loss: 3.2647116 test loss: 4.085248\n",
"For 0.1 loss 3.264561 test loss: 4.0860925\n",
"Iteration: 0 b: [0.8450879] loss: 58.75422 test loss: 55.97531\n",
"Iteration: 10000 b: [0.68023765] loss: 3.265846 test loss: 4.032003\n",
"Iteration: 20000 b: [0.5495104] loss: 3.230226 test loss: 4.047606\n",
"Iteration: 30000 b: [0.43580288] loss: 3.226225 test loss: 4.055908\n",
"Iteration: 40000 b: [0.33138865] loss: 3.2248836 test loss: 4.058941\n",
"Iteration: 50000 b: [0.23385906] loss: 3.2239053 test loss: 4.060739\n",
"Iteration: 60000 b: [0.14226052] loss: 3.2230594 test loss: 4.062263\n",
"Iteration: 70000 b: [0.05607743] loss: 3.2223113 test loss: 4.0637045\n",
"Iteration: 80000 b: [-0.02505824] loss: 3.2216473 test loss: 4.0651064\n",
"Iteration: 90000 b: [-0.10145766] loss: 3.2210593 test loss: 4.066458\n",
"Iteration: 100000 b: [-0.17341305] loss: 3.2205377 test loss: 4.0677667\n",
"Iteration: 110000 b: [-0.2411804] loss: 3.2200747 test loss: 4.0690455\n",
"Iteration: 120000 b: [-0.3049991] loss: 3.219664 test loss: 4.070274\n",
"Iteration: 130000 b: [-0.3651044] loss: 3.2192996 test loss: 4.07146\n",
"Iteration: 140000 b: [-0.42170697] loss: 3.2189767 test loss: 4.0725913\n",
"Iteration: 150000 b: [-0.47501633] loss: 3.2186909 test loss: 4.0737057\n",
"Iteration: 160000 b: [-0.5252213] loss: 3.218436 test loss: 4.074762\n",
"Iteration: 170000 b: [-0.5724996] loss: 3.2182102 test loss: 4.0757833\n",
"Iteration: 180000 b: [-0.6170425] loss: 3.2180107 test loss: 4.0767508\n",
"Iteration: 190000 b: [-0.658967] loss: 3.2178338 test loss: 4.077673\n",
"For 0.05 loss 3.2176766 test loss: 4.0785604\n",
"Iteration: 0 b: [-0.6241921] loss: 170.1068 test loss: 152.6357\n",
"Iteration: 10000 b: [-0.7920006] loss: 3.2010643 test loss: 4.074972\n",
"Iteration: 20000 b: [-0.8306458] loss: 3.1915178 test loss: 4.080595\n",
"Iteration: 30000 b: [-0.86061925] loss: 3.1909919 test loss: 4.082712\n",
"Iteration: 40000 b: [-0.8882508] loss: 3.190871 test loss: 4.0836215\n",
"Iteration: 50000 b: [-0.91441077] loss: 3.1907947 test loss: 4.0843105\n",
"Iteration: 60000 b: [-0.9391751] loss: 3.1907315 test loss: 4.0849485\n",
"Iteration: 70000 b: [-0.9625621] loss: 3.1906757 test loss: 4.085537\n",
"Iteration: 80000 b: [-0.98465955] loss: 3.1906264 test loss: 4.0860972\n",
"Iteration: 90000 b: [-1.0055116] loss: 3.1905825 test loss: 4.0866227\n",
"Iteration: 100000 b: [-1.0252115] loss: 3.1905434 test loss: 4.0871005\n",
"Iteration: 110000 b: [-1.043818] loss: 3.190508 test loss: 4.0875807\n",
"Iteration: 120000 b: [-1.0614088] loss: 3.1904774 test loss: 4.088039\n",
"Iteration: 130000 b: [-1.0780828] loss: 3.190449 test loss: 4.088484\n",
"Iteration: 140000 b: [-1.0935808] loss: 3.190425 test loss: 4.0888925\n",
"Iteration: 150000 b: [-1.1082572] loss: 3.1904025 test loss: 4.0892806\n",
"Iteration: 160000 b: [-1.1222589] loss: 3.190383 test loss: 4.089652\n",
"Iteration: 170000 b: [-1.1353719] loss: 3.1903656 test loss: 4.090003\n",
"Iteration: 180000 b: [-1.1476579] loss: 3.1903505 test loss: 4.0903416\n",
"Iteration: 190000 b: [-1.1595788] loss: 3.1903367 test loss: 4.090666\n",
"For 0.025 loss 3.1903245 test loss: 4.090942\n",
"Iteration: 0 b: [0.15676336] loss: 144.92862 test loss: 134.40892\n",
"Iteration: 10000 b: [0.09477637] loss: 3.195157 test loss: 4.098688\n",
"Iteration: 20000 b: [0.01872106] loss: 3.1827314 test loss: 4.070593\n",
"Iteration: 30000 b: [-0.05890947] loss: 3.1812282 test loss: 4.0682683\n",
"Iteration: 40000 b: [-0.13202393] loss: 3.1805384 test loss: 4.068948\n",
"Iteration: 50000 b: [-0.20061804] loss: 3.1800377 test loss: 4.0702057\n",
"Iteration: 60000 b: [-0.26512927] loss: 3.179614 test loss: 4.071502\n",
"Iteration: 70000 b: [-0.32593107] loss: 3.179241 test loss: 4.072769\n",
"Iteration: 80000 b: [-0.38330692] loss: 3.1789086 test loss: 4.0740113\n",
"Iteration: 90000 b: [-0.43748882] loss: 3.178612 test loss: 4.0751834\n",
"Iteration: 100000 b: [-0.48866636] loss: 3.1783476 test loss: 4.0762906\n",
"Iteration: 110000 b: [-0.5370163] loss: 3.1781113 test loss: 4.077369\n",
"Iteration: 120000 b: [-0.5827066] loss: 3.1779006 test loss: 4.0784044\n",
"Iteration: 130000 b: [-0.6258498] loss: 3.1777117 test loss: 4.0794106\n",
"Iteration: 140000 b: [-0.66662866] loss: 3.177544 test loss: 4.08035\n",
"Iteration: 150000 b: [-0.7051428] loss: 3.1773942 test loss: 4.0812435\n",
"Iteration: 160000 b: [-0.7415522] loss: 3.1772606 test loss: 4.08213\n",
"Iteration: 170000 b: [-0.7759304] loss: 3.177141 test loss: 4.0829687\n",
"Iteration: 180000 b: [-0.808414] loss: 3.1770341 test loss: 4.083767\n",
"Iteration: 190000 b: [-0.8391069] loss: 3.1769383 test loss: 4.084516\n",
"For 0.0125 loss 3.1768537 test loss: 4.085215\n",
"Iteration: 0 b: [-0.10906486] loss: 40.825893 test loss: 26.098883\n",
"Iteration: 10000 b: [-0.16230181] loss: 3.1807606 test loss: 4.1318903\n",
"Iteration: 20000 b: [-0.2203647] loss: 3.173818 test loss: 4.0850487\n",
"Iteration: 30000 b: [-0.27953464] loss: 3.172482 test loss: 4.076399\n",
"Iteration: 40000 b: [-0.33732593] loss: 3.1719093 test loss: 4.0753284\n",
"Iteration: 50000 b: [-0.39283016] loss: 3.1715364 test loss: 4.0759444\n",
"Iteration: 60000 b: [-0.4457304] loss: 3.171236 test loss: 4.0769415\n",
"Iteration: 70000 b: [-0.49595383] loss: 3.1709757 test loss: 4.0780044\n",
"Iteration: 80000 b: [-0.5435349] loss: 3.1707451 test loss: 4.079071\n",
"Iteration: 90000 b: [-0.58858305] loss: 3.1705394 test loss: 4.0800667\n",
"Iteration: 100000 b: [-0.63118804] loss: 3.1703556 test loss: 4.0810866\n",
"Iteration: 110000 b: [-0.67146194] loss: 3.1701913 test loss: 4.082033\n",
"Iteration: 120000 b: [-0.70955485] loss: 3.1700442 test loss: 4.082931\n",
"Iteration: 130000 b: [-0.7455879] loss: 3.169913 test loss: 4.0838027\n",
"Iteration: 140000 b: [-0.7796626] loss: 3.1697958 test loss: 4.0846543\n",
"Iteration: 150000 b: [-0.81186295] loss: 3.1696908 test loss: 4.085453\n",
"Iteration: 160000 b: [-0.8422874] loss: 3.1695971 test loss: 4.0862217\n",
"Iteration: 170000 b: [-0.8710561] loss: 3.1695132 test loss: 4.0869284\n",
"Iteration: 180000 b: [-0.8983028] loss: 3.1694386 test loss: 4.0876145\n",
"Iteration: 190000 b: [-0.9240264] loss: 3.1693714 test loss: 4.0882893\n",
"For 0.00625 loss 3.1693115 test loss: 4.088914\n",
"Iteration: 0 b: [-0.43576062] loss: 53.034683 test loss: 54.937252\n",
"Iteration: 10000 b: [-0.45155224] loss: 3.1813805 test loss: 4.0250125\n",
"Iteration: 20000 b: [-0.5018592] loss: 3.16776 test loss: 4.058835\n",
"Iteration: 30000 b: [-0.5501913] loss: 3.167012 test loss: 4.0748925\n",
"Iteration: 40000 b: [-0.59541875] loss: 3.1667643 test loss: 4.0798554\n",
"Iteration: 50000 b: [-0.6378789] loss: 3.1665769 test loss: 4.081822\n",
"Iteration: 60000 b: [-0.67789906] loss: 3.1664147 test loss: 4.083018\n",
"Iteration: 70000 b: [-0.7156745] loss: 3.1662703 test loss: 4.0840073\n",
"Iteration: 80000 b: [-0.7513331] loss: 3.1661422 test loss: 4.0849085\n",
"Iteration: 90000 b: [-0.7850432] loss: 3.166027 test loss: 4.085758\n",
"Iteration: 100000 b: [-0.81690955] loss: 3.1659243 test loss: 4.0865517\n",
"Iteration: 110000 b: [-0.8470394] loss: 3.1658328 test loss: 4.08732\n",
"Iteration: 120000 b: [-0.87556285] loss: 3.1657507 test loss: 4.08803\n",
"Iteration: 130000 b: [-0.90250087] loss: 3.1656773 test loss: 4.088707\n",
"Iteration: 140000 b: [-0.92802626] loss: 3.165611 test loss: 4.089386\n",
"Iteration: 150000 b: [-0.9521409] loss: 3.1655521 test loss: 4.090006\n",
"Iteration: 160000 b: [-0.9749373] loss: 3.1655 test loss: 4.090613\n",
"Iteration: 170000 b: [-0.99650264] loss: 3.1654525 test loss: 4.091197\n",
"Iteration: 180000 b: [-1.0168681] loss: 3.1654105 test loss: 4.091736\n",
"Iteration: 190000 b: [-1.03611] loss: 3.1653726 test loss: 4.0922446\n",
"For 0.003125 loss 3.165339 test loss: 4.0927277\n",
"Iteration: 0 b: [0.6763606] loss: 34.893692 test loss: 34.53244\n",
"Iteration: 10000 b: [0.57032514] loss: 3.1967502 test loss: 4.0974994\n",
"Iteration: 20000 b: [0.45359167] loss: 3.1749637 test loss: 4.069233\n",
"Iteration: 30000 b: [0.348755] loss: 3.1720364 test loss: 4.064789\n",
"Iteration: 40000 b: [0.25270972] loss: 3.1707218 test loss: 4.0648317\n",
"Iteration: 50000 b: [0.1633283] loss: 3.169826 test loss: 4.066045\n",
"Iteration: 60000 b: [0.07948966] loss: 3.169098 test loss: 4.0675116\n",
"Iteration: 70000 b: [0.00053133] loss: 3.1684651 test loss: 4.06899\n",
"Iteration: 80000 b: [-0.07399005] loss: 3.1679049 test loss: 4.0704293\n",
"Iteration: 90000 b: [-0.1443847] loss: 3.1674042 test loss: 4.0718484\n",
"Iteration: 100000 b: [-0.21091746] loss: 3.1669576 test loss: 4.073214\n",
"Iteration: 110000 b: [-0.27381793] loss: 3.1665576 test loss: 4.0745378\n",
"Iteration: 120000 b: [-0.3332975] loss: 3.1661992 test loss: 4.075802\n",
"Iteration: 130000 b: [-0.3895712] loss: 3.165879 test loss: 4.0770187\n",
"Iteration: 140000 b: [-0.4427994] loss: 3.1655927 test loss: 4.0782094\n",
"Iteration: 150000 b: [-0.49314046] loss: 3.165336 test loss: 4.079348\n",
"Iteration: 160000 b: [-0.5407492] loss: 3.1651068 test loss: 4.0804176\n",
"Iteration: 170000 b: [-0.58581525] loss: 3.1649013 test loss: 4.081457\n",
"Iteration: 180000 b: [-0.6284296] loss: 3.1647174 test loss: 4.082472\n",
"Iteration: 190000 b: [-0.66871905] loss: 3.1645536 test loss: 4.083444\n",
"For 0.0015625 loss 3.164406 test loss: 4.0843496\n",
"Iteration: 0 b: [0.65690863] loss: 77.35664 test loss: 91.92238\n",
"Iteration: 10000 b: [0.50615716] loss: 3.2111673 test loss: 3.9104216\n",
"Iteration: 20000 b: [0.41103953] loss: 3.174423 test loss: 4.0245166\n",
"Iteration: 30000 b: [0.31920403] loss: 3.1708555 test loss: 4.0549784\n",
"Iteration: 40000 b: [0.23016323] loss: 3.169586 test loss: 4.0632524\n",
"Iteration: 50000 b: [0.14476846] loss: 3.168727 test loss: 4.06628\n",
"Iteration: 60000 b: [0.06339005] loss: 3.1680202 test loss: 4.0681095\n",
"Iteration: 70000 b: [-0.01390217] loss: 3.167402 test loss: 4.0695944\n",
"Iteration: 80000 b: [-0.08718075] loss: 3.166855 test loss: 4.07102\n",
"Iteration: 90000 b: [-0.15658972] loss: 3.1663651 test loss: 4.0723844\n",
"Iteration: 100000 b: [-0.22228853] loss: 3.1659274 test loss: 4.073701\n",
"Iteration: 110000 b: [-0.28446984] loss: 3.165536 test loss: 4.0750065\n",
"Iteration: 120000 b: [-0.34329548] loss: 3.1651852 test loss: 4.0762815\n",
"Iteration: 130000 b: [-0.3989649] loss: 3.164872 test loss: 4.0774884\n",
"Iteration: 140000 b: [-0.4516338] loss: 3.1645908 test loss: 4.0786767\n",
"Iteration: 150000 b: [-0.5014476] loss: 3.1643398 test loss: 4.079801\n",
"Iteration: 160000 b: [-0.54857534] loss: 3.164115 test loss: 4.080862\n",
"Iteration: 170000 b: [-0.59317803] loss: 3.163914 test loss: 4.0818996\n",
"Iteration: 180000 b: [-0.6353615] loss: 3.163734 test loss: 4.0829086\n",
"Iteration: 190000 b: [-0.67525965] loss: 3.1635725 test loss: 4.083871\n",
"For 0.00078125 loss 3.163428 test loss: 4.084773\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZdxMG39L77cV",
"colab_type": "text"
},
"source": [
"**Fifth attempt**\\\n",
"Let's decrease lambda from 0.1 to 0.05: Loss is 3.0340056\n",
"\n",
"Let's decrease lambda from 0.1 to 0.01: Loss is 2.9808152\n",
"\n",
"Let's decrease lambda from 0.1 to 0.005: Loss is 2.9808152\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vKWw3xp87_Fn",
"colab_type": "code",
"outputId": "8a3a7542-c3e2-45d5-d2ff-7cc628888cd0",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 185
}
},
"source": [
"features = len(df.columns) -1\n",
"x = tf.placeholder(tf.float32, [None, features])\n",
"y_ = tf.placeholder(tf.float32, [None, 1])\n",
"W = tf.Variable(tf.truncated_normal([features,1]))\n",
"b = tf.Variable(tf.truncated_normal([1]))\n",
"y = tf.matmul(x,W) + b\n",
"lambda_ = 0.005\n",
"loss = tf.reduce_mean(tf.pow(y - y_, 2)) + lambda_*tf.nn.l2_loss(W)\n",
"update = tf.train.GradientDescentOptimizer(0.001).minimize(loss)\n",
"data_x = np.array(X_train)\n",
"data_y = np.array(y_train)\n",
"sess = tf.Session()\n",
"sess.run(tf.global_variables_initializer())\n",
"for i in range(0,100000):\n",
" sess.run(update, feed_dict = {x:data_x, y_:data_y})\n",
" if i % 10000 == 0 :\n",
" print('Iteration:' , i , ' b:' , sess.run(b), ' loss:', loss.eval(session=sess, feed_dict = {x:data_x, y_:data_y}))"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Iteration: 0 b: [0.02101899] loss: 23.407375\n",
"Iteration: 10000 b: [-0.07375606] loss: 3.1877348\n",
"Iteration: 20000 b: [-0.1450135] loss: 3.1792014\n",
"Iteration: 30000 b: [-0.21295574] loss: 3.1776085\n",
"Iteration: 40000 b: [-0.2779373] loss: 3.176963\n",
"Iteration: 50000 b: [-0.33976126] loss: 3.1765273\n",
"Iteration: 60000 b: [-0.39832288] loss: 3.176168\n",
"Iteration: 70000 b: [-0.45364642] loss: 3.1758544\n",
"Iteration: 80000 b: [-0.5058221] loss: 3.1755779\n",
"Iteration: 90000 b: [-0.5550226] loss: 3.175332\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CIRp8LszLKLI",
"colab_type": "text"
},
"source": [
"**Neural Network**\n",
"\n",
"Adding 1 layer with 10 nodes, learning reate = 0.001, loss = 0.25101364"
]
},
{
"cell_type": "code",
"metadata": {
"id": "QQIkOr0RLTeP",
"colab_type": "code",
"outputId": "320f5684-07a8-4938-9495-37500b27bfee",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 428
}
},
"source": [
"features = len(df.columns) -1\n",
"hidden_layer_nodes = 10\n",
"x = tf.placeholder(tf.float32, [None, features])\n",
"y_ = tf.placeholder(tf.float32, [None, 1])\n",
"\n",
"W1 = tf.Variable(tf.truncated_normal([features,hidden_layer_nodes], stddev=0.1))\n",
"b1 = tf.Variable(tf.constant(0.1, shape=[hidden_layer_nodes]))\n",
"z1 = tf.matmul(x,W1) + b1\n",
"a1 = tf.nn.relu(z1)\n",
"\n",
"W2 = tf.Variable(tf.truncated_normal([hidden_layer_nodes,1], stddev=0.1))\n",
"b2 = tf.Variable(0.)\n",
"z2 = tf.matmul(a1,W2) + b2\n",
"y = tf.nn.relu(z2)\n",
"\n",
"loss_vector=[]\n",
"loss = tf.reduce_mean(tf.pow(y - y_, 2))\n",
"update = tf.train.GradientDescentOptimizer(0.001).minimize(loss)\n",
"data_x = np.array(X_train)\n",
"data_y = np.array(y_train)\n",
"\n",
"sess = tf.Session()\n",
"sess.run(tf.global_variables_initializer())\n",
"for i in range(0,100000):\n",
" sess.run(update, feed_dict = {x:data_x, y_:data_y})\n",
" if i % 5000 == 0 :\n",
" loss_vector.append(loss.eval(session=sess, feed_dict = {x:data_x, y_:data_y}))\n",
" print('Iteration:' , i , ' loss:', loss_vector[-1])\n"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/math_grad.py:1375: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
"Iteration: 0 loss: 94.01231\n",
"Iteration: 5000 loss: 2.344067\n",
"Iteration: 10000 loss: 1.1089563\n",
"Iteration: 15000 loss: 0.7573769\n",
"Iteration: 20000 loss: 0.55701417\n",
"Iteration: 25000 loss: 0.44538024\n",
"Iteration: 30000 loss: 0.39102012\n",
"Iteration: 35000 loss: 0.35623863\n",
"Iteration: 40000 loss: 0.35248277\n",
"Iteration: 45000 loss: 0.33374956\n",
"Iteration: 50000 loss: 0.3080824\n",
"Iteration: 55000 loss: 0.29250553\n",
"Iteration: 60000 loss: 0.32490906\n",
"Iteration: 65000 loss: 0.30972072\n",
"Iteration: 70000 loss: 0.28366655\n",
"Iteration: 75000 loss: 0.29444805\n",
"Iteration: 80000 loss: 0.27667034\n",
"Iteration: 85000 loss: 0.2610112\n",
"Iteration: 90000 loss: 0.27040717\n",
"Iteration: 95000 loss: 0.25101364\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hcJrNEf1Dijy",
"colab_type": "text"
},
"source": [
"**Plot - Loss across the epochs**\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "yy16FhYBDiHX",
"colab_type": "code",
"outputId": "8b260c7d-2c78-4d96-c9fa-399ea45e86d2",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
}
},
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot(np.arange(0, 100000, 5000), loss_vector)\n",
"plt.axis([0, 100000, 0, 1])\n",
"plt.title('Loss across ephocs')\n",
"plt.xlabel('Epochs')\n",
"plt.ylabel('Loss')\n",
"plt.show()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IzHDpxkXRlkH",
"colab_type": "text"
},
"source": [
"**Prediction:**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "pUH7GT4RRoUr",
"colab_type": "code",
"outputId": "a0780c73-0b46-4bc2-a590-e6298fc3222a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
}
},
"source": [
"test_x = np.array(X_test)\n",
"test_y = np.array(y_test)\n",
"test_size = len(test_y)\n",
"vector_prediction=[]\n",
"vector_loss = []\n",
"\n",
"for i in range(0, test_size):\n",
" z1 = np.matmul(test_x[i],sess.run(W1)) + sess.run(b1)\n",
" a1 = tf.nn.relu(z1)\n",
" z2 = np.matmul(a1.eval(session=sess),sess.run(W2)) + sess.run(b2)\n",
" y = tf.nn.relu(z2)\n",
"\n",
" prediction = y.eval(session=sess)[0]\n",
" vector_prediction.append(prediction)\n",
" vector_loss.append(pow(prediction - test_y[i][0], 2))\n",
" print('prediction:', prediction, ', actual: ', test_y[i])"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"prediction: 17.17098186415044 , actual: [16]\n",
"prediction: 15.284719617419961 , actual: [14]\n",
"prediction: 15.472399932449868 , actual: [15]\n",
"prediction: 10.119393574428477 , actual: [10]\n",
"prediction: 13.11868190485415 , actual: [14]\n",
"prediction: 12.136621818235927 , actual: [13]\n",
"prediction: 9.835002321637374 , actual: [10]\n",
"prediction: 12.234368354904598 , actual: [10]\n",
"prediction: 5.352030190692695 , actual: [6]\n",
"prediction: 12.030259633493149 , actual: [13]\n",
"prediction: 6.384850374966333 , actual: [6]\n",
"prediction: 17.528959128201578 , actual: [18]\n",
"prediction: 11.430737324315018 , actual: [10]\n",
"prediction: 15.772734025956233 , actual: [15]\n",
"prediction: 10.40165388038271 , actual: [11]\n",
"prediction: 9.260631604225754 , actual: [8]\n",
"prediction: 11.894481165613955 , actual: [11]\n",
"prediction: 10.519187134201509 , actual: [11]\n",
"prediction: 10.416406549400657 , actual: [9]\n",
"prediction: 8.80564328017319 , actual: [0]\n",
"prediction: 10.127064251317234 , actual: [10]\n",
"prediction: 12.285135786392033 , actual: [13]\n",
"prediction: 9.175045713214464 , actual: [7]\n",
"prediction: 15.285894919513531 , actual: [14]\n",
"prediction: 14.357842377424559 , actual: [14]\n",
"prediction: 3.681873434578938 , actual: [7]\n",
"prediction: 17.071199951294926 , actual: [15]\n",
"prediction: 15.913472638633392 , actual: [17]\n",
"prediction: 15.02185117937297 , actual: [15]\n",
"prediction: 10.135609520722596 , actual: [9]\n",
"prediction: 12.424829954427441 , actual: [13]\n",
"prediction: 10.486716648774571 , actual: [9]\n",
"prediction: 7.265451504129585 , actual: [8]\n",
"prediction: 5.154335941737388 , actual: [6]\n",
"prediction: 9.510957178675973 , actual: [9]\n",
"prediction: 5.188685318680022 , actual: [6]\n",
"prediction: 9.761349954066288 , actual: [10]\n",
"prediction: 8.795184669798502 , actual: [6]\n",
"prediction: 0.0 , actual: [0]\n",
"prediction: 14.150427638886443 , actual: [13]\n",
"prediction: 13.145263682056662 , actual: [15]\n",
"prediction: 14.63330148381505 , actual: [15]\n",
"prediction: 13.030481246007467 , actual: [14]\n",
"prediction: 13.15890021892893 , actual: [13]\n",
"prediction: 11.148499956419332 , actual: [13]\n",
"prediction: 0.0 , actual: [0]\n",
"prediction: 11.712055033470177 , actual: [11]\n",
"prediction: 15.76826729042623 , actual: [15]\n",
"prediction: 12.41885889029923 , actual: [13]\n",
"prediction: 12.462803459150262 , actual: [12]\n",
"prediction: 13.033639419508617 , actual: [13]\n",
"prediction: 12.268767855188962 , actual: [13]\n",
"prediction: 11.5959932834503 , actual: [13]\n",
"prediction: 17.1226906977578 , actual: [15]\n",
"prediction: 18.08481201537005 , actual: [18]\n",
"prediction: 10.369978092775437 , actual: [9]\n",
"prediction: 13.47069408090981 , actual: [12]\n",
"prediction: 14.17406930457919 , actual: [10]\n",
"prediction: 11.17645431085316 , actual: [11]\n",
"prediction: 7.52066182224147 , actual: [8]\n",
"prediction: 12.226486052702091 , actual: [11]\n",
"prediction: 11.223870181952208 , actual: [11]\n",
"prediction: 9.754602651576091 , actual: [9]\n",
"prediction: 9.708607753750167 , actual: [8]\n",
"prediction: 13.728317547609734 , actual: [12]\n",
"prediction: 12.122651296527208 , actual: [10]\n",
"prediction: 4.463916022867091 , actual: [5]\n",
"prediction: 7.885359983954856 , actual: [11]\n",
"prediction: 14.316341886953513 , actual: [15]\n",
"prediction: 8.98231996703507 , actual: [0]\n",
"prediction: 14.758150417818635 , actual: [14]\n",
"prediction: 12.214876500745973 , actual: [11]\n",
"prediction: 11.201560559055942 , actual: [10]\n",
"prediction: 5.969621792643091 , actual: [8]\n",
"prediction: 13.490748607742553 , actual: [13]\n",
"prediction: 19.246115773758763 , actual: [18]\n",
"prediction: 0.0 , actual: [0]\n",
"prediction: 12.393307786251725 , actual: [11]\n",
"prediction: 9.165018681976616 , actual: [10]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "qJ45OGibcJLW",
"colab_type": "code",
"outputId": "97e7584f-5ac2-4933-ea36-a40e79444885",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 573
}
},
"source": [
"plt.plot(np.arange(0, test_size, 1), vector_prediction, color='red', label='Prediction')\n",
"plt.plot(np.arange(0, test_size, 1), test_y, color='blue', label='Actual')\n",
"plt.title('Prediction vs Actual')\n",
"plt.xlabel('Student ID')\n",
"plt.ylabel('Grade')\n",
"plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)\n",
"plt.show()\n",
"\n",
"\n",
"plt.plot(np.arange(0, test_size, 1), vector_loss)\n",
"plt.title('Prediction Loss')\n",
"plt.xlabel('Student ID')\n",
"plt.ylabel('Loss - squered Error')\n",
"plt.show()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment