From 983ce942b17f8f043808d5c71d95d6b6030eccba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Sk=C3=B3rzewski?= Date: Thu, 23 Mar 2023 10:36:02 +0100 Subject: [PATCH] =?UTF-8?q?Przyk=C5=82ad=20scikit-learn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab/scikit-learn.ipynb | 152 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 lab/scikit-learn.ipynb diff --git a/lab/scikit-learn.ipynb b/lab/scikit-learn.ipynb new file mode 100644 index 0000000..3888fa6 --- /dev/null +++ b/lab/scikit-learn.ipynb @@ -0,0 +1,152 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "source": [ + "### Uczenie maszynowe — laboratoria\n", + "# Korzystanie z gotowych implementacji algorytmów na przykładzie pakietu *scikit-learn*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Scikit-learn](https://scikit-learn.org) jest otwartoźródłową biblioteką programistyczną dla języka Python wspomagającą uczenie maszynowe. Zawiera implementacje wielu algorytmów uczenia maszynowego." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Poniżej przykład, jak stworzyć klasyfikator regresji liniowej wielu zmiennych z użyciem `scikit-learn`.\n", + "\n", + "Na podobnej zasadzie można korzystać z innych modeli dostępnych w bibliotece." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[302322.47270869]\n", + " [283694.74995925]\n", + " [276290.72977935]\n", + " [477362.89530745]\n", + " [420862.62245119]\n", + " [312510.3868097 ]\n", + " [362445.20969959]\n", + " [335753.83506582]\n", + " [759239.88142398]\n", + " [684376.72797254]]\n", + "Błąd średniokwadratowy wynosi 29811493540.217434\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "from sklearn.linear_model import LinearRegression # Model regresji liniowej z biblioteki scikit-learn\n", + "\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "\n", + "FEATURES = [\n", + " 'Powierzchnia w m2',\n", + " 'Liczba pokoi',\n", + " 'Liczba pięter w budynku',\n", + " 'Piętro',\n", + " 'Rok budowy',\n", + " 'ładne w opisie'\n", + "]\n", + "\n", + "\n", + "def preprocess(data):\n", + " \"\"\"Wstępne przetworzenie danych, np. zamiana wartości tekstowych na liczby\"\"\"\n", + " data = data.replace({'parter': 0, 'poddasze': 0}, regex=True)\n", + " data = data.applymap(np.nan_to_num) # Zamienia \"NaN\" na liczby\n", + " return data\n", + "\n", + "# Nazwy plików\n", + "dataset_filename = 'flats.tsv'\n", + "\n", + "# Wczytanie danych\n", + "data = pd.read_csv(dataset_filename, header=0, sep='\\t')\n", + "\n", + "# Jeżeli chcemy, możemy stworzyć nową cechę (kolumnę) na podstawie istniejącej\n", + "# Poniższa cecha mówi, czy kolumna \"opis\" zawiera słowo \"ładne\"\n", + "data['ładne w opisie'] = data['opis'].apply(\n", + " lambda x: True if 'ładne' in str(x) else False)\n", + "\n", + "data = data[FEATURES + ['cena']] # wybór cech\n", + "data = data[(data[\"Powierzchnia w m2\"] < 10000) & (data[\"cena\"] > 1000)] # Odrzucenie obserwacji odstających\n", + "data = preprocess(data) # wstępne przetworzenie danych\n", + "\n", + "# Podział danych na zbiory uczący i testowy\n", + "split_point = int(0.8 * len(data))\n", + "data_train = data[:split_point]\n", + "data_test = data[split_point:]\n", + "\n", + "# Uczenie modelu\n", + "y_train = pd.DataFrame(data_train['cena'])\n", + "x_train = pd.DataFrame(data_train[FEATURES])\n", + "model = LinearRegression() # definicja modelu\n", + "model.fit(x_train, y_train) # dopasowanie modelu\n", + "\n", + "# Predykcja wyników dla danych testowych\n", + "y_expected = pd.DataFrame(data_test['cena'])\n", + "x_test = pd.DataFrame(data_test[FEATURES])\n", + "y_predicted = model.predict(x_test) # predykcja wyników na podstawie modelu\n", + "\n", + "print(y_predicted[:10]) # Pierwsze 10 wyników\n", + "\n", + "# Ewaluacja\n", + "mse = mean_squared_error(y_predicted, y_expected) # Błąd średniokwadratowy na zbiorze testowym\n", + "\n", + "print(\"Błąd średniokwadratowy wynosi \", mse)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Biblioteka *scikit-learn* dostarcza również narzędzi do wstępnego przetwarzania danych, np. skalowania i normalizacji: https://scikit-learn.org/stable/modules/preprocessing.html" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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", + "version": "3.10.6" + }, + "livereveal": { + "start_slideshow_at": "selected", + "theme": "amu" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}