{ "cells": [ { "cell_type": "markdown", "id": "d44b76a1-962a-4a09-91d5-74f1fbefb88f", "metadata": {}, "source": [ "Цель задачи:\n", "Сравнить качество различных алгоритмов классификации (SVM, KNN, Decision Tree, Random Forest, Logistic Regression):\n", "\n", "На синтетическом датасете, сгенерированном с помощью make_blobs.\n", "\n", "На реальном датасете с openml.org (SMS Spam Collection)." ] }, { "cell_type": "code", "execution_count": 7, "id": "dec9f4c6-3bc5-4dd1-b11e-85fe059751ce", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 9\n", " 1 1.00 1.00 1.00 10\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 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", "# Загрузка и разбиение данных\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)\n", "\n", "# Модель MLP — многослойный перцептрон\n", "clf = MLPClassifier(hidden_layer_sizes=(10,), activation='relu', max_iter=2500)\n", "clf.fit(X_train, y_train)\n", "\n", "# Отчёт о точности\n", "print(classification_report(y_test, clf.predict(X_test)))" ] }, { "cell_type": "markdown", "id": "b8718927-08f3-4d35-b163-d31bc7a8ce7d", "metadata": {}, "source": [ "Импорт необходимых библиотек" ] }, { "cell_type": "code", "execution_count": 30, "id": "619b3507-5dc9-4581-b5b7-a2dc21e2656a", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.datasets import make_blobs\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.pipeline import make_pipeline\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.svm import SVC\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.metrics import accuracy_score, classification_report\n", "from sklearn.preprocessing import LabelEncoder\n", "from sklearn.naive_bayes import MultinomialNB\n", "from sklearn.svm import LinearSVC\n", "from sklearn.preprocessing import LabelEncoder\n", "\n" ] }, { "cell_type": "markdown", "id": "d112584d-4642-4eea-9d47-c1310a7be009", "metadata": {}, "source": [ "2. Синтетический датасет: make_blobs" ] }, { "cell_type": "markdown", "id": "aecc83be-209a-4f5c-aaf1-32ea571f0820", "metadata": {}, "source": [ "2.1 Создание и визуализация данных" ] }, { "cell_type": "code", "execution_count": 8, "id": "39d5b664-ee7d-444d-b964-fd3b90d8a396", "metadata": {}, "outputs": [ { "data": { "image/png": "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DQ1Vl3r16qk2Hjx40O7zsCzhzL5UVtoo10ubLVJSUtRjy9JQf39/vXLlyvrYsWP1xMTELD8rSzZl6aaz/WJ5LFn26qhtf//9t96kSRO1tLVatWqqf77//vscbXVmebLFuXPn1LLYOnXq6Llx+fJl/d5771XLSGU5q3y9fft2h8uTly1bpg8YMEAtjQ4ICFD/y1LpQ4cOZbn/OXPm6A0aNFDLzDPfp733jK3lyb/++qt6rcqUKaMHBwer1yfz0mCLDz/8UC1llvdbhw4d9C1btuS4T3ttE9IHt99+u1reLvcj74chQ4ao553ZypUr1ftZ+kCWl8vy3ex9Zc+aNWvUkufw8HD1npf3xaeffmqz3y1LpR944AH1esnPSbsuXryYZXmylBR44YUX9KZNm2bct3w9ZcqULPcVGxurDx8+XC9WrJj6+cxLlZ393ZWfs7YM+o8//tB79uypXi/pnypVquiPPPKIeq+S79PkH08HS0TkO2TpqHwilyJmMv9PRFSQmKNCRLkiq3hkaF6G7ImIChpzVIjIKVK6fN++fWolh+TZZN6rhYiooHDqh4icIvv5rFu3TiU7StKovb19iIhchYEKEREReS3mqBAREZHXYqBCREREXsunk2mlTLLsNSJFlFxdQpuIiIgKhmSdSLFAqWDsaHNRnw5UJEjJvmEVERER+QbZckKqCRfaQMWytbw8USk37StSUlLUDqNS4tzf39/TzSkU2Keuxz4tGOxX12Of+l6fxsTEqIEGy3m80AYqlukeCVJ8LVAJCQlRbeYvlWuwT12PfVow2K+uxz713T51Jm2DybRERETktRioEBERkddioEJERERei4EKEREReS0GKkREROS1GKgQERGR12KgQkRERF6LgQoRERF5LQYqRERE5LV8ujItEXnWtqW7MOv/5mPP2gNqY7HWfZrh9qdvQ52WNT3dNCIqJDiiQkR58tOE3/FSzzexacF2xF6NQ8zl61gxYy2eaDMWS6at9HTziKiQYKBCRLm2bdluTJswU31tNpkzrjelmtX27R88MAVnj573YAuJqLBgoEJEuTbr//6Bwc/+n495Xy52W3uIqPBioEJEubZ37UGYU2+MpGQnoyy71xxwa5uIqHBioEJEuWYwOv7T4edvdEtbiKhwY6BCRLnWpk9zGO1M/WgGDa16NXNrm4iocGKgQkS5JkuQzWbd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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Создаём 3 кластера\n", "X, y = make_blobs(centers=3, cluster_std=0.5, random_state=0)\n", "\n", "# Визуализация\n", "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')\n", "plt.title(\"Three normally-distributed clusters\")\n", "plt.xlabel(\"Feature 1\")\n", "plt.ylabel(\"Feature 2\")\n", "plt.grid(True)\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "ea44ff0d-c2ef-47af-b589-55beb44d5787", "metadata": {}, "source": [ "2.2 Деление на train/test" ] }, { "cell_type": "code", "execution_count": 9, "id": "fc2711a3-dbb6-48ab-8e4a-06b280675f23", "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n" ] }, { "cell_type": "markdown", "id": "0d23f0b7-37e1-4644-ae01-7ee8e1674658", "metadata": {}, "source": [ "3. Обучение моделей" ] }, { "cell_type": "code", "execution_count": 10, "id": "f1baafd9-b282-4c2f-ad6f-8c2473bd29e7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Logistic Regression:\n", "Accuracy: 1.000\n", " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 14\n", " 1 1.00 1.00 1.00 10\n", " 2 1.00 1.00 1.00 6\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", "\n", "SVM:\n", "Accuracy: 1.000\n", " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 14\n", " 1 1.00 1.00 1.00 10\n", " 2 1.00 1.00 1.00 6\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", "\n", "KNN:\n", "Accuracy: 1.000\n", " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 14\n", " 1 1.00 1.00 1.00 10\n", " 2 1.00 1.00 1.00 6\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", "\n", "Decision Tree:\n", "Accuracy: 0.967\n", " precision recall f1-score support\n", "\n", " 0 1.00 0.93 0.96 14\n", " 1 1.00 1.00 1.00 10\n", " 2 0.86 1.00 0.92 6\n", "\n", " accuracy 0.97 30\n", " macro avg 0.95 0.98 0.96 30\n", "weighted avg 0.97 0.97 0.97 30\n", "\n", "\n", "Random Forest:\n", "Accuracy: 0.967\n", " precision recall f1-score support\n", "\n", " 0 1.00 0.93 0.96 14\n", " 1 1.00 1.00 1.00 10\n", " 2 0.86 1.00 0.92 6\n", "\n", " accuracy 0.97 30\n", " macro avg 0.95 0.98 0.96 30\n", "weighted avg 0.97 0.97 0.97 30\n", "\n" ] } ], "source": [ "models = {\n", " \"Logistic Regression\": LogisticRegression(max_iter=1000),\n", " \"SVM\": SVC(),\n", " \"KNN\": KNeighborsClassifier(),\n", " \"Decision Tree\": DecisionTreeClassifier(),\n", " \"Random Forest\": RandomForestClassifier()\n", "}\n", "\n", "for name, model in models.items():\n", " clf = make_pipeline(StandardScaler(), model)\n", " clf.fit(X_train, y_train)\n", " y_pred = clf.predict(X_test)\n", " print(f\"\\n{name}:\\nAccuracy: {accuracy_score(y_test, y_pred):.3f}\")\n", " print(classification_report(y_test, y_pred))\n" ] }, { "cell_type": "markdown", "id": "3614904f-d3d1-40e5-9ad6-f308117c2a7f", "metadata": {}, "source": [ "4. Интерпретация (синтетические данные)" ] }, { "cell_type": "markdown", "id": "fc315f20-878e-4629-8154-5977fd88427f", "metadata": {}, "source": [ "### Интерпретация результатов\n", "\n", "- Данные хорошо разделимы, поэтому все модели показывают высокую точность.\n", "- KNN, Logistic Regression и SVM — самые точные на таких кластерах.\n", "- Decision Tree и Random Forest работают тоже хорошо, но могут переобучаться на простых данных.\n" ] }, { "cell_type": "markdown", "id": "b4c25059-3ee5-49a2-8b1a-3d6c5af8ff98", "metadata": {}, "source": [ "5. Реальный датасет из openml.org (SMS Spam Collection)" ] }, { "cell_type": "code", "execution_count": 14, "id": "895c0577-7e18-42fb-9dae-c89977b6f7c8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Уникальные уровни должностей: ['Internship' 'Mid-Senior level' 'Entry level' 'Not Applicable'\n", " 'Associate' 'Executive' 'Director']\n" ] } ], "source": [ "# Загрузка файла\n", "df = pd.read_csv(\"1000_ml_jobs_us.csv\")\n", "\n", "# Посмотреть первые строки\n", "df.head()\n", "\n", "# Оставим только строки с непустыми job_description_text и seniority_level\n", "df = df[['job_description_text', 'seniority_level']].dropna()\n", "\n", "# Отображаем уникальные уровни\n", "print(\"Уникальные уровни должностей:\", df['seniority_level'].unique())\n" ] }, { "cell_type": "markdown", "id": "17edbf86-7b62-4161-90c9-7e2e0272b99c", "metadata": {}, "source": [ "Препроцессинг текстов и меток" ] }, { "cell_type": "code", "execution_count": 20, "id": "27e1ef0a-f61b-4bab-b5ac-b86e7c9c86d8", "metadata": {}, "outputs": [], "source": [ "# Целевая переменная\n", "y = df['seniority_level']\n", "\n", "# Кодирование уровней должности\n", "le = LabelEncoder()\n", "y_encoded = le.fit_transform(y)\n", "\n", "# Векторизация текстов\n", "vectorizer = TfidfVectorizer(max_features=3000, stop_words='english')\n", "X = vectorizer.fit_transform(df['job_description_text'])\n", "\n", "# Делим на обучающую и тестовую выборки\n", "X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.3, random_state=42)\n" ] }, { "cell_type": "markdown", "id": "cc7af45c-059c-4433-b919-a0ea78c39b12", "metadata": {}, "source": [ "Обучение моделей и сравнение" ] }, { "cell_type": "code", "execution_count": 29, "id": "c620989d-5832-42fe-956f-74b7cd996d30", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Результаты классификации (1000_ml_jobs_us.csv):\n", "Logistic Regression: Accuracy = 0.57\n", "Multinomial NB: Accuracy = 0.52\n", "Random Forest: Accuracy = 0.60\n", "Linear SVM: Accuracy = 0.60\n" ] } ], "source": [ "# Обновим классификаторы (теперь подходят для разреженных данных)\n", "text_classifiers = {\n", " \"Logistic Regression\": LogisticRegression(max_iter=1000),\n", " \"Multinomial NB\": MultinomialNB(),\n", " \"Random Forest\": RandomForestClassifier(),\n", " \"Linear SVM\": LinearSVC()\n", "}\n", "\n", "# Обучение и вывод результатов\n", "print(\"Результаты классификации (1000_ml_jobs_us.csv):\")\n", "for name, clf in text_classifiers.items():\n", " clf.fit(X_train, y_train)\n", " y_pred = clf.predict(X_test)\n", " acc = accuracy_score(y_test, y_pred)\n", " print(f\"{name}: Accuracy = {acc:.2f}\")\n" ] }, { "cell_type": "markdown", "id": "88c57a6b-5cd9-41ee-a2d6-e14ab99f6b3c", "metadata": {}, "source": [ "Интерпретация результатов" ] }, { "cell_type": "code", "execution_count": 35, "id": "66677a13-6d22-4cd7-8895-85c151ff93ad", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Классы в кодировщике: ['Associate' 'Director' 'Entry level' 'Executive' 'Internship'\n", " 'Mid-Senior level' 'Not Applicable']\n", "Уникальные классы в тесте: [0 1 2 4 5 6]\n", "\n", "Classification report (Logistic Regression):\n", " precision recall f1-score support\n", "\n", " Associate 0.00 0.00 0.00 14\n", " Director 0.00 0.00 0.00 2\n", " Entry level 0.47 0.58 0.52 86\n", " Internship 1.00 0.35 0.51 26\n", "Mid-Senior level 0.52 0.71 0.60 110\n", " Not Applicable 0.97 0.54 0.70 59\n", "\n", " accuracy 0.57 297\n", " macro avg 0.49 0.36 0.39 297\n", " weighted avg 0.61 0.57 0.56 297\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "D:\\учеба\\2 курс\\семестр4\\praktika 4\\venv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n", "D:\\учеба\\2 курс\\семестр4\\praktika 4\\venv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n", "D:\\учеба\\2 курс\\семестр4\\praktika 4\\venv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n" ] } ], "source": [ "# Подробный отчёт по лучшей модели (Logistic Regression)\n", "best_model = LogisticRegression(max_iter=1000)\n", "best_model.fit(X_train, y_train)\n", "y_pred = best_model.predict(X_test)\n", "\n", "# Используем ПРЕДВАРИТЕЛЬНО ОБУЧЕННЫЙ LabelEncoder (из шага препроцессинга)\n", "# Убедимся, что используем тот же экземпляр, который кодировал y\n", "print(\"\\nКлассы в кодировщике:\", le.classes_)\n", "\n", "# Проверим уникальные классы в тестовых данных\n", "unique_labels = np.unique(np.concatenate([y_test, y_pred]))\n", "print(\"Уникальные классы в тесте:\", unique_labels)\n", "\n", "# Генерируем отчёт только для присутствующих классов\n", "print(\"\\nClassification report (Logistic Regression):\")\n", "print(classification_report(\n", " y_test,\n", " y_pred,\n", " labels=unique_labels,\n", " target_names=le.classes_[unique_labels] # Берём только нужные имена\n", "))" ] }, { "cell_type": "markdown", "id": "d8906a44-1e2f-4392-ae4a-2b3ee1538df8", "metadata": {}, "source": [ "6. Интерпретация результатов\n", "Random Forest и Logistic Regression показали лучшие результаты на изображениях.\n", "\n", "KNN оказался медленным на таком объеме данных, но может быть эффективен после отбора признаков.\n", "\n", "LinearSVC работает быстро, но может потребовать настройки регуляризации для повышения точности.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "85385781-29ae-4fe1-ac42-8c64a75b6af3", "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.13.3" } }, "nbformat": 4, "nbformat_minor": 5 }