{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Miniaturowy przykład notatnika Jupyter do projektu ZUM z użyciem języka Python" ], "metadata": { "id": "uWO8GBphz8r8" } }, { "cell_type": "markdown", "source": [ "Jest to przykład demonstrujący **wyłącznie** pobieranie plików z danymi oraz dodatkowych plików źródłowych z kodem, nie należy go traktować jako wzorca realizacji i dokumentowania projektu." ], "metadata": { "id": "iWEro61OMReE" } }, { "cell_type": "markdown", "source": [ "**Pobieranie plików z danymi (oryginalne źródło [UCI](https://archive.ics.uci.edu/ml/datasets/census+income), tutaj używana wersja przetworzona do formatu CSV):**" ], "metadata": { "id": "S0bAPzgEQLEP" } }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TuCXV5IaxkVi", "outputId": "0d4aa84c-3edf-4c8d-9942-744f9af40ec4" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "--2023-03-29 08:32:44-- http://elektron.elka.pw.edu.pl/~pcichosz/zum/projekt/census-income-train.csv\n", "Resolving elektron.elka.pw.edu.pl (elektron.elka.pw.edu.pl)... 194.29.160.103\n", "Connecting to elektron.elka.pw.edu.pl (elektron.elka.pw.edu.pl)|194.29.160.103|:80... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 3518606 (3.4M) [text/csv]\n", "Saving to: ‘census-income-train.csv’\n", "\n", "census-income-train 100%[===================>] 3.36M 775KB/s in 5.1s \n", "\n", "2023-03-29 08:32:49 (669 KB/s) - ‘census-income-train.csv’ saved [3518606/3518606]\n", "\n", "--2023-03-29 08:32:50-- http://elektron.elka.pw.edu.pl/~pcichosz/zum/projekt/census-income-test.csv\n", "Resolving elektron.elka.pw.edu.pl (elektron.elka.pw.edu.pl)... 194.29.160.103\n", "Connecting to elektron.elka.pw.edu.pl (elektron.elka.pw.edu.pl)|194.29.160.103|:80... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 1759072 (1.7M) [text/csv]\n", "Saving to: ‘census-income-test.csv’\n", "\n", "census-income-test. 100%[===================>] 1.68M 503KB/s in 3.4s \n", "\n", "2023-03-29 08:32:53 (503 KB/s) - ‘census-income-test.csv’ saved [1759072/1759072]\n", "\n" ] } ], "source": [ "!wget -nc elektron.elka.pw.edu.pl/~pcichosz/zum/projekt/census-income-train.csv\n", "!wget -nc elektron.elka.pw.edu.pl/~pcichosz/zum/projekt/census-income-test.csv" ] }, { "cell_type": "markdown", "source": [ "**Pobieranie dodatkowych plików źródłowych:**" ], "metadata": { "id": "_bDx6nfkQTTs" } }, { "cell_type": "code", "source": [ "!wget -nc elektron.elka.pw.edu.pl/~pcichosz/zum/projekt/plot_roc.py" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "pnrPFkCJPdGg", "outputId": "9bccf77b-0b29-42ed-e391-4c50550442f2" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "--2023-03-29 08:32:53-- http://elektron.elka.pw.edu.pl/~pcichosz/zum/projekt/plot_roc.py\n", "Resolving elektron.elka.pw.edu.pl (elektron.elka.pw.edu.pl)... 194.29.160.103\n", "Connecting to elektron.elka.pw.edu.pl (elektron.elka.pw.edu.pl)|194.29.160.103|:80... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 429 [text/x-python]\n", "Saving to: ‘plot_roc.py’\n", "\n", "plot_roc.py 100%[===================>] 429 --.-KB/s in 0s \n", "\n", "2023-03-29 08:32:54 (62.7 MB/s) - ‘plot_roc.py’ saved [429/429]\n", "\n" ] } ] }, { "cell_type": "markdown", "source": [ "Eksperymenty..." ], "metadata": { "id": "J01C4VuMgJQM" } }, { "cell_type": "code", "source": [ "import pandas as pd" ], "metadata": { "id": "013yQzUd9Peu" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "cin_train = pd.read_csv('census-income-train.csv')\n", "cin_test = pd.read_csv('census-income-test.csv')" ], "metadata": { "id": "Hn1E9Ovh9T4B" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.preprocessing import OneHotEncoder\n", "from sklearn.compose import make_column_transformer, make_column_selector\n", "from sklearn.pipeline import make_pipeline" ], "metadata": { "id": "qI-s_LkX7aSM" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "rf = make_pipeline(make_column_transformer((OneHotEncoder(handle_unknown='ignore'),\n", " make_column_selector(dtype_exclude='number')),\n", " remainder = 'passthrough'),\n", " RandomForestClassifier())\n", "rf.fit(cin_train.drop('income', axis=1), cin_train['income'])" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 191 }, "outputId": "88fd1885-a97e-4bbf-e5be-3b2a63632be1", "id": "udd2G8bzc143" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Pipeline(steps=[('columntransformer',\n", " ColumnTransformer(remainder='passthrough',\n", " transformers=[('onehotencoder',\n", " OneHotEncoder(handle_unknown='ignore'),\n", " )])),\n", " ('randomforestclassifier', RandomForestClassifier())])" ], "text/html": [ "
Pipeline(steps=[('columntransformer',\n",
              "                 ColumnTransformer(remainder='passthrough',\n",
              "                                   transformers=[('onehotencoder',\n",
              "                                                  OneHotEncoder(handle_unknown='ignore'),\n",
              "                                                  <sklearn.compose._column_transformer.make_column_selector object at 0x7f0dd5103d90>)])),\n",
              "                ('randomforestclassifier', RandomForestClassifier())])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ] }, "metadata": {}, "execution_count": 6 } ] }, { "cell_type": "code", "source": [ "cin_prob = rf.predict_proba(cin_test)[:,1]" ], "metadata": { "id": "qLiKcgkXI3XO" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "from plot_roc import plot_roc" ], "metadata": { "id": "cusUz2N5Q320" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "plot_roc(cin_test['income'].to_numpy(), cin_prob)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 283 }, "id": "_4IURdNwJAeU", "outputId": "ee6cbe57-aad1-46c0-ed4a-f69132f154c6" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] } ] }