{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "## * What is Data Science?\n", " - Intersection of CS/IT + Maths/Stats + Domain/Business Knowledge\n", " - togethre its data science\n", "\n", "##* What is Analytics?\n", " - Descriptive (ANOVA)\n", " - Predictive (LR)\n", " - Prescriptive (LPP)\n", "\n", "## * What is AI?\n", " - include => learning + reasoning + self correction + simulation\n", " - E.g. driver less cars\n", " * What can it do? \n", " - Answer info\n", " - watch health\n", " - deliver groceries\n", " - breakthrough genomics\n", " * what it cannot do?\n", " - human level general intelligence\n", "\n", "## * What is ML?\n", " - in 1959 Arthur Samuel defined it as \"Field of study that gives computers the ability to learn without being explicitly programmed”\n", " - it can be called as \"the effort to automate intellectual tasks normally performed by humans\"\n", " - in classical programming we input Rules+Data to get Answers while in ML programming we input Data+Answers to get Rules \n", "\n", "## * Where is ML used? \n", " - Medicine\n", " - National Security\n", " - from a list of customers which will respond?\n", " - which customers are likely to commit fraud?\n", "\n", "## * Role of ML\n", " - to aid to achieve AI\n", " - driven by maths concepts\n", " - analyse patterns in captured data to build predictive model on existing phenomena in business\n", " - broadly there are 3 types of ML algorithms\n", " 1. Supervised \n", " 2. Unsupervised \n", " 3. Re-inforcement " ], "metadata": { "id": "Bb_rhylYOXWJ" } }, { "cell_type": "markdown", "source": [ "## Types of ML\n", "1. Supervised\n", "2. Unsupervised\n", "\n", "## Supervised\n", "* when the response variable is numerical, then the predictive modeling is called regression\n", "* when the response variable is categorical, the model is called classification \n", "\n", " ### * Example of Regression:\n", " * Sales are influenced by variables like adv expenses, costs, dealers cost etc.\n", " \n", " Sales = function(Adv. Exp, Manpower, Cost, Dealers...)\n", "\n", " ### * Example of Classification: \n", " * Customer may buy/not buy, patient may die/not die\n", "\n", " Prob(Cust Purchase) = function(Age, Income, Residence...)\n", "\n", " Prob(Cust defaults) = function(Expense, Taxes, Charges...)\n", "\n", " ### * Algorithms of Supervised Learning:\n", "\n", " 1. Linear Regression\n", " 2. Regression Trees\n", " 3. Non-Linear Regression\n", " 4. Bayesian Linear Regression\n", " 5. Polynomial Regression\n", "\n", "## UnSupervised\n", "* there is no outcome or y \n", "\n", " ### * Algorithms of Unsupervised Learning:\n", " 1. Clustering\n", " 2. PCA\n", " 3. Association Rules\n", "\n", "## Lifecycle of any ML project\n", "1. Define the scope\n", "2. Collect/ Extract the Data\n", "3. Train an appropriate ML Model and Evaluate it\n", "4. Deploy the Model\n", "5. Collect feedback and backtrack with new inputs to make changes to Model and re-Deploy\n", "\n", "## Types of predicted values\n", " * ### categorical\n", " * we use classiication confusion matrix\n", " * ### numerical \n", " * we use algorithms\n", "\n", "\n" ], "metadata": { "id": "DPSAjMAsPVeK" } }, { "cell_type": "code", "source": [ "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "from sklearn.decomposition import PCA\n", "from sklearn.preprocessing import StandardScaler\n", "from google.colab import drive\n", "import matplotlib.pyplot as plt\n", "drive.mount('/content/gdrive')" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Bf57lIcNUgtR", "outputId": "3943e175-dfcc-4e33-83bb-d3e0f4ddaec6" }, "execution_count": 2, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Drive already mounted at /content/gdrive; to attempt to forcibly remount, call drive.mount(\"/content/gdrive\", force_remount=True).\n" ] } ] }, { "cell_type": "code", "source": [ "mowers_path = '/content/gdrive/MyDrive/Datasets/RidingMowers.csv'\n", "mowers = pd.read_csv(mowers_path)\n", "with plt.style.context('seaborn-whitegrid'):\n", " fig_size = plt.rcParams[\"figure.figsize\"]\n", " fig_size[0] = 12 # X scaling of fig \n", " fig_size[1] = 8 # Y scaling of fig\n", " sns.scatterplot(data = mowers, x = 'Income', y = 'Lot_Size', hue = 'Response')\n", " plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 493 }, "id": "lDx2MwjQUvXf", "outputId": "d95fd2b3-486f-4579-912f-cf7363c8897f" }, "execution_count": 8, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAs4AAAHcCAYAAADGGiwhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3hUZdrH8W9674WQQEIIAoEAEhBRQVRQUFdFUREFUbEulnXtuPZV3F13XdurK8KKIIIiWLF3LCBFpIReU0jvvb1/nCUhzACBTOZM+X2uay44d05O7syZwJ1n7ud5PJqbm5sREREREZEj8jQ7ARERERERZ6DCWURERESkHVQ4i4iIiIi0gwpnEREREZF2UOEsIiIiItIO3mYn0F6rV682OwURERERcQNDhgyxGneawhkO/01I58vIyCA1NdXsNOQ46N45L90756T75rx075yXLe/dkQZr1aohIiIiItIOKpxFRERERNpBhbOIiIiISDuocBYRERERaQcVziIiIiIi7aDCWURERESkHVQ4i4iIiIi0gwpnEREREZF2cKoNUOwhMzOTCy64gLS0NADq6uro3bs3jz76KF5eXiZnJyIiIiJm0YizFcnJycybN4958+axaNEi6uvr+fDDD81OS0RERERMpBHndhg4cCB79uzhzTff5MMPP8TT05MxY8Zw3XXXsWnTJh577DF8fX3x9fXl2WefZe7cuezfv5+cnBzy8/O55557OP3001m2bBmvv/46Xl5e9O/fn7/85S+88MILlJeXs2vXLvbu3cuMGTMYNWoUf/3rX9mwYQONjY1MmjSJSy65hM8//5w5c+bg7e1NWloa999/v9lPjYiIiIjbUOF8FPX19Xz11VeMHDmSTz/9lLfeeguASZMmMW7cOJYsWcKkSZMYP348P//8M/n5+QDk5uYyZ84ctmzZwn333ceQIUN49tlnee+99wgKCuLmm2/ml19+AWD//v3MmjWL77//noULFzJo0CC+/fZbvvzyS+rr61m6dCmVlZW8/PLLLFq0CF9fX+644w5Wr17NkCFDTHtuRERERNyJCmcrdu3axZQpUwDYsmUL119/PbGxsezZs4err74agMrKSrKyshg9ejSPPvoou3fv5rzzziMlJQWAU045BYA+ffqQm5vL7t27SUpKIigoCIBhw4aR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MDgTEREREfUDgzMRERERUT8wOBMRERER9QODMxERERFRPzA4ExERERH1A4MzEREREVE/MDgTEREREfUDgzMRERERUT8IvF6vN9xN9MeWLVvC3QIRERERDQJjx471W4+a4ExEREREFE6cqkFERERE1A8MzkRERERE/cDgTERERETUD+JwN0CRy2az4YILLsBtt92GyZMn495774Xb7YbBYMBTTz0FqVQa7hbpZzZu3Ii77roLQ4YMAQAUFhZiwYIFvHdRYuXKlVi0aBHEYjHuvPNOFBUV8d5FuA8++AArV67sebx7924sXboUDz74IACgqKgIDz30UJi6oxMxm82477770NHRAafTiYULF8JgMPDeRQGPx4O//OUvOHjwICQSCR588EEolcqQ/Lzk4kDq0z/+8Q98//33mD9/PjZt2oQZM2bg3HPPxdNPP42UlBTMmzcv3C3Sz2zcuBGLFy/Gc88911P7wx/+wHsXBYxGI6688kp8+OGHsFgseP755+FyuXjvosiPP/6IL774AuXl5fj973+PESNG4J577sFFF12EmTNnhrs9+pn33nsPjY2NuOeee9DY2Ihrr70WBoOB9y4KfPXVV/jss8/wzDPP4MiRI3jssccQHx8fkp+XnKpBflVUVKC8vByzZs0C0B3IzjzzTADA7NmzsX79+jB2R6eC9y46rF+/HpMnT4ZarUZSUhIeeeQR3rso8+KLL+LGG29EbW0tRowYAYD3LZLFxcWhvb0dAGAymaDX63nvokRVVVXPfcrKykJdXV3Ifl4yOJNff/3rX3H//ff3PLZarT0feSQkJKC5uTlcrdFJlJeX45ZbbsFVV12FH374gfcuStTU1MBms+GWW27BvHnzsH79et67KLJz506kpqbi/9u7v5Cm3gCM41/3r3DURekMZxkLqiW1ii4qFl1UkBVEwihI7KqoHIX9NanuqhsJoa6qQUJQiJUVBBMCiS4UamlljIhuTo6kplEWTc+2LoLxK+XXbtIdeD5X87x6eA8Pe33YebfZ7XZmzpyZO67cCtfWrVtJJBJs2rSJ2tpaTpw4oewsYuHChTx58oR0Os27d+8wDIOBgYFJWS+1x1nG6ejoYPny5cydO3fCce3uKVzz588nHA5TXV2NYRjU1dWRTqdz48qusH3+/JnLly+TSCSoq6v7LS9lV9ja29vZsWPHuOPKrXDdu3eP8vJyIpEI8Xic+vp6ZsyYkRtXdoVr/fr1xGIxdu/ezaJFi/D5fLx58yY3/i+zU3GWcbq6ujAMg66uLj58+IDL5aK4uJgfP34wffp0BgcH8Xg8Uz1NmUBZWRlbtmwBft2+Kikp4eXLl8rOAmbPns2KFStwOBzMmzcPt9uN3W5XdhbR09PD6dOnKSoqyt3+B5RbAYvFYgSDQQAWL15MKpXCNM3cuLIrbA0NDbnHGzdupKysbFLWS23VkHFaWlq4ffs2bW1thEIhDh48yNq1a4lGowB0dnaybt26KZ6lTOT+/ftEIhEAPn78SDKZpKamRtlZQDAYpLu7m0wmw/DwMN+/f9fzziIGBwdxu924XC6cTic+n4+nT58Cyq2QVVZW0tfXB8DAwABut5sFCxYoOwuIx+OcOnUKgMePH7NkyZJJWy/1qRryvy5duoTX6yUYDHLy5ElSqRTl5eVcuHABp9M51dOTP4yMjHDs2DG+fPnC2NgY4XAYv9+v7Czi1q1btLe3A3DgwAGWLl2q7Czg1atXtLS0cO3aNeDX+wzOnj1LJpMhEAjk/sFLYfn27RtNTU0kk0lM0+Tw4cOUlpYqOwvIZDI0NTXx9u1bpk2bRnNzM3a7fVLWSxVnEREREZE8aKuGiIiIiEgeVJxFRERERPKg4iwiIiIikgcVZxERERGRPKg4i4iIiIjkQcVZRKSAvX//npqamqmehoiIoOIsIiIiIpIXfeW2iIgFNDY24vF46O/vJ5FI0NzcTFVVFVevXiUajWKz2Thy5AirV6+mtbWVhw8fArBhwwb27dtHY2Mjs2bNor+/n6GhIfbu3cudO3cYHh7mxo0bFBcXc+bMGQzDwDRNDh06xJo1a6b4qkVECouKs4iIRYyOjhKJRLh58yYdHR243W6i0ShtbW0YhsGVK1fwer3cvXs39w2EoVCIzZs3A+BwOGhtbeXo0aM8f/6c69evc/z4cXp6ehgZGaG0tJTz588zNDTEnj17ePDgwVRerohIwVFxFhGxiFWrVgEwZ84cXrx4wevXrwkEAthsNiorKzl37hydnZ0EAgEcjl/L+8qVK4nH4wAsW7YMAI/Hg8/nA6CkpISvX7/S29vLs2fPiMViAKRSKUZHR3G5XJN9mSIiBUvFWUTEIux2e+5xNpvFbreTyWR++52ioiKy2Wzu57GxMWw227i///NcTqeT/fv3s23btn81fRERy9ObA0VELKqqqopYLIZpmnz69In6+nr8fj+9vb2YpolpmvT19eH3+/96rkAgwKNHjwBIJpNcvHjxX09fRMRy9IqziIhFVVRUsH37dmpra8lmszQ0NFBRUcHOnTtzx0KhEF6v96/nqq6upru7m127dpFOpwmHw5NwBSIi1lKU/e89PRERERERmZC2aoiIiIiI5EHFWUREREQkDyrOIiIiIiJ5UHEWEREREcmDirOIiIiISB5UnEVERERE8qDiLCIiIiKSh5+t5ltbHQMF+wAAAABJRU5ErkJggg==\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import confusion_matrix, r2_score, f1_score, accuracy_score, classification_report\n", "# create dummy\n", "# train test split\n", "# go for knn\n", "# test and conclude\n", "dum_mow =pd.get_dummies(mowers,drop_first=True)\n", "\n", "X = dum_mow.drop('Response_Not Bought',axis=1)\n", "y= dum_mow['Response_Not Bought']\n", "X_train,X_test,y_train,y_test= train_test_split(X,y,stratify=y,random_state=2022,train_size=0.7)\n", "\n", "knn= KNeighborsClassifier(n_neighbors=3)\n", "knn.fit(X_train,y_train)\n", "\n", "y_pred= knn.predict(X_test)\n", "\n", "print(confusion_matrix(y_test,y_pred))\n", "print(accuracy_score(y_test,y_pred))\n", "print(classification_report(y_test,y_pred))\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JBjB_wYde32n", "outputId": "5b5cb727-19d1-4ab6-f226-be248ef5025b" }, "execution_count": 20, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[22 0]\n", " [ 1 32]]\n", "0.9818181818181818\n", " precision recall f1-score support\n", "\n", " 0 0.96 1.00 0.98 22\n", " 1 1.00 0.97 0.98 33\n", "\n", " accuracy 0.98 55\n", " macro avg 0.98 0.98 0.98 55\n", "weighted avg 0.98 0.98 0.98 55\n", "\n" ] } ] }, { "cell_type": "code", "source": [ "#loop\n", "acc=[]\n", "ks = [x for x in range(1,16) if x%2!=0]\n", "for i in ks:\n", " knn =KNeighborsClassifier(n_neighbors=i)\n", " knn.fit(X_train,y_train)\n", " y_pred = knn.predict(X_test)\n", " acc.append(accuracy_score(y_test,y_pred))\n", "\n", "i_max =np.argmax(acc)\n", "best_k =ks[i_max]\n", "print(\"Best n_neigbors =\",best_k)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4FNWE2DulSqY", "outputId": "21e5e96f-3837-4b0d-bc6f-c146f794f8ae" }, "execution_count": 25, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Best n_neigbors = 3\n" ] } ] }, { "cell_type": "markdown", "source": [ "# Functions:\n", " - roc_auc : helps to draw ROC curve\n", " - roc_auc_score : calculates area under the curve " ], "metadata": { "id": "y9eSYgYb-UXc" } }, { "cell_type": "code", "source": [ "from sklearn.metrics import roc_auc_score\n", "\n", "acc=[]\n", "ks = [x for x in range(1,16) if x%2!=0]\n", "for i in ks:\n", " knn =KNeighborsClassifier(n_neighbors=i)\n", " knn.fit(X_train,y_train)\n", " y_pred_prob = knn.predict_proba(X_test)[:,1]\n", " acc.append(roc_auc_score(y_test,y_pred_prob))\n", "\n", "i_max =np.argmax(acc)\n", "best_k =ks[i_max]\n", "print(\"Best n_neigbors =\",best_k)\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Aayuzq_zp5gs", "outputId": "8298921a-bf06-40b4-f790-4ede8e05b001" }, "execution_count": 32, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Best n_neigbors = 3\n" ] } ] }, { "cell_type": "code", "source": [ "from sklearn.metrics import log_loss\n", "acc=[]\n", "ks = [x for x in range(1,16) if x%2!=0]\n", "for i in ks:\n", " knn =KNeighborsClassifier(n_neighbors=i)\n", " knn.fit(X_train,y_train)\n", " y_pred_prob = knn.predict_proba(X_test)[:,1]\n", " acc.append(-log_loss(y_test,y_pred_prob))\n", "\n", "i_max = np.argmax(acc)\n", "best_k =ks[i_max]\n", "print(\"best n_neigbors =\",best_k)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "thAdHB8lH86L", "outputId": "23a64ba0-8516-476e-ae10-8f9d71b40c08" }, "execution_count": 42, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "best n_neigbors = 15\n" ] } ] }, { "cell_type": "code", "source": [ "from sklearn.neighbors import KNeighborsRegressor\n", "from sklearn.metrics import mean_squared_error\n", "boston_path = '/content/gdrive/MyDrive/Datasets/Boston.csv'\n", "boston = pd.read_csv(boston_path)\n", "X= boston.drop('medv',axis=1)\n", "y= boston['medv']\n", "\n", "X_train, X_test,y_train,y_test= train_test_split(X,y,random_state=2022,train_size=0.7)\n", "acc=[]\n", "ks =np.arange(1,16)\n", "for i in ks:\n", " knn= KNeighborsRegressor(n_neighbors=i)\n", " knn.fit(X_train,y_train)\n", "\n", " y_pred =knn.predict(X_test)\n", " acc.append(-mean_squared_error(y_test,y_pred))\n", "i_max =np.argmax(acc)\n", "best_k =ks[i_max]\n", "print(\"Best n_neighbors =\",best_k)\n", "print(\"Best score =\",acc[i_max])\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "GeQy_XI7OCIx", "outputId": "7bc43384-78d4-4456-dd3f-95ed03999900" }, "execution_count": 53, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Best n_neighbors = 9\n", "Best score = -39.11516325536063\n" ] } ] }, { "cell_type": "code", "source": [ "from sklearn.neighbors import KNeighborsRegressor\n", "from sklearn.metrics import mean_squared_error\n", "boston_path = '/content/gdrive/MyDrive/Datasets/Boston.csv'\n", "boston = pd.read_csv(boston_path)\n", "X= boston.drop('medv',axis=1)\n", "y= boston['medv']\n", "\n", "X_train, X_test,y_train,y_test= train_test_split(X,y,random_state=2022,train_size=0.7)\n", "acc=[]\n", "ks =np.arange(1,16)\n", "for i in ks:\n", " knn= KNeighborsRegressor(n_neighbors=i)\n", " knn.fit(X_train,y_train)\n", "\n", " y_pred =knn.predict(X_test)\n", " acc.append(r2_score(y_test,y_pred))\n", "i_max =np.argmax(acc)\n", "best_k =ks[i_max]\n", "print(\"Best n_neighbors =\",best_k)\n", "print(\"Best score =\",acc[i_max])\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "uZNe4b3-T0LX", "outputId": "f688dad7-f011-4c95-9597-6b032c1b6e6e" }, "execution_count": 54, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Best n_neighbors = 9\n", "Best score = 0.5433824716755711\n" ] } ] }, { "cell_type": "code", "source": [ "scaler = StandardScaler()\n", "scaler.fit(X_train)\n", "X_trn_scl =scaler.transform(X_train)\n", "X_tst_scl =scaler.transform(X_test)\n", "acc=[]\n", "ks =np.arange(1,16)\n", "for i in ks:\n", " knn= KNeighborsRegressor(n_neighbors=i)\n", " knn.fit(X_trn_scl,y_train)\n", " y_pred =knn.predict(X_tst_scl)\n", " acc.append(r2_score(y_test,y_pred))\n", "\n", "i_max =np.argmax(acc)\n", "best_k =ks[i_max]\n", "print(\"Best n_neighbors =\",best_k)\n", "print(\"Best score =\",acc[i_max])\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sWnO14h2XXo2", "outputId": "d2ac5e4f-41c1-4bb5-e1e8-d58537f4ba8a" }, "execution_count": 58, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Best n_neighbors = 4\n", "Best score = 0.8398330163891028\n" ] } ] }, { "cell_type": "code", "source": [ "# without scaling\n", "concrete_path = '/content/gdrive/MyDrive/Datasets/Concrete_Data.csv'\n", "concrete = pd.read_csv(concrete_path)\n", "X= concrete.drop('Strength',axis=1)\n", "y= concrete['Strength']\n", "\n", "X_train, X_test,y_train,y_test= train_test_split(X,y,random_state=2022,train_size=0.7)\n", "acc=[]\n", "ks =np.arange(1,16)\n", "for i in ks:\n", " knn= KNeighborsRegressor(n_neighbors=i)\n", " knn.fit(X_train,y_train)\n", " y_pred =knn.predict(X_test)\n", " acc.append(r2_score(y_test,y_pred))\n", "\n", "i_max =np.argmax(acc)\n", "best_k =ks[i_max]\n", "print(\"Best n_neighbors =\",best_k)\n", "print(\"Best score =\",acc[i_max])\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Mqr4nzqUaMvy", "outputId": "8532003e-dc27-4395-81af-26b199434e94" }, "execution_count": 62, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Best n_neighbors = 2\n", "Best score = 0.712527052078325\n" ] } ] }, { "cell_type": "code", "source": [ "# with scaling\n", "concrete_path = '/content/gdrive/MyDrive/Datasets/Concrete_Data.csv'\n", "concrete = pd.read_csv(concrete_path)\n", "X= concrete.drop('Strength',axis=1)\n", "y= concrete['Strength']\n", "\n", "X_train, X_test,y_train,y_test= train_test_split(X,y,random_state=2022,train_size=0.7)\n", "scaler = StandardScaler()\n", "scaler.fit(X_train)\n", "X_trn_scl =scaler.transform(X_train)\n", "X_tst_scl =scaler.transform(X_test)\n", "acc=[]\n", "ks =np.arange(1,16)\n", "for i in ks:\n", " knn= KNeighborsRegressor(n_neighbors=i)\n", " knn.fit(X_trn_scl,y_train)\n", " y_pred =knn.predict(X_tst_scl)\n", " acc.append(r2_score(y_test,y_pred))\n", "\n", "i_max =np.argmax(acc)\n", "best_k =ks[i_max]\n", "print(\"Best n_neighbors =\",best_k)\n", "print(\"Best score =\",acc[i_max])" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IFLdbPAvaZuR", "outputId": "d6e88dcd-835d-4fa2-e8a9-c62aa957cf3d" }, "execution_count": 63, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Best n_neighbors = 4\n", "Best score = 0.7273783938643456\n" ] } ] }, { "cell_type": "code", "source": [ "from sklearn.model_selection import StratifiedKFold\n", "from sklearn.model_selection import cross_val_score\n", "\n", "mowers_path = '/content/gdrive/MyDrive/Datasets/RidingMowers.csv'\n", "mowers = pd.read_csv(mowers_path)\n", "\n", "dum_mow =pd.get_dummies(mowers,drop_first=True)\n", "X= dum_mow.drop('Response_Not Bought',axis=1)\n", "y =dum_mow['Response_Not Bought']\n", "\n", "knn = KNeighborsClassifier(n_neighbors=3)\n", "kfold = StratifiedKFold(n_splits=5, shuffle=True,random_state=2022)\n", "\n", "#accuracy\n", "cross_val_score(knn,X,y,cv =kfold)\n", "\n", "#roc auc\n", "result = cross_val_score(knn,X,y,cv=kfold,scoring='roc_auc')\n", "print(result.mean())\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xQPMLOXTkf4-", "outputId": "f12bde50-d240-4cc3-e2d1-f09f4d7253ec" }, "execution_count": 68, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "0.9353391053391054\n" ] } ] }, { "cell_type": "code", "source": [ "acc=[]\n", "kfold = StratifiedKFold(n_splits=5, shuffle=True,random_state=2022)\n", "ks=[x for x in range(1,16) if x%2!=0]\n", "for i in ks:\n", " knn = KNeighborsClassifier(n_neighbors=i)\n", " result = cross_val_score(knn,X,y,cv=kfold,scoring='roc_auc')\n", " acc.append(result.mean())\n", "\n", "i_max =np.argmax(acc)\n", "best_k =ks[i_max]\n", "print(\"Best n_neighbors =\",best_k)\n", "print(\"Best Cross Validation Score =\",acc[i_max])" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "vKOiUKwJn7nj", "outputId": "eddbd08d-bb21-4fc2-aba7-4fb84bf267f9" }, "execution_count": 79, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Best n_neighbors = 7\n", "Best Cross Validation Score = 0.9387373737373738\n" ] } ] }, { "cell_type": "code", "source": [ "# Grid Search Cross Validation is even better for complicated algorithms without using the loop method\n", "from sklearn.model_selection import GridSearchCV\n", "ks= np.arange(1,16,2)\n", "parameters = {'n_neighbors':ks}\n", "knn=KNeighborsClassifier()\n", "gcv =GridSearchCV(knn,param_grid=parameters,scoring ='roc_auc',cv=kfold)\n", "gcv.fit(X,y)\n", "print(gcv.best_params_)\n", "print(gcv.best_score_)\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ieah7zTCo9Si", "outputId": "6ff38ece-e82a-4afd-c76b-9a29cd42ccf7" }, "execution_count": 85, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "{'n_neighbors': 7}\n", "0.9387373737373738\n" ] } ] }, { "cell_type": "code", "source": [ "# kfold\n", "# KNeighborsRegressor\n", "# r2_score\n", "# boston \n", "\n", "from sklearn.neighbors import KNeighborsRegressor\n", "from sklearn.metrics import mean_squared_error\n", "from sklearn.model_selection import KFold\n", "\n", "\n", "boston_path = '/content/gdrive/MyDrive/Datasets/Boston.csv'\n", "boston = pd.read_csv(boston_path)\n", "X= boston.drop('medv',axis=1)\n", "y= boston['medv']\n", "\n", "\n", "kfold = KFold(n_splits=5, shuffle=True,random_state=2022)\n", "ks= np.arange(1,16)\n", "parameters = {'n_neighbors':ks}\n", "knn=KNeighborsRegressor()\n", "\n", "gcv =GridSearchCV(knn,param_grid=parameters,scoring ='r2',cv=kfold)\n", "gcv.fit(X,y)\n", "\n", "\n", "print(gcv.best_params_)\n", "print(gcv.best_score_)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "M5WElObkqZgJ", "outputId": "6942fa65-03fc-421c-d5a8-2017401948c8" }, "execution_count": 88, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "{'n_neighbors': 4}\n", "0.5460972244133464\n" ] } ] } ] }