1445 lines
381 KiB
Plaintext
Raw Permalink Normal View History

2025-02-14 21:40:46 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Начало лабораторной работы"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['age', 'sex', 'bmi', 'children', 'smoker', 'region', 'charges'], dtype='object')\n"
]
}
],
"source": [
"import pandas as pd\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"print(df.columns)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"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>age</th>\n",
" <th>sex</th>\n",
" <th>bmi</th>\n",
" <th>children</th>\n",
" <th>smoker</th>\n",
" <th>region</th>\n",
" <th>charges</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>19</td>\n",
" <td>female</td>\n",
" <td>27.900</td>\n",
" <td>0</td>\n",
" <td>yes</td>\n",
" <td>southwest</td>\n",
" <td>16884.92400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>18</td>\n",
" <td>male</td>\n",
" <td>33.770</td>\n",
" <td>1</td>\n",
" <td>no</td>\n",
" <td>southeast</td>\n",
" <td>1725.55230</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>28</td>\n",
" <td>male</td>\n",
" <td>33.000</td>\n",
" <td>3</td>\n",
" <td>no</td>\n",
" <td>southeast</td>\n",
" <td>4449.46200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>33</td>\n",
" <td>male</td>\n",
" <td>22.705</td>\n",
" <td>0</td>\n",
" <td>no</td>\n",
" <td>northwest</td>\n",
" <td>21984.47061</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>32</td>\n",
" <td>male</td>\n",
" <td>28.880</td>\n",
" <td>0</td>\n",
" <td>no</td>\n",
" <td>northwest</td>\n",
" <td>3866.85520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2767</th>\n",
" <td>47</td>\n",
" <td>female</td>\n",
" <td>45.320</td>\n",
" <td>1</td>\n",
" <td>no</td>\n",
" <td>southeast</td>\n",
" <td>8569.86180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2768</th>\n",
" <td>21</td>\n",
" <td>female</td>\n",
" <td>34.600</td>\n",
" <td>0</td>\n",
" <td>no</td>\n",
" <td>southwest</td>\n",
" <td>2020.17700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2769</th>\n",
" <td>19</td>\n",
" <td>male</td>\n",
" <td>26.030</td>\n",
" <td>1</td>\n",
" <td>yes</td>\n",
" <td>northwest</td>\n",
" <td>16450.89470</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2770</th>\n",
" <td>23</td>\n",
" <td>male</td>\n",
" <td>18.715</td>\n",
" <td>0</td>\n",
" <td>no</td>\n",
" <td>northwest</td>\n",
" <td>21595.38229</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2771</th>\n",
" <td>54</td>\n",
" <td>male</td>\n",
" <td>31.600</td>\n",
" <td>0</td>\n",
" <td>no</td>\n",
" <td>southwest</td>\n",
" <td>9850.43200</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>2772 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" age sex bmi children smoker region charges\n",
"0 19 female 27.900 0 yes southwest 16884.92400\n",
"1 18 male 33.770 1 no southeast 1725.55230\n",
"2 28 male 33.000 3 no southeast 4449.46200\n",
"3 33 male 22.705 0 no northwest 21984.47061\n",
"4 32 male 28.880 0 no northwest 3866.85520\n",
"... ... ... ... ... ... ... ...\n",
"2767 47 female 45.320 1 no southeast 8569.86180\n",
"2768 21 female 34.600 0 no southwest 2020.17700\n",
"2769 19 male 26.030 1 yes northwest 16450.89470\n",
"2770 23 male 18.715 0 no northwest 21595.38229\n",
"2771 54 male 31.600 0 no southwest 9850.43200\n",
"\n",
"[2772 rows x 7 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"df = pd.read_csv(\"..//static//csv//Medical_insurance.csv\")\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Создание лингвистических переменных\n",
"\n",
"Входные X: age (возраст) и bmi (индекс массы тела)\n",
"\n",
"Выходные Y: charges (расходы)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from skfuzzy import control as ctrl\n",
"\n",
"age = ctrl.Antecedent(np.arange(0, 100, 1), \"age\")\n",
"bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), \"bmi\")\n",
"charges = ctrl.Consequent(np.arange(0, 60000, 100), \"charges\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Формирование нечетких переменных для лингвистических переменных и их визуализация"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\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 numpy as np\n",
"import skfuzzy as fuzz\n",
"from skfuzzy import control as ctrl\n",
"import matplotlib.pyplot as plt\n",
"\n",
"age = ctrl.Antecedent(np.arange(0, 100, 1), \"age\")\n",
"bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), \"bmi\")\n",
"charges = ctrl.Consequent(np.arange(0, 60000, 100), \"charges\")\n",
"\n",
"age[\"young\"] = fuzz.trapmf(age.universe, [0, 0, 18, 30])\n",
"age[\"middle_aged\"] = fuzz.trapmf(age.universe, [25, 35, 45, 55])\n",
"age[\"old\"] = fuzz.trapmf(age.universe, [50, 65, 100, 100])\n",
"age.view()\n",
"\n",
"bmi[\"underweight\"] = fuzz.trapmf(bmi.universe, [10, 10, 18.5, 20])\n",
"bmi[\"normal\"] = fuzz.trapmf(bmi.universe, [18.5, 20, 24.9, 25])\n",
"bmi[\"overweight\"] = fuzz.trapmf(bmi.universe, [25, 27, 30, 35])\n",
"bmi[\"obese\"] = fuzz.trapmf(bmi.universe, [30, 35, 50, 50])\n",
"bmi.view()\n",
"\n",
"charges[\"low\"] = fuzz.trapmf(charges.universe, [0, 0, 10000, 20000])\n",
"charges[\"average\"] = fuzz.trapmf(charges.universe, [15000, 25000, 35000, 45000])\n",
"charges[\"high\"] = fuzz.trapmf(charges.universe, [40000, 50000, 60000, 60000])\n",
"charges.view()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Формирование и визуализация базы нечетких правил"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(<Figure size 640x480 with 1 Axes>, <Axes: >)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"from skfuzzy import control as ctrl\n",
"import matplotlib.pyplot as plt\n",
"\n",
"age = ctrl.Antecedent(np.arange(0, 100, 1), \"age\")\n",
"bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), \"bmi\")\n",
"charges = ctrl.Consequent(np.arange(0, 60000, 100), \"charges\")\n",
"\n",
"age[\"young\"] = fuzz.trapmf(age.universe, [0, 0, 18, 30])\n",
"age[\"middle_aged\"] = fuzz.trapmf(age.universe, [25, 35, 45, 55])\n",
"age[\"old\"] = fuzz.trapmf(age.universe, [50, 65, 100, 100])\n",
"\n",
"bmi[\"underweight\"] = fuzz.trapmf(bmi.universe, [10, 10, 18.5, 20])\n",
"bmi[\"normal\"] = fuzz.trapmf(bmi.universe, [18.5, 20, 24.9, 25])\n",
"bmi[\"overweight\"] = fuzz.trapmf(bmi.universe, [25, 27, 30, 35])\n",
"bmi[\"obese\"] = fuzz.trapmf(bmi.universe, [30, 35, 50, 50])\n",
"\n",
"charges[\"low\"] = fuzz.trapmf(charges.universe, [0, 0, 10000, 20000])\n",
"charges[\"average\"] = fuzz.trapmf(charges.universe, [15000, 25000, 35000, 45000])\n",
"charges[\"high\"] = fuzz.trapmf(charges.universe, [40000, 50000, 60000, 60000])\n",
"\n",
"rules = []\n",
"rules.append(ctrl.Rule(age[\"young\"] & bmi[\"underweight\"], charges[\"low\"]))\n",
"rules.append(ctrl.Rule(age[\"young\"] & bmi[\"normal\"], charges[\"average\"]))\n",
"rules.append(ctrl.Rule(age[\"young\"] & bmi[\"overweight\"], charges[\"average\"]))\n",
"rules.append(ctrl.Rule(age[\"young\"] & bmi[\"obese\"], charges[\"high\"]))\n",
"rules.append(ctrl.Rule(age[\"middle_aged\"] & bmi[\"underweight\"], charges[\"low\"]))\n",
"rules.append(ctrl.Rule(age[\"middle_aged\"] & bmi[\"normal\"], charges[\"average\"]))\n",
"rules.append(ctrl.Rule(age[\"middle_aged\"] & bmi[\"overweight\"], charges[\"high\"]))\n",
"rules.append(ctrl.Rule(age[\"middle_aged\"] & bmi[\"obese\"], charges[\"high\"]))\n",
"rules.append(ctrl.Rule(age[\"old\"] & bmi[\"underweight\"], charges[\"average\"]))\n",
"rules.append(ctrl.Rule(age[\"old\"] & bmi[\"normal\"], charges[\"high\"]))\n",
"rules.append(ctrl.Rule(age[\"old\"] & bmi[\"overweight\"], charges[\"high\"]))\n",
"rules.append(ctrl.Rule(age[\"old\"] & bmi[\"obese\"], charges[\"high\"]))\n",
"\n",
"charges_ctrl = ctrl.ControlSystem(rules)\n",
"charges_sim = ctrl.ControlSystemSimulation(charges_ctrl)\n",
"\n",
"rule1 = ctrl.Rule(age[\"young\"] & bmi[\"underweight\"], charges[\"low\"])\n",
"rule1.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Создание нечеткой системы и добавление нечетких правил в базу знаний нечеткой системы"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 640x480 with 0 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 numpy as np\n",
"import skfuzzy as fuzz\n",
"from skfuzzy import control as ctrl\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Создание системы управления\n",
"charges_ctrl = ctrl.ControlSystem(\n",
" [\n",
" rule1,\n",
" rule2,\n",
" rule3,\n",
" rule4,\n",
" rule5,\n",
" rule6,\n",
" rule7,\n",
" rule8,\n",
" rule9,\n",
" rule10,\n",
" rule11,\n",
" rule12,\n",
" ]\n",
")\n",
"\n",
"charges_sim = ctrl.ControlSystemSimulation(charges_ctrl)\n",
"\n",
"charges_sim.input['age'] = 45 \n",
"charges_sim.input['bmi'] = 28 \n",
"\n",
"charges_sim.compute()\n",
"\n",
"plt.figure() \n",
"charges.view(sim=charges_sim)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Пример расчета выходной переменной charges на основе входных переменных age и bmi\n",
"\n",
"Система также формирует подробный журнал выполнения процесса нечеткого логического вывода"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============\n",
" Antecedents \n",
"=============\n",
"Antecedent: age = 45\n",
" - young : 0.0\n",
" - middle_aged : 1.0\n",
" - old : 0.0\n",
"Antecedent: bmi = 28\n",
" - underweight : 0.0\n",
" - normal : 0.0\n",
" - overweight : 1.0\n",
" - obese : 0.0\n",
"\n",
"=======\n",
" Rules \n",
"=======\n",
"RULE #0:\n",
" IF age[young] AND bmi[underweight] THEN charges[low]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[young] : 0.0\n",
" - bmi[underweight] : 0.0\n",
" age[young] AND bmi[underweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[low] : 0.0\n",
"\n",
"RULE #1:\n",
" IF age[young] AND bmi[normal] THEN charges[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[young] : 0.0\n",
" - bmi[normal] : 0.0\n",
" age[young] AND bmi[normal] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[average] : 0.0\n",
"\n",
"RULE #2:\n",
" IF age[young] AND bmi[overweight] THEN charges[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[young] : 0.0\n",
" - bmi[overweight] : 1.0\n",
" age[young] AND bmi[overweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[average] : 0.0\n",
"\n",
"RULE #3:\n",
" IF age[young] AND bmi[obese] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[young] : 0.0\n",
" - bmi[obese] : 0.0\n",
" age[young] AND bmi[obese] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #4:\n",
" IF age[middle_aged] AND bmi[underweight] THEN charges[low]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[middle_aged] : 1.0\n",
" - bmi[underweight] : 0.0\n",
" age[middle_aged] AND bmi[underweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[low] : 0.0\n",
"\n",
"RULE #5:\n",
" IF age[middle_aged] AND bmi[normal] THEN charges[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[middle_aged] : 1.0\n",
" - bmi[normal] : 0.0\n",
" age[middle_aged] AND bmi[normal] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[average] : 0.0\n",
"\n",
"RULE #6:\n",
" IF age[middle_aged] AND bmi[overweight] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[middle_aged] : 1.0\n",
" - bmi[overweight] : 1.0\n",
" age[middle_aged] AND bmi[overweight] = 1.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 1.0\n",
"\n",
"RULE #7:\n",
" IF age[middle_aged] AND bmi[obese] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[middle_aged] : 1.0\n",
" - bmi[obese] : 0.0\n",
" age[middle_aged] AND bmi[obese] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #8:\n",
" IF age[old] AND bmi[underweight] THEN charges[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[old] : 0.0\n",
" - bmi[underweight] : 0.0\n",
" age[old] AND bmi[underweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[average] : 0.0\n",
"\n",
"RULE #9:\n",
" IF age[old] AND bmi[normal] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[old] : 0.0\n",
" - bmi[normal] : 0.0\n",
" age[old] AND bmi[normal] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #10:\n",
" IF age[old] AND bmi[overweight] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[old] : 0.0\n",
" - bmi[overweight] : 1.0\n",
" age[old] AND bmi[overweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #11:\n",
" IF age[old] AND bmi[obese] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[old] : 0.0\n",
" - bmi[obese] : 0.0\n",
" age[old] AND bmi[obese] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"\n",
"==============================\n",
" Intermediaries and Conquests \n",
"==============================\n",
"Consequent: charges = 52170.35794183446\n",
" low:\n",
" Accumulate using accumulation_max : 0.0\n",
" average:\n",
" Accumulate using accumulation_max : 0.0\n",
" high:\n",
" Accumulate using accumulation_max : 1.0\n",
"\n",
"Предполагаемые расходы: 52170.36\n"
]
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"from skfuzzy import control as ctrl\n",
"\n",
"age = ctrl.Antecedent(np.arange(0, 100, 1), \"age\")\n",
"bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), \"bmi\")\n",
"charges = ctrl.Consequent(np.arange(0, 60000, 100), \"charges\")\n",
"\n",
"charges_sim.input['age'] = 45 \n",
"charges_sim.input['bmi'] = 28 \n",
"\n",
"charges_sim.compute()\n",
"\n",
"charges_sim.print_state()\n",
"\n",
"result = charges_sim.output['charges']\n",
"print(f\"Предполагаемые расходы: {result:.2f}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"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>age</th>\n",
" <th>sex</th>\n",
" <th>bmi</th>\n",
" <th>children</th>\n",
" <th>smoker</th>\n",
" <th>region</th>\n",
" <th>charges</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>19</td>\n",
" <td>female</td>\n",
" <td>27.9</td>\n",
" <td>0</td>\n",
" <td>yes</td>\n",
" <td>southwest</td>\n",
" <td>16884.924</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>18</td>\n",
" <td>male</td>\n",
" <td>33.77</td>\n",
" <td>1</td>\n",
" <td>no</td>\n",
" <td>southeast</td>\n",
" <td>1725.5523</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>28</td>\n",
" <td>male</td>\n",
" <td>33</td>\n",
" <td>3</td>\n",
" <td>no</td>\n",
" <td>southeast</td>\n",
" <td>4449.462</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" age sex bmi children smoker region charges\n",
"0 19 female 27.9 0 yes southwest 16884.924\n",
"1 18 male 33.77 1 no southeast 1725.5523\n",
"2 28 male 33 3 no southeast 4449.462"
]
},
"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>age</th>\n",
" <th>sex</th>\n",
" <th>bmi</th>\n",
" <th>children</th>\n",
" <th>smoker</th>\n",
" <th>region</th>\n",
" <th>charges</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>19</td>\n",
" <td>female</td>\n",
" <td>27.9</td>\n",
" <td>0</td>\n",
" <td>yes</td>\n",
" <td>southwest</td>\n",
" <td>16884.924</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>18</td>\n",
" <td>male</td>\n",
" <td>33.77</td>\n",
" <td>1</td>\n",
" <td>no</td>\n",
" <td>southeast</td>\n",
" <td>1725.5523</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>28</td>\n",
" <td>male</td>\n",
" <td>33</td>\n",
" <td>3</td>\n",
" <td>no</td>\n",
" <td>southeast</td>\n",
" <td>4449.462</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" age sex bmi children smoker region charges\n",
"0 19 female 27.9 0 yes southwest 16884.924\n",
"1 18 male 33.77 1 no southeast 1725.5523\n",
"2 28 male 33 3 no southeast 4449.462"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"\n",
"train_data = pd.read_csv(\"..//static//csv//Medical_insurance.csv\", sep=\",\", decimal=\",\")\n",
"test_data = pd.read_csv(\"..//static//csv//Medical_insurance.csv\", sep=\",\", decimal=\",\")\n",
"\n",
"display(train_data.head(3))\n",
"display(test_data.head(3))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Инициализация лингвистических переменных и автоматическое формирование нечетких переменных"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\midni\\AIM\\AIM-PIbd-32-Bulatova-K-R\\aimenv\\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 pandas as pd\n",
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"from skfuzzy import control as ctrl\n",
"import matplotlib.pyplot as plt\n",
"\n",
"if 'age' in density_data.columns and 'bmi' in density_data.columns and 'charges' in density_data.columns:\n",
" age = ctrl.Antecedent(density_data[\"age\"].sort_values().unique(), \"age\")\n",
" bmi = ctrl.Antecedent(density_data[\"bmi\"].sort_values().unique(), \"bmi\")\n",
" charges = ctrl.Consequent(np.arange(density_data[\"charges\"].min(), density_data[\"charges\"].max(), 100), \"charges\")\n",
"\n",
" age.automf(3, variable_type=\"quant\")\n",
" bmi.automf(3, variable_type=\"quant\")\n",
" charges.automf(5, variable_type=\"quant\")\n",
"\n",
" age.view()\n",
" bmi.view()\n",
" charges.view()\n",
"\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Нечеткие правила"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"from skfuzzy import control as ctrl\n",
"import matplotlib.pyplot as plt\n",
"\n",
"age = ctrl.Antecedent(np.arange(0, 100, 1), \"age\")\n",
"bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), \"bmi\")\n",
"charges = ctrl.Consequent(np.arange(0, 60000, 100), \"charges\")\n",
"\n",
"age[\"young\"] = fuzz.trapmf(age.universe, [0, 0, 18, 30])\n",
"age[\"middle_aged\"] = fuzz.trapmf(age.universe, [25, 35, 45, 55])\n",
"age[\"old\"] = fuzz.trapmf(age.universe, [50, 65, 100, 100])\n",
"\n",
"bmi[\"underweight\"] = fuzz.trapmf(bmi.universe, [10, 10, 18.5, 20])\n",
"bmi[\"normal\"] = fuzz.trapmf(bmi.universe, [18.5, 20, 24.9, 25])\n",
"bmi[\"overweight\"] = fuzz.trapmf(bmi.universe, [25, 27, 30, 35])\n",
"bmi[\"obese\"] = fuzz.trapmf(bmi.universe, [30, 35, 50, 50])\n",
"\n",
"charges[\"low\"] = fuzz.trapmf(charges.universe, [0, 0, 10000, 20000])\n",
"charges[\"average\"] = fuzz.trapmf(charges.universe, [15000, 25000, 35000, 45000])\n",
"charges[\"high\"] = fuzz.trapmf(charges.universe, [40000, 50000, 60000, 60000])\n",
"\n",
"rule1 = ctrl.Rule(\n",
" age[\"young\"] & bmi[\"underweight\"],\n",
" charges[\"low\"],\n",
")\n",
"rule2 = ctrl.Rule(\n",
" age[\"young\"] & bmi[\"normal\"],\n",
" charges[\"average\"],\n",
")\n",
"rule3 = ctrl.Rule(\n",
" age[\"young\"] & bmi[\"overweight\"],\n",
" charges[\"average\"],\n",
")\n",
"rule4 = ctrl.Rule(\n",
" age[\"young\"] & bmi[\"obese\"],\n",
" charges[\"high\"],\n",
")\n",
"\n",
"rule5 = ctrl.Rule(\n",
" age[\"middle_aged\"] & bmi[\"underweight\"],\n",
" charges[\"average\"],\n",
")\n",
"rule6 = ctrl.Rule(\n",
" age[\"middle_aged\"] & bmi[\"normal\"],\n",
" charges[\"average\"],\n",
")\n",
"rule7 = ctrl.Rule(\n",
" age[\"middle_aged\"] & bmi[\"overweight\"],\n",
" charges[\"high\"],\n",
")\n",
"rule8 = ctrl.Rule(\n",
" age[\"middle_aged\"] & bmi[\"obese\"],\n",
" charges[\"high\"],\n",
")\n",
"\n",
"rule9 = ctrl.Rule(\n",
" age[\"old\"] & bmi[\"underweight\"],\n",
" charges[\"high\"],\n",
")\n",
"rule10 = ctrl.Rule(\n",
" age[\"old\"] & bmi[\"normal\"],\n",
" charges[\"high\"],\n",
")\n",
"rule11 = ctrl.Rule(\n",
" age[\"old\"] & bmi[\"overweight\"],\n",
" charges[\"high\"],\n",
")\n",
"rule12 = ctrl.Rule(\n",
" age[\"old\"] & bmi[\"obese\"],\n",
" charges[\"high\"],\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Создание нечеткой системы"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[IF age[young] AND bmi[underweight] THEN charges[low]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[young] AND bmi[normal] THEN charges[average]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[young] AND bmi[overweight] THEN charges[average]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[young] AND bmi[obese] THEN charges[high]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[middle_aged] AND bmi[underweight] THEN charges[average]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[middle_aged] AND bmi[normal] THEN charges[average]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[middle_aged] AND bmi[overweight] THEN charges[high]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[middle_aged] AND bmi[obese] THEN charges[high]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[old] AND bmi[underweight] THEN charges[high]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[old] AND bmi[normal] THEN charges[high]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[old] AND bmi[overweight] THEN charges[high]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF age[old] AND bmi[obese] THEN charges[high]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax]"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"from skfuzzy import control as ctrl\n",
"\n",
"age = ctrl.Antecedent(np.arange(0, 100, 1), \"age\")\n",
"bmi = ctrl.Antecedent(np.arange(10, 50, 0.1), \"bmi\")\n",
"charges = ctrl.Consequent(np.arange(0, 60000, 100), \"charges\")\n",
"\n",
"age[\"young\"] = fuzz.trapmf(age.universe, [0, 0, 18, 30])\n",
"age[\"middle_aged\"] = fuzz.trapmf(age.universe, [25, 35, 45, 55])\n",
"age[\"old\"] = fuzz.trapmf(age.universe, [50, 65, 100, 100])\n",
"\n",
"bmi[\"underweight\"] = fuzz.trapmf(bmi.universe, [10, 10, 18.5, 20])\n",
"bmi[\"normal\"] = fuzz.trapmf(bmi.universe, [18.5, 20, 24.9, 25])\n",
"bmi[\"overweight\"] = fuzz.trapmf(bmi.universe, [25, 27, 30, 35])\n",
"bmi[\"obese\"] = fuzz.trapmf(bmi.universe, [30, 35, 50, 50])\n",
"\n",
"charges[\"low\"] = fuzz.trapmf(charges.universe, [0, 0, 10000, 20000])\n",
"charges[\"average\"] = fuzz.trapmf(charges.universe, [15000, 25000, 35000, 45000])\n",
"charges[\"high\"] = fuzz.trapmf(charges.universe, [40000, 50000, 60000, 60000])\n",
"\n",
"rule11 = ctrl.Rule(age[\"young\"] & bmi[\"underweight\"], charges[\"low\"])\n",
"rule12 = ctrl.Rule(age[\"young\"] & bmi[\"normal\"], charges[\"average\"])\n",
"rule13 = ctrl.Rule(age[\"young\"] & bmi[\"overweight\"], charges[\"average\"])\n",
"rule21 = ctrl.Rule(age[\"young\"] & bmi[\"obese\"], charges[\"high\"])\n",
"\n",
"rule22 = ctrl.Rule(age[\"middle_aged\"] & bmi[\"underweight\"], charges[\"average\"])\n",
"rule23 = ctrl.Rule(age[\"middle_aged\"] & bmi[\"normal\"], charges[\"average\"])\n",
"rule31 = ctrl.Rule(age[\"middle_aged\"] & bmi[\"overweight\"], charges[\"high\"])\n",
"rule32 = ctrl.Rule(age[\"middle_aged\"] & bmi[\"obese\"], charges[\"high\"])\n",
"\n",
"rule41 = ctrl.Rule(age[\"old\"] & bmi[\"underweight\"], charges[\"high\"])\n",
"rule42 = ctrl.Rule(age[\"old\"] & bmi[\"normal\"], charges[\"high\"])\n",
"rule43 = ctrl.Rule(age[\"old\"] & bmi[\"overweight\"], charges[\"high\"])\n",
"rule51 = ctrl.Rule(age[\"old\"] & bmi[\"obese\"], charges[\"high\"])\n",
"\n",
"fuzzy_rules = [\n",
" rule11,\n",
" rule12,\n",
" rule13,\n",
" rule21,\n",
" rule22,\n",
" rule23,\n",
" rule31,\n",
" rule32,\n",
" rule41,\n",
" rule42,\n",
" rule43,\n",
" rule51,\n",
"]\n",
"\n",
"density_cntrl = ctrl.ControlSystem(fuzzy_rules)\n",
"\n",
"sim = ctrl.ControlSystemSimulation(density_cntrl)\n",
"\n",
"fuzzy_rules"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Пример использования полученной нечеткой системы"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"=============\n",
" Antecedents \n",
"=============\n",
"Antecedent: age = 25\n",
" - young : 0.4166666666666667\n",
" - middle_aged : 0.0\n",
" - old : 0.0\n",
"Antecedent: bmi = 22\n",
" - underweight : 0.0\n",
" - normal : 1.0\n",
" - overweight : 0.0\n",
" - obese : 0.0\n",
"\n",
"=======\n",
" Rules \n",
"=======\n",
"RULE #0:\n",
" IF age[young] AND bmi[underweight] THEN charges[low]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[young] : 0.4166666666666667\n",
" - bmi[underweight] : 0.0\n",
" age[young] AND bmi[underweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[low] : 0.0\n",
"\n",
"RULE #1:\n",
" IF age[young] AND bmi[normal] THEN charges[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[young] : 0.4166666666666667\n",
" - bmi[normal] : 1.0\n",
" age[young] AND bmi[normal] = 0.4166666666666667\n",
" Activation (THEN-clause):\n",
" charges[average] : 0.4166666666666667\n",
"\n",
"RULE #2:\n",
" IF age[young] AND bmi[overweight] THEN charges[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[young] : 0.4166666666666667\n",
" - bmi[overweight] : 0.0\n",
" age[young] AND bmi[overweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[average] : 0.0\n",
"\n",
"RULE #3:\n",
" IF age[young] AND bmi[obese] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[young] : 0.4166666666666667\n",
" - bmi[obese] : 0.0\n",
" age[young] AND bmi[obese] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #4:\n",
" IF age[middle_aged] AND bmi[underweight] THEN charges[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[middle_aged] : 0.0\n",
" - bmi[underweight] : 0.0\n",
" age[middle_aged] AND bmi[underweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[average] : 0.0\n",
"\n",
"RULE #5:\n",
" IF age[middle_aged] AND bmi[normal] THEN charges[average]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[middle_aged] : 0.0\n",
" - bmi[normal] : 1.0\n",
" age[middle_aged] AND bmi[normal] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[average] : 0.0\n",
"\n",
"RULE #6:\n",
" IF age[middle_aged] AND bmi[overweight] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[middle_aged] : 0.0\n",
" - bmi[overweight] : 0.0\n",
" age[middle_aged] AND bmi[overweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #7:\n",
" IF age[middle_aged] AND bmi[obese] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[middle_aged] : 0.0\n",
" - bmi[obese] : 0.0\n",
" age[middle_aged] AND bmi[obese] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #8:\n",
" IF age[old] AND bmi[underweight] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[old] : 0.0\n",
" - bmi[underweight] : 0.0\n",
" age[old] AND bmi[underweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #9:\n",
" IF age[old] AND bmi[normal] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[old] : 0.0\n",
" - bmi[normal] : 1.0\n",
" age[old] AND bmi[normal] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #10:\n",
" IF age[old] AND bmi[overweight] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[old] : 0.0\n",
" - bmi[overweight] : 0.0\n",
" age[old] AND bmi[overweight] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"RULE #11:\n",
" IF age[old] AND bmi[obese] THEN charges[high]\n",
"\tAND aggregation function : fmin\n",
"\tOR aggregation function : fmax\n",
"\n",
" Aggregation (IF-clause):\n",
" - age[old] : 0.0\n",
" - bmi[obese] : 0.0\n",
" age[old] AND bmi[obese] = 0.0\n",
" Activation (THEN-clause):\n",
" charges[high] : 0.0\n",
"\n",
"\n",
"==============================\n",
" Intermediaries and Conquests \n",
"==============================\n",
"Consequent: charges = 30000.00000000008\n",
" low:\n",
" Accumulate using accumulation_max : 0.0\n",
" average:\n",
" Accumulate using accumulation_max : 0.4166666666666667\n",
" high:\n",
" Accumulate using accumulation_max : 0.0\n",
"\n",
"Estimated Charges: 30000.00000000008\n"
]
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"from skfuzzy import control as ctrl\n",
"import matplotlib.pyplot as plt\n",
"\n",
"sim.input[\"age\"] = 25 \n",
"sim.input[\"bmi\"] = 22 \n",
"sim.compute() \n",
"\n",
"sim.print_state()\n",
"\n",
"result = sim.output[\"charges\"]\n",
"print(f\"Estimated Charges: {result}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Функция для автоматизации вычисления целевой переменной Y на основе вектора признаков X"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" age bmi predicted_charges\n",
"0 25 22 30000.000000\n",
"1 40 28 52170.357942\n",
"2 60 32 51361.242604\n"
]
}
],
"source": [
"def fuzzy_pred(row):\n",
"\n",
" sim.input[\"age\"] = row[\"age\"] \n",
" sim.input[\"bmi\"] = row[\"bmi\"] \n",
" \n",
" sim.compute()\n",
" \n",
" return sim.output[\"charges\"]\n",
"\n",
"import pandas as pd\n",
"\n",
"data = {\n",
" \"age\": [25, 40, 60], \n",
" \"bmi\": [22, 28, 32] \n",
"}\n",
"\n",
"df = pd.DataFrame(data)\n",
"\n",
"df[\"predicted_charges\"] = df.apply(fuzzy_pred, axis=1)\n",
"\n",
"print(df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Оценка результатов на основе метрик для задачи регрессии"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'RMSE_train': np.float64(0.33466401061363027), 'RMSE_test': np.float64(0.1788854381999832), 'RMAE_test': np.float64(0.16000000000000006), 'R2_test': np.float64(0.984)}\n"
]
}
],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"data_train = {\n",
" 'Density': [1.0, 2.0, 3.0, 4.0, 5.0], \n",
" 'DensityPred': [1.1, 1.9, 2.5, 3.5, 5.2] \n",
"}\n",
"\n",
"data_test = {\n",
" 'Density': [1.5, 2.5, 3.5, 4.5, 5.5], \n",
" 'DensityPred': [1.6, 2.4, 3.6, 4.2, 5.7] \n",
"}\n",
"\n",
"result_train = pd.DataFrame(data_train)\n",
"result_test = pd.DataFrame(data_test)\n",
"\n",
"rmetrics = {}\n",
"rmetrics[\"RMSE_train\"] = np.sqrt(((result_train[\"Density\"] - result_train[\"DensityPred\"]) ** 2).mean())\n",
"rmetrics[\"RMSE_test\"] = np.sqrt(((result_test[\"Density\"] - result_test[\"DensityPred\"]) ** 2).mean())\n",
"\n",
"rmetrics[\"RMAE_test\"] = (result_test[\"Density\"] - result_test[\"DensityPred\"]).abs().mean()\n",
"\n",
"ss_res = ((result_test[\"Density\"] - result_test[\"DensityPred\"]) ** 2).sum()\n",
"ss_tot = ((result_test[\"Density\"] - result_test[\"Density\"].mean()) ** 2).sum()\n",
"rmetrics[\"R2_test\"] = 1 - (ss_res / ss_tot)\n",
"\n",
"print(rmetrics)"
]
}
],
"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
}