2025-02-06 19:23:34 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
2025-03-01 09:17:21 +04:00
"## Управление каденсом велосипедиста"
2025-02-06 19:23:34 +04:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Создание лингвистических переменных\n",
"\n",
"Входные X: speed (текущая скорость) и target (желаемая скорость) /\n",
"Выходные Y: cadence (необходимый каденс)"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 1,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from skfuzzy import control as ctrl\n",
"\n",
"speed = ctrl.Antecedent(np.arange(0, 100, 1), \"speed\")\n",
"target = ctrl.Antecedent(np.arange(0, 100, 1), \"target\")\n",
"cadence = ctrl.Consequent(np.arange(0, 130, 1), \"cadence\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Формирование нечетких переменных для лингвистических переменных и их визуализация"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 2,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"d:\\Методы искусственного интеллекта\\MII_Salin_Oleg_PIbd-33\\.venv\\Lib\\site-packages\\skfuzzy\\control\\fuzzyvariable.py:125: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n",
" fig.show()\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import skfuzzy as fuzz\n",
"\n",
"speed[\"slow\"] = fuzz.zmf(speed.universe, 20, 60)\n",
"speed[\"average\"] = fuzz.trapmf(speed.universe, [10, 30, 60, 80])\n",
"speed[\"fast\"] = fuzz.smf(speed.universe, 60, 80)\n",
"speed.view()\n",
"\n",
"target[\"slow\"] = fuzz.zmf(target.universe, 20, 60)\n",
"target[\"average\"] = fuzz.trapmf(target.universe, [10, 30, 60, 80])\n",
"target[\"fast\"] = fuzz.smf(target.universe, 60, 80)\n",
"target.view()\n",
"\n",
"cadence[\"low\"] = fuzz.zmf(cadence.universe, 0, 80)\n",
"cadence[\"average\"] = fuzz.trapmf(cadence.universe, [0, 60, 70, 90])\n",
"cadence[\"high\"] = fuzz.smf(cadence.universe, 80, 110)\n",
"cadence.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Формирование и визуализация базы нечетких правил\n",
"\n",
"В случае ошибки необходимо в файле\n",
"```\n",
".venv/lib/python3.13/site-packages/skfuzzy/control/visualization.py\n",
"```\n",
"удалить лишний отступ на 182 строке, должно быть:\n",
"```python\n",
" if not matplotlib_present:\n",
" raise ImportError(\"`ControlSystemVisualizer` can only be used \"\n",
" \"with `matplotlib` present in the system.\")\n",
"\n",
" self.ctrl = control_system\n",
"\n",
" self.fig, self.ax = plt.subplots()\n",
"```"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 3,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(<Figure size 640x480 with 1 Axes>, <Axes: >)"
]
},
2025-03-01 09:17:21 +04:00
"execution_count": 3,
2025-02-06 19:23:34 +04:00
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2025-03-01 09:17:21 +04:00
"image/png": "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
2025-02-06 19:23:34 +04:00
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"rule1 = ctrl.Rule(speed[\"slow\"] & target[\"fast\"], cadence[\"high\"])\n",
"rule2 = ctrl.Rule(speed[\"slow\"] & target[\"average\"], cadence[\"high\"])\n",
"rule3 = ctrl.Rule(speed[\"slow\"] & target[\"slow\"], cadence[\"low\"])\n",
"rule4 = ctrl.Rule(speed[\"average\"] & target[\"fast\"], cadence[\"high\"])\n",
"rule5 = ctrl.Rule(speed[\"average\"] & target[\"average\"], cadence[\"average\"])\n",
"rule6 = ctrl.Rule(speed[\"average\"] & target[\"slow\"], cadence[\"low\"])\n",
"rule7 = ctrl.Rule(speed[\"fast\"] & target[\"fast\"], cadence[\"high\"])\n",
"rule8 = ctrl.Rule(speed[\"fast\"] & target[\"average\"], cadence[\"low\"])\n",
"rule9 = ctrl.Rule(speed[\"fast\"] & target[\"slow\"], cadence[\"low\"])\n",
"\n",
"rule1.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Создание нечеткой системы и добавление нечетких правил в базу знаний нечеткой системы"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 4,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [],
"source": [
"cadence_ctrl = ctrl.ControlSystem(\n",
" [\n",
" rule1,\n",
" rule2,\n",
" rule3,\n",
" rule4,\n",
" rule5,\n",
" rule6,\n",
" rule7,\n",
" rule8,\n",
" rule9,\n",
" ]\n",
")\n",
"\n",
"cadences = ctrl.ControlSystemSimulation(cadence_ctrl)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2025-03-01 09:17:21 +04:00
"#### Пример расчета выходной переменной cadence на основе входных переменных speed и target\n",
2025-02-06 19:23:34 +04:00
"\n",
"Система также формирует подробный журнал выполнения процесса нечеткого логического вывода"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 5,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============\n",
" Antecedents \n",
"=============\n",
"Antecedent: speed = 60\n",
" - slow : 0.0\n",
" - average : 1.0\n",
" - fast : 0.0\n",
"Antecedent: target = 20\n",
" - slow : 1.0\n",
" - average : 0.5\n",
" - fast : 0.0\n",
"\n",
"=======\n",
" Rules \n",
"=======\n",
"RULE #0:\n",
" IF speed[slow] AND target[fast] THEN cadence[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - speed[slow] : 0.0\n",
" - target[fast] : 0.0\n",
" speed[slow] AND target[fast] = 0.0\n",
" Activation (THEN-clause):\n",
" cadence[high] : 0.0\n",
"\n",
"RULE #1:\n",
" IF speed[slow] AND target[average] THEN cadence[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - speed[slow] : 0.0\n",
" - target[average] : 0.5\n",
" speed[slow] AND target[average] = 0.0\n",
" Activation (THEN-clause):\n",
" cadence[high] : 0.0\n",
"\n",
"RULE #2:\n",
" IF speed[slow] AND target[slow] THEN cadence[low]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - speed[slow] : 0.0\n",
" - target[slow] : 1.0\n",
" speed[slow] AND target[slow] = 0.0\n",
" Activation (THEN-clause):\n",
" cadence[low] : 0.0\n",
"\n",
"RULE #3:\n",
" IF speed[average] AND target[fast] THEN cadence[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - speed[average] : 1.0\n",
" - target[fast] : 0.0\n",
" speed[average] AND target[fast] = 0.0\n",
" Activation (THEN-clause):\n",
" cadence[high] : 0.0\n",
"\n",
"RULE #4:\n",
" IF speed[average] AND target[average] THEN cadence[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - speed[average] : 1.0\n",
" - target[average] : 0.5\n",
" speed[average] AND target[average] = 0.5\n",
" Activation (THEN-clause):\n",
" cadence[average] : 0.5\n",
"\n",
"RULE #5:\n",
" IF speed[average] AND target[slow] THEN cadence[low]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - speed[average] : 1.0\n",
" - target[slow] : 1.0\n",
" speed[average] AND target[slow] = 1.0\n",
" Activation (THEN-clause):\n",
" cadence[low] : 1.0\n",
"\n",
"RULE #6:\n",
" IF speed[fast] AND target[fast] THEN cadence[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - speed[fast] : 0.0\n",
" - target[fast] : 0.0\n",
" speed[fast] AND target[fast] = 0.0\n",
" Activation (THEN-clause):\n",
" cadence[high] : 0.0\n",
"\n",
"RULE #7:\n",
" IF speed[fast] AND target[average] THEN cadence[low]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - speed[fast] : 0.0\n",
" - target[average] : 0.5\n",
" speed[fast] AND target[average] = 0.0\n",
" Activation (THEN-clause):\n",
" cadence[low] : 0.0\n",
"\n",
"RULE #8:\n",
" IF speed[fast] AND target[slow] THEN cadence[low]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - speed[fast] : 0.0\n",
" - target[slow] : 1.0\n",
" speed[fast] AND target[slow] = 0.0\n",
" Activation (THEN-clause):\n",
" cadence[low] : 0.0\n",
"\n",
"\n",
"==============================\n",
" Intermediaries and Conquests \n",
"==============================\n",
"Consequent: cadence = 35.97074517705886\n",
" low:\n",
" Accumulate using accumulation_max : 1.0\n",
" average:\n",
" Accumulate using accumulation_max : 0.5\n",
" high:\n",
" Accumulate using accumulation_max : 0.0\n",
"\n"
]
},
{
"data": {
"text/plain": [
"np.float64(35.97074517705886)"
]
},
2025-03-01 09:17:21 +04:00
"execution_count": 5,
2025-02-06 19:23:34 +04:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cadences.input[\"speed\"] = 60\n",
"cadences.input[\"target\"] = 20\n",
"cadences.compute()\n",
"cadences.print_state()\n",
"cadences.output[\"cadence\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2025-03-01 09:17:21 +04:00
"#### Визуализация функции принадлежности для выходной переменной cadence\n",
2025-02-06 19:23:34 +04:00
"\n",
2025-03-01 09:17:21 +04:00
"Функция получена в процессе аккумуляции и используется для дефаззификации значения выходной переменной cadence"
2025-02-06 19:23:34 +04:00
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 6,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cadence.view(sim=cadences)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Пример решения задачи регрессии на основе нечеткого логического вывода"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Загрузка данных"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 7,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'cars_train'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Price</th>\n",
" <th>Prodyear</th>\n",
" <th>Engine volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>3329</th>\n",
" <td>188</td>\n",
" <td>2009</td>\n",
" <td>2.5</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>15830</th>\n",
" <td>16621</td>\n",
" <td>2005</td>\n",
2025-02-06 19:23:34 +04:00
" <td>2.4</td>\n",
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>3384</th>\n",
" <td>3293</td>\n",
" <td>2014</td>\n",
" <td>5.7</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>1672</th>\n",
" <td>59464</td>\n",
" <td>2016</td>\n",
" <td>2.2</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>10342</th>\n",
" <td>8500</td>\n",
" <td>2006</td>\n",
" <td>1.5</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>8472</th>\n",
" <td>470</td>\n",
" <td>2015</td>\n",
" <td>3.0</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>7958</th>\n",
" <td>6586</td>\n",
" <td>2014</td>\n",
" <td>1.4</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>272</th>\n",
" <td>16308</td>\n",
" <td>2008</td>\n",
" <td>2.2</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>4525</th>\n",
" <td>7683</td>\n",
" <td>2013</td>\n",
" <td>2.0</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>5251</th>\n",
" <td>7997</td>\n",
" <td>2004</td>\n",
" <td>2.0</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>15389 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" Price Prodyear Engine volume\n",
2025-03-01 09:17:21 +04:00
"3329 188 2009 2.5\n",
"15830 16621 2005 2.4\n",
"3384 3293 2014 5.7\n",
"1672 59464 2016 2.2\n",
"10342 8500 2006 1.5\n",
2025-02-06 19:23:34 +04:00
"... ... ... ...\n",
2025-03-01 09:17:21 +04:00
"8472 470 2015 3.0\n",
"7958 6586 2014 1.4\n",
"272 16308 2008 2.2\n",
"4525 7683 2013 2.0\n",
"5251 7997 2004 2.0\n",
2025-02-06 19:23:34 +04:00
"\n",
"[15389 rows x 3 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"'cars_test'"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Price</th>\n",
" <th>Prodyear</th>\n",
" <th>Engine volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>13393</th>\n",
" <td>3763</td>\n",
" <td>2016</td>\n",
" <td>2.0</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>4751</th>\n",
" <td>470</td>\n",
" <td>2011</td>\n",
" <td>2.4</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>11945</th>\n",
" <td>706</td>\n",
" <td>2010</td>\n",
" <td>1.3</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>5150</th>\n",
" <td>470</td>\n",
" <td>2019</td>\n",
" <td>2.0</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>10864</th>\n",
" <td>5488</td>\n",
" <td>2014</td>\n",
" <td>2.5</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>5343</th>\n",
" <td>7840</td>\n",
" <td>1998</td>\n",
" <td>2.8</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>9938</th>\n",
" <td>19444</td>\n",
" <td>2013</td>\n",
2025-02-06 19:23:34 +04:00
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>6576</th>\n",
" <td>26343</td>\n",
" <td>2017</td>\n",
" <td>3.0</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>12789</th>\n",
" <td>39750</td>\n",
" <td>2017</td>\n",
" <td>1.6</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>5395</th>\n",
" <td>18189</td>\n",
" <td>2012</td>\n",
" <td>1.9</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>3848 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" Price Prodyear Engine volume\n",
2025-03-01 09:17:21 +04:00
"13393 3763 2016 2.0\n",
"4751 470 2011 2.4\n",
"11945 706 2010 1.3\n",
"5150 470 2019 2.0\n",
"10864 5488 2014 2.5\n",
2025-02-06 19:23:34 +04:00
"... ... ... ...\n",
2025-03-01 09:17:21 +04:00
"5343 7840 1998 2.8\n",
"9938 19444 2013 2.0\n",
"6576 26343 2017 3.0\n",
"12789 39750 2017 1.6\n",
"5395 18189 2012 1.9\n",
2025-02-06 19:23:34 +04:00
"\n",
"[3848 rows x 3 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"from utils import split_stratified_into_train_val_test\n",
"\n",
"df = pd.read_csv(\"data/car_price_prediction.csv\")\n",
"df = df.drop([\"ID\", \"Manufacturer\", \"Model\", \"Leatherinterior\", \"Fueltype\", \"Cylinders\",\n",
" \"Doors\", \"Wheel\", \"Color\", \"Levy\", \"Drive wheels\", \"Airbags\", \"Gear box type\", \"Mileage\"], axis=1)\n",
"df = df.dropna()\n",
"df[\"Engine volume\"] = df[\"Engine volume\"].apply(\n",
" lambda x: float(x.split()[0])\n",
")\n",
"\n",
"\n",
"cars_train, X_val, cars_test, y_train, y_val, y_test = split_stratified_into_train_val_test(\n",
" df,\n",
" stratify_colname=\"Category\",\n",
" target_colname=\"Price\",\n",
" frac_train=0.80,\n",
" frac_val=0,\n",
" frac_test=0.20\n",
")\n",
"\n",
"cars_train = cars_train.drop(\"Category\", axis=1)\n",
"cars_test = cars_test.drop(\"Category\", axis=1)\n",
"display(\"cars_train\", cars_train)\n",
"display(\"cars_test\", cars_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Инициализация лингвистических переменных и автоматическое формирование нечетких переменных"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 8,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"26307500\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"d:\\Методы искусственного интеллекта\\MII_Salin_Oleg_PIbd-33\\.venv\\Lib\\site-packages\\skfuzzy\\control\\fuzzyvariable.py:125: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n",
" fig.show()\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-03-01 09:17:21 +04:00
"image/png": "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
2025-02-06 19:23:34 +04:00
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"prodyear = ctrl.Antecedent(np.arange(1885, 2025, 1), \"prodyear\")\n",
"engine_volume = ctrl.Antecedent(cars_train[\"Engine volume\"].sort_values().unique(), \"engine_volume\")\n",
"print(cars_train[\"Price\"].max())\n",
"price = ctrl.Consequent(np.arange(cars_train[\"Price\"].min() // 100, \n",
" cars_train[\"Price\"].max() // 100, 1), \"price\")\n",
"\n",
"prodyear[\"old\"] = fuzz.zmf(prodyear.universe, 1885, 2020)\n",
"prodyear[\"new\"] = fuzz.smf(prodyear.universe, 2015, 2020)\n",
"prodyear.view()\n",
"engine_volume.automf(3, variable_type=\"quant\")\n",
"engine_volume.view()\n",
"price[\"very cheap\"] = fuzz.trimf(price.universe, [0, 50, 100])\n",
"price[\"cheap\"] = fuzz.trimf(price.universe, [80, 120, 200])\n",
"price[\"average\"] = fuzz.trapmf(price.universe, [150, 250, 500, 1000])\n",
"price[\"expensive\"] = fuzz.trimf(price.universe, [800, 1500, 2000])\n",
"price[\"very expensive\"] = fuzz.smf(price.universe, 1800, 2500)\n",
"price.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Нечеткие правила"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 9,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [],
"source": [
"rule11 = ctrl.Rule(\n",
" engine_volume[\"low\"] & prodyear[\"old\"],\n",
" price[\"very cheap\"],\n",
")\n",
"rule12 = ctrl.Rule(\n",
" engine_volume[\"average\"] & prodyear[\"old\"],\n",
" price[\"cheap\"],\n",
")\n",
"rule13 = ctrl.Rule(\n",
" engine_volume[\"high\"] & prodyear[\"old\"],\n",
" price[\"average\"],\n",
")\n",
"rule21 = ctrl.Rule(\n",
" engine_volume[\"low\"] & prodyear[\"new\"],\n",
" price[\"average\"],\n",
")\n",
"rule22 = ctrl.Rule(\n",
" engine_volume[\"average\"] & prodyear[\"new\"],\n",
" price[\"expensive\"],\n",
")\n",
"rule23 = ctrl.Rule(\n",
" engine_volume[\"high\"] & prodyear[\"new\"],\n",
" price[\"very expensive\"],\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Создание нечеткой системы"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 10,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[IF engine_volume[low] AND prodyear[old] THEN price[very cheap]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF engine_volume[average] AND prodyear[old] THEN price[cheap]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF engine_volume[high] AND prodyear[old] THEN price[average]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF engine_volume[low] AND prodyear[new] THEN price[average]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF engine_volume[average] AND prodyear[new] THEN price[expensive]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF engine_volume[high] AND prodyear[new] THEN price[very expensive]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax]"
]
},
2025-03-01 09:17:21 +04:00
"execution_count": 10,
2025-02-06 19:23:34 +04:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fuzzy_rules = [\n",
" rule11,\n",
" rule12,\n",
" rule13,\n",
" rule21,\n",
" rule22, \n",
" rule23,\n",
"]\n",
"\n",
"price_cntrl = ctrl.ControlSystem(fuzzy_rules)\n",
"\n",
"sim = ctrl.ControlSystemSimulation(price_cntrl)\n",
"\n",
"fuzzy_rules"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Пример использования полученной нечеткой системы"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 11,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============\n",
" Antecedents \n",
"=============\n",
"Antecedent: engine_volume = 1.5\n",
" - low : 0.85\n",
" - average : 0.15\n",
" - high : 0.0\n",
"Antecedent: prodyear = 2016\n",
" - old : 0.0017558299039780523\n",
" - new : 0.08000000000000002\n",
"\n",
"=======\n",
" Rules \n",
"=======\n",
"RULE #0:\n",
" IF engine_volume[low] AND prodyear[old] THEN price[very cheap]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - engine_volume[low] : 0.85\n",
" - prodyear[old] : 0.0017558299039780523\n",
" engine_volume[low] AND prodyear[old] = 0.0017558299039780523\n",
" Activation (THEN-clause):\n",
" price[very cheap] : 0.0017558299039780523\n",
"\n",
"RULE #1:\n",
" IF engine_volume[average] AND prodyear[old] THEN price[cheap]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - engine_volume[average] : 0.15\n",
" - prodyear[old] : 0.0017558299039780523\n",
" engine_volume[average] AND prodyear[old] = 0.0017558299039780523\n",
" Activation (THEN-clause):\n",
" price[cheap] : 0.0017558299039780523\n",
"\n",
"RULE #2:\n",
" IF engine_volume[high] AND prodyear[old] THEN price[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - engine_volume[high] : 0.0\n",
" - prodyear[old] : 0.0017558299039780523\n",
" engine_volume[high] AND prodyear[old] = 0.0\n",
" Activation (THEN-clause):\n",
" price[average] : 0.0\n",
"\n",
"RULE #3:\n",
" IF engine_volume[low] AND prodyear[new] THEN price[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - engine_volume[low] : 0.85\n",
" - prodyear[new] : 0.08000000000000002\n",
" engine_volume[low] AND prodyear[new] = 0.08000000000000002\n",
" Activation (THEN-clause):\n",
" price[average] : 0.08000000000000002\n",
"\n",
"RULE #4:\n",
" IF engine_volume[average] AND prodyear[new] THEN price[expensive]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - engine_volume[average] : 0.15\n",
" - prodyear[new] : 0.08000000000000002\n",
" engine_volume[average] AND prodyear[new] = 0.08000000000000002\n",
" Activation (THEN-clause):\n",
" price[expensive] : 0.08000000000000002\n",
"\n",
"RULE #5:\n",
" IF engine_volume[high] AND prodyear[new] THEN price[very expensive]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - engine_volume[high] : 0.0\n",
" - prodyear[new] : 0.08000000000000002\n",
" engine_volume[high] AND prodyear[new] = 0.0\n",
" Activation (THEN-clause):\n",
" price[very expensive] : 0.0\n",
"\n",
"\n",
"==============================\n",
" Intermediaries and Conquests \n",
"==============================\n",
"Consequent: price = 1065.2447541258305\n",
" very cheap:\n",
" Accumulate using accumulation_max : 0.0017558299039780523\n",
" cheap:\n",
" Accumulate using accumulation_max : 0.0017558299039780523\n",
" average:\n",
" Accumulate using accumulation_max : 0.08000000000000002\n",
" expensive:\n",
" Accumulate using accumulation_max : 0.08000000000000002\n",
" very expensive:\n",
" Accumulate using accumulation_max : 0.0\n",
"\n"
]
},
{
"data": {
"text/plain": [
"np.float64(1065.2447541258305)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sim.input[\"prodyear\"] = 2016\n",
"sim.input[\"engine_volume\"] = 1.5\n",
"sim.compute()\n",
"sim.print_state()\n",
"display(sim.output[\"price\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Функция для автоматизации вычисления целевой переменной Y на основе вектора признаков X"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 12,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [],
"source": [
"def fuzzy_pred(row):\n",
" sim.input[\"prodyear\"] = row[\"Prodyear\"]\n",
" sim.input[\"engine_volume\"] = row[\"Engine volume\"]\n",
" sim.compute()\n",
" return sim.output[\"price\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Тестирование нечеткой системы на обучающей выборке"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 13,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Price</th>\n",
" <th>Prodyear</th>\n",
" <th>Engine volume</th>\n",
" <th>PricePred</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>3329</th>\n",
" <td>188</td>\n",
" <td>2009</td>\n",
" <td>2.5</td>\n",
" <td>99.900555</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>15830</th>\n",
" <td>16621</td>\n",
" <td>2005</td>\n",
" <td>2.4</td>\n",
" <td>99.815314</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>3384</th>\n",
" <td>3293</td>\n",
" <td>2014</td>\n",
" <td>5.7</td>\n",
" <td>99.970383</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>1672</th>\n",
" <td>59464</td>\n",
2025-02-06 19:23:34 +04:00
" <td>2016</td>\n",
2025-03-01 09:17:21 +04:00
" <td>2.2</td>\n",
2025-02-06 19:23:34 +04:00
" <td>1065.244754</td>\n",
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>10342</th>\n",
" <td>8500</td>\n",
" <td>2006</td>\n",
" <td>1.5</td>\n",
" <td>99.839062</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>11936</th>\n",
" <td>5018</td>\n",
" <td>2011</td>\n",
" <td>1.8</td>\n",
" <td>99.933398</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15103</th>\n",
" <td>21012</td>\n",
" <td>2012</td>\n",
2025-02-06 19:23:34 +04:00
" <td>2.5</td>\n",
2025-03-01 09:17:21 +04:00
" <td>99.947365</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>4720</th>\n",
" <td>1568</td>\n",
" <td>2016</td>\n",
" <td>3.5</td>\n",
" <td>1065.244754</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>9631</th>\n",
" <td>34811</td>\n",
2025-02-06 19:23:34 +04:00
" <td>2012</td>\n",
" <td>3.0</td>\n",
" <td>99.947365</td>\n",
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>6122</th>\n",
" <td>21181</td>\n",
" <td>2012</td>\n",
2025-02-06 19:23:34 +04:00
" <td>2.0</td>\n",
2025-03-01 09:17:21 +04:00
" <td>99.947365</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>3261</th>\n",
" <td>23521</td>\n",
" <td>2014</td>\n",
2025-02-06 19:23:34 +04:00
" <td>2.5</td>\n",
2025-03-01 09:17:21 +04:00
" <td>99.970383</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>12788</th>\n",
" <td>10349</td>\n",
" <td>2009</td>\n",
" <td>1.8</td>\n",
" <td>99.900555</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>11298</th>\n",
" <td>76029</td>\n",
" <td>2016</td>\n",
" <td>2.3</td>\n",
" <td>1065.244754</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>5113</th>\n",
" <td>17562</td>\n",
" <td>2012</td>\n",
" <td>1.8</td>\n",
" <td>99.947365</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>12635</th>\n",
" <td>22580</td>\n",
" <td>2016</td>\n",
" <td>2.0</td>\n",
" <td>1065.244754</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Price Prodyear Engine volume PricePred\n",
2025-03-01 09:17:21 +04:00
"3329 188 2009 2.5 99.900555\n",
"15830 16621 2005 2.4 99.815314\n",
"3384 3293 2014 5.7 99.970383\n",
"1672 59464 2016 2.2 1065.244754\n",
"10342 8500 2006 1.5 99.839062\n",
"11936 5018 2011 1.8 99.933398\n",
"15103 21012 2012 2.5 99.947365\n",
"4720 1568 2016 3.5 1065.244754\n",
"9631 34811 2012 3.0 99.947365\n",
"6122 21181 2012 2.0 99.947365\n",
"3261 23521 2014 2.5 99.970383\n",
"12788 10349 2009 1.8 99.900555\n",
"11298 76029 2016 2.3 1065.244754\n",
"5113 17562 2012 1.8 99.947365\n",
"12635 22580 2016 2.0 1065.244754"
2025-02-06 19:23:34 +04:00
]
},
2025-03-01 09:17:21 +04:00
"execution_count": 13,
2025-02-06 19:23:34 +04:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result_train = cars_train.copy()\n",
"\n",
"result_train[\"PricePred\"] = result_train.apply(fuzzy_pred, axis=1)\n",
"\n",
"result_train.head(15)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Тестирование нечеткой системы на тестовой выборке"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 14,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Price</th>\n",
" <th>Prodyear</th>\n",
" <th>Engine volume</th>\n",
" <th>PricePred</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>13393</th>\n",
" <td>3763</td>\n",
" <td>2016</td>\n",
" <td>2.0</td>\n",
" <td>106524.475413</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>4751</th>\n",
" <td>470</td>\n",
" <td>2011</td>\n",
" <td>2.4</td>\n",
" <td>9993.339772</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>11945</th>\n",
" <td>706</td>\n",
" <td>2010</td>\n",
" <td>1.3</td>\n",
" <td>9991.779367</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>5150</th>\n",
" <td>470</td>\n",
" <td>2019</td>\n",
" <td>2.0</td>\n",
" <td>77990.662719</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>10864</th>\n",
" <td>5488</td>\n",
" <td>2014</td>\n",
" <td>2.5</td>\n",
" <td>9997.038307</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>5343</th>\n",
" <td>7840</td>\n",
" <td>1998</td>\n",
" <td>2.8</td>\n",
" <td>9960.397848</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>9938</th>\n",
" <td>19444</td>\n",
" <td>2013</td>\n",
2025-02-06 19:23:34 +04:00
" <td>2.0</td>\n",
2025-03-01 09:17:21 +04:00
" <td>9995.969432</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>6576</th>\n",
" <td>26343</td>\n",
" <td>2017</td>\n",
" <td>3.0</td>\n",
" <td>103432.672018</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>12789</th>\n",
" <td>39750</td>\n",
" <td>2017</td>\n",
" <td>1.6</td>\n",
" <td>90913.773797</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" <tr>\n",
2025-03-01 09:17:21 +04:00
" <th>5395</th>\n",
" <td>18189</td>\n",
" <td>2012</td>\n",
" <td>1.9</td>\n",
" <td>9994.736527</td>\n",
2025-02-06 19:23:34 +04:00
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>3848 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
2025-03-01 09:17:21 +04:00
" Price Prodyear Engine volume PricePred\n",
"13393 3763 2016 2.0 106524.475413\n",
"4751 470 2011 2.4 9993.339772\n",
"11945 706 2010 1.3 9991.779367\n",
"5150 470 2019 2.0 77990.662719\n",
"10864 5488 2014 2.5 9997.038307\n",
"... ... ... ... ...\n",
"5343 7840 1998 2.8 9960.397848\n",
"9938 19444 2013 2.0 9995.969432\n",
"6576 26343 2017 3.0 103432.672018\n",
"12789 39750 2017 1.6 90913.773797\n",
"5395 18189 2012 1.9 9994.736527\n",
2025-02-06 19:23:34 +04:00
"\n",
"[3848 rows x 4 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"result_test = cars_test.copy()\n",
"\n",
"result_test[\"PricePred\"] = result_test.apply(fuzzy_pred, axis=1)\n",
"result_test[\"PricePred\"] = result_test[\"PricePred\"].apply(lambda x: x * 100)\n",
"\n",
"display(result_test)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Оценка результатов на основе метрик для задачи регрессии"
]
},
{
"cell_type": "code",
2025-03-01 09:17:21 +04:00
"execution_count": 15,
2025-02-06 19:23:34 +04:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2025-03-01 09:17:21 +04:00
"{'RMSE_train': 34126.997123579145,\n",
" 'RMSE_test': 34126.997123579145,\n",
" 'RMAE_test': 140.19755698149206,\n",
" 'R2_test': -2.0018563819330226}"
2025-02-06 19:23:34 +04:00
]
},
2025-03-01 09:17:21 +04:00
"execution_count": 15,
2025-02-06 19:23:34 +04:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import math\n",
"from sklearn import metrics\n",
"\n",
"\n",
"rmetrics = {}\n",
"\n",
"rmetrics[\"RMSE_train\"] = math.sqrt(\n",
" metrics.mean_squared_error(result_test[\"Price\"], result_test[\"PricePred\"])\n",
")\n",
"rmetrics[\"RMSE_test\"] = math.sqrt(\n",
" metrics.mean_squared_error(result_test[\"Price\"], result_test[\"PricePred\"])\n",
")\n",
"rmetrics[\"RMAE_test\"] = math.sqrt(\n",
" metrics.mean_absolute_error(result_test[\"Price\"], result_test[\"PricePred\"])\n",
")\n",
"rmetrics[\"R2_test\"] = metrics.r2_score(\n",
" result_test[\"Price\"], result_test[\"PricePred\"]\n",
")\n",
"\n",
"rmetrics"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"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.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}