diff --git a/cardio_fuzzy.ipynb b/cardio_tree.ipynb similarity index 85% rename from cardio_fuzzy.ipynb rename to cardio_tree.ipynb index a038a1d..d52fdbc 100644 --- a/cardio_fuzzy.ipynb +++ b/cardio_tree.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -219,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -299,7 +299,7 @@ " if (ap_hi > 129.5) and (ap_hi > 138.5) and (ap_hi > 149.5) and (bmi > 20.482) and (age > 64.351) and (bmi > 36.796) -> 0]" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -315,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -395,7 +395,7 @@ " if (ap_hi > 129.5) and (bmi > 20.482) and (age > 64.351) -> 0]" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -411,7 +411,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -488,7 +488,7 @@ " if (ap_hi > 129.5) and (bmi > 20.482) and (age > 64.351) -> 0]" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -504,7 +504,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -578,7 +578,7 @@ " if (ap_hi > 129.5) and (bmi > 20.482) and (age > 64.351) -> 0]" ] }, - "execution_count": 102, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -593,629 +593,96 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 6, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "['(age <= 39.558)', '(age <= 43.632)', '(age <= 47.569)', '(age <= 54.65)', '(age <= 59.39)', '(age <= 59.536)', '(age <= 60.707)', '(age <= 61.572)', '(age <= 62.463)', '(age <= 63.998)', '(age <= 64.269)', '(age <= 64.308)', '(age <= 64.351)', '(age > 39.538)', '(age > 39.558)', '(age > 39.751)', '(age > 39.989)', '(age > 43.632)', '(age > 43.792)', '(age > 49.818)', '(age > 54.008)', '(age > 54.65)', '(age > 55.817)', '(age > 59.536)', '(age > 64.269)', '(age > 64.351)', '(ap_hi <= 129.5)', '(ap_hi <= 138.5)', '(ap_hi <= 149.5)', '(ap_hi > 114.5)', '(ap_hi > 115.0)', '(ap_hi > 115.5)', '(ap_hi > 118.5)', '(ap_hi > 119.5)', '(ap_hi > 129.5)', '(bmi <= 19.231)', '(bmi <= 20.482)', '(bmi <= 20.512)', '(bmi <= 20.614)', '(bmi <= 21.637)', '(bmi <= 22.045)', '(bmi <= 23.329)', '(bmi <= 26.032)', '(bmi <= 27.71)', '(bmi <= 28.874)', '(bmi <= 29.043)', '(bmi <= 30.744)', '(bmi <= 32.049)', '(bmi <= 32.337)', '(bmi <= 32.886)', '(bmi <= 35.021)', '(bmi <= 35.121)', '(bmi <= 35.932)', '(bmi <= 36.796)', '(bmi <= 38.186)', '(bmi <= 50.547)', '(bmi > 17.3)', '(bmi > 19.231)', '(bmi > 20.482)', '(bmi > 20.512)', '(bmi > 20.614)', '(bmi > 21.637)', '(bmi > 22.045)', '(bmi > 23.329)', '(bmi > 23.927)', '(bmi > 25.912)', '(bmi > 26.032)', '(bmi > 27.71)', '(bmi > 28.874)', '(bmi > 29.043)', '(bmi > 30.744)', '(bmi > 32.886)', '(bmi > 38.186)', '(cholesterol <= 2.5)', '(cholesterol > 1.5)', '(cholesterol > 2.5)']\n" - ] + "data": { + "text/plain": [ + "57" + ] + }, + "metadata": {}, + "output_type": "display_data" }, { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
(age <= 39.558)(age <= 43.632)(age <= 47.569)(age <= 54.65)(age <= 59.39)(age <= 59.536)(age <= 60.707)(age <= 61.572)(age <= 62.463)(age <= 63.998)...(bmi > 27.71)(bmi > 28.874)(bmi > 29.043)(bmi > 30.744)(bmi > 32.886)(bmi > 38.186)(cholesterol <= 2.5)(cholesterol > 1.5)(cholesterol > 2.5)consequent
rule
if (ap_hi <= 129.5) and (age <= 54.65) and (cholesterol <= 2.5) -> 00001000000...0000001000
if (ap_hi <= 129.5) and (ap_hi > 114.5) and (age <= 54.65) and (cholesterol <= 2.5) -> 00001000000...0000001000
if (ap_hi <= 129.5) and (age <= 54.65) and (cholesterol <= 2.5) and (cholesterol > 1.5) and (bmi <= 28.874) -> 00001000000...0000001100
if (ap_hi <= 129.5) and (age <= 54.65) and (cholesterol <= 2.5) and (cholesterol > 1.5) and (bmi > 28.874) -> 00001000000...0100001100
if (ap_hi <= 129.5) and (age <= 54.65) and (age > 43.792) and (cholesterol <= 2.5) and (bmi <= 22.045) -> 00001000000...0000001000
\n", - "

5 rows × 77 columns

\n", - "
" - ], "text/plain": [ - " (age <= 39.558) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (age <= 43.632) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (age <= 47.569) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (age <= 54.65) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 1 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 1 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 1 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 1 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 1 \n", - "\n", - " (age <= 59.39) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (age <= 59.536) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (age <= 60.707) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (age <= 61.572) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (age <= 62.463) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (age <= 63.998) ... \\\n", - "rule ... \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 ... \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 ... \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 ... \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 ... \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 ... \n", - "\n", - " (bmi > 27.71) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (bmi > 28.874) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 1 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (bmi > 29.043) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (bmi > 30.744) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (bmi > 32.886) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (bmi > 38.186) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (cholesterol <= 2.5) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 1 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 1 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 1 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 1 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 1 \n", - "\n", - " (cholesterol > 1.5) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 1 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 1 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " (cholesterol > 2.5) \\\n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - " consequent \n", - "rule \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (ag... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cho... 0 \n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age... 0 \n", - "\n", - "[5 rows x 77 columns]" + "[if (ap_hi = 7) and (age = 29.564) and (cholesterol = 1) -> 0,\n", + " if (ap_hi = 122.0) and (age = 29.564) and (cholesterol = 1) -> 0,\n", + " if (ap_hi = 7) and (age = 29.564) and (cholesterol = 2.0) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 7) and (age = 29.564) and (cholesterol = 2.0) and (bmi = 298.667) -> 0,\n", + " if (ap_hi = 7) and (age = 49.221) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 7) and (age = 49.221) and (cholesterol = 1) and (bmi = 298.667) -> 0,\n", + " if (ap_hi = 124.5) and (age = 49.221) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 124.5) and (age = 49.221) and (cholesterol = 1) and (bmi = 298.667) -> 0,\n", + " if (ap_hi = 7) and (age = 29.564) and (cholesterol = 3) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 122.25) and (age = 29.564) and (cholesterol = 3) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 7) and (age = 29.564) and (cholesterol = 3) and (bmi = 298.667) -> 0,\n", + " if (ap_hi = 7) and (age = 47.2) and (cholesterol = 3) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 7) and (age = 54.329) and (cholesterol = 3) and (bmi = 32.032) -> 0,\n", + " if (ap_hi = 7) and (age = 54.329) and (cholesterol = 3) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 7) and (age = 57.679) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 7) and (age = 57.679) and (cholesterol = 1) and (bmi = 298.667) -> 0,\n", + " if (ap_hi = 124.0) and (age = 57.679) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 124.0) and (age = 57.679) and (cholesterol = 1) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 7) and (age = 59.479) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 1) and (bmi = 3.472) -> 1,\n", + " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 1) and (bmi = 298.667) -> 0,\n", + " if (ap_hi = 122.5) and (age = 64.924) and (cholesterol = 1) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 3) and (bmi = 3.472) -> 1,\n", + " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 3) and (bmi = 25.972) -> 0,\n", + " if (ap_hi = 7) and (age = 57.02) and (cholesterol = 3) and (bmi = 30.982) -> 1,\n", + " if (ap_hi = 7) and (age = 57.02) and (cholesterol = 3) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 3) and (bmi = 30.577) -> 1,\n", + " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 3) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 29.564) and (bmi = 3.472) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 29.564) and (bmi = 19.469) -> 0,\n", + " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 29.564) and (bmi = 298.667) -> 0,\n", + " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 49.762) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 61.0) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 61.0) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 61.767) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 64.924) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 3.472) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 27.336) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 31.396) and (age = 29.564) -> 0,\n", + " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 31.396) and (age = 64.924) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 31.54) -> 1,\n", + " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 139.5) and (age = 29.564) and (bmi = 3.472) -> 1,\n", + " if (ap_hi = 139.5) and (age = 39.548) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 139.5) and (age = 29.564) and (bmi = 44.367) -> 0,\n", + " if (ap_hi = 139.5) and (age = 29.564) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 139.5) and (age = 43.563) and (bmi = 3.472) -> 0,\n", + " if (ap_hi = 139.5) and (age = 43.563) and (bmi = 298.667) -> 1,\n", + " if (ap_hi = 139.5) and (age = 50.565) -> 1,\n", + " if (ap_hi = 139.5) and (age = 64.924) -> 1,\n", + " if (ap_hi = 240) and (bmi = 3.472) and (age = 29.564) -> 1,\n", + " if (ap_hi = 240) and (bmi = 3.472) and (age = 60.043) -> 1,\n", + " if (ap_hi = 240) and (bmi = 3.472) and (age = 64.924) -> 0,\n", + " if (ap_hi = 240) and (bmi = 298.667) and (age = 29.564) -> 1,\n", + " if (ap_hi = 240) and (bmi = 298.667) and (age = 57.084) -> 1,\n", + " if (ap_hi = 240) and (bmi = 28.639) and (age = 64.924) -> 1,\n", + " if (ap_hi = 240) and (bmi = 298.667) and (age = 64.924) -> 0]" ] }, - "execution_count": 103, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from src.rules import get_features, vectorize_rules\n", + "from src.rules import simplify_rules\n", "\n", - "features = get_features(rules, [])\n", - "print(features)\n", - "\n", - "df_rules = vectorize_rules(rules, features)\n", - "df_rules.head(5)" + "rules = simplify_rules(df, rules)\n", + "display(len(rules))\n", + "rules" ] }, { "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{2: 0.2028684211063448,\n", - " 3: 0.16350739364416753,\n", - " 4: 0.17115418740422497,\n", - " 5: 0.18051062435509244,\n", - " 6: 0.17312188913678084,\n", - " 7: 0.20265014439953413,\n", - " 8: 0.2470239144182239,\n", - " 9: 0.26319032892830624}" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "'The best clusters count is 9'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from src.cluster_helper import draw_best_clusters_plot, get_best_clusters_num\n", - "\n", - "random_state = 9\n", - "\n", - "X = df_rules.copy()\n", - "X = X.drop([\"consequent\"], axis=1)\n", - "\n", - "clusters_score = get_best_clusters_num(X, random_state)\n", - "display(clusters_score)\n", - "\n", - "draw_best_clusters_plot(clusters_score)\n", - "\n", - "clusters_num = sorted(clusters_score.items(), key=lambda x: x[1], reverse=True)[0][0]\n", - "display(f\"The best clusters count is {clusters_num}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 106, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Кластер 1 (16):\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cholesterol <= 2.5) -> 0;\n", - "if (ap_hi <= 129.5) and (ap_hi > 114.5) and (age <= 54.65) and (cholesterol <= 2.5) -> 0;\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cholesterol <= 2.5) and (cholesterol > 1.5) and (bmi <= 28.874) -> 0;\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cholesterol <= 2.5) and (cholesterol > 1.5) and (bmi > 28.874) -> 0;\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age > 43.792) and (cholesterol <= 2.5) and (bmi <= 22.045) -> 0;\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age > 43.792) and (cholesterol <= 2.5) and (bmi > 22.045) -> 0;\n", - "if (ap_hi <= 129.5) and (ap_hi > 119.5) and (age <= 54.65) and (age > 43.792) and (cholesterol <= 2.5) and (bmi <= 27.71) -> 0;\n", - "if (ap_hi <= 129.5) and (ap_hi > 119.5) and (age <= 54.65) and (age > 43.792) and (cholesterol <= 2.5) and (bmi > 27.71) -> 0;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (age <= 60.707) and (cholesterol <= 2.5) and (bmi <= 23.329) -> 0;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (age <= 60.707) and (cholesterol <= 2.5) and (bmi > 23.329) -> 0;\n", - "if (ap_hi <= 129.5) and (ap_hi > 118.5) and (age > 54.65) and (age <= 60.707) and (cholesterol <= 2.5) and (bmi <= 32.886) -> 0;\n", - "if (ap_hi <= 129.5) and (ap_hi > 118.5) and (age > 54.65) and (age <= 60.707) and (cholesterol <= 2.5) and (bmi > 32.886) -> 1;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (age <= 64.308) and (cholesterol <= 2.5) and (bmi <= 20.512) -> 0;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (cholesterol <= 2.5) and (bmi <= 20.512) -> 1;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (cholesterol <= 2.5) and (bmi > 20.512) -> 0;\n", - "if (ap_hi <= 129.5) and (ap_hi > 115.5) and (age > 54.65) and (cholesterol <= 2.5) and (bmi > 20.512) -> 1\n", - "--------\n", - "Кластер 2 (8):\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol <= 2.5) and (age <= 59.536) and (bmi <= 21.637) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol <= 2.5) and (age <= 59.536) and (bmi <= 21.637) and (bmi > 17.3) -> 0;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol <= 2.5) and (age <= 59.536) and (bmi > 21.637) -> 0;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol <= 2.5) and (age <= 59.536) and (age > 39.989) and (bmi > 21.637) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol <= 2.5) and (age > 59.536) and (age <= 62.463) and (bmi <= 20.614) -> 0;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol <= 2.5) and (age > 59.536) and (age <= 62.463) and (bmi > 20.614) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol <= 2.5) and (age > 59.536) and (age <= 63.998) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol <= 2.5) and (age > 59.536) -> 1\n", - "--------\n", - "Кластер 3 (6):\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (cholesterol > 2.5) and (bmi <= 26.032) -> 1;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (cholesterol > 2.5) and (bmi <= 26.032) and (bmi > 25.912) -> 0;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (age <= 59.39) and (cholesterol > 2.5) and (bmi > 26.032) and (bmi <= 35.932) -> 1;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (age <= 59.39) and (cholesterol > 2.5) and (bmi > 26.032) -> 1;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (cholesterol > 2.5) and (bmi > 26.032) and (bmi <= 35.121) -> 1;\n", - "if (ap_hi <= 129.5) and (age > 54.65) and (cholesterol > 2.5) and (bmi > 26.032) -> 1\n", - "--------\n", - "Кластер 4 (3):\n", - "if (ap_hi > 129.5) and (bmi <= 20.482) and (age <= 64.269) -> 1;\n", - "if (ap_hi > 129.5) and (bmi <= 20.482) and (age <= 64.269) and (age > 55.817) -> 1;\n", - "if (ap_hi > 129.5) and (bmi <= 20.482) and (age > 64.269) -> 0\n", - "--------\n", - "Кластер 5 (4):\n", - "if (ap_hi > 129.5) and (ap_hi <= 149.5) and (age <= 39.558) and (bmi <= 38.186) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 149.5) and (age <= 39.558) and (age > 39.538) and (bmi <= 38.186) -> 0;\n", - "if (ap_hi > 129.5) and (ap_hi <= 149.5) and (age <= 39.558) and (bmi > 38.186) and (bmi <= 50.547) -> 0;\n", - "if (ap_hi > 129.5) and (ap_hi <= 149.5) and (age <= 39.558) and (bmi > 38.186) -> 1\n", - "--------\n", - "Кластер 6 (6):\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol > 2.5) and (bmi <= 30.744) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol > 2.5) and (bmi <= 30.744) and (bmi > 23.927) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol > 2.5) and (bmi > 30.744) and (bmi <= 32.049) and (age <= 43.632) -> 0;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol > 2.5) and (bmi > 30.744) and (bmi <= 32.049) and (age > 43.632) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol > 2.5) and (bmi > 30.744) and (bmi <= 32.337) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 138.5) and (cholesterol > 2.5) and (bmi > 30.744) -> 1\n", - "--------\n", - "Кластер 7 (4):\n", - "if (ap_hi > 129.5) and (ap_hi <= 149.5) and (age > 39.558) and (age <= 47.569) and (bmi <= 19.231) -> 0;\n", - "if (ap_hi > 129.5) and (ap_hi <= 149.5) and (age > 39.558) and (age <= 47.569) and (bmi > 19.231) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 149.5) and (age > 39.558) and (age <= 61.572) -> 1;\n", - "if (ap_hi > 129.5) and (ap_hi <= 149.5) and (age > 39.558) -> 1\n", - "--------\n", - "Кластер 8 (6):\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cholesterol > 2.5) and (bmi <= 29.043) -> 0;\n", - "if (ap_hi <= 129.5) and (ap_hi > 115.0) and (age <= 54.65) and (cholesterol > 2.5) and (bmi <= 29.043) -> 0;\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (cholesterol > 2.5) and (bmi > 29.043) -> 0;\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age > 39.751) and (cholesterol > 2.5) and (bmi > 29.043) -> 1;\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age > 54.008) and (cholesterol > 2.5) and (bmi > 29.043) and (bmi <= 35.021) -> 0;\n", - "if (ap_hi <= 129.5) and (age <= 54.65) and (age > 54.008) and (cholesterol > 2.5) and (bmi > 29.043) -> 1\n", - "--------\n", - "Кластер 9 (4):\n", - "if (ap_hi > 129.5) and (bmi > 20.482) and (age <= 64.351) -> 1;\n", - "if (ap_hi > 129.5) and (bmi > 20.482) and (age <= 64.351) and (age > 49.818) -> 1;\n", - "if (ap_hi > 129.5) and (bmi > 20.482) and (bmi <= 36.796) and (age > 64.351) -> 1;\n", - "if (ap_hi > 129.5) and (bmi > 20.482) and (age > 64.351) -> 0\n", - "--------\n" - ] - } - ], - "source": [ - "from sklearn import cluster\n", - "\n", - "from src.cluster_helper import print_cluster_result\n", - "\n", - "kmeans = cluster.KMeans(n_clusters=clusters_num, random_state=random_state)\n", - "kmeans.fit(X)\n", - "\n", - "print_cluster_result(X, clusters_num, kmeans.labels_)" - ] - }, - { - "cell_type": "code", - "execution_count": 107, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[if (ap_hi = 7) and (age = 29.564) and (cholesterol = 1) -> 0,\n", - " if (ap_hi = 122.0) and (age = 29.564) and (cholesterol = 1) -> 0,\n", - " if (ap_hi = 7) and (age = 29.564) and (cholesterol = 2.0) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 7) and (age = 29.564) and (cholesterol = 2.0) and (bmi = 298.667) -> 0,\n", - " if (ap_hi = 7) and (age = 49.221) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 7) and (age = 49.221) and (cholesterol = 1) and (bmi = 298.667) -> 0,\n", - " if (ap_hi = 124.5) and (age = 49.221) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 124.5) and (age = 49.221) and (cholesterol = 1) and (bmi = 298.667) -> 0,\n", - " if (ap_hi = 7) and (age = 57.679) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 7) and (age = 57.679) and (cholesterol = 1) and (bmi = 298.667) -> 0,\n", - " if (ap_hi = 124.0) and (age = 57.679) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 124.0) and (age = 57.679) and (cholesterol = 1) and (bmi = 298.667) -> 1,\n", - " if (ap_hi = 7) and (age = 59.479) and (cholesterol = 1) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 1) and (bmi = 3.472) -> 1,\n", - " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 1) and (bmi = 298.667) -> 0,\n", - " if (ap_hi = 122.5) and (age = 64.924) and (cholesterol = 1) and (bmi = 298.667) -> 1],\n", - " [if (ap_hi = 134.0) and (cholesterol = 1) and (age = 29.564) and (bmi = 3.472) -> 1,\n", - " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 29.564) and (bmi = 19.469) -> 0,\n", - " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 29.564) and (bmi = 298.667) -> 0,\n", - " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 49.762) and (bmi = 298.667) -> 1,\n", - " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 61.0) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 61.0) and (bmi = 298.667) -> 1,\n", - " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 61.767) -> 1,\n", - " if (ap_hi = 134.0) and (cholesterol = 1) and (age = 64.924) -> 1],\n", - " [if (ap_hi = 7) and (age = 64.924) and (cholesterol = 3) and (bmi = 3.472) -> 1,\n", - " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 3) and (bmi = 25.972) -> 0,\n", - " if (ap_hi = 7) and (age = 57.02) and (cholesterol = 3) and (bmi = 30.982) -> 1,\n", - " if (ap_hi = 7) and (age = 57.02) and (cholesterol = 3) and (bmi = 298.667) -> 1,\n", - " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 3) and (bmi = 30.577) -> 1,\n", - " if (ap_hi = 7) and (age = 64.924) and (cholesterol = 3) and (bmi = 298.667) -> 1],\n", - " [if (ap_hi = 240) and (bmi = 3.472) and (age = 29.564) -> 1,\n", - " if (ap_hi = 240) and (bmi = 3.472) and (age = 60.043) -> 1,\n", - " if (ap_hi = 240) and (bmi = 3.472) and (age = 64.924) -> 0],\n", - " [if (ap_hi = 139.5) and (age = 29.564) and (bmi = 3.472) -> 1,\n", - " if (ap_hi = 139.5) and (age = 39.548) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 139.5) and (age = 29.564) and (bmi = 44.367) -> 0,\n", - " if (ap_hi = 139.5) and (age = 29.564) and (bmi = 298.667) -> 1],\n", - " [if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 3.472) -> 1,\n", - " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 27.336) -> 1,\n", - " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 31.396) and (age = 29.564) -> 0,\n", - " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 31.396) and (age = 64.924) -> 1,\n", - " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 31.54) -> 1,\n", - " if (ap_hi = 134.0) and (cholesterol = 3) and (bmi = 298.667) -> 1],\n", - " [if (ap_hi = 139.5) and (age = 43.563) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 139.5) and (age = 43.563) and (bmi = 298.667) -> 1,\n", - " if (ap_hi = 139.5) and (age = 50.565) -> 1,\n", - " if (ap_hi = 139.5) and (age = 64.924) -> 1],\n", - " [if (ap_hi = 7) and (age = 29.564) and (cholesterol = 3) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 122.25) and (age = 29.564) and (cholesterol = 3) and (bmi = 3.472) -> 0,\n", - " if (ap_hi = 7) and (age = 29.564) and (cholesterol = 3) and (bmi = 298.667) -> 0,\n", - " if (ap_hi = 7) and (age = 47.2) and (cholesterol = 3) and (bmi = 298.667) -> 1,\n", - " if (ap_hi = 7) and (age = 54.329) and (cholesterol = 3) and (bmi = 32.032) -> 0,\n", - " if (ap_hi = 7) and (age = 54.329) and (cholesterol = 3) and (bmi = 298.667) -> 1],\n", - " [if (ap_hi = 240) and (bmi = 298.667) and (age = 29.564) -> 1,\n", - " if (ap_hi = 240) and (bmi = 298.667) and (age = 57.084) -> 1,\n", - " if (ap_hi = 240) and (bmi = 28.639) and (age = 64.924) -> 1,\n", - " if (ap_hi = 240) and (bmi = 298.667) and (age = 64.924) -> 0]]" - ] - }, - "execution_count": 107, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from src.rules import simplify_and_group_rules\n", - "\n", - "clustered_rules = simplify_and_group_rules(\n", - " df, rules, clusters_num, kmeans.labels_\n", - ")\n", - "clustered_rules" - ] - }, - { - "cell_type": "code", - "execution_count": 108, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -1325,7 +792,7 @@ "bmi 26.346494 30.119376 298.666667 " ] }, - "execution_count": 108, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -1336,7 +803,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -1423,13 +890,13 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "41" + "40" ] }, "metadata": {}, @@ -1462,6 +929,21 @@ " IF ((ap_hi[average] AND age[average]) AND cholesterol[low]) AND bmi[high] THEN cardio[No]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", + " IF ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", + " \tAND aggregation function : fmin\n", + " \tOR aggregation function : fmax,\n", + " IF ((ap_hi[average] AND age[low]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", + " \tAND aggregation function : fmin\n", + " \tOR aggregation function : fmax,\n", + " IF ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[high] THEN cardio[No]\n", + " \tAND aggregation function : fmin\n", + " \tOR aggregation function : fmax,\n", + " IF ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", + " \tAND aggregation function : fmin\n", + " \tOR aggregation function : fmax,\n", + " IF ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[high] THEN cardio[Yes]\n", + " \tAND aggregation function : fmin\n", + " \tOR aggregation function : fmax,\n", " IF ((ap_hi[average] AND age[high]) AND cholesterol[low]) AND bmi[low] THEN cardio[No]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", @@ -1474,6 +956,12 @@ " IF ((ap_hi[average] AND age[high]) AND cholesterol[low]) AND bmi[high] THEN cardio[Yes]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", + " IF ((ap_hi[low] AND age[high]) AND cholesterol[high]) AND bmi[low] THEN cardio[Yes]\n", + " \tAND aggregation function : fmin\n", + " \tOR aggregation function : fmax,\n", + " IF ((ap_hi[low] AND age[high]) AND cholesterol[high]) AND bmi[high] THEN cardio[Yes]\n", + " \tAND aggregation function : fmin\n", + " \tOR aggregation function : fmax,\n", " IF ((ap_hi[average] AND cholesterol[low]) AND age[low]) AND bmi[low] THEN cardio[No]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", @@ -1492,27 +980,6 @@ " IF (ap_hi[average] AND cholesterol[low]) AND age[high] THEN cardio[Yes]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", - " IF ((ap_hi[low] AND age[high]) AND cholesterol[high]) AND bmi[low] THEN cardio[Yes]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", - " IF ((ap_hi[low] AND age[high]) AND cholesterol[high]) AND bmi[high] THEN cardio[Yes]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", - " IF (ap_hi[high] AND bmi[low]) AND age[low] THEN cardio[Yes]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", - " IF (ap_hi[high] AND bmi[low]) AND age[high] THEN cardio[Yes]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", - " IF (ap_hi[average] AND age[average]) AND bmi[low] THEN cardio[No]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", - " IF (ap_hi[average] AND age[low]) AND bmi[low] THEN cardio[No]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", - " IF (ap_hi[average] AND age[low]) AND bmi[high] THEN cardio[Yes]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", " IF ((ap_hi[average] AND cholesterol[high]) AND bmi[low]) AND age[low] THEN cardio[No]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", @@ -1525,6 +992,12 @@ " IF (ap_hi[average] AND cholesterol[high]) AND bmi[high] THEN cardio[Yes]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", + " IF (ap_hi[average] AND age[low]) AND bmi[low] THEN cardio[No]\n", + " \tAND aggregation function : fmin\n", + " \tOR aggregation function : fmax,\n", + " IF (ap_hi[average] AND age[low]) AND bmi[high] THEN cardio[Yes]\n", + " \tAND aggregation function : fmin\n", + " \tOR aggregation function : fmax,\n", " IF (ap_hi[average] AND age[average]) AND bmi[low] THEN cardio[No]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", @@ -1537,19 +1010,10 @@ " IF ap_hi[average] AND age[high] THEN cardio[Yes]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", - " IF ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", + " IF (ap_hi[high] AND bmi[low]) AND age[low] THEN cardio[Yes]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", - " IF ((ap_hi[average] AND age[low]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", - " IF ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[high] THEN cardio[No]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", - " IF ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", - " \tAND aggregation function : fmin\n", - " \tOR aggregation function : fmax,\n", - " IF ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[high] THEN cardio[Yes]\n", + " IF (ap_hi[high] AND bmi[low]) AND age[high] THEN cardio[Yes]\n", " \tAND aggregation function : fmin\n", " \tOR aggregation function : fmax,\n", " IF (ap_hi[high] AND bmi[high]) AND age[low] THEN cardio[Yes]\n", @@ -1563,7 +1027,7 @@ " \tOR aggregation function : fmax]" ] }, - "execution_count": 110, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -1578,7 +1042,7 @@ " \"bmi\": bmi,\n", " \"consequent\": cardio,\n", "}\n", - "fuzzy_rules = get_fuzzy_rules(clustered_rules, fuzzy_variables)\n", + "fuzzy_rules = get_fuzzy_rules(rules, fuzzy_variables)\n", "\n", "fuzzy_cntrl = ctrl.ControlSystem(fuzzy_rules)\n", "\n", @@ -1590,7 +1054,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -1731,6 +1195,76 @@ " cardio[No] : 0.0\n", "\n", "RULE #8:\n", + " IF ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[low] : 0.11397849462365592\n", + " - age[low] : 0.0\n", + " - cholesterol[high] : 0.0\n", + " - bmi[low] : 0.8718221321169112\n", + " ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[low] = 0.0\n", + " Activation (THEN-clause):\n", + " cardio[No] : 0.0\n", + "\n", + "RULE #9:\n", + " IF ((ap_hi[average] AND age[low]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[average] : 0.886021505376344\n", + " - age[low] : 0.0\n", + " - cholesterol[high] : 0.0\n", + " - bmi[low] : 0.8718221321169112\n", + " ((ap_hi[average] AND age[low]) AND cholesterol[high]) AND bmi[low] = 0.0\n", + " Activation (THEN-clause):\n", + " cardio[No] : 0.0\n", + "\n", + "RULE #10:\n", + " IF ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[high] THEN cardio[No]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[low] : 0.11397849462365592\n", + " - age[low] : 0.0\n", + " - cholesterol[high] : 0.0\n", + " - bmi[high] : 0.0\n", + " ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[high] = 0.0\n", + " Activation (THEN-clause):\n", + " cardio[No] : 0.0\n", + "\n", + "RULE #11:\n", + " IF ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[low] : 0.11397849462365592\n", + " - age[average] : 0.7966947605633802\n", + " - cholesterol[high] : 0.0\n", + " - bmi[low] : 0.8718221321169112\n", + " ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[low] = 0.0\n", + " Activation (THEN-clause):\n", + " cardio[No] : 0.0\n", + "\n", + "RULE #12:\n", + " IF ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[high] THEN cardio[Yes]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[low] : 0.11397849462365592\n", + " - age[average] : 0.7966947605633802\n", + " - cholesterol[high] : 0.0\n", + " - bmi[high] : 0.0\n", + " ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[high] = 0.0\n", + " Activation (THEN-clause):\n", + " cardio[Yes] : 0.0\n", + "\n", + "RULE #13:\n", " IF ((ap_hi[average] AND age[high]) AND cholesterol[low]) AND bmi[low] THEN cardio[No]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -1744,7 +1278,7 @@ " Activation (THEN-clause):\n", " cardio[No] : 0.2033052394366198\n", "\n", - "RULE #9:\n", + "RULE #14:\n", " IF ((ap_hi[low] AND age[high]) AND cholesterol[low]) AND bmi[low] THEN cardio[No]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -1758,7 +1292,7 @@ " Activation (THEN-clause):\n", " cardio[No] : 0.11397849462365592\n", "\n", - "RULE #10:\n", + "RULE #15:\n", " IF ((ap_hi[low] AND age[high]) AND cholesterol[low]) AND bmi[high] THEN cardio[No]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -1772,7 +1306,7 @@ " Activation (THEN-clause):\n", " cardio[No] : 0.0\n", "\n", - "RULE #11:\n", + "RULE #16:\n", " IF ((ap_hi[average] AND age[high]) AND cholesterol[low]) AND bmi[high] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -1786,90 +1320,7 @@ " Activation (THEN-clause):\n", " cardio[Yes] : 0.0\n", "\n", - "RULE #12:\n", - " IF ((ap_hi[average] AND cholesterol[low]) AND age[low]) AND bmi[low] THEN cardio[No]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[average] : 0.886021505376344\n", - " - cholesterol[low] : 1.0\n", - " - age[low] : 0.0\n", - " - bmi[low] : 0.8718221321169112\n", - " ((ap_hi[average] AND cholesterol[low]) AND age[low]) AND bmi[low] = 0.0\n", - " Activation (THEN-clause):\n", - " cardio[No] : 0.0\n", - "\n", - "RULE #13:\n", - " IF ((ap_hi[average] AND cholesterol[low]) AND age[low]) AND bmi[high] THEN cardio[No]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[average] : 0.886021505376344\n", - " - cholesterol[low] : 1.0\n", - " - age[low] : 0.0\n", - " - bmi[high] : 0.0\n", - " ((ap_hi[average] AND cholesterol[low]) AND age[low]) AND bmi[high] = 0.0\n", - " Activation (THEN-clause):\n", - " cardio[No] : 0.0\n", - "\n", - "RULE #14:\n", - " IF ((ap_hi[average] AND cholesterol[low]) AND age[average]) AND bmi[high] THEN cardio[Yes]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[average] : 0.886021505376344\n", - " - cholesterol[low] : 1.0\n", - " - age[average] : 0.7966947605633802\n", - " - bmi[high] : 0.0\n", - " ((ap_hi[average] AND cholesterol[low]) AND age[average]) AND bmi[high] = 0.0\n", - " Activation (THEN-clause):\n", - " cardio[Yes] : 0.0\n", - "\n", - "RULE #15:\n", - " IF ((ap_hi[average] AND cholesterol[low]) AND age[high]) AND bmi[low] THEN cardio[No]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[average] : 0.886021505376344\n", - " - cholesterol[low] : 1.0\n", - " - age[high] : 0.2033052394366198\n", - " - bmi[low] : 0.8718221321169112\n", - " ((ap_hi[average] AND cholesterol[low]) AND age[high]) AND bmi[low] = 0.2033052394366198\n", - " Activation (THEN-clause):\n", - " cardio[No] : 0.2033052394366198\n", - "\n", - "RULE #16:\n", - " IF ((ap_hi[average] AND cholesterol[low]) AND age[high]) AND bmi[high] THEN cardio[Yes]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[average] : 0.886021505376344\n", - " - cholesterol[low] : 1.0\n", - " - age[high] : 0.2033052394366198\n", - " - bmi[high] : 0.0\n", - " ((ap_hi[average] AND cholesterol[low]) AND age[high]) AND bmi[high] = 0.0\n", - " Activation (THEN-clause):\n", - " cardio[Yes] : 0.0\n", - "\n", "RULE #17:\n", - " IF (ap_hi[average] AND cholesterol[low]) AND age[high] THEN cardio[Yes]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[average] : 0.886021505376344\n", - " - cholesterol[low] : 1.0\n", - " - age[high] : 0.2033052394366198\n", - " (ap_hi[average] AND cholesterol[low]) AND age[high] = 0.2033052394366198\n", - " Activation (THEN-clause):\n", - " cardio[Yes] : 0.2033052394366198\n", - "\n", - "RULE #18:\n", " IF ((ap_hi[low] AND age[high]) AND cholesterol[high]) AND bmi[low] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -1883,7 +1334,7 @@ " Activation (THEN-clause):\n", " cardio[Yes] : 0.0\n", "\n", - "RULE #19:\n", + "RULE #18:\n", " IF ((ap_hi[low] AND age[high]) AND cholesterol[high]) AND bmi[high] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -1897,71 +1348,89 @@ " Activation (THEN-clause):\n", " cardio[Yes] : 0.0\n", "\n", - "RULE #20:\n", - " IF (ap_hi[high] AND bmi[low]) AND age[low] THEN cardio[Yes]\n", + "RULE #19:\n", + " IF ((ap_hi[average] AND cholesterol[low]) AND age[low]) AND bmi[low] THEN cardio[No]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", "\n", " Aggregation (IF-clause):\n", - " - ap_hi[high] : 0.0\n", - " - bmi[low] : 0.8718221321169112\n", + " - ap_hi[average] : 0.886021505376344\n", + " - cholesterol[low] : 1.0\n", " - age[low] : 0.0\n", - " (ap_hi[high] AND bmi[low]) AND age[low] = 0.0\n", + " - bmi[low] : 0.8718221321169112\n", + " ((ap_hi[average] AND cholesterol[low]) AND age[low]) AND bmi[low] = 0.0\n", " Activation (THEN-clause):\n", - " cardio[Yes] : 0.0\n", + " cardio[No] : 0.0\n", + "\n", + "RULE #20:\n", + " IF ((ap_hi[average] AND cholesterol[low]) AND age[low]) AND bmi[high] THEN cardio[No]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[average] : 0.886021505376344\n", + " - cholesterol[low] : 1.0\n", + " - age[low] : 0.0\n", + " - bmi[high] : 0.0\n", + " ((ap_hi[average] AND cholesterol[low]) AND age[low]) AND bmi[high] = 0.0\n", + " Activation (THEN-clause):\n", + " cardio[No] : 0.0\n", "\n", "RULE #21:\n", - " IF (ap_hi[high] AND bmi[low]) AND age[high] THEN cardio[Yes]\n", + " IF ((ap_hi[average] AND cholesterol[low]) AND age[average]) AND bmi[high] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", "\n", " Aggregation (IF-clause):\n", - " - ap_hi[high] : 0.0\n", - " - bmi[low] : 0.8718221321169112\n", - " - age[high] : 0.2033052394366198\n", - " (ap_hi[high] AND bmi[low]) AND age[high] = 0.0\n", + " - ap_hi[average] : 0.886021505376344\n", + " - cholesterol[low] : 1.0\n", + " - age[average] : 0.7966947605633802\n", + " - bmi[high] : 0.0\n", + " ((ap_hi[average] AND cholesterol[low]) AND age[average]) AND bmi[high] = 0.0\n", " Activation (THEN-clause):\n", " cardio[Yes] : 0.0\n", "\n", "RULE #22:\n", - " IF (ap_hi[average] AND age[average]) AND bmi[low] THEN cardio[No]\n", + " IF ((ap_hi[average] AND cholesterol[low]) AND age[high]) AND bmi[low] THEN cardio[No]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", "\n", " Aggregation (IF-clause):\n", " - ap_hi[average] : 0.886021505376344\n", - " - age[average] : 0.7966947605633802\n", + " - cholesterol[low] : 1.0\n", + " - age[high] : 0.2033052394366198\n", " - bmi[low] : 0.8718221321169112\n", - " (ap_hi[average] AND age[average]) AND bmi[low] = 0.7966947605633802\n", + " ((ap_hi[average] AND cholesterol[low]) AND age[high]) AND bmi[low] = 0.2033052394366198\n", " Activation (THEN-clause):\n", - " cardio[No] : 0.7966947605633802\n", + " cardio[No] : 0.2033052394366198\n", "\n", "RULE #23:\n", - " IF (ap_hi[average] AND age[low]) AND bmi[low] THEN cardio[No]\n", + " IF ((ap_hi[average] AND cholesterol[low]) AND age[high]) AND bmi[high] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", "\n", " Aggregation (IF-clause):\n", " - ap_hi[average] : 0.886021505376344\n", - " - age[low] : 0.0\n", - " - bmi[low] : 0.8718221321169112\n", - " (ap_hi[average] AND age[low]) AND bmi[low] = 0.0\n", - " Activation (THEN-clause):\n", - " cardio[No] : 0.0\n", - "\n", - "RULE #24:\n", - " IF (ap_hi[average] AND age[low]) AND bmi[high] THEN cardio[Yes]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[average] : 0.886021505376344\n", - " - age[low] : 0.0\n", + " - cholesterol[low] : 1.0\n", + " - age[high] : 0.2033052394366198\n", " - bmi[high] : 0.0\n", - " (ap_hi[average] AND age[low]) AND bmi[high] = 0.0\n", + " ((ap_hi[average] AND cholesterol[low]) AND age[high]) AND bmi[high] = 0.0\n", " Activation (THEN-clause):\n", " cardio[Yes] : 0.0\n", "\n", + "RULE #24:\n", + " IF (ap_hi[average] AND cholesterol[low]) AND age[high] THEN cardio[Yes]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[average] : 0.886021505376344\n", + " - cholesterol[low] : 1.0\n", + " - age[high] : 0.2033052394366198\n", + " (ap_hi[average] AND cholesterol[low]) AND age[high] = 0.2033052394366198\n", + " Activation (THEN-clause):\n", + " cardio[Yes] : 0.2033052394366198\n", + "\n", "RULE #25:\n", " IF ((ap_hi[average] AND cholesterol[high]) AND bmi[low]) AND age[low] THEN cardio[No]\n", "\tAND aggregation function : fmin\n", @@ -2017,6 +1486,32 @@ " cardio[Yes] : 0.0\n", "\n", "RULE #29:\n", + " IF (ap_hi[average] AND age[low]) AND bmi[low] THEN cardio[No]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[average] : 0.886021505376344\n", + " - age[low] : 0.0\n", + " - bmi[low] : 0.8718221321169112\n", + " (ap_hi[average] AND age[low]) AND bmi[low] = 0.0\n", + " Activation (THEN-clause):\n", + " cardio[No] : 0.0\n", + "\n", + "RULE #30:\n", + " IF (ap_hi[average] AND age[low]) AND bmi[high] THEN cardio[Yes]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[average] : 0.886021505376344\n", + " - age[low] : 0.0\n", + " - bmi[high] : 0.0\n", + " (ap_hi[average] AND age[low]) AND bmi[high] = 0.0\n", + " Activation (THEN-clause):\n", + " cardio[Yes] : 0.0\n", + "\n", + "RULE #31:\n", " IF (ap_hi[average] AND age[average]) AND bmi[low] THEN cardio[No]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -2029,7 +1524,7 @@ " Activation (THEN-clause):\n", " cardio[No] : 0.7966947605633802\n", "\n", - "RULE #30:\n", + "RULE #32:\n", " IF (ap_hi[average] AND age[average]) AND bmi[high] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -2042,7 +1537,7 @@ " Activation (THEN-clause):\n", " cardio[Yes] : 0.0\n", "\n", - "RULE #31:\n", + "RULE #33:\n", " IF ap_hi[average] AND age[average] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -2054,7 +1549,7 @@ " Activation (THEN-clause):\n", " cardio[Yes] : 0.7966947605633802\n", "\n", - "RULE #32:\n", + "RULE #34:\n", " IF ap_hi[average] AND age[high] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -2066,77 +1561,33 @@ " Activation (THEN-clause):\n", " cardio[Yes] : 0.2033052394366198\n", "\n", - "RULE #33:\n", - " IF ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[low] : 0.11397849462365592\n", - " - age[low] : 0.0\n", - " - cholesterol[high] : 0.0\n", - " - bmi[low] : 0.8718221321169112\n", - " ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[low] = 0.0\n", - " Activation (THEN-clause):\n", - " cardio[No] : 0.0\n", - "\n", - "RULE #34:\n", - " IF ((ap_hi[average] AND age[low]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[average] : 0.886021505376344\n", - " - age[low] : 0.0\n", - " - cholesterol[high] : 0.0\n", - " - bmi[low] : 0.8718221321169112\n", - " ((ap_hi[average] AND age[low]) AND cholesterol[high]) AND bmi[low] = 0.0\n", - " Activation (THEN-clause):\n", - " cardio[No] : 0.0\n", - "\n", "RULE #35:\n", - " IF ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[high] THEN cardio[No]\n", + " IF (ap_hi[high] AND bmi[low]) AND age[low] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", "\n", " Aggregation (IF-clause):\n", - " - ap_hi[low] : 0.11397849462365592\n", - " - age[low] : 0.0\n", - " - cholesterol[high] : 0.0\n", - " - bmi[high] : 0.0\n", - " ((ap_hi[low] AND age[low]) AND cholesterol[high]) AND bmi[high] = 0.0\n", - " Activation (THEN-clause):\n", - " cardio[No] : 0.0\n", - "\n", - "RULE #36:\n", - " IF ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[low] THEN cardio[No]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[low] : 0.11397849462365592\n", - " - age[average] : 0.7966947605633802\n", - " - cholesterol[high] : 0.0\n", + " - ap_hi[high] : 0.0\n", " - bmi[low] : 0.8718221321169112\n", - " ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[low] = 0.0\n", - " Activation (THEN-clause):\n", - " cardio[No] : 0.0\n", - "\n", - "RULE #37:\n", - " IF ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[high] THEN cardio[Yes]\n", - "\tAND aggregation function : fmin\n", - "\tOR aggregation function : fmax\n", - "\n", - " Aggregation (IF-clause):\n", - " - ap_hi[low] : 0.11397849462365592\n", - " - age[average] : 0.7966947605633802\n", - " - cholesterol[high] : 0.0\n", - " - bmi[high] : 0.0\n", - " ((ap_hi[low] AND age[average]) AND cholesterol[high]) AND bmi[high] = 0.0\n", + " - age[low] : 0.0\n", + " (ap_hi[high] AND bmi[low]) AND age[low] = 0.0\n", " Activation (THEN-clause):\n", " cardio[Yes] : 0.0\n", "\n", - "RULE #38:\n", + "RULE #36:\n", + " IF (ap_hi[high] AND bmi[low]) AND age[high] THEN cardio[Yes]\n", + "\tAND aggregation function : fmin\n", + "\tOR aggregation function : fmax\n", + "\n", + " Aggregation (IF-clause):\n", + " - ap_hi[high] : 0.0\n", + " - bmi[low] : 0.8718221321169112\n", + " - age[high] : 0.2033052394366198\n", + " (ap_hi[high] AND bmi[low]) AND age[high] = 0.0\n", + " Activation (THEN-clause):\n", + " cardio[Yes] : 0.0\n", + "\n", + "RULE #37:\n", " IF (ap_hi[high] AND bmi[high]) AND age[low] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -2149,7 +1600,7 @@ " Activation (THEN-clause):\n", " cardio[Yes] : 0.0\n", "\n", - "RULE #39:\n", + "RULE #38:\n", " IF (ap_hi[high] AND bmi[high]) AND age[high] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -2162,7 +1613,7 @@ " Activation (THEN-clause):\n", " cardio[Yes] : 0.0\n", "\n", - "RULE #40:\n", + "RULE #39:\n", " IF (ap_hi[high] AND bmi[low]) AND age[high] THEN cardio[Yes]\n", "\tAND aggregation function : fmin\n", "\tOR aggregation function : fmax\n", @@ -2205,6 +1656,14 @@ "metadata": {}, "output_type": "display_data" }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/user/Projects/python/fuzzy-rules-generator/.venv/lib/python3.12/site-packages/skfuzzy/control/fuzzyvariable.py:125: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n", + " fig.show()\n" + ] + }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAGyCAYAAAAI3auEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABtRklEQVR4nO3dd3gU5frG8e+m90ZCAiEkJLTQm/QiilIUREWqVMEKIthABKyAelQUUBSwnaOiIlgRBQQhVKVJ6CUhoSQQSnrf+f2R3+EcDqAkJJlN9v5cV7xkmNm9l0l2n7zvO/NYDMMwEBEREbFDDmYHEBERETGLCiERERGxWyqERERExG6pEBIRERG7pUJIRERE7JYKIREREbFbKoRERETEbqkQEhEREbulQkhERETslt0VQoZhkJaWhm6oLSIiIqYWQuvWraN3795Ur14di8XCN99887fHrF27lhYtWuDq6krt2rX56KOPivWc6enp+Pr6kp6eXrLQIiIiUmmYWghlZmbStGlT5s2bd037x8XFcdttt9G1a1d27tzJY489xujRo/n555/LOKmIiIhURhZbabpqsVhYtmwZffv2veo+Tz/9ND/++COxsbEXtw0cOJALFy6wYsWKa3qetLQ0fH19SU1NxcfH53pji4iISAVWodYIbdq0iW7dul2yrXv37mzatOmqx+Tm5pKWlnbJF8Du4xfKMqqIiIiUlsIC+PXlMnnoClUIJSUlERwcfMm24OBg0tLSyM7OvuIxM2fOxNfX9+JXWFgYAEMXbWXBuqNYrTYxICYiIiJXknoCPu4N618vk4evUIVQSUyePJnU1NSLX4mJiQAMblOTl5fv476Pf+dcZp7JKUVEROQyB36C+R3gQgKM+LFMnqJCFUIhISEkJydfsi05ORkfHx/c3d2veIyrqys+Pj6XfAE81aM+H4xoxc7EC/R8ax2bj54t8/wiIiJyDQpyYcVk+Hwg1GwHD66H8HZl8lQVqhBq164dq1evvmTbypUradeuZP84N9UPZvn4ToRX8WTwgs3MXnWQQk2ViYiImOfsEVh0K/y+EHq8AgM/A4+AMns6UwuhjIwMdu7cyc6dO4Giy+N37txJQkICUDStNWzYsIv7P/jggxw9epSnnnqK/fv388477/Dll18yYcKEEmeo5uvO52PaMu6mOry1+hBDFm4mOS3nul6XiIiI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", @@ -2229,7 +1688,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -2574,7 +2033,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -2738,7 +2197,7 @@ "[1000 rows x 6 columns]" ] }, - "execution_count": 113, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -2753,7 +2212,7 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 13, "metadata": {}, "outputs": [ {