Skip to content

Instantly share code, notes, and snippets.

@arghyadeep99
Created August 16, 2020 12:29
Show Gist options
  • Save arghyadeep99/feeb6bee49b028313c7f09eb65245f11 to your computer and use it in GitHub Desktop.
Save arghyadeep99/feeb6bee49b028313c7f09eb65245f11 to your computer and use it in GitHub Desktop.
SVMs.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "SVMs.ipynb",
"provenance": [],
"authorship_tag": "ABX9TyPpO34kfHjFpfT/AcLKo0oI",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/arghyadeep99/feeb6bee49b028313c7f09eb65245f11/svms.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lfx7mMhA2cFe",
"colab_type": "text"
},
"source": [
"# **Support Vector Machines (Classification)** "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Tu6Arl9x2R6D",
"colab_type": "text"
},
"source": [
"# Importing Libraries and data"
]
},
{
"cell_type": "code",
"metadata": {
"id": "GeBTF7K7Uljz",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 74
},
"outputId": "c178017f-c15e-4115-cad1-7a53bf86162e"
},
"source": [
"#we first import the necessary libraries\n",
"import numpy as np \n",
"import pandas as pd \n",
"import matplotlib.pyplot as plt # This library is for plotting graphs \n",
"import seaborn as sns #This one is also for plotting raphs\n",
"\n",
"#Next we import the confusion matrix which tells us about our actual values and predicted values of testing examples \n",
"from sklearn.metrics import confusion_matrix \n",
"\n",
"from sklearn.model_selection import train_test_split \n",
"from sklearn import datasets \n",
"from sklearn.svm import LinearSVC #importing Linear Support Vector Classifier from sllearn library"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n",
" import pandas.util.testing as tm\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "hVV3aGqAU0Tr",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"outputId": "a30d1732-5188-4427-c10b-1cb88164eb71"
},
"source": [
"iris = datasets.load_iris() #taking dataset from the library itself. Libraries have some pre-loaded datasets\n",
"print(type(iris)) #Iris is a bunch datatype. It belongs to sklearn.utils class \n",
"iris"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"<class 'sklearn.utils.Bunch'>\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'DESCR': '.. _iris_dataset:\\n\\nIris plants dataset\\n--------------------\\n\\n**Data Set Characteristics:**\\n\\n :Number of Instances: 150 (50 in each of three classes)\\n :Number of Attributes: 4 numeric, predictive attributes and the class\\n :Attribute Information:\\n - sepal length in cm\\n - sepal width in cm\\n - petal length in cm\\n - petal width in cm\\n - class:\\n - Iris-Setosa\\n - Iris-Versicolour\\n - Iris-Virginica\\n \\n :Summary Statistics:\\n\\n ============== ==== ==== ======= ===== ====================\\n Min Max Mean SD Class Correlation\\n ============== ==== ==== ======= ===== ====================\\n sepal length: 4.3 7.9 5.84 0.83 0.7826\\n sepal width: 2.0 4.4 3.05 0.43 -0.4194\\n petal length: 1.0 6.9 3.76 1.76 0.9490 (high!)\\n petal width: 0.1 2.5 1.20 0.76 0.9565 (high!)\\n ============== ==== ==== ======= ===== ====================\\n\\n :Missing Attribute Values: None\\n :Class Distribution: 33.3% for each of 3 classes.\\n :Creator: R.A. Fisher\\n :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\\n :Date: July, 1988\\n\\nThe famous Iris database, first used by Sir R.A. Fisher. The dataset is taken\\nfrom Fisher\\'s paper. Note that it\\'s the same as in R, but not as in the UCI\\nMachine Learning Repository, which has two wrong data points.\\n\\nThis is perhaps the best known database to be found in the\\npattern recognition literature. Fisher\\'s paper is a classic in the field and\\nis referenced frequently to this day. (See Duda & Hart, for example.) The\\ndata set contains 3 classes of 50 instances each, where each class refers to a\\ntype of iris plant. One class is linearly separable from the other 2; the\\nlatter are NOT linearly separable from each other.\\n\\n.. topic:: References\\n\\n - Fisher, R.A. \"The use of multiple measurements in taxonomic problems\"\\n Annual Eugenics, 7, Part II, 179-188 (1936); also in \"Contributions to\\n Mathematical Statistics\" (John Wiley, NY, 1950).\\n - Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.\\n (Q327.D83) John Wiley & Sons. ISBN 0-471-22361-1. See page 218.\\n - Dasarathy, B.V. (1980) \"Nosing Around the Neighborhood: A New System\\n Structure and Classification Rule for Recognition in Partially Exposed\\n Environments\". IEEE Transactions on Pattern Analysis and Machine\\n Intelligence, Vol. PAMI-2, No. 1, 67-71.\\n - Gates, G.W. (1972) \"The Reduced Nearest Neighbor Rule\". IEEE Transactions\\n on Information Theory, May 1972, 431-433.\\n - See also: 1988 MLC Proceedings, 54-64. Cheeseman et al\"s AUTOCLASS II\\n conceptual clustering system finds 3 classes in the data.\\n - Many, many more ...',\n",
" 'data': array([[5.1, 3.5, 1.4, 0.2],\n",
" [4.9, 3. , 1.4, 0.2],\n",
" [4.7, 3.2, 1.3, 0.2],\n",
" [4.6, 3.1, 1.5, 0.2],\n",
" [5. , 3.6, 1.4, 0.2],\n",
" [5.4, 3.9, 1.7, 0.4],\n",
" [4.6, 3.4, 1.4, 0.3],\n",
" [5. , 3.4, 1.5, 0.2],\n",
" [4.4, 2.9, 1.4, 0.2],\n",
" [4.9, 3.1, 1.5, 0.1],\n",
" [5.4, 3.7, 1.5, 0.2],\n",
" [4.8, 3.4, 1.6, 0.2],\n",
" [4.8, 3. , 1.4, 0.1],\n",
" [4.3, 3. , 1.1, 0.1],\n",
" [5.8, 4. , 1.2, 0.2],\n",
" [5.7, 4.4, 1.5, 0.4],\n",
" [5.4, 3.9, 1.3, 0.4],\n",
" [5.1, 3.5, 1.4, 0.3],\n",
" [5.7, 3.8, 1.7, 0.3],\n",
" [5.1, 3.8, 1.5, 0.3],\n",
" [5.4, 3.4, 1.7, 0.2],\n",
" [5.1, 3.7, 1.5, 0.4],\n",
" [4.6, 3.6, 1. , 0.2],\n",
" [5.1, 3.3, 1.7, 0.5],\n",
" [4.8, 3.4, 1.9, 0.2],\n",
" [5. , 3. , 1.6, 0.2],\n",
" [5. , 3.4, 1.6, 0.4],\n",
" [5.2, 3.5, 1.5, 0.2],\n",
" [5.2, 3.4, 1.4, 0.2],\n",
" [4.7, 3.2, 1.6, 0.2],\n",
" [4.8, 3.1, 1.6, 0.2],\n",
" [5.4, 3.4, 1.5, 0.4],\n",
" [5.2, 4.1, 1.5, 0.1],\n",
" [5.5, 4.2, 1.4, 0.2],\n",
" [4.9, 3.1, 1.5, 0.2],\n",
" [5. , 3.2, 1.2, 0.2],\n",
" [5.5, 3.5, 1.3, 0.2],\n",
" [4.9, 3.6, 1.4, 0.1],\n",
" [4.4, 3. , 1.3, 0.2],\n",
" [5.1, 3.4, 1.5, 0.2],\n",
" [5. , 3.5, 1.3, 0.3],\n",
" [4.5, 2.3, 1.3, 0.3],\n",
" [4.4, 3.2, 1.3, 0.2],\n",
" [5. , 3.5, 1.6, 0.6],\n",
" [5.1, 3.8, 1.9, 0.4],\n",
" [4.8, 3. , 1.4, 0.3],\n",
" [5.1, 3.8, 1.6, 0.2],\n",
" [4.6, 3.2, 1.4, 0.2],\n",
" [5.3, 3.7, 1.5, 0.2],\n",
" [5. , 3.3, 1.4, 0.2],\n",
" [7. , 3.2, 4.7, 1.4],\n",
" [6.4, 3.2, 4.5, 1.5],\n",
" [6.9, 3.1, 4.9, 1.5],\n",
" [5.5, 2.3, 4. , 1.3],\n",
" [6.5, 2.8, 4.6, 1.5],\n",
" [5.7, 2.8, 4.5, 1.3],\n",
" [6.3, 3.3, 4.7, 1.6],\n",
" [4.9, 2.4, 3.3, 1. ],\n",
" [6.6, 2.9, 4.6, 1.3],\n",
" [5.2, 2.7, 3.9, 1.4],\n",
" [5. , 2. , 3.5, 1. ],\n",
" [5.9, 3. , 4.2, 1.5],\n",
" [6. , 2.2, 4. , 1. ],\n",
" [6.1, 2.9, 4.7, 1.4],\n",
" [5.6, 2.9, 3.6, 1.3],\n",
" [6.7, 3.1, 4.4, 1.4],\n",
" [5.6, 3. , 4.5, 1.5],\n",
" [5.8, 2.7, 4.1, 1. ],\n",
" [6.2, 2.2, 4.5, 1.5],\n",
" [5.6, 2.5, 3.9, 1.1],\n",
" [5.9, 3.2, 4.8, 1.8],\n",
" [6.1, 2.8, 4. , 1.3],\n",
" [6.3, 2.5, 4.9, 1.5],\n",
" [6.1, 2.8, 4.7, 1.2],\n",
" [6.4, 2.9, 4.3, 1.3],\n",
" [6.6, 3. , 4.4, 1.4],\n",
" [6.8, 2.8, 4.8, 1.4],\n",
" [6.7, 3. , 5. , 1.7],\n",
" [6. , 2.9, 4.5, 1.5],\n",
" [5.7, 2.6, 3.5, 1. ],\n",
" [5.5, 2.4, 3.8, 1.1],\n",
" [5.5, 2.4, 3.7, 1. ],\n",
" [5.8, 2.7, 3.9, 1.2],\n",
" [6. , 2.7, 5.1, 1.6],\n",
" [5.4, 3. , 4.5, 1.5],\n",
" [6. , 3.4, 4.5, 1.6],\n",
" [6.7, 3.1, 4.7, 1.5],\n",
" [6.3, 2.3, 4.4, 1.3],\n",
" [5.6, 3. , 4.1, 1.3],\n",
" [5.5, 2.5, 4. , 1.3],\n",
" [5.5, 2.6, 4.4, 1.2],\n",
" [6.1, 3. , 4.6, 1.4],\n",
" [5.8, 2.6, 4. , 1.2],\n",
" [5. , 2.3, 3.3, 1. ],\n",
" [5.6, 2.7, 4.2, 1.3],\n",
" [5.7, 3. , 4.2, 1.2],\n",
" [5.7, 2.9, 4.2, 1.3],\n",
" [6.2, 2.9, 4.3, 1.3],\n",
" [5.1, 2.5, 3. , 1.1],\n",
" [5.7, 2.8, 4.1, 1.3],\n",
" [6.3, 3.3, 6. , 2.5],\n",
" [5.8, 2.7, 5.1, 1.9],\n",
" [7.1, 3. , 5.9, 2.1],\n",
" [6.3, 2.9, 5.6, 1.8],\n",
" [6.5, 3. , 5.8, 2.2],\n",
" [7.6, 3. , 6.6, 2.1],\n",
" [4.9, 2.5, 4.5, 1.7],\n",
" [7.3, 2.9, 6.3, 1.8],\n",
" [6.7, 2.5, 5.8, 1.8],\n",
" [7.2, 3.6, 6.1, 2.5],\n",
" [6.5, 3.2, 5.1, 2. ],\n",
" [6.4, 2.7, 5.3, 1.9],\n",
" [6.8, 3. , 5.5, 2.1],\n",
" [5.7, 2.5, 5. , 2. ],\n",
" [5.8, 2.8, 5.1, 2.4],\n",
" [6.4, 3.2, 5.3, 2.3],\n",
" [6.5, 3. , 5.5, 1.8],\n",
" [7.7, 3.8, 6.7, 2.2],\n",
" [7.7, 2.6, 6.9, 2.3],\n",
" [6. , 2.2, 5. , 1.5],\n",
" [6.9, 3.2, 5.7, 2.3],\n",
" [5.6, 2.8, 4.9, 2. ],\n",
" [7.7, 2.8, 6.7, 2. ],\n",
" [6.3, 2.7, 4.9, 1.8],\n",
" [6.7, 3.3, 5.7, 2.1],\n",
" [7.2, 3.2, 6. , 1.8],\n",
" [6.2, 2.8, 4.8, 1.8],\n",
" [6.1, 3. , 4.9, 1.8],\n",
" [6.4, 2.8, 5.6, 2.1],\n",
" [7.2, 3. , 5.8, 1.6],\n",
" [7.4, 2.8, 6.1, 1.9],\n",
" [7.9, 3.8, 6.4, 2. ],\n",
" [6.4, 2.8, 5.6, 2.2],\n",
" [6.3, 2.8, 5.1, 1.5],\n",
" [6.1, 2.6, 5.6, 1.4],\n",
" [7.7, 3. , 6.1, 2.3],\n",
" [6.3, 3.4, 5.6, 2.4],\n",
" [6.4, 3.1, 5.5, 1.8],\n",
" [6. , 3. , 4.8, 1.8],\n",
" [6.9, 3.1, 5.4, 2.1],\n",
" [6.7, 3.1, 5.6, 2.4],\n",
" [6.9, 3.1, 5.1, 2.3],\n",
" [5.8, 2.7, 5.1, 1.9],\n",
" [6.8, 3.2, 5.9, 2.3],\n",
" [6.7, 3.3, 5.7, 2.5],\n",
" [6.7, 3. , 5.2, 2.3],\n",
" [6.3, 2.5, 5. , 1.9],\n",
" [6.5, 3. , 5.2, 2. ],\n",
" [6.2, 3.4, 5.4, 2.3],\n",
" [5.9, 3. , 5.1, 1.8]]),\n",
" 'feature_names': ['sepal length (cm)',\n",
" 'sepal width (cm)',\n",
" 'petal length (cm)',\n",
" 'petal width (cm)'],\n",
" 'filename': '/usr/local/lib/python3.6/dist-packages/sklearn/datasets/data/iris.csv',\n",
" 'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
" 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
" 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]),\n",
" 'target_names': array(['setosa', 'versicolor', 'virginica'], dtype='<U10')}"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DnAh4gDgYLGN",
"colab_type": "text"
},
"source": [
"For simplicity, We demostrate the binary classification using SVMs. So We take only the two classes of the flowers, i.e. Setosa and Versicolor. Also we take into consideration only their petal length and petal width. "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tpcuvCan2s8F",
"colab_type": "text"
},
"source": [
"# Data Pre-processing and Plotting "
]
},
{
"cell_type": "code",
"metadata": {
"id": "OK548y_6U5d6",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 90
},
"outputId": "17e31ab8-e024-46d9-baf6-2783fa0c091d"
},
"source": [
"#We are extracting data from iris bunch into arrays for easier implementation purposes. \n",
"#In iris databunch, we take the data part and in data part we take the first 50 entries of the 3rd row (index i=2 means 3rd row as index starts from 0)\n",
"petal_length_setosa = iris['data'][:50, (2)]\n",
"petal_width_setosa = iris['data'][:50, (3)]\n",
"petal_length_versicolor = iris['data'][50:100, (2)]\n",
"petal_width_versicolor = iris['data'][50:100, (3)]\n",
"\n",
"petal_length_setosa"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4,\n",
" 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1. , 1.7, 1.9, 1.6,\n",
" 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 1.3,\n",
" 1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4])"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "EmFVNjvgW0Eh",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 298
},
"outputId": "212d56c7-113b-46e1-9a45-72b3f32be3bb"
},
"source": [
"#We now plot the graph \n",
"\n",
"plt.xlabel('petal_length')\n",
"plt.ylabel('petal_width')\n",
"plt.scatter(petal_length_setosa,petal_width_setosa, color='red') #plotting setosa flower\n",
"plt.scatter(petal_length_versicolor,petal_width_versicolor, color='green') #plotting versicolor flower"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fe6e53b4e48>"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "xK2p_Av4aUN3",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "6c657e34-cf0a-4b0b-e142-664dac999b74"
},
"source": [
"X = iris['data'][:100, 2:] #We make an 2-D array of the petal length and petal width of the first 100 samples only. \n",
"y = iris['target'][:100] # We similarly make a 1-D array of the target class. \n",
"# class 0 represents iris setosa and class 1 represents versicolor\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)\n",
"print(y_test)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"[0 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 0 1]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "i02IF5p421W8",
"colab_type": "text"
},
"source": [
"# Training and Testing"
]
},
{
"cell_type": "code",
"metadata": {
"id": "5ENn1PGNnO0_",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "e163de94-36bb-447f-d064-eafc07868d2e"
},
"source": [
"model = LinearSVC() # define the model as LinearSVC class\n",
"model.fit(X_train,y_train) #use model.fit() to train the model on the training dataset\n",
"y_pred = model.predict(X_test) # Using model.predict() predict the y values for test data and store it in y_pred\n",
"y_pred "
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1])"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YDXAdSJKMLqV",
"colab_type": "text"
},
"source": [
"Confusion Matrix is an n*n matrix that gives us the actual and predicted values of each of the n classes. For binary classification it goes as follows: \n",
"\n",
"![image.png](data:image/png;base64,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)\n",
"\n",
"TP:True Positives \n",
"\n",
"FN:False Negatives \n",
"\n",
"TN:True Negatives \n",
"\n",
"FT:False Positives"
]
},
{
"cell_type": "code",
"metadata": {
"id": "mcO6HtK4Ki8j",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 72
},
"outputId": "f7a3fd93-ef14-4448-fc94-da6389dc8b16"
},
"source": [
"print(confusion_matrix(y_test,y_pred)) \n",
"\n",
"print(model.coef_[0])\n",
"#In the output as we can see the classifier predicted that 12 data points belonged to class 0 and 8 to class 1\n",
"#Also as seen in confusion matrix, all the values are true. "
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"[[10 0]\n",
" [ 0 10]]\n",
"[0.61997277 0.77965952]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fvAQPSw3zyqX",
"colab_type": "text"
},
"source": [
"The decision boundary for SVMs is given by wx+b=0. Here x and w both represent vectors. Note that x is the position vector 'x' of the data point and not the x-coordinate. \n",
"So the Calculation of the x and y coordiante goes as follows - \n",
"\n",
"(w[0] i + w[1] j).(x i + y j) + b = 0\n",
"\n",
"w[0] * x + w[1] * y + b = 0 \n",
"\n",
"y = ( - w[0]*x - b )/w[1]\n",
"\n",
"Now b is the intercept_ attribute of LinearSVC"
]
},
{
"cell_type": "code",
"metadata": {
"id": "d2iJgyT2LS7d",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 298
},
"outputId": "c08cda3a-b393-470c-bac8-0ec781f5fdb5"
},
"source": [
"#We first plot the data points\n",
"plt.xlabel('petal_length')\n",
"plt.ylabel('petal_width')\n",
"plt.scatter(petal_length_setosa,petal_width_setosa, color='red') #plotting setosa flower\n",
"plt.scatter(petal_length_versicolor,petal_width_versicolor, color='green') #plotting versicolor flower\n",
"\n",
"#Now we plot the decision boundary\n",
"# w.x + b = 0 is the decision boundary \n",
"w = model.coef_[0] \n",
"\n",
"x1=1 #We tale arbitrary values of x to construct a line using the slope and intercept\n",
"x2=4\n",
"y1=-(x1*w[0]+model.intercept_[0])/w[1] #We calculate the values of y-coordinate from x\n",
"y2=-(x2*w[0]+model.intercept_[0])/w[1] \n",
"plt.plot([x1,x2],[y1,y2]) #We plot the line using two co-ordinates\n",
" \n",
"#Now we plot the support vectors of both the classes\n",
"#The +1,-1 here stands for the distance between the decision boundary and support vector in either direction\n",
"y1=-(x1*w[0]+model.intercept_[0]-1)/w[1] \n",
"y2=-(x2*w[0]+model.intercept_[0]-1)/w[1]\n",
"plt.plot([x1,x2],[y1,y2],'k--') #Here 'k--' stands for dotted line \n",
"\n",
"y1=-(x1*w[0]+model.intercept_[0]+1)/w[1]\n",
"y2=-(x2*w[0]+model.intercept_[0]+1)/w[1]\n",
"plt.plot([x1,x2],[y1,y2],'k--')\n"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fe6e4eb9080>]"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qqxQhDmm3JhJ",
"colab_type": "text"
},
"source": [
"# Kernels\n",
"Using kernels we try to separate non-linear data using a linear classifier. Kernelization treats as if there are dimensional changes in data and then the kernelized data is sent through a linear classifier to do the usual classification "
]
},
{
"cell_type": "code",
"metadata": {
"id": "oGiTS1K33I1Q",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"outputId": "40157bd3-bc0c-42e8-e4af-fdff2e35f97b"
},
"source": [
"#Here we take a non-linear dataset\n",
"from sklearn.datasets import make_moons #we import make_moons for using non-linear dataset\n",
"moon = make_moons(n_samples=100) #we take sample size = 100, 50 for each class and store it in a tuple\n",
"print(moon)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"(array([[ 1.99179001e+00, 3.72122838e-01],\n",
" [ 7.18349350e-01, 6.95682551e-01],\n",
" [ 7.15472413e-01, -4.58667853e-01],\n",
" [ 4.04783343e-01, 9.14412623e-01],\n",
" [-9.49055747e-01, 3.15108218e-01],\n",
" [ 1.22252093e+00, -4.74927912e-01],\n",
" [ 7.61445958e-01, 6.48228395e-01],\n",
" [ 4.81607432e-01, -3.55142763e-01],\n",
" [ 1.99794539e+00, 4.35929780e-01],\n",
" [ 9.81559157e-01, 1.91158629e-01],\n",
" [ 3.20515776e-02, 9.99486216e-01],\n",
" [ 8.01413622e-01, 5.98110530e-01],\n",
" [ 8.20998618e-03, 3.72122838e-01],\n",
" [ 9.91790014e-01, 1.27877162e-01],\n",
" [-1.00000000e+00, 1.22464680e-16],\n",
" [ 9.49055747e-01, 3.15108218e-01],\n",
" [-3.20515776e-02, 9.99486216e-01],\n",
" [ 6.23489802e-01, 7.81831482e-01],\n",
" [ 1.00000000e+00, 0.00000000e+00],\n",
" [ 6.72300890e-01, 7.40277997e-01],\n",
" [ 3.45365054e-01, 9.38468422e-01],\n",
" [-3.45365054e-01, 9.38468422e-01],\n",
" [ 1.46253829e+00, -3.86599306e-01],\n",
" [ 9.67948422e-01, -4.99486216e-01],\n",
" [ 5.09442530e-02, 1.84891782e-01],\n",
" [ 8.38088105e-01, 5.45534901e-01],\n",
" [ 5.18392568e-01, 8.55142763e-01],\n",
" [ 1.98586378e-01, -9.81105305e-02],\n",
" [-1.59599895e-01, 9.87181783e-01],\n",
" [-4.62538290e-01, 8.86599306e-01],\n",
" [ 1.40478334e+00, -4.14412623e-01],\n",
" [-9.67294863e-01, 2.53654584e-01],\n",
" [ 3.27051370e-02, 2.46345416e-01],\n",
" [-7.61445958e-01, 6.48228395e-01],\n",
" [ 4.62538290e-01, 8.86599306e-01],\n",
" [ 1.94905575e+00, 1.84891782e-01],\n",
" [ 1.96729486e+00, 2.46345416e-01],\n",
" [-9.91790014e-01, 1.27877162e-01],\n",
" [ 9.26916757e-01, 3.75267005e-01],\n",
" [ 1.87131870e+00, 9.28244800e-03],\n",
" [ 0.00000000e+00, 5.00000000e-01],\n",
" [ 1.15959990e+00, -4.87181783e-01],\n",
" [ 1.80141362e+00, -9.81105305e-02],\n",
" [ 1.62348980e+00, -2.81831482e-01],\n",
" [-8.71318704e-01, 4.90717552e-01],\n",
" [ 7.77479066e-01, -4.74927912e-01],\n",
" [ 1.28681296e-01, 9.28244800e-03],\n",
" [ 2.38554042e-01, -1.48228395e-01],\n",
" [ 1.92691676e+00, 1.24732995e-01],\n",
" [ 9.67294863e-01, 2.53654584e-01],\n",
" [-8.01413622e-01, 5.98110530e-01],\n",
" [-9.60230259e-02, 9.95379113e-01],\n",
" [ 1.51839257e+00, -3.55142763e-01],\n",
" [-5.18392568e-01, 8.55142763e-01],\n",
" [ 1.03205158e+00, -4.99486216e-01],\n",
" [ 2.22520934e-01, 9.74927912e-01],\n",
" [ 1.67230089e+00, -2.40277997e-01],\n",
" [-9.97945393e-01, 6.40702200e-02],\n",
" [ 1.61911895e-01, -4.55349012e-02],\n",
" [ 8.40400105e-01, -4.87181783e-01],\n",
" [-6.23489802e-01, 7.81831482e-01],\n",
" [ 4.27883340e-01, -3.20172255e-01],\n",
" [ 9.90311321e-02, 6.61162609e-02],\n",
" [ 1.71834935e+00, -1.95682551e-01],\n",
" [ 3.76510198e-01, -2.81831482e-01],\n",
" [-2.84527587e-01, 9.58667853e-01],\n",
" [ 9.60230259e-02, 9.95379113e-01],\n",
" [ 1.28452759e+00, -4.58667853e-01],\n",
" [-6.72300890e-01, 7.40277997e-01],\n",
" [ 5.72116660e-01, 8.20172255e-01],\n",
" [ 1.34536505e+00, -4.38468422e-01],\n",
" [ 1.83808810e+00, -4.55349012e-02],\n",
" [ 9.97945393e-01, 6.40702200e-02],\n",
" [ 9.00968868e-01, 4.33883739e-01],\n",
" [ 2.84527587e-01, 9.58667853e-01],\n",
" [-2.22520934e-01, 9.74927912e-01],\n",
" [-9.26916757e-01, 3.75267005e-01],\n",
" [ 1.57211666e+00, -3.20172255e-01],\n",
" [ 5.37461710e-01, -3.86599306e-01],\n",
" [ 7.30832427e-02, 1.24732995e-01],\n",
" [ 6.54634946e-01, -4.38468422e-01],\n",
" [ 1.90096887e+00, 6.61162609e-02],\n",
" [-8.38088105e-01, 5.45534901e-01],\n",
" [-7.18349350e-01, 6.95682551e-01],\n",
" [ 1.59599895e-01, 9.87181783e-01],\n",
" [-9.00968868e-01, 4.33883739e-01],\n",
" [ 2.81650650e-01, -1.95682551e-01],\n",
" [ 1.98155916e+00, 3.08841371e-01],\n",
" [ 5.95216657e-01, -4.14412623e-01],\n",
" [-5.72116660e-01, 8.20172255e-01],\n",
" [ 8.71318704e-01, 4.90717552e-01],\n",
" [ 1.84408430e-02, 3.08841371e-01],\n",
" [-4.04783343e-01, 9.14412623e-01],\n",
" [ 2.00000000e+00, 5.00000000e-01],\n",
" [-9.81559157e-01, 1.91158629e-01],\n",
" [ 1.76144596e+00, -1.48228395e-01],\n",
" [ 3.27699110e-01, -2.40277997e-01],\n",
" [ 9.03976974e-01, -4.95379113e-01],\n",
" [ 1.09602303e+00, -4.95379113e-01],\n",
" [ 2.05460725e-03, 4.35929780e-01]]), array([1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1,\n",
" 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0,\n",
" 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1,\n",
" 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1]))\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "hKiarNEn3f4_",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"outputId": "45b31d9e-14d1-44d5-9d83-88d5ebb0309f"
},
"source": [
"x1, x2, y1, y2 = list(),list(),list(),list()\n",
"\n",
"#We now put the data in different list for plotting and implementation purposes\n",
"for i in range(100):\n",
" if moon[1][i]==0:\n",
" x1.append(moon[0][i][0])\n",
" y1.append(moon[0][i][1])\n",
" else:\n",
" x2.append(moon[0][i][0])\n",
" y2.append(moon[0][i][1])\n",
"\n",
"# We now plot the data \n",
"plt.scatter(x1,y1,color='red') \n",
"plt.scatter(x2,y2,color='green')"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fe6f400d940>"
]
},
"metadata": {
"tags": []
},
"execution_count": 10
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "hI3n5RaK3kKS",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 109
},
"outputId": "b5823d5e-9ffa-4737-e7df-b2a2777014d2"
},
"source": [
"#We use the SVC class in sklearn which has rbf as default kernel \n",
"from sklearn.svm import SVC\n",
"\n",
"X = moon[0] #We take the data from moon tuple and store it in arrays \n",
"y = moon[1]\n",
"\n",
"model = SVC() #We fit the data in our classifier\n",
"model.fit(X,y)\n",
"\n",
"#We now predict the first datapoint of our moon's tuple which should be present in class 0 as denoted by the dataset\n",
"print(moon[0][0])\n",
"print(moon[1][0])\n",
"\n",
"print('\\nModel Prediction ')\n",
"model.predict([moon[0][0]])"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"[1.99179001 0.37212284]\n",
"1\n",
"\n",
"Model Prediction \n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([1])"
]
},
"metadata": {
"tags": []
},
"execution_count": 11
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bhWXP46c4cTY",
"colab_type": "text"
},
"source": [
"We now try to visualize the decision boundary predicted by our Support Vector Classifier which uses the Radial Basis function Kernel, popularly known as Gaussian Kernel. \n",
"\n",
"Gaussian kernel function is given by \n",
"\n",
"![kernel.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAAA7CAIAAAACdHpkAAAIkklEQVR42uxd75GiPhj2dvb7sRUAFYAVCBWIFYAVgBWAFRgriFRgrAC2AmIFQAWEa+B+M/vOMIz8kWUJ6u/yfPJuFELy5P33vGTf//79++fPn4WAwLPiTUyBgOCogMCP8C6mQIAToii6Xq9FUTDGjsejsKOvgTRNMcb/wpMyxrIs8zxvv98vFgvf92/mASEkOPqMBPU8b7PZjPt5fZlvlvyxaB1YkiQVC3Vdj+O4/hNVVYc/heDofAS1LCsMQ0mSxl2BUtr6+eFoHZhpmoQQ+JxlmaIoN7/yPI8xNsSainh0JjiOs9/vRxP0FQHGcrFYkC80v3A8HjVNMwxD13VhRx/vDRVFsSzrH3x227YRQhVfbxCG4Xq9ZowJjj7Yy59Op58ktq8LhNButzNNM03T1i/oum4YxuFwEBx9JDzPcxznn/LylYtXvpCm6eVy6fpaEAQIoS4Si3h0jnwijuMwDHmzoSiKLMsMwyjLsiiKOI6DIOjysCOeIssyjHFFNULI+Xzuea40TW3brm/UnrDVsqwgCLquJjjKF4fDwbIsrkY0iiJN01RVTdPUMIzj8bjdboMgKMtykuszxpIk2W63rutSSiG/OZ/PzVT9hnnDB7Db7VarFWOsdaKEr+cIxhghZLfbcb1LWZZgL7MsWywWkJnled6fLA8HEDRNU8ZYdc04jg3DmOoRdF1XFOV0Ogk7OjdOp5MkSVNxpQtVuWAIbyil/ZVz0zRv/LJpmvAs1Y0opYwx+P8JnwJj3BoSCI4uuHrhCY3NXcRx7DjOXYvVk770h7ygasKNJt94m80GMqdmDC18PV/SzMZRxhiltLpdFEXTXh8SMn57T9d1SZJuJNOfcpQxxrU94tV7L4AlvDkaRZEsy5DEVNIOpbQ/ofkJ0jTltPcURWnVePs46vt+jwDg+/7o9oiBxt913dfl6PV6reuBnPDx8WFZFiFkuVyGYej7PtShJr8vQuhwOGCMIbOZNhitTGmrHX3v2p1BEGRZVoUgzRHzLqlIkmSaJsZ4u92+IkeTJOFnzOrrWilYuq7zk1urVUAIcXIOuq63pvZvXcndbrfrGcr5fOaxk5q5Xlc94vnB1eHODFmWqwD3cDj0FOR/6OtbW7reRuSkhJC7+eOEHv9FA9N6NfGlwRizLAtMku/71WdOHIUq7yCOEkK6OIoxni1dNQyjta3rJZb24+Pjf8BRKPFijKF7i19zDExXURSD4lEQ+CHuJoRkWZYkSSWnUkqbIfkIyXiICqzrOqd+XoTQ79+/YRie56mqCgkBpRSakUFahNZPwzCCIKCUwmzAr0zT7I//4PpToZ4bdOUJvINRrgOD9KapoLZztCouYIw3m02SJP3dUyMk4+EqcH9z4Ti4rquqKkw9jDnP8+0X1us1TJaqqvAs8E9FUXRdz7KsWjBN04qiaF0/HmOuRw5PFUVMO7ChdpQQAr3+sACmaeZ5XpnYZjrfJRn3p72tKnAzSVIUpavbwHXdfjYoitLc2dDQWZlnVVUlSYqiCMKsMAw1TbMsK8uyiqCVJ6qX2zzPC4KglaMw0f8PXz9zXNFc0E47Cha+ixzNBPzGAN/FJCrwuNgIKpfXL1RRb32aTqeT4zigtvfHyqDujDAe39LNp40ZHosR3VjvrdMnSdLlcknTVNO0OI7rMeXHx0eP6RoiGd8Y7Lsq8MB9MqKw1fq5cutBEPRvGJjuHgI13VbdJw7XzafqsnuJRLO51u89wSg4wev1qqpq5Qp76NKUjO8axR+qwON8vaZp4PHre6/+z8sXVquV7/s9SUCSJJIktSaFwsv/MLu/w9Hz+Vy3hRAO3tiA+opGUeQ4Tp7nXZJxmqZBENRju9ZKQhzHzeJwvycd5+tVVYVQsiogQGoIn23bhsteLhd4a7G+0+I4rowuQqhrAF0p6sthqrNGhqPpl95azWG1YJ7nnb9QXyfLsuq66l3JuCxLKCq1FoD6VeA4jnloofv93jAM3/fxF5bLpSRJCCFN06rqUpX/ua5bf9sG3sR1XRcE4W+lqC/neXvOGuFxu1Y7+mvE2Y6MMdu2v9uGSAjpWVGEUBRFzWuuVqvPz88nWTBZlvM8Hxgcgw1+6ddBoyjyPA8yS7AjXNeCUrparaCmdMeODikQTFJav6sCQxTxogvMT30YB4wxQsh13fV6PbC79O5ZI9MCHFfzLm+jfeW3ZPRmPnRXBYaXgZ6k6YlSCo2CoDgM+clyuXwejkLA7Xne8XiEEGWgwlw/ayQIghk42sxBf40+x5kxdj6fB3Ko1dEDy2GDNq8D0/q6r6VHUWRZ1vDYgCs0TQvDsMo+bdumlFbl4buwbdtxHN6dbrZtZ1nWDCd+ibPGucavzejqIZBluS6J+b6PEBpYdoCG0ZtiDqdBwqlY0/h6gSFRu6IorY3l8wO6Eepe9Sbswxhrmva7BngFZeBZIz8HqOKtBXLBUY4YHvbNbODr8l7l+j8/P/M8NwzD87yyLPM8h7NGbNuWZVnXda6lNNjMrT5H+PoF72JKayvjA7Fer+vNABhjQkhlI+E1ofnrfev1uqs5VdhRvuUnRVG4usjvAiF0c8pDEAR1m1qW5fxJHmOsR6wRHOWL7xbpuAICjzpBQT+rq81RFM3fnHo4HKCPR3D0MSEp74MIBiKKoqIoKoLCId/N5GmGA6parXvPoeOCo9xxPB55V7+HRMaQoUdfIISABTVNs94wBP00M/t6jLGu6z0VOpEzzYHVauU4zgM1M1mWb5rX4J0toC+8olOW5d2j6XlEopqmXS6XnvsKjs4B+KMihJCnSvCfsMggfP3DoKoqQuh1+2Nmy+EERx8J0zRf/QSryUPk+mvrPRC+fu4Edojl+BeCH8/zBv5FNcFRgWeH8PUCgqMCAoKjAoKjAgKCowICgqMCgqMCAoKjAoKjAgKCowICY/BfAAAA//8mydVANQPvBgAAAABJRU5ErkJggg==)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "pZkhYNCK3n4V",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"outputId": "8fbac2bd-1d98-4be1-9532-06c8a68c704f"
},
"source": [
"#We make a grid of the x and y values to be plotted with each set of values of x and y in data point \n",
"#The purpose of meshgrid is to create a grid by using the coordinate of each dim\n",
"def make_meshgrid(x, y, h=.02): \n",
" x_min, x_max = x.min() - 1, x.max() + 1 \n",
" y_min, y_max = y.min() - 1, y.max() + 1\n",
" xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
" return xx, yy\n",
"\n",
"#Using the plot)contour function we plot the filled contours represtning the decision boundary \n",
"def plot_contours(ax, clf, xx, yy, **params):\n",
" Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) #ravel numpy function flattens the array to 1-D shape, c_ stands for concatenation of arrays\n",
" Z = Z.reshape(xx.shape) #We reshape the shape of Z to match our requirements \n",
" out = ax.contourf(xx, yy, Z, **params) #contourf draws filled contours \n",
" return out\n",
"\n",
"fig, ax = plt.subplots() \n",
"X0, X1 = X[:, 0], X[:, 1]\n",
"xx, yy = make_meshgrid(X0, X1)\n",
"plot_contours(ax, model, xx, yy, cmap=plt.cm.coolwarm, alpha=0.8) \n",
"\n",
"#plotting graph of data points\n",
"plt.scatter(x1,y1,color='red')\n",
"plt.scatter(x2,y2,color='green')"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fe6e4de22b0>"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment