Skip to content
Snippets Groups Projects
02_classification.ipynb 296 KiB
Newer Older
  • Learn to ignore specific revisions
  • schmittu's avatar
    schmittu committed
        }
       ],
       "source": [
        "from sklearn.preprocessing import PolynomialFeatures\n",
        "\n",
        "df = pd.read_csv(\"xor.csv\")\n",
        "features = df.iloc[:10, :-1]\n",
        "preproc = PolynomialFeatures(2, include_bias=False)\n",
        "data = preproc.fit_transform(features)\n",
        "print(pd.DataFrame(data))"
    
    schmittu's avatar
    schmittu committed
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
    
    schmittu's avatar
    schmittu committed
        "In this case \n",
        "- columns 0 and 1 are $x$ and $y$ from the original data set.\n",
        "- column 2 is $x^2$\n",
        "- column 3 is $x y$\n",
        "- column 4 is $y^2$.\n",
    
    schmittu's avatar
    schmittu committed
        "\n",
    
    schmittu's avatar
    schmittu committed
        "A complete description can be found here: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html"
    
    schmittu's avatar
    schmittu committed
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
    
    schmittu's avatar
    schmittu committed
        "The following script now learns classifiers on different data sets and plots decision surfaces."
    
    schmittu's avatar
    schmittu committed
       ]
      },
      {
       "cell_type": "code",
    
       "execution_count": 30,
    
    schmittu's avatar
    schmittu committed
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
    
    schmittu's avatar
    schmittu committed
          "113 out of 200 predicted correctly\n"
    
    schmittu's avatar
    schmittu committed
         ]
        },
        {
         "data": {
    
          "image/png": "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\n",
    
    schmittu's avatar
    schmittu committed
          "text/plain": [
    
    schmittu's avatar
    schmittu committed
           "<Figure size 432x432 with 1 Axes>"
    
    schmittu's avatar
    schmittu committed
          ]
         },
         "metadata": {
          "needs_background": "light"
         },
         "output_type": "display_data"
        }
       ],
       "source": [
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.svm import LinearSVC, SVC\n",
        "from sklearn.preprocessing import PolynomialFeatures\n",
        "from sklearn.tree import DecisionTreeClassifier\n",
        "from sklearn.neighbors import KNeighborsClassifier\n",
        "\n",
        "\n",
        "def train_and_plot_decision_surface(clf, preproc, features, labels, marker=\".\", N=400):\n",
        "    \n",
        "    features = np.array(features)\n",
        "    xmin, ymin = features.min(axis=0)\n",
        "    xmax, ymax = features.max(axis=0)\n",
        "    \n",
        "    x = np.linspace(xmin, xmax, N)\n",
        "    y = np.linspace(ymin, ymax, N) \n",
        "    points = np.array(np.meshgrid(x, y)).T.reshape(-1, 2)\n",
        "  \n",
        "    if preproc is not None:\n",
        "        points_for_clf = preproc.fit_transform(points)\n",
        "        features = preproc.fit_transform(features)\n",
        "    else:\n",
        "        points_for_clf = points\n",
        "    \n",
        "    clf.fit(features, labels)\n",
        "    predicted = clf.predict(features)\n",
        "    print(sum(predicted == labels), \"out of\", len(labels), \"predicted correctly\")\n",
        "    classes = np.array(clf.predict(points_for_clf), dtype=bool) \n",
    
    schmittu's avatar
    schmittu committed
        "    plt.plot(points[classes][:, 0], points[classes][:, 1], \"b\" + marker, markersize=1, alpha=.05);\n",
    
    schmittu's avatar
    schmittu committed
        "    plt.plot(points[~classes][:, 0], points[~classes][:, 1], \"r\" + marker, markersize=1, alpha=.05);\n",
        "\n",
        "\n",
        "df = pd.read_csv(\"2d_points.csv\")\n",
    
    schmittu's avatar
    schmittu committed
        "# df = pd.read_csv(\"xor.csv\")\n",
    
    schmittu's avatar
    schmittu committed
        "\n",
        "features = df.iloc[:, :-1]\n",
        "labels = df.iloc[:, -1]\n",
        "\n",
        "plt.figure(figsize=(6, 6));\n",
        "\n",
        "clf = LinearSVC()\n",
        "# clf = LogisticRegression()\n",
        "# clf = SVC(gamma=.1)\n",
        "# clf = DecisionTreeClassifier(max_depth=6)\n",
        "# clf = KNeighborsClassifier(10)\n",
        "\n",
    
    schmittu's avatar
    schmittu committed
        "#preproc = PolynomialFeatures(2, include_bias=False)\n",
        "preproc = None\n",
    
    schmittu's avatar
    schmittu committed
        "\n",
        "train_and_plot_decision_surface(clf, preproc, features, labels)\n",
        "\n",
    
    schmittu's avatar
    schmittu committed
        "colors = [\"rb\"[i] for i in labels]\n",
    
    schmittu's avatar
    schmittu committed
        "plt.scatter(features.iloc[:, 0], features.iloc[:, 1], color=colors, marker='.');"
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "- modify the script to use the `xor.csv` data set.\n",
        "\n",
    
    schmittu's avatar
    schmittu committed
        "- play with the other classifiers which are outcommented in the script.\n",
        "- play with their parameters.\n",
    
        "- activate the feature engineering step and experiment with classifiers and their parameters.\n"
    
    schmittu's avatar
    schmittu committed
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 369,
       "metadata": {},
       "outputs": [
        {
         "name": "stderr",
         "output_type": "stream",
         "text": [
          "/Users/uweschmitt/Projects/machinelearning-introduction-workshop/venv3.6/lib/python3.6/site-packages/ipykernel_launcher.py:9: UserWarning: get_ipython_dir has moved to the IPython.paths module since IPython 4.0.\n",
          "  if __name__ == '__main__':\n"
         ]
        },
        {
         "data": {
          "text/html": [
           "<style>\n",
           "    \n",
           "    @import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
           "    \n",
           "    @import url('http://fonts.googleapis.com/css?family=Kameron');\n",
           "    @import url('http://fonts.googleapis.com/css?family=Crimson+Text');\n",
           "    \n",
           "    @import url('http://fonts.googleapis.com/css?family=Lato');\n",
           "    @import url('http://fonts.googleapis.com/css?family=Source+Sans+Pro');\n",
           "    \n",
           "    @import url('http://fonts.googleapis.com/css?family=Lora'); \n",
           "\n",
           "    \n",
           "    body {\n",
           "        font-family: 'Lora', Consolas, sans-serif;\n",
           "       \n",
           "        -webkit-print-color-adjust: exact important !;\n",
           "        \n",
           "      \n",
           "       \n",
           "    }\n",
           "    .rendered_html code\n",
           "    {\n",
           "        color: black;\n",
           "        background: #eaf0ff;\n",
           "        background: #f5f5f5; \n",
           "        padding: 1pt;\n",
           "        font-family:  'Source Code Pro', Consolas, monocco, monospace;\n",
           "    }\n",
           "    \n",
           "    p {\n",
           "      line-height: 140%;\n",
           "    }\n",
           "    \n",
           "    strong code {\n",
           "        background: red;\n",
           "    }\n",
           "    \n",
           "    em  {\n",
           "        color: green;\n",
           "    }\n",
           "    \n",
           "    .rendered_html strong code\n",
           "    {\n",
           "        background: #f5f5f5;\n",
           "    }\n",
           "    \n",
           "    .CodeMirror pre {\n",
           "    font-family: 'Source Code Pro', monocco, Consolas, monocco, monospace;\n",
           "    }\n",
           "    \n",
           "    .cm-s-ipython span.cm-keyword {\n",
           "        font-weight: normal;\n",
           "     }\n",
           "     \n",
           "     strong {\n",
           "         background: #f5f5f5;\n",
           "         margin-top: 4pt;\n",
           "         margin-bottom: 4pt;\n",
           "         padding: 2pt;\n",
           "         border: 0.5px solid #a0a0a0;\n",
           "         font-weight: bold;\n",
           "         color: darkred;\n",
           "     }\n",
           "     \n",
           "    \n",
           "    div #notebook {\n",
           "        # font-size: 10pt; \n",
           "        line-height: 145%;\n",
           "        }\n",
           "        \n",
           "    li {\n",
           "        line-height: 145%;\n",
           "    }\n",
           "\n",
           "    div.output_area pre {\n",
           "        background: #fff9d8 !important;\n",
           "        padding: 5pt;\n",
           "       \n",
           "       -webkit-print-color-adjust: exact; \n",
           "        \n",
           "    }\n",
           " \n",
           "    \n",
           " \n",
           "    h1, h2, h3, h4 {\n",
           "        font-family: Kameron, arial;\n",
           "    }\n",
           "    \n",
           "    div#maintoolbar {display: none !important;}\n",
           "    </style>"
          ],
          "text/plain": [
           "<IPython.core.display.HTML object>"
          ]
         },
         "execution_count": 369,
         "metadata": {},
         "output_type": "execute_result"
        }
       ],
       "source": [
        "#REMOVEBEGIN\n",
        "# THE LINES BELOW ARE JUST FOR STYLING THE CONTENT ABOVE !\n",
        "\n",
        "from IPython import utils\n",
        "from IPython.core.display import HTML\n",
        "import os\n",
        "def css_styling():\n",
        "    \"\"\"Load default custom.css file from ipython profile\"\"\"\n",
        "    base = utils.path.get_ipython_dir()\n",
        "    styles = \"\"\"<style>\n",
        "    \n",
        "    @import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
        "    \n",
        "    @import url('http://fonts.googleapis.com/css?family=Kameron');\n",
        "    @import url('http://fonts.googleapis.com/css?family=Crimson+Text');\n",
        "    \n",
        "    @import url('http://fonts.googleapis.com/css?family=Lato');\n",
        "    @import url('http://fonts.googleapis.com/css?family=Source+Sans+Pro');\n",
        "    \n",
        "    @import url('http://fonts.googleapis.com/css?family=Lora'); \n",
        "\n",
        "    \n",
        "    body {\n",
        "        font-family: 'Lora', Consolas, sans-serif;\n",
        "       \n",
        "        -webkit-print-color-adjust: exact important !;\n",
        "        \n",
        "      \n",
        "       \n",
        "    }\n",
        "    .rendered_html code\n",
        "    {\n",
        "        color: black;\n",
        "        background: #eaf0ff;\n",
        "        background: #f5f5f5; \n",
        "        padding: 1pt;\n",
        "        font-family:  'Source Code Pro', Consolas, monocco, monospace;\n",
        "    }\n",
        "    \n",
        "    p {\n",
        "      line-height: 140%;\n",
        "    }\n",
        "    \n",
        "    strong code {\n",
        "        background: red;\n",
        "    }\n",
        "    \n",
        "    em  {\n",
        "        color: green;\n",
        "    }\n",
        "    \n",
        "    .rendered_html strong code\n",
        "    {\n",
        "        background: #f5f5f5;\n",
        "    }\n",
        "    \n",
        "    .CodeMirror pre {\n",
        "    font-family: 'Source Code Pro', monocco, Consolas, monocco, monospace;\n",
        "    }\n",
        "    \n",
        "    .cm-s-ipython span.cm-keyword {\n",
        "        font-weight: normal;\n",
        "     }\n",
        "     \n",
        "     strong {\n",
        "         background: #f5f5f5;\n",
        "         margin-top: 4pt;\n",
        "         margin-bottom: 4pt;\n",
        "         padding: 2pt;\n",
        "         border: 0.5px solid #a0a0a0;\n",
        "         font-weight: bold;\n",
        "         color: darkred;\n",
        "     }\n",
        "     \n",
        "    \n",
        "    div #notebook {\n",
        "        # font-size: 10pt; \n",
        "        line-height: 145%;\n",
        "        }\n",
        "        \n",
        "    li {\n",
        "        line-height: 145%;\n",
        "    }\n",
        "\n",
        "    div.output_area pre {\n",
        "        background: #fff9d8 !important;\n",
        "        padding: 5pt;\n",
        "       \n",
        "       -webkit-print-color-adjust: exact; \n",
        "        \n",
        "    }\n",
        " \n",
        "    \n",
        " \n",
        "    h1, h2, h3, h4 {\n",
        "        font-family: Kameron, arial;\n",
        "    }\n",
        "    \n",
        "    div#maintoolbar {display: none !important;}\n",
        "    </style>\"\"\"\n",
        "    return HTML(styles)\n",
        "css_styling()\n",
        "#REMOVEEND"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": null,
       "metadata": {},
       "outputs": [],
       "source": []
      }
     ],
     "metadata": {
      "kernelspec": {
       "display_name": "Python 3",
       "language": "python",
       "name": "python3"
      },
      "language_info": {
       "codemirror_mode": {
        "name": "ipython",
        "version": 3
       },
       "file_extension": ".py",
       "mimetype": "text/x-python",
       "name": "python",
       "nbconvert_exporter": "python",
       "pygments_lexer": "ipython3",
    
    schmittu's avatar
    schmittu committed
      }
     },
     "nbformat": 4,
     "nbformat_minor": 2
    }