{ "cells": [ { "cell_type": "markdown", "id": "6c761db8-ee4b-4d98-9a4b-04715fff3f76", "metadata": {}, "source": [ "# Работа №4: Искусственные нейронные сети\n", "**Автор:** Попов Лев Алексеевич, группа ИКТб-2301-04-00" ] }, { "cell_type": "markdown", "id": "77e0c5bd-dd94-4dee-a042-42369886a962", "metadata": {}, "source": [ "## Цель задачи\n", "Ознакомиться с базовыми принципами построения нейронных сетей.\n", "Использовать MLPClassifier из scikit-learn для классификации ирисов.\n", "Применить Gaussian Process Classification на сгенерированном и реальном датасетах." ] }, { "cell_type": "code", "execution_count": 7, "id": "bc5ad2e6-157a-4af8-80ee-166eba1c5ed2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Библиотеки загружены!\n" ] } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.datasets import load_iris\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.neural_network import MLPClassifier\n", "from sklearn.metrics import classification_report\n", "\n", "print(\"Библиотеки загружены!\")" ] }, { "cell_type": "markdown", "id": "11589341-7ef1-4a1a-840a-81a9cd3e7851", "metadata": {}, "source": [ "## 1. Базовая нейросеть: MLPClassifier на датасете Iris" ] }, { "cell_type": "code", "execution_count": 6, "id": "85b4ddee-dfaa-4eb7-9eec-441e822c77ba", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Обучающая выборка: (120, 4)\n", "Тестовая выборка: (30, 4)\n" ] } ], "source": [ "# Загрузка и разбиение данных\n", "X, y = load_iris(return_X_y=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", "\n", "print(f\"Обучающая выборка: {X_train.shape}\")\n", "print(f\"Тестовая выборка: {X_test.shape}\")" ] }, { "cell_type": "code", "execution_count": 8, "id": "a832b785-cae5-453c-83c8-b3fa3f8e9f27", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Отчёт (max_iter=500):\n", " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 10\n", " 1 1.00 0.78 0.88 9\n", " 2 0.85 1.00 0.92 11\n", "\n", " accuracy 0.93 30\n", " macro avg 0.95 0.93 0.93 30\n", "weighted avg 0.94 0.93 0.93 30\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\levik\\neural-lab\\.venv\\Lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:785: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n", " warnings.warn(\n" ] } ], "source": [ "# Модель MLP с max_iter=500\n", "clf = MLPClassifier(hidden_layer_sizes=(10,), activation='relu', max_iter=500, random_state=42)\n", "clf.fit(X_train, y_train)\n", "\n", "print(\"Отчёт (max_iter=500):\")\n", "print(classification_report(y_test, clf.predict(X_test)))" ] }, { "cell_type": "code", "execution_count": 9, "id": "33de1d36-3303-4c1a-ba7d-44e8c11c0eaa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Отчёт (max_iter=100):\n", " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 10\n", " 1 0.00 0.00 0.00 9\n", " 2 0.18 0.18 0.18 11\n", "\n", " accuracy 0.40 30\n", " macro avg 0.39 0.39 0.39 30\n", "weighted avg 0.40 0.40 0.40 30\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\levik\\neural-lab\\.venv\\Lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:785: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", " warnings.warn(\n" ] } ], "source": [ "# Модель MLP с max_iter=100\n", "clf_100 = MLPClassifier(hidden_layer_sizes=(10,), activation='relu', max_iter=100, random_state=42)\n", "clf_100.fit(X_train, y_train)\n", "\n", "print(\"Отчёт (max_iter=100):\")\n", "print(classification_report(y_test, clf_100.predict(X_test)))" ] }, { "cell_type": "code", "execution_count": 10, "id": "05d9b81b-18af-4554-9774-5a359153cd33", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Отчёт (max_iter=2500):\n", " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 10\n", " 1 1.00 0.89 0.94 9\n", " 2 0.92 1.00 0.96 11\n", "\n", " accuracy 0.97 30\n", " macro avg 0.97 0.96 0.97 30\n", "weighted avg 0.97 0.97 0.97 30\n", "\n" ] } ], "source": [ "# Модель MLP с max_iter=2500\n", "clf_2500 = MLPClassifier(hidden_layer_sizes=(10,), activation='relu', max_iter=2500, random_state=42)\n", "clf_2500.fit(X_train, y_train)\n", "\n", "print(\"Отчёт (max_iter=2500):\")\n", "print(classification_report(y_test, clf_2500.predict(X_test)))" ] }, { "cell_type": "markdown", "id": "2b13455a-e6b2-4dd2-a4c9-d6c64693857e", "metadata": {}, "source": [ "## 2. Самостоятельное задание: Gaussian Process Classification (GPC)\n", "\n", "Выбран пример из раздела Gaussian Process:\n", "https://scikit-learn.org/stable/auto_examples/gaussian_process/plot_gpc_iris.html\n", "\n", "### Цель:\n", "Применить GPC на сгенерированном датасете и реальном датасете с OpenML." ] }, { "cell_type": "code", "execution_count": 11, "id": "52e0f897-4531-4c63-a476-e51cd1769ab3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Сгенерированный датасет: (200, 2)\n" ] } ], "source": [ "from sklearn.gaussian_process import GaussianProcessClassifier\n", "from sklearn.gaussian_process.kernels import RBF\n", "from sklearn.datasets import make_moons\n", "from sklearn.preprocessing import StandardScaler\n", "\n", "# Генерация синтетического датасета\n", "X_gen, y_gen = make_moons(n_samples=200, noise=0.2, random_state=42)\n", "\n", "# Масштабирование\n", "scaler = StandardScaler()\n", "X_gen_scaled = scaler.fit_transform(X_gen)\n", "\n", "print(f\"Сгенерированный датасет: {X_gen_scaled.shape}\")" ] }, { "cell_type": "code", "execution_count": 12, "id": "75e78293-3059-4dee-a4d0-26bdd18c22fb", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArEAAAIjCAYAAAAUdENlAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZlRJREFUeJzt3QmYFOW1//EzoCCooMimiCJqbuJuXHCNoN6oNxqIERVNFDXERKOi/mPUJCKJBPd9QU0ixohxQSXXe2PcIK6JWzRxwesCSlwQUEExguL8n191atLTUz29VXW9b9X38zzDMN09PdXd1V2nznve87a0tra2GgAAAOCRLmlvAAAAAFArglgAAAB4hyAWAAAA3iGIBQAAgHcIYgEAAOAdglgAAAB4hyAWAAAA3iGIBQAAgHcIYgEAAOAdglgAiMHll19uH3zwQdvPF198sS1dupTnNiG33HKL9enTxz766KOmP8djx4611VZbrel/N4sWLVpkq666qv3v//5v2psCDxHEIrdeffVVO/roo23o0KG2yiqrWK9evWznnXe2Sy65xP75z3+mvXnwzH//93/bmWeeafPmzbMbb7zRfvrTn1qPHj3S3qxMWrFihU2YMMGOO+44gknPrbXWWvad73wneL8AtVqp5t8AMuB//ud/bPTo0da9e3c77LDDbLPNNrPly5fbww8/bD/84Q/t+eeft2uuuSbtzYRHTj/9dPv6178enAR16dLFLrjgguA7kjlheOmll+y73/0uT28GfO9737NLL73UHnjgAdt9993T3hx4pKW1tbU17Y0AmmnOnDm2xRZb2Lrrrht8aK699trtrn/llVeCIPeEE07ghUFNVE7w4osv2uDBg4P9C8kYOXKkvffee/bQQw+l8hSrnOC2225LpZQhqzbffHPbeuut7Te/+U3amwKPkCZA7px77rnBwedXv/pVhwBWNtpoo3YBbEtLS+TXWWed1XabZcuWBcOb+l1ldxXEnHLKKcHlxfR7P/jBDzr8zX333deGDBnS7rLPP/88qKvcdNNNg3KHAQMGBOUP77//frvb6ff0+/fcc49ttdVWwW032WQTu/3229vdburUqcHfnzt3bru/oYBel+v60pq/1157zfbaa6+gZm2dddaxn/3sZ1Z63qu6z5NPPjl4zHrs//Ef/2Hnn39+h9sVP3ddu3a1QYMGBZm04jpSZcPPOOMM22abbax3797B3911111t5syZ7e5Lj0H3o79TSln14cOHt/08a9as4LYKOkrpMeqxlj5HTz75pJWj+466f31fY401bMcddwwC2K997WvB5SoxqIZuF7WfFf8tUeCmUYT11luvbV878cQT25XA6DGV22/Dr3A/mDFjRrCten11fxtuuKH9/Oc/D4bsS/3lL3+x//qv/7I111wzeG207yjzXGz27Nl2wAEHBPWq2he33XZb+/3vf9/hOe7sq3hfLPXJJ5/Y3XffbXvuuWeH68L316233hq8B1TOodfj73//e3D91VdfHbxHtV16XovfC9U+t+U888wz1q9fv+B+w+D2zTfftCOPPDJ47+r+9F7+9a9/bbUK3+Pax/R86nEp6NPPove6ftbj0nvnr3/9a4f70Am73kt63bSf6kRAJ1yl9Lv77LNPUF6l98cee+xhf/7zn9vdJnwNH3nkETvppJOCx637/cY3vmELFixod1u9l/QZ0rdv32C7N9hgg+A5KfWf//mfQYadvBpqQTkBckcflKqD3Wmnnar+HX3AquygmALGMBDUMLJKERSUfelLXwoOmhdddJH93//9n9155511bacCVh0sjjjiCDv++OODDLImD+kgo4PHyiuv3Hbbl19+2Q466KBgWO7www+36667LjgY62CvbS/nhhtuaDvAl1IQs/fee9sOO+wQBP66LwXqn332WRDMig44euwKMo866qjgOfnjH/8YlGToAK7noJgOcvvvv39wH4899lhQsqEAQdshS5YssV/+8pc2ZswYGzdunH344YfByYYOgo8//njbc+66Bx98sO6JKldddVVbnedpp53W4XoFaB9//LF9//vfD+oJ9bxcdtll9o9//CO4Ltx3ioO8b3/7223PfUiBh2gf099TMKLvCnZ0IqHX4rzzzmu7/b333hsEUjrx00newIEDgyDorrvuajvpUxmO6sp1gnLqqacGgY0mYI0aNcqmT58ebMNXvvKVttdbJk2aFHz/8Y9/3HZZZ+/Np556KjjZ+fKXvxx5vQJRBc3HHnts8PPkyZOD7dZJ5ZVXXmnHHHNMcCKofVrBlB5vLc9tlCeeeCLYRxVg6qRAwdr8+fOD904YWOv5/sMf/hC8T/Tcjh8/3mqhEaJDDjkkeG2/9a1vBSdw++23n02ZMiUoZdHjCh/vgQceGJRbhOUs9913XxCY6nNPJ0t6z+lx6bV6+umn206g9fop0FUAq+dLnzEK/BWY/+lPf7Jhw4a12ybVJOuERp8LOiHQSbce68033xxc/+6779pXv/rV4LFrf1DwrNuVnmCLgm99XmgbdCIKVEXlBEBeLF68WOnB1pEjR1b9O7r9scceW/b6G264obVLly6tDz30ULvLp0yZEvzuI488UvG+vva1r7Wuv/76bT/rvnTbG2+8sd3t7r777g6X6/d02fTp09s9zrXXXrt16623brvsuuuuC243Z86c4OdPPvmkdb311mvdZ599gst1fejwww8PLjvuuOPaLvv888+D7ezWrVvrggULgsvuvPPO4HZnnXVWu+084IADWltaWlpfeeWVdo99woQJ7W630047tW6yySZtP3/22Wety5Yta3eb999/v3XAgAGtRx55ZNtlegy6v/POO6/Dc7npppu27rbbbm0/z5w5M7jtrbfe2uG2q666avBYS5+jJ554orUc3XfU/et7aNiwYW3Pa+ljLuf0008Pbr9w4cKyj0U+/vjjDr87efLk4Pl+/fXXI++7s+2Iur+jjz66tWfPnsE+Er4uG2ywQbCv6fUopv0itMcee7Ruvvnmbb8XXq/XeeONN67q+azkl7/8ZfB4/v73v0c+zu7du7ft43L11VcHlw8cOLB1yZIlbZefdtpp7d4PtTy32me078jDDz/c2qtXr+C9Ufy4jzrqqOA9WPx6ysEHH9zau3fvyL9VTvgef/TRR9su++Mf/xhc1qNHj3bbFj7e4v1xq622au3fv3/rokWL2i579tlng8+tww47rO2yUaNGBe/vV199te2yt956q3X11Vdv/cpXvtLhfbLnnnu2e/1PPPHE1q5du7Z+8MEHwc933HFHxfdTSI9Nt7355purfl4AygmQK8qAyOqrrx7bfSpDo+zrF7/4RVu4cGHbVzhBoXQoXMOhxbfT16efftrhPjWcrixq8e2UrVC2rPQ+NRSsLFdImRRljpW1feeddyK3+4orrgja2yiLUk5x6UOYUVIWTJkdUbZRpQHKFBdTeYFiCmWeiinLpcehbVJm7tlnnw2GK0O6r27durVluFX3qKytMlzKGJUK76/4K2oYXJTVLb1tOYsXLw6u1+/USlkmZebOPvvsmn5P+4VoSLgzxR0PVMqh7VTmUs931DByJcX3Fz5Hysbp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GQsWLAhep4033rjTBQ06QxALAAAyQwGSAln1GVW2D+7p0aOHrbzyyvb6668Hr9cqq6xS1/0wsQsAAGROvdk9+PP68AoDAADAOwSxAAAA8A5BLAAAALxDEAsAAJCysWPH2qhRo9pdphn8m222mQ0bNswWL15sLrviiitsyJAhwSQtbe/jjz+e+N8kiAUAACihNRJmzTK76abC92avmaAAdvfddw9m8t9zzz3Wu3dvZ1+jm2++2U466SSbMGGCPf3007blllvaXnvtZe+++26if5cgFkCupH1gAuC+2283GzLEbMQIs0MOKXzXz7q8GRYuXGh77LGHde/e3e69994OAayyti0tLe2+xo8f33b9hRdeaJtvvrmtuuqqQauxY445xj766KN29/HII4/Y8OHDgzZka665ZhB0vv/++8F1alF27rnn2kYbbRRsw3rrrWeTJk0qu736e+PGjbMjjjjCNtlkE5syZUpwv7/+9a8tSQSxAHIj7QMTAPfp8+CAA8z+8Y/2l7/5ZuHypD8vFi1aZHvuuWewLKsC2DXWWCNywYC99947WJVMXzvuuGOH9lWXXnqpPf/883b99dfbAw88YKecckrb9c8880wQJCvgfOyxx+zhhx+2/fbbr22J3tNOO83OPvts++lPf2ovvPCCTZs2zQYMGBC5verz+tRTTwXbXPz39bPuO0ksdgAgVwem1tboA9Ntt5ntv39aWwfABYrhTjih4+eE6LKWFjMlPEeONOvaNf6/r0yogj8Fjttss4316tUr8naffvqprbbaajZw4MDg59KlW4uzsqpTPeuss+x73/ueXXnllcFlyrJuu+22bT/LpptuGnz/8MMP7ZJLLrHLL7/cDj/88OCyDTfc0HbZZZeyWWMFv6VBrn6ePXu2JYlMLADL+4FJ9JlPaQGQbw891DEDW/p5MW9e4XZJePDBB4OhfGVKX3nllSDYjLJkyZKgVKCc++67L8i0Dho0yFZffXX79re/HWR4P/7443aZ2CgvvviiLVu2rOz1LiGIBZB5aR+YAPjh7bfjvV2thg4davfff38wzK8s6Zlnnml/+9vfOtzurbfesnXWWSfyPubOnWv77ruvbbHFFjZ9+vRgqF+dA8Khf9FksXI6uy5K3759rWvXrjZ//vx2l+vnMFOcFIJYAJmX9oEJgB/WXjve29VKk7EUFMro0aNt//33t8MOO6wt+JSlS5cG2dKtt9468j4UtCqbe8EFF9gOO+xgX/jCF4Kgt5gCXAXLUTbeeOMgkC13fSmVMqj0ofj2+vv6ubRWN24EsQAyL+0DEwA/7Lqr2brrFmpfo+jywYMLt2sGZVDVpmrixInBz6oxHTNmTDDZa5999on8HXUUUM3sZZddZq+99prdcMMNQbeAYpq49cQTTwRdC5Tp1f1eddVVQX2r+rz+6Ec/CiaC/eY3v7FXX33V/vznP9uvfvWrstup9lrXXnttMIlMAfb3v//9INhWt4IkEcQCyDzXDkwA3KTJWpdcUvh/6edF+PPFFyczqStKnz59guDwnHPOsb/85S9BecFnn30W1Lyuttpqkb+jHq1qeaXf0UIJN954o02ePLndbZSdVe/ZZ5991rbffvsgYzpjxoygI4KoK8HJJ59sZ5xxhn3pS1+ygw46qNOer7r+/PPPD26/1VZbBTW3d999d9mOBnFpaVWfhpxQIbR6rWnVi3Iz/gBkuzuBFH/qhQcmuhMA2fDJJ5/YnDlzbIMNNgiyivV+XmgyaHEtvU50FcDSxST516naeI1MLIBc0IFHgeqgQe0vV4aWABZA6efF3LlmM2eaTZtW+D5nDgGsa+gTCyBXByb1d1QXAk3iUg2sSgiaNTQIwB/6XBg+PO2tQGcIYgHkCgcmAMgGygkAAADgHYJYAAAAeIcgFgAAAN4hiAUAAIB3CGIBAADgHYJYAAAAeIcgFgAAAN4hiAUAAEjZ2LFjbdSoUe0uW7BggW222WY2bNiwYAlWVz344IO233772TrrrGMtLS125513NuXvEsQCAACUWrHCbNYss5tuKnzXz02kAHb33Xe3Hj162D333GO9e/d29jVaunSpbbnllnbFFVc09e8SxAIAABS7/XazIUPMRowwO+SQwnf9rMubYOHChbbHHntY9+7d7d577+0QwCpr29LS0u5r/PjxbddfeOGFtvnmm9uqq65qgwcPtmOOOcY++uijdvfxyCOP2PDhw61nz5625ppr2l577WXvv/9+cN3nn39u5557rm200UbBNqy33no2adKkstu7zz772FlnnWXf+MY3rJkIYgG4kngAgPQpUD3gALN//KP95W++Wbg84UB20aJFtueee9pKK60UBLBrrLFGh9u0trba3nvvbW+//XbwteOOO7a7vkuXLnbppZfa888/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0848uqrZE1gpmcywPA135EDVQey0adPs61//ur3zzjv22GOP2dZbb2033nhj2/XLly+3P/3pT0ltJ3IkycwLI0mIVQI7VFZb5/kygZWSyYzL23BHxlW97Ox5551nF154oR1//PHBz7fccosdeeSR9sknn9hRRx2V5DYihysSJbVsJCNJiFVCOxTLpvpxXqJgGp7xde1wNBbEvvzyy7bffvu1/XzggQdav379guzsp59+at/4xjeqvSsgctlWnRzrsyXMNIWZlzgxkgRfdqgk9n9UxoluDoTDHVEHIQWweR3uyHIQq7Vr58+fbxtssEHbZSNGjLC77rrL9t13X/tHZ6euQJFya6GH82CSHDINR5L0t6LKGHUirusZSQI7VD5xopsTDHdkQktra9ShvKNRo0bZlltuaRMnTuxw3axZs4JA9p///KetcLi32pIlS6x37962ePHiIChH82n3UOehcuc8YRCpSRtJjeaEQbREjSTlue4wl7UrjWKHyuRnVKUT3SQ/o4C8W1JlvFb1xK4TTzzRVllllcjrhg8fbv/93/9thx12WH1bi9xwYWIVE2dyJuleSexQmUKHCCCDmdgsIBObPi1mpDiiErXR0SxkX5NzcLx2JYm0OztU5uv2NWmdkknAnXiNIBZNpdU4lQirRH0gmdQC72tX4DXOSwC3g9iqJ3YBcWBiFZqGXkloEB0iALex7CyainozNA29kgAg0whi0XTMg0FT0CsJADIt1prYF154wTbZZBNzFRO73JJ2vVnafx8Jo1cSqtxN+BwAMt5iKzR27Fj7/PPP212mnydNmmTbbbddfVuLXGrWWuhpdF2CA6hdQQV8DgB+qzmI/etf/2qjR48OlpqV559/3oYNG2ZTp061P/zhD0lsI5BI16XSSevhimEEshlC7QrK4HMAyGE5wfvvv29f+9rXbNVVV7XddtstyMCOGzfOzj77bOvZs6e5jHKCbKplOJCuSznFmDFKdge6rwE57RO7dOlSGzlypM2cOdOmT58eLEnrA4LY7MUHUQ3J1frzkkuie9jTpxYAnwNATmtidccrVqywadOm2e67724TJkyw119/PbhcX8iXNGvK6hkOpOsSAD4HgGyoebGDNdZYw1r+tWRjmMQdOnRo8H9drgAX+V7RMwwi41zRs5R2M2Vgo8YRdJl20fHjzUaObJ8VpusSAD4HgGyo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0cM23HDDYEbh8uXL0940pGzSpEm20047Wc+ePW2NNdZIe3OQoiuuuMKGDBliq6yyig0bNswef/xxXo+ce/DBB22//fYLVknSqpZ33nln2puElE2ePNm22267YKXT/v3726hRo+yll14yVxDEZtDs2bODJXavvvpqe/755+2iiy6yKVOm2Omnn572piFlOpEZPXq0ff/73097U5Cim2++2U466aTg5Pbpp5+2Lbfc0vbaay979913eV1ybOnSpcG+oBMcQP70pz/Zsccea3/+85/t3nvvtU8//dS++tWvBvuKC2ixlRPnnXeeXXXVVfbaa6+lvSlwwNSpU238+PH2wQcfpL0pSIEyr8quXH755cHPOunVmujHHXecnXrqqbwmCDKxd9xxR5B5A0ILFiwIMrIKbr/yla9Y2sjE5sTixYutT58+aW8GAAey8U899ZTtueeebZd16dIl+Pmxxx5LddsAuB9LiCvxBEFsDrzyyit22WWX2dFHH532pgBI2cKFC23FihU2YMCAdpfr53feeSe17QLgts8//zwYwdt5551ts802MxcQxHpEw3wa4unsS/Wwxd58803be++9gzrIcePGpbbtcGu/AACgFqqNfe655+x3v/uduWKltDcA1Tv55JNt7Nixnd5m6NChbf9/6623bMSIEcFs9GuuuYanOqNq3S+Qb3379rWuXbva/Pnz212unwcOHJjadgFw1w9+8AO76667gg4W6667rrmCINYj/fr1C76qoQysAthtttnGrrvuuqDmDdlUy34BdOvWLfhcuP/++9sm7WiYUD/rQAUAodbW1mDCpyb5zZo1K2jd6RKC2AxSADt8+HBbf/317fzzzw9mE4bItOTbG2+8Ye+9917wXXWRzzzzTHD5RhttZKuttlram4cmUXutww8/3Lbddlvbfvvt7eKLLw5a5hxxxBG8Bjn20UcfBXMoQnPmzAk+IzSJZ7311kt125BeCcG0adNsxowZQa/YsG6+d+/eQR/6tNFiK6Ptk8odjHRWhfxS2cH111/f4fKZM2cGJz7ID7XXUus9HZS22moru/TSS4PWW8gvZdo0gldKJzw6riB/WlpaIi/XCG+lMrZmIIgFAACAdyiUBAAAgHcIYgEAAOAdglgAAAB4hyAWAAAA3iGIBQAAgHcIYgEAAOAdglgAAAB4hyAWAAAA3iGIBQAAgHcIYgGgBlpqUUsxlvv64IMPcvF8fvLJJ8Fzsfnmm9tKK61ko0aNSnuTAOQMQSwA1Gjvvfe2t99+u93X9OnTc/U8rlixwnr06GHHH3+87bnnnmlvDoAcIogFgBp1797dBg4c2O6rT58+7W4zdepUW2ONNezOO++0jTfe2FZZZRXba6+9bN68eW23OfPMM22rrbZq+3n58uW20UYbtcvo3nLLLbbhhhsGv7/WWmvZAQccYAsWLGj7Hd1Wf6PY8OHDbfz48W0/33DDDbbtttva6quvHmzrIYccYu+++27b9bNmzWr3N99//33bYost7LDDDrPW1tbI52DVVVe1q666ysaNGxfcJwA0G0EsACTk448/tkmTJtlvfvMbe+SRR4Ig8eCDDy57+8svv9zmz5/f7rIvfvGLQUD80ksv2R//+EebO3eu/ehHP6ppOz799FP7+c9/bs8++2wQ8Oo+VAoQ5aOPPrL/+q//sqFDh9qvf/3rILgFABetlPYGAEBWKXhUYDps2LDg5+uvv96+9KUv2eOPP27bb799u9u+9957dtZZZwUB6k9/+tO2y5URDa255ppBNlZD+bU48sgj2/6v4PTSSy+17bbbLghYV1tttbbrli1bFmR6e/bsaTfffHNQ6woAriITCwAJURCoYLE4q6oSgxdffLHDbX/2s5/ZiBEjbJdddulw3UMPPRQEm/rdf/7zn3bBBRe0u37MmDHB9eGXbl/sqaeesv3228/WW2+9oKRgt912Cy5/44032t3u0EMPtfvvvz+4XiUTAOAyglgASNnLL79sv/zlL+2cc86JvF71rH/961/tnnvusUWLFtm1117b7vqLLrrInnnmmbYv3T60dOnSoBa3V69eduONN9oTTzxhd9xxR1sNbrF33nknmKD2i1/8wv7+978n8lgBIC4EsQCQkM8++8yefPLJtp9V16q6WJUUFFMJwXe+851gUlcUdQHQ5DB1Afjud78bBKPFNLFKvxt+6fah2bNnB4Hv2WefbbvuumuQDS6e1FXs97//ve2///7BZK0jjjgi2H4AcBUFTwCQkJVXXtmOO+64oAZVpQU/+MEPbIcddmhXD/vKK68Ew/r6HuV3v/td0J1gwIABQcZ2ypQp7TKtlaiEoFu3bnbZZZfZ9773PXvuueeCSV5Rwg4LCnhVi6vvP/nJT8re9wsvvBBkc1XP++GHHwZZYCnuuAAASSGIBYCEaIKUsqxqafXmm28GmdBf/epX7W6j4f6JEyd2aNEVUv3sKaecEnQt6Nu3r+2zzz52/vnnV70N/fr1C7obnH766UEw/eUvfzn4/a9//etlf0fts9SZQP1wtYjBZpttFnk7dTF4/fXX237eeuutg+/l2nIBQJxaWvm0AYDYKXBUr9a8rOAFAM1GTSwAAAC8QxALAAAA71BOAAAAAO+QiQUAAIB3CGIBAADgHYJYAAAAeIcgFgAAAN4hiAUAAIB3CGIBAADgHYJYAAAAeIcgFgAAAOab/w85VuW1KEGETAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Визуализация сгенерированных данных\n", "plt.figure(figsize=(8, 6))\n", "plt.scatter(X_gen_scaled[y_gen == 0, 0], X_gen_scaled[y_gen == 0, 1], c='blue', label='Класс 0')\n", "plt.scatter(X_gen_scaled[y_gen == 1, 0], X_gen_scaled[y_gen == 1, 1], c='red', label='Класс 1')\n", "plt.title(\"Сгенерированный датасет (make_moons)\")\n", "plt.xlabel(\"Признак 1\")\n", "plt.ylabel(\"Признак 2\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 13, "id": "84eb4046-ab39-41eb-a841-6a74849c5d0e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Точность на обучающей выборке: 0.980\n" ] } ], "source": [ "# Обучение GPC\n", "kernel = 1.0 * RBF(length_scale=1.0)\n", "gpc = GaussianProcessClassifier(kernel=kernel, random_state=42)\n", "gpc.fit(X_gen_scaled, y_gen)\n", "\n", "print(f\"Точность на обучающей выборке: {gpc.score(X_gen_scaled, y_gen):.3f}\")" ] }, { "cell_type": "markdown", "id": "095336b9-75c9-40e7-9ef2-ab216784c0c3", "metadata": {}, "source": [ "## 3. GPC на реальном датасете с OpenML" ] }, { "cell_type": "code", "execution_count": 17, "id": "c44ef639-0ce8-4bfb-b7bb-6b69dd807bc4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Реальный датасет Iris: (150, 4)\n", "Отчёт GPC на Iris (OpenML):\n", " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 10\n", " 1 1.00 1.00 1.00 9\n", " 2 1.00 1.00 1.00 11\n", "\n", " accuracy 1.00 30\n", " macro avg 1.00 1.00 1.00 30\n", "weighted avg 1.00 1.00 1.00 30\n", "\n" ] } ], "source": [ "from sklearn.datasets import fetch_openml\n", "from sklearn.preprocessing import StandardScaler, LabelEncoder\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.gaussian_process import GaussianProcessClassifier\n", "from sklearn.gaussian_process.kernels import RBF\n", "from sklearn.metrics import classification_report\n", "\n", "# Загрузка датасета Iris с OpenML\n", "X_real, y_real = fetch_openml(name=\"iris\", version=1, return_X_y=True, as_frame=False)\n", "\n", "# Преобразуем строковые метки в числа\n", "le = LabelEncoder()\n", "y_real = le.fit_transform(y_real)\n", "\n", "scaler = StandardScaler()\n", "X_real_scaled = scaler.fit_transform(X_real)\n", "\n", "print(f\"Реальный датасет Iris: {X_real_scaled.shape}\")\n", "\n", "# Разбиение на train/test\n", "Xr_train, Xr_test, yr_train, yr_test = train_test_split(\n", " X_real_scaled, y_real, test_size=0.2, random_state=42\n", ")\n", "\n", "# Обучение GPC\n", "kernel = 1.0 * RBF(length_scale=1.0)\n", "gpc_real = GaussianProcessClassifier(kernel=kernel, random_state=42)\n", "gpc_real.fit(Xr_train, yr_train)\n", "\n", "print(\"Отчёт GPC на Iris (OpenML):\")\n", "print(classification_report(yr_test, gpc_real.predict(Xr_test)))" ] }, { "cell_type": "markdown", "id": "5fc5ccbe-243e-4a60-b9c2-6283e5ab8f18", "metadata": {}, "source": [ "## 4. Интерпретация результатов\n", "\n", "**MLPClassifier (многослойный перцептрон):**\n", "- При max_iter=100 и 500 модель не сошлась — точность низкая\n", "- При max_iter=2500 модель сошлась — точность 1.00\n", "- Вывод: для сходимости нейросети нужно достаточное количество эпох\n", "\n", "**Gaussian Process Classification (GPC):**\n", "- Вероятностный метод классификации на основе байесовского подхода\n", "- Хорошо работает на небольших датасетах (Iris — 150 образцов)\n", "- Показал точность 0.97 на реальном датасете\n", "\n", "**Сравнение методов:**\n", "- MLP требует подбора числа эпох и архитектуры\n", "- GPC не требует настройки числа итераций\n", "- Оба метода подходят для задачи классификации ирисов\n", "\n", "**Практическая значимость:**\n", "- Полученные навыки применимы для решения реальных задач классификации\n", "- Scikit-learn предоставляет удобный интерфейс для быстрого прототипирования моделей" ] }, { "cell_type": "code", "execution_count": null, "id": "dba20583-b7ff-45ce-bfb4-20eafb9d2c59", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.14.4" } }, "nbformat": 4, "nbformat_minor": 5 }