2025-02-08 13:32:07 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Начало лабораторной\n",
"\n",
"Выгрузка данных из csv файла в датафрейм"
]
},
{
"cell_type": "code",
2025-02-15 09:27:14 +04:00
"execution_count": 3,
2025-02-08 13:32:07 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['work_year', 'experience_level', 'employment_type', 'job_title',\n",
" 'salary', 'salary_currency', 'salary_in_usd', 'employee_residence',\n",
" 'remote_ratio', 'company_location', 'company_size'],\n",
" dtype='object')\n"
]
}
],
"source": [
"import pandas as pd\n",
"df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n",
"print(df.columns)"
]
},
{
"cell_type": "code",
2025-02-15 10:23:21 +04:00
"execution_count": 5,
2025-02-08 13:32:07 +04:00
"metadata": {},
"outputs": [
{
"data": {
2025-02-15 10:23:21 +04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACuaklEQVR4nOzdd3gUVRfA4d/upvcECAkQelcRQUUQKQoiIor6KSBIUVHpHUSk9450BREUVBQRUVFBFEFEQQEbRUronRDS6873xzibhBSyyW5my3mfJ08mu7MzZ3c2yd17z73HoCiKghBCCCGEizDqHYAQQgghhC1J40YIIYQQLkUaN0IIIYRwKdK4EUIIIYRLkcaNEEIIIVyKNG6EEEII4VKkcSOEEEIIlyKNGyGEEEK4FGncCCGEEMKlSONGCCGEWzAYDIwfP17vMEQJkMaNKLIePXoQEBCgdxhCCCe0atUqDAYDANu3b8dgMHDy5Mkc+3zxxRc0b96c8PBw/Pz8qFq1Ks8++yzffPONDhEXz/jx46lcuTKQ87kL+5DGjbDKtWvXWLBgAc888wxff/01ycnJPPLII4waNYr9+/frHZ4QwkXMnj2bxx9/HIPBwKhRo5g3bx5PP/00R48e5aOPPtI7POHgPPQOQDiPjz76iF69epGQkEDlypXx9PTEYDBw7do15syZw/Tp0+nevTtvv/02Xl5eeocrhHBSGRkZTJo0idatW7Nly5Zc91++fFmHqHJKTEzE399f7zBEPqTnRhTKrl276Nq1KxEREezatYvo6GhatWqFj48Pe/fu5fz583Tu3JnVq1czePBgABRFoXLlyjzxxBO5jpeSkkJwcDCvvPIKkNUtvX79+lz7BgQE0KNHD8vPWpdu9i7sf/75h9DQUB577DEyMjJy7Pfbb7/lON7Vq1fzHHvP67ZZs2ZhMBho0aKF5TYt1u3bt+fYt127doUa09cen99XXs91x44dvPLKK5QqVYqgoCC6devG9evXcxy3cuXKOR4L8Mknn2AwGCzd4QAnT57EYDAwe/bsXLHdfvvtOZ5rWloaY8eOpWHDhgQHB+Pv788DDzzADz/8kOdz0+K9+Sv7+bPL7zW4eXhizZo1NGzYEF9fX8LCwujUqRNnzpzJEWfz5s2pWrUqV65csdw+fvz4XN3/s2fPxsPDg82bN1tua9GiBbfffnuu+GbPnp1nPEuWLOG2227D29ubcuXK0bdvX2JjY3M9/tdff+XRRx8lNDQUf39/6tWrx5tvvgmow7oFvQ+yn7ew17Yg2nUvzOutvSZ57btq1aoc+y1dupTbb78dPz+/HPvl9btcWFevXiUuLo77778/z/vDw8Mt29a+R7M7deoUffr0oVatWvj6+lKqVCmeeeaZXK+H9r7+8ccf6dOnD+Hh4VSoUIEffvgBg8HAZ599luvYH3zwAQaDgd27d1v35IVNSM+NKJTp06djNpv56KOPaNiwYa77S5cuzXvvvcfBgwd56623GDduHOHh4XTt2pWZM2cSExNDWFiYZf8vvviCuLg4unbtWuzYzpw5wyOPPELt2rX5+OOP8fCwzds6NjaWadOmFWrfHTt25PhnWRgDBgzgnnvuyXHbSy+9lOe+/fr1IyQkhPHjx3PkyBGWLl3KqVOnLA2lvGRkZDB69GirYrpZXFwcK1asoHPnzvTq1Yv4+Hjeeecd2rRpw549e6hfv36ej5s4cSJVqlQBYM6cObkaYtk9+eSTPPXUUwDs3LmTt99+O8f9U6ZMYcyYMTz77LO89NJLXLlyhYULF9KsWTP2799PSEgIXl5ebNiwgfvuu48nn3ySbdu24e3tnetcn3/+OSNHjmT+/Pk8+uijRXpNxo8fz4QJE2jVqhW9e/e2XI+9e/eya9cuPD09Adi6dSuPPfYYkZGRDBw4kIiICA4dOsSXX37JwIEDeeWVV2jVqpXluM8//3yO1wKgTJkyecZQnGvbuXNny3PfvHkzH374Yb771q5d23Keq1evWj64aNatW0efPn1o0aIF/fv3x9/fn0OHDjF16tQixaYJDw/H19eXL774gv79++f423Gzor5HAfbu3cvPP/9Mp06dqFChAidPnmTp0qW0aNGCgwcP4ufnl2P/Pn36UKZMGcaOHUtiYiItWrQgKiqKtWvX8uSTT+bYd+3atVSrVo3GjRsX67UQRaQIUQhhYWFKpUqVctzWvXt3xd/fP8dtY8aMUQDliy++UBRFUY4cOaIAytKlS3Ps9/jjjyuVK1dWzGazoiiK8sMPPyiA8sknn+Q6t7+/v9K9e3fLz++++64CKNHR0UpMTIxSt25dpVatWsrVq1dzPE7bb+/evTluv3LligIo48aNy3H7zbeNGDFCCQ8PVxo2bKg0b97ccrsW6w8//GC5rVGjRkrbtm3zPO7NivJcGzZsqKSlpVlunzlzpgIon3/+ueW2SpUq5XjskiVLFG9vb6Vly5Y5rl10dLQCKLNmzcp1/ttuuy3Hc83IyFBSU1Nz7HP9+nWlbNmyygsvvJDr8W+//bYCKL/99pvltnbt2uV67yiKoqSnpyuAMmHChFzPNzo6WlEURTl58qRiMpmUKVOm5HjsX3/9pXh4eOS6/ciRI0poaKjStWtXRVEUZdy4cYr2Z27//v2Kv7+/0rdv31yxNG/eXLntttty3T5r1qwc8Vy+fFnx8vJSHn74YSUzM9Oy36JFixRAWblypaIo6utWpUoVpVKlSsr169dzHFN7z9+soPdOYa9tQf79918FUGbPnp3v88vu/vvvV1q2bGn5WXvfvPvuu5bbOnfurISEhCjJycmW2wp6f1tj7NixCqD4+/srbdu2VaZMmaL8/vvvufaz5j1682uclJSU63i7d+9WAOW9996z3Ka9L5s2bapkZGTk2H/UqFGKt7e3Ehsba7nt8uXLioeHxy3/Fgj7kWEpUSjx8fE5uoLzU7ZsWUD9NAVQs2ZNGjVqxNq1ay37xMTE8PXXX9OlS5dcvQ7x8fFcvXo1x1d+UlJSePzxx7ly5QrffPMNpUqVKspTy9O5c+dYuHAhY8aMueWMsA0bNrB3716mT59us/Pf7OWXX7b0CAD07t0719BKdklJSUycOJF+/fpRsWLFfPe5+bXOzMzMsY/JZLLkT5nNZmJiYsjIyODuu+9m3759uY6ZkpICgI+Pzy2fU1paGkCePSyaDRs2YDabefbZZ3PEGRERQY0aNXINPdSsWZNPP/2UtWvXMnnyZMvtFy5coH379jRu3NgyLHSzzMzMXK9HUlJSjn2+++470tLSGDRoEEZj1p/PXr16ERQUxFdffQXA/v37iY6OZtCgQYSEhOQ4RnFnyRTm2ubFmmsD6vUp6NqA+vvq5+dX6GNaY8KECXzwwQfcddddfPvtt4wePZqGDRvSoEEDDh06ZNnP2vdodr6+vpbt9PR0rl27RvXq1QkJCcnzsb169cJkMuW4rVu3bqSmpuYYhlu3bh0ZGRk26ZkWRSONG1Eo5cqV4/jx47fc79ixYwCUL1/eclu3bt3YtWsXp06dAtRcgfT0dJ5//vlcj3/hhRcoU6ZMjq/ExMQ8z9WzZ09++ukn4uPjLXk2tjJu3DjKlStnyQnKT2ZmJq+//jpdunShXr16No0huxo1auT4OSAggMjIyDxzJQDmzp1LSkoKr7/+er7HHDduXK7X+vDhw7n2W716NfXq1cPHx4dSpUpRpkwZvvrqK27cuJFrX60xGhwcfMvnpOWoFNR4PHr0KIqiUKNGjVyxHjp0KM/E0itXrqAoCmPHjrU0Np544gnOnj1bYCLq4cOHc51j3LhxOfbR3sO1atXKcbuXlxdVq1a13K/9ruSVx1Nchbm2ebHm2oB6fW7VsG/cuDHnz59n/PjxnD59mqtXr+b5viiqzp07s3PnTq5fv86WLVt47rnn2L9/P+3bt7c01sC692h2ycnJjB07lqioKLy9vSldujRlypQhNjY2z8dqQ63Z1a5dm3vuuSfHB7i1a9dy3333Ub169WI8e1EcknMjCuWxxx5j8eLFvPPOO7z44ot57nPp0iVWr15NmTJluO+++yy3d+rUicGDB7N
2025-02-08 13:32:07 +04:00
"text/plain": [
2025-02-08 13:44:18 +04:00
"<Figure size 640x480 with 1 Axes>"
2025-02-08 13:32:07 +04:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
2025-02-08 13:44:18 +04:00
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Загрузка датасета\n",
2025-02-08 13:32:07 +04:00
"df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n",
"\n",
2025-02-08 13:44:18 +04:00
"# Определение диапазона значений для переменной \"salary_in_usd\"\n",
"x_salary = np.linspace(df['salary_in_usd'].min(), df['salary_in_usd'].max(), 100)\n",
"\n",
"# Определение функций принадлежности для термов\n",
"# Низкий\n",
"low = fuzz.trimf(x_salary, [0, 0, 50000])\n",
"# Средний\n",
"medium = fuzz.trimf(x_salary, [30000, 70000, 100000])\n",
"# Высокий\n",
2025-02-15 09:27:14 +04:00
"high = fuzz.trimf(x_salary, [70000, 250000, 400000])\n",
2025-02-15 10:23:21 +04:00
"veryhigh = fuzz.trimf(x_salary, [400000, 450000, 700000])\n",
2025-02-08 13:32:07 +04:00
"\n",
2025-02-08 13:44:18 +04:00
"# Визуализация функций принадлежности\n",
"plt.figure()\n",
"plt.plot(x_salary, low, label='Низкий', color='blue')\n",
"plt.plot(x_salary, medium, label='Средний', color='green')\n",
"plt.plot(x_salary, high, label='Высокий', color='red')\n",
2025-02-15 10:23:21 +04:00
"plt.plot(x_salary, veryhigh, label='Очень Высокий', color='purple')\n",
2025-02-08 13:44:18 +04:00
"plt.title('Функции принадлежности для \"Salary\"')\n",
"plt.xlabel('Зарплата в USD')\n",
"plt.ylabel('Степень принадлежности')\n",
"plt.legend()\n",
"plt.grid()\n",
2025-02-08 13:32:07 +04:00
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2025-02-08 13:44:18 +04:00
"База нечетких правил"
2025-02-08 13:32:07 +04:00
]
},
{
"cell_type": "code",
2025-02-15 09:27:14 +04:00
"execution_count": 5,
2025-02-08 13:32:07 +04:00
"metadata": {},
"outputs": [
2025-02-08 13:44:18 +04:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"Нечеткие правила:\n",
"Если Опыт Низкий И Тип занятости Частичная, Тогда Зарплата Низкая.\n",
"Если Опыт Средний И Тип занятости Частичная, Тогда Зарплата Средняя.\n",
"Если Опыт Высокий И Тип занятости Полная, Тогда Зарплата Высокая.\n",
"Если Опыт Низкий И Тип занятости Полная, Тогда Зарплата Средняя.\n",
"Если Опыт Средний И Тип занятости Полная, Тогда Зарплата Высокая.\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 600x1200 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
2025-02-08 13:32:07 +04:00
{
"data": {
2025-02-08 13:44:18 +04:00
"image/png": "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
2025-02-08 13:32:07 +04:00
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2025-02-08 13:44:18 +04:00
"import pandas as pd\n",
"import numpy as np\n",
"import skfuzzy as fuzz\n",
2025-02-08 13:32:07 +04:00
"import matplotlib.pyplot as plt\n",
"\n",
2025-02-08 13:44:18 +04:00
"# Загрузка датасета\n",
"df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n",
"\n",
"# Определение диапазонов значений для входных переменных\n",
"x_experience = np.linspace(0, 40, 100) # Опыт работы в годах\n",
"x_employment = np.array([0, 1]) # 0 - Частичная занятость, 1 - Полная занятость\n",
"x_salary = np.linspace(0, df['salary_in_usd'].max(), 100) # Зарплата в USD\n",
"\n",
"# Определение функций принадлежности для опыта работы\n",
"low_experience = fuzz.trimf(x_experience, [0, 0, 5])\n",
"medium_experience = fuzz.trimf(x_experience, [3, 10, 20])\n",
"high_experience = fuzz.trimf(x_experience, [15, 40, 40])\n",
"\n",
"# Определение функций принадлежности для типа занятости\n",
"part_time = fuzz.trimf(x_employment, [0, 0, 1]) # Частичная занятость\n",
"full_time = fuzz.trimf(x_employment, [0, 1, 1]) # Полная занятость\n",
"\n",
"# Определение функций принадлежности для зарплаты\n",
"low_salary = fuzz.trimf(x_salary, [0, 0, 50000])\n",
"medium_salary = fuzz.trimf(x_salary, [30000, 70000, 100000])\n",
"high_salary = fuzz.trimf(x_salary, [70000, 150000, df['salary_in_usd'].max()])\n",
"\n",
"# Определение нечетких правил\n",
"fuzzy_rules = [\n",
" (\"Низкий\", \"Частичная\", \"Низкая\"),\n",
" (\"Средний\", \"Частичная\", \"Средняя\"),\n",
" (\"Высокий\", \"Полная\", \"Высокая\"),\n",
" (\"Низкий\", \"Полная\", \"Средняя\"),\n",
" (\"Средний\", \"Полная\", \"Высокая\")\n",
"]\n",
"\n",
"# Вывод правил\n",
"print(\"Нечеткие правила:\")\n",
"for rule in fuzzy_rules:\n",
" print(f\"Если Опыт {rule[0]} И Тип занятости {rule[1]}, Тогда Зарплата {rule[2]}.\")\n",
"\n",
"# Визуализация функций принадлежности\n",
"fig, axs = plt.subplots(3, 1, figsize=(6, 12))\n",
"\n",
"# Опыт работы\n",
"axs[0].plot(x_experience, low_experience, label='Низкий', color='blue')\n",
"axs[0].plot(x_experience, medium_experience, label='Средний', color='green')\n",
"axs[0].plot(x_experience, high_experience, label='Высокий', color='red')\n",
"axs[0].set_title('Функции принадлежности для Опыта работы')\n",
"axs[0].set_xlabel('Опыт работы (годы)')\n",
"axs[0].set_ylabel('Степень принадлежности')\n",
"axs[0].legend()\n",
"axs[0].grid()\n",
"\n",
"# Тип занятости\n",
"axs[1].plot(x_employment, part_time, label='Частичная занятость', color='orange')\n",
"axs[1].plot(x_employment, full_time, label='Полная занятость', color='purple')\n",
"axs[1].set_title('Функции принадлежности для Типа занятости')\n",
"axs[1].set_xlabel('Тип занятости')\n",
"axs[1].set_ylabel('Степень принадлежности')\n",
"axs[1].legend()\n",
"axs[1].grid()\n",
"\n",
"# Зарплата\n",
"axs[2].plot(x_salary, low_salary, label='Низкая', color='blue')\n",
"axs[2].plot(x_salary, medium_salary, label='Средняя', color='green')\n",
"axs[2].plot(x_salary, high_salary, label='Высокая', color='red')\n",
"axs[2].set_title('Функции принадлежности для Зарплаты')\n",
"axs[2].set_xlabel('Зарплата в USD')\n",
"axs[2].set_ylabel('Степень принадлежности')\n",
"axs[2].legend()\n",
"axs[2].grid()\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"# Визуализация нечетких правил\n",
"fig, ax = plt.subplots(figsize=(10, 6))\n",
"\n",
"# Заполнение областей для каждого правила с новыми цветами\n",
"ax.fill_between(x_experience, low_experience, 0, color='lightblue', alpha=0.5, \n",
" label='Правило 1: Низкий опыт, Частичная занятость => Низкая Зарплата')\n",
"ax.fill_between(x_experience, medium_experience, medium_salary, color='lightgreen', alpha=0.5, \n",
" label='Правило 2: Средний опыт, Частичная занятость => Средняя Зарплата')\n",
"ax.fill_between(x_experience, high_experience, high_salary, color='lightpink', alpha=0.5, \n",
" label='Правило 3: Высокий опыт, Полная занятость => Высокая Зарплата')\n",
"ax.fill_between(x_experience, low_experience, medium_salary, color='lightcoral', alpha=0.5, \n",
" label='Правило 4: Низкий опыт, Полная занятость => Средняя Зарплата')\n",
"ax.fill_between(x_experience, medium_experience, high_salary, color='lightyellow', alpha=0.5, \n",
" label='Правило 5: Средний опыт, Полная занятость => Высокая Зарплата')\n",
"\n",
"ax.set_title('Визуализация нечетких правил')\n",
"ax.set_xlabel('Опыт работы (годы)')\n",
"ax.set_ylabel('Зарплата')\n",
"ax.legend()\n",
"ax.grid()\n",
"\n",
"plt.tight_layout()\n",
2025-02-08 13:32:07 +04:00
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2025-02-08 13:44:18 +04:00
"Оценка качества полученной нечеткой системы"
2025-02-08 13:32:07 +04:00
]
},
{
"cell_type": "code",
2025-02-15 09:27:14 +04:00
"execution_count": 6,
2025-02-08 13:32:07 +04:00
"metadata": {},
"outputs": [
{
2025-02-08 13:44:18 +04:00
"name": "stdout",
"output_type": "stream",
"text": [
"Опыт работы | Тип занятости | Эталонная зарплата | Оцененная зарплата\n",
" 2 | Частичная | 40000 | 16666.67\n",
" 5 | Частичная | 60000 | 66585.98\n",
" 10 | Полная | 80000 | 0.00\n",
" 15 | Полная | 120000 | 223308.38\n",
"\n",
"Средняя абсолютная ошибка (MAE): 53306.92\n",
"Среднеквадратичная ошибка (RMSE): 66446.29\n"
]
2025-02-08 13:32:07 +04:00
}
],
"source": [
2025-02-08 13:44:18 +04:00
"import pandas as pd\n",
"import numpy as np\n",
"import skfuzzy as fuzz\n",
2025-02-08 13:32:07 +04:00
"import matplotlib.pyplot as plt\n",
"\n",
2025-02-08 13:44:18 +04:00
"# Загрузка датасета\n",
"df = pd.read_csv(\"..//static//csv//ds_salaries.csv\")\n",
2025-02-08 13:32:07 +04:00
"\n",
2025-02-08 13:44:18 +04:00
"# Определение диапазонов значений для входных переменных\n",
"x_experience = np.linspace(0, 40, 100) # Опыт работы в годах\n",
"x_employment = np.array([0, 1]) # 0 - Частичная занятость, 1 - Полная занятость\n",
"x_salary = np.linspace(0, df['salary_in_usd'].max(), 100) # Зарплата в USD\n",
2025-02-08 13:32:07 +04:00
"\n",
2025-02-08 13:44:18 +04:00
"# Определение функций принадлежности для опыта работы\n",
"low_experience = fuzz.trimf(x_experience, [0, 0, 5])\n",
"medium_experience = fuzz.trimf(x_experience, [3, 10, 20])\n",
"high_experience = fuzz.trimf(x_experience, [15, 40, 40])\n",
2025-02-08 13:32:07 +04:00
"\n",
2025-02-08 13:44:18 +04:00
"# Определение функций принадлежности для типа занятости\n",
"part_time = fuzz.trimf(x_employment, [0, 0, 1]) # Частичная занятость\n",
"full_time = fuzz.trimf(x_employment, [0, 1, 1]) # Полная занятость\n",
"\n",
"# Определение функций принадлежности для зарплаты\n",
"low_salary = fuzz.trimf(x_salary, [0, 0, 50000])\n",
"medium_salary = fuzz.trimf(x_salary, [30000, 70000, 100000])\n",
"high_salary = fuzz.trimf(x_salary, [70000, 150000, df['salary_in_usd'].max()])\n",
"\n",
"# Создаем тестовые данные (опыт работы, тип занятости, эталонная зарплата)\n",
"test_data = [\n",
" (2, 0, 40000), # Низкий опыт, частичная занятость => Низкая зарплата\n",
" (5, 0, 60000), # Низкий опыт, частичная занятость => Средняя зарплата\n",
" (10, 1, 80000), # Средний опыт, полная занятость => Средняя зарплата\n",
" (15, 1, 120000), # Высокий опыт, полная занятость => Высокая зарплата\n",
"]\n",
"\n",
"# Функция для вычисления нечеткой оценки\n",
"def fuzzy_inference(experience, employment):\n",
" # Определение степени принадлежности\n",
" exp_low = fuzz.interp_membership(x_experience, low_experience, experience)\n",
" exp_medium = fuzz.interp_membership(x_experience, medium_experience, experience)\n",
" exp_high = fuzz.interp_membership(x_experience, high_experience, experience)\n",
"\n",
" emp_part_time = fuzz.interp_membership(x_employment, part_time, employment)\n",
" emp_full_time = fuzz.interp_membership(x_employment, full_time, employment)\n",
"\n",
" # Применяем правила\n",
" salary_low = np.fmin(exp_low, emp_part_time)\n",
" salary_medium = np.fmin(exp_medium, emp_part_time)\n",
" salary_high = np.fmin(exp_high, emp_full_time)\n",
"\n",
" # Вычисляем выходные значения при наличии ненулевых областей\n",
" salary0 = low_salary * salary_low\n",
" salary1 = medium_salary * salary_medium\n",
" salary2 = high_salary * salary_high\n",
"\n",
" # Проверка на ненулевые области перед дефуззацией\n",
" if salary_low > 0:\n",
" salary0 = fuzz.defuzz(x_salary, salary0, 'centroid')\n",
" else:\n",
" salary0 = 0 # Значение по умолчанию\n",
"\n",
" if salary_medium > 0:\n",
" salary1 = fuzz.defuzz(x_salary, salary1, 'centroid')\n",
" else:\n",
" salary1 = 0 # Значение по умолчанию\n",
"\n",
" if salary_high > 0:\n",
" salary2 = fuzz.defuzz(x_salary, salary2, 'centroid')\n",
" else:\n",
" salary2 = 0 # Значение по умолчанию\n",
"\n",
" return max(salary0, salary1, salary2)\n",
"\n",
"# Список для хранения результатов\n",
"results = []\n",
"\n",
"# Оценка системы на тестовом наборе данных\n",
"for experience, employment, actual_salary in test_data:\n",
" inferred_salary = fuzzy_inference(experience, employment)\n",
" results.append((experience, employment, actual_salary, inferred_salary))\n",
"\n",
"# Вывод результатов\n",
"print(\"Опыт работы | Тип занятости | Эталонная зарплата | Оцененная зарплата\")\n",
"for experience, employment, actual_salary, inferred_salary in results:\n",
" employment_type = \"Частичная\" if employment == 0 else \"Полная\"\n",
" print(f\"{experience:12} | {employment_type:13} | {actual_salary:20} | {inferred_salary:.2f}\")\n",
"\n",
"# Вычисление метрик качества\n",
"actual_salaries = [actual for _, _, actual, _ in results]\n",
"inferred_salaries = [inferred for _, _, _, inferred in results]\n",
"\n",
"mae = np.mean(np.abs(np.array(actual_salaries) - np.array(inferred_salaries)))\n",
"rmse = np.sqrt(np.mean((np.array(actual_salaries) - np.array(inferred_salaries)) ** 2))\n",
"\n",
"print(f\"\\nС р е дняя абсолютная ошибка (MAE): {mae:.2f}\")\n",
"print(f\"Среднеквадратичная ошибка (RMSE): {rmse:.2f}\")"
2025-02-08 13:32:07 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2025-02-08 13:44:18 +04:00
"\n",
"Полученные результаты указывают на необходимость значительных улучшений в проектировании нечеткой системы. Высокие значения средней абсолютной ошибки (MAE) и среднеквадратичной ошибки (RMSE) свидетельствуют о том, что система неэффективно обрабатывает входные данные. Особенно заметна проблема нулевой оценки для случая с 10 годами опыта, что указывает на серьезные недостатки в определении правил и функций принадлежности. Это требует дальнейшей работы над уточнением правил и пересмотром функций принадлежности для достижения более точных оценок зарплат. "
2025-02-08 13:32:07 +04:00
]
}
],
"metadata": {
"kernelspec": {
"display_name": "aimenv",
"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.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}