diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f39f2d..c5db650 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.8, 3.9, 3.10, 3.11] + python-version: [3.8, 3.9, 3.10, 3.11, 3.12] steps: - uses: actions/checkout@v2 diff --git a/README.md b/README.md index 6dcf34b..61ca66c 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,10 @@ modifications: to the 'n_iter_fwer' parameter. For a cluster to be rejected a similar round of reasoning applies. Clusters that are not rejected remain tentative. -4) After the iterative refinement stage SAGE scores could be used to select - the best feature from each cluster. +4) After the iterative refinement a swarm intelligence algorithm, naked mole rat + algorithm, is used to select the most informative feature subset. The user can + also choose to use the MultiSURF algorithm as an alternative to swarm + intelligence. While this method may not produce all features important for classification, it does have some nice properties. First of all, by using an Extremely diff --git a/docs/API.md b/docs/API.md index 35bac4c..bfd8ee2 100644 --- a/docs/API.md +++ b/docs/API.md @@ -7,29 +7,24 @@ of the `Triglav` class and its methods. class triglav.Triglav(transformer = NoScale(), sampler = NoResample(), estimator = ExtraTreesClassifier(512, bootstrap = True), stage_2_estimator = ExtraTreesClassifier(512, bootstrap = True), per_class_imp = False, - n_iter = 40, n_iter_fwer = 11, p_1 = 0.65, p_2 = 0.30, metric = "correlation", linkage = "complete", + n_iter = 40, n_iter_fwer = 11, p_1 = 0.65, p_2 = 0.30, metric = "euclidean", linkage = "ward", thresh = 2.0, criterion = "distance", run_stage_2 = True, verbose = 0, n_jobs = 10) ### Parameters transformer: default = NoScale() - The transformer to be used to scale features. One can use - the scikit-learn.preprocessing transformers. In addition, - CLR and Scaler (converts each row into frequencies) are - available by importing 'CLRTransformer' and 'Scaler' from the - 'triglav' package. - + The transformer to be used to scale features. + sampler: default = NoResample() - The resampling method used for imbalanced classes. Should be - compatable with 'imblearn' or use an 'imblearn' resampler. + The type of sampler (from Imbalanced-learn) to use. estimator: default = ExtraTreesClassifier(512, bootstrap = True) The estimator used to calculate Shapley scores. stage_2_estimator: default = ExtraTreesClassifier(512) - The estimator used to calculate SAGE values. Only used if the - 'run_stage_2' is set to True. - + The estimator used to calculate MultiSURF CV scores. + Only used if the 'run_stage_2' is set to True or 'mms'. + per_class_imp: bool, default = False Specifies if importance scores are calculated globally or per class. Note, per class importance scores are calculated in a @@ -47,14 +42,13 @@ of the `Triglav` class and its methods. p_2: float, default = 0.30 Used to determine the shape of the Beta-Binomial distribution - modelling failures. + modelling misses. - metric: str, default = "correlation" + metric: str, default = "euclidean" The dissimilarity measure used to calculate distances between - features. To use Extremely Randomized Trees proximities one - has to import 'ETCProx' from the 'triglav' package. + features. - linkage: str, default = "complete" + linkage: str, default = "ward" The type of hierarchical clustering method to apply. The available methods include: single, complete, ward, average, centroid. @@ -63,15 +57,16 @@ of the `Triglav` class and its methods. criterion: str, default = "distance" The method used to form flat clusters. The available methods - include: inconsistent, distance, maxclust, monocrit, - maxclust_monocrit. + include: distance or maxclust. alpha: float, default = 0.05 The level at which corrected p-values will be rejected. - run_stage_2: bool, default = True - This stage will determine the best feature from each of the - selected clusters by calculating SAGE values. + run_stage_2: str or bool, default = "mms" + This stage will determine the best features from the selected + Triglav features. If 'str' is "auto", swarm optimization is used. + If "mms" (default), a modified version of the MultiSURF algorithm + is used. If True, "mms" is used. If False, stage 2 is not run. verbose: int, default = 0 Specifies if basic reporting is sent to the user. @@ -94,10 +89,8 @@ of the `Triglav` class and its methods. The mask of the best features from each cluster. Only returns an ndarray if the 'run_stage_2' parameter is enabled. - self.sage_values_: SAGE Explanation Object - A SAGE explanation object created using the set of features in 'selected_'. - For a detailed explanation on how to use this object, please visit: - https://github.com/iancovert/sage + self.task_opt_: Task Object + MealPy task optimizer object. linkage_matrix_: ndarray The SciPy hierarchical clustering encoded as a linkage matrix. @@ -206,8 +199,6 @@ of the `Triglav` class and its methods. class triglav.Scaler() - class triglav.CLRTransformer() - class triglav.NoResample() ### Parameters @@ -237,6 +228,5 @@ of the `Triglav` class and its methods. NoScale will return X Scaler will return the closure of X (all rows sum to one, X must be non-negative) - CLRTransformer will return the CLR Transform of X (X must be non-negative) NoResample will return X diff --git a/notebooks/Diseased-Gut-Analysis/16S_CD_stability.ipynb b/notebooks/Diseased-Gut-Analysis/16S_CD_stability.ipynb deleted file mode 100644 index 634d149..0000000 --- a/notebooks/Diseased-Gut-Analysis/16S_CD_stability.ipynb +++ /dev/null @@ -1,1444 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "9f55a580", - "metadata": {}, - "source": [ - "#### Import required packages" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "c3cff73f", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:34: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:53: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:62: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:68: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:76: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:4: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:9: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:14: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:19: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:362: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit # we can't use this when using a custom link function...\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:384: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:427: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:438: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_tabular.py:185: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_tabular.py:196: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_image.py:174: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\explainers\\_partition.py:675: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "\u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - "\u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n" - ] - } - ], - "source": [ - "from sklearn.model_selection import StratifiedGroupKFold\n", - "from sklearn.ensemble import ExtraTreesClassifier\n", - "from sklearn.metrics import balanced_accuracy_score\n", - "from sklearn.feature_selection import mutual_info_classif\n", - "from sklearn.feature_selection import f_classif\n", - "from sklearn.feature_selection import RFE, RFECV\n", - "\n", - "from statsmodels.stats.multitest import multipletests\n", - "\n", - "from triglav import Triglav, CLRTransformer, ETCProx\n", - "\n", - "from boruta import BorutaPy\n", - "\n", - "import shap as sh\n", - "\n", - "import sage as sg\n", - "\n", - "import numpy as np\n", - "\n", - "import pandas as pd\n", - "\n", - "from random import shuffle\n", - "\n", - "import seaborn as sns\n", - "\n", - "from matplotlib import pyplot as plt\n", - "\n", - "from skbio.stats.composition import clr, multiplicative_replacement, closure\n", - "\n", - "from stability import *" - ] - }, - { - "cell_type": "markdown", - "id": "50aae8d6", - "metadata": {}, - "source": [ - "#### Read in taxonomic data and select high-confidence ASVs" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "fe5a03df", - "metadata": {}, - "outputs": [], - "source": [ - "if __name__ == \"__main__\":\n", - "\n", - " #Read in ASV table\n", - " X = pd.read_csv(\"Diseased Gut/ESV.table\", index_col=0, sep=\"\\t\")\n", - " X_features = X.index.values #Get features\n", - " X_index = [s_name.split(\"_\")[0] for s_name in X.columns.values] #Get the right index\n", - " X_original = X.transpose()\n", - " X_original.index = X_index #Fix the index so it can be ordered\n", - " \n", - " # Read in taxa data\n", - " taxa_tab = pd.read_csv(\n", - " \"Diseased Gut/rdp.out.tmp\", delimiter=\"\\t\", header=None\n", - " ).values\n", - "\n", - " #Convert taxa tab into a dictionary for quick searching\n", - " taxa_dict = {t[0]: np.asarray(t)[1:] for t in taxa_tab}\n", - " \n", - " # Keep all ASVs assigned to Bacteria and Archaea, remove Cyanobacteria and Chloroplasts\n", - " idx = np.where(\n", - " ((taxa_tab[:, 2] == \"Bacteria\") | (taxa_tab[:, 2] == \"Archaea\")), True, False\n", - " )\n", - " taxa_tab = taxa_tab[idx]\n", - " idx = np.where(taxa_tab[:, 5] != \"Cyanobacteria/Chloroplast\", True, False)\n", - " taxa_tab = taxa_tab[idx]\n", - " X_selected = set([x[0] for x in taxa_tab])\n", - " taxa_tab_ss = {x[0]: x for x in taxa_tab}\n", - "\n", - " # Get names of high confidence features\n", - " n_list = [4, 7, 10, 13, 16, 19]\n", - " asv_name = []\n", - "\n", - " for entry in X_features:\n", - " if entry in taxa_dict:\n", - " if float(taxa_dict[entry][-1]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-3], entry))\n", - "\n", - " elif float(taxa_dict[entry][-4]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-6], entry))\n", - "\n", - " elif float(taxa_dict[entry][-7]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-9], entry))\n", - "\n", - " elif float(taxa_dict[entry][-10]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-12], entry))\n", - "\n", - " elif float(taxa_dict[entry][-13]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-15], entry))\n", - "\n", - " else:\n", - " asv_name.append(\"Unclassified-%s\" % entry)\n", - " \n", - " asv_name = np.asarray(asv_name)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "57fdbc75", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3318,)\n", - "(3318,)\n", - "(214, 3318)\n", - "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", - "SRR8534033 926 1 0 0 0 0 0 \\\n", - "SRR8534034 38586 14 1 0 0 0 0 \n", - "SRR8534035 49718 1069 1 0 2 0 0 \n", - "SRR8534036 1016 236 0 0 0 0 0 \n", - "SRR8534037 4247 3416 0 0 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534250 5231 2880 0 0 1 0 0 \n", - "SRR8534251 636 145 0 0 0 0 0 \n", - "SRR8534252 3026 347 332 0 0 0 0 \n", - "SRR8534253 111 163 0 0 0 0 0 \n", - "SRR8534254 12386 2485 0 0 0 0 0 \n", - "\n", - "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", - "SRR8534033 0 0 0 ... 0 0 0 \\\n", - "SRR8534034 0 0 0 ... 0 0 0 \n", - "SRR8534035 0 0 0 ... 0 0 0 \n", - "SRR8534036 0 0 0 ... 0 0 0 \n", - "SRR8534037 0 0 0 ... 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534250 0 0 0 ... 0 0 0 \n", - "SRR8534251 0 0 0 ... 0 0 0 \n", - "SRR8534252 0 0 0 ... 0 0 69 \n", - "SRR8534253 0 0 0 ... 0 0 0 \n", - "SRR8534254 0 0 0 ... 0 0 0 \n", - "\n", - "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", - "SRR8534033 0 0 0 0 0 0 0 \n", - "SRR8534034 0 0 0 0 4 0 0 \n", - "SRR8534035 0 0 0 0 0 0 0 \n", - "SRR8534036 0 0 0 0 0 0 0 \n", - "SRR8534037 0 0 0 0 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534250 0 0 0 0 0 0 0 \n", - "SRR8534251 0 0 0 0 0 1 0 \n", - "SRR8534252 0 0 0 0 0 0 0 \n", - "SRR8534253 0 0 0 0 0 0 0 \n", - "SRR8534254 0 0 0 0 0 0 0 \n", - "\n", - "[214 rows x 3318 columns]\n", - "['Blautia-Zotu1' 'Anaerostipes-Zotu10' 'Blautia-Zotu100' ...\n", - " 'Lachnospiraceae-Zotu997' 'Clostridiales-Zotu998' 'Clostridia-Zotu999']\n" - ] - } - ], - "source": [ - " print(asv_name.shape)\n", - " print(X_features.shape)\n", - " print(X_original.shape)\n", - " print(X_original)\n", - " print(asv_name)" - ] - }, - { - "cell_type": "markdown", - "id": "586057cf", - "metadata": {}, - "source": [ - "#### Read in metadata and order X" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "26b9f682", - "metadata": {}, - "outputs": [], - "source": [ - " # Read in metadata\n", - " meta = pd.read_csv(\"Diseased Gut/metadata.csv\", index_col=0)\n", - " meta = meta[[\"Sample Name\", \"Host_disease\", \"Timepoint\"]]\n", - "\n", - " # Correct locations so they are more informative\n", - " meta[\"Host_disease\"] = np.where(\n", - " meta[\"Host_disease\"] == \"CD\", \"Crohn's Disease\", meta[\"Host_disease\"]\n", - " )\n", - " meta[\"Host_disease\"] = np.where(\n", - " meta[\"Host_disease\"] == \"RA\", \"Rheumatoid Arthritis\", meta[\"Host_disease\"]\n", - " )\n", - " meta[\"Host_diseaes\"] = np.where(\n", - " meta[\"Host_disease\"] == \"MS\", \"Multiple Sclerosis\", meta[\"Host_disease\"]\n", - " )\n", - " meta[\"Host_disease\"] = np.where(\n", - " meta[\"Host_disease\"] == \"US\", \"Ulcerative Colitis\", meta[\"Host_disease\"]\n", - " )\n", - " meta[\"Host_disease\"] = np.where(\n", - " meta[\"Host_disease\"] == \"HC\", \"Healthy Control\", meta[\"Host_disease\"]\n", - " )\n", - " \n", - " #Order samples according to the metadata\n", - " X_original = X_original.loc[meta.index]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "f9e162cb", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Sample Name Host_disease Timepoint Host_diseaes\n", - "SRR8534151 1003.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", - "SRR8534152 1003.2 Rheumatoid Arthritis 2 Rheumatoid Arthritis\n", - "SRR8534149 1021.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", - "SRR8534083 1021.2 Rheumatoid Arthritis 2 Rheumatoid Arthritis\n", - "SRR8534155 1024.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", - "... ... ... ... ...\n", - "SRR8534199 8399.2 UC 2 UC\n", - "SRR8534200 8407.1 Crohn's Disease 1 Crohn's Disease\n", - "SRR8534125 8407.2 Crohn's Disease 2 Crohn's Disease\n", - "SRR8534128 8702.1 UC 1 UC\n", - "SRR8534126 8702.2 UC 2 UC\n", - "\n", - "[198 rows x 4 columns]\n", - "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", - "SRR8534151 776 23 0 0 0 0 0 \\\n", - "SRR8534152 30315 1134 2 0 0 0 0 \n", - "SRR8534149 443 23 54 0 0 0 0 \n", - "SRR8534083 6206 2328 226 0 1 0 2 \n", - "SRR8534155 33147 271 0 0 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534199 17255 5 0 0 0 0 0 \n", - "SRR8534200 295 82 0 0 0 0 0 \n", - "SRR8534125 6785 823 5 0 0 0 0 \n", - "SRR8534128 5802 451 3 0 0 0 0 \n", - "SRR8534126 717 512 0 0 0 0 0 \n", - "\n", - "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", - "SRR8534151 0 0 0 ... 0 0 0 \\\n", - "SRR8534152 0 0 0 ... 0 0 0 \n", - "SRR8534149 0 0 0 ... 0 0 0 \n", - "SRR8534083 0 0 0 ... 0 0 0 \n", - "SRR8534155 0 0 0 ... 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534199 0 0 0 ... 0 0 0 \n", - "SRR8534200 0 0 0 ... 0 0 0 \n", - "SRR8534125 1 0 0 ... 0 0 0 \n", - "SRR8534128 1 0 0 ... 0 0 0 \n", - "SRR8534126 2 0 0 ... 0 0 0 \n", - "\n", - "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", - "SRR8534151 0 0 0 0 0 0 0 \n", - "SRR8534152 0 0 1 10 0 0 1 \n", - "SRR8534149 0 0 0 0 0 0 0 \n", - "SRR8534083 0 0 0 0 0 1 4 \n", - "SRR8534155 0 0 3 0 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534199 0 0 0 0 0 0 0 \n", - "SRR8534200 0 0 0 0 0 0 0 \n", - "SRR8534125 0 0 0 0 0 1 0 \n", - "SRR8534128 0 0 0 0 0 0 0 \n", - "SRR8534126 0 0 0 0 0 0 0 \n", - "\n", - "[198 rows x 3318 columns]\n" - ] - } - ], - "source": [ - " print(meta)\n", - " print(X_original)" - ] - }, - { - "cell_type": "markdown", - "id": "52439a8a", - "metadata": {}, - "source": [ - "#### Get the group metadata (Sample Name)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "6169b42b", - "metadata": {}, - "outputs": [], - "source": [ - " # Get groups\n", - " groups = meta[\"Sample Name\"].astype(str).values\n", - " groups = np.asarray([x.split(\".\")[0] for x in groups])\n", - " \n", - " # List of phenotypes/datasets to test\n", - " pheno = \"Crohn's Disease-Healthy Control\"\n", - "\n", - " pheno_a, pheno_b = pheno.split(\"-\")\n", - "\n", - " idx = np.where(\n", - " ((meta[\"Host_disease\"] == pheno_a) | (meta[\"Host_disease\"] == pheno_b)),\n", - " True,\n", - " False,\n", - " )\n", - "\n", - " y = meta[idx][\"Host_disease\"]\n", - " y = y.values\n", - " \n", - " X_signal = X_original[idx]\n", - " \n", - " groups = groups[idx]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "7626efee", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " \"Crohn's Disease\" \"Crohn's Disease\" 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"]\n", - "['2001' '2001' '2006' '2006' '2008' '2008' '2011' '2011' '2012' '2012'\n", - " '2013' '2013' '2014' '2014' '2015' '2015' '2018' '2018' '2019' '2019'\n", - " '2020' '2020' '2021' '2021' '2022' '2022' '2023' '2023' '2026' '2026'\n", - " '2030' '2030' '2031' '2031' '2037' '2037' '2043' '2043' '2046' '2046'\n", - " '2048' '2048' '2049' '2049' '2057' '2057' '2061' '2061' '2062' '2062'\n", - " '2063' '2063' '2064' '2064' '2084' '2084' '2093' '2093' '2101' '2101'\n", - " '2196' '2196' '2201' '2201' '8101' '8101' '8102' '8102' '8114' '8114'\n", - " '8124' '8124' '8160' '8160' '8170' '8170' '8182' '8182' '8407' '8407']\n", - "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", - "SRR8534047 253 277 0 0 0 0 0 \\\n", - "SRR8534050 4319 2289 0 0 0 1 1 \n", - "SRR8534049 673 216 8 0 0 0 1 \n", - "SRR8534045 6891 1434 56 0 3 0 0 \n", - "SRR8534044 10664 3777 305 0 0 1 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534236 8629 397 1 0 0 0 0 \n", - "SRR8534229 591 81 0 0 0 0 0 \n", - "SRR8534230 361 40 0 0 0 0 0 \n", - "SRR8534200 295 82 0 0 0 0 0 \n", - "SRR8534125 6785 823 5 0 0 0 0 \n", - "\n", - "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", - "SRR8534047 0 0 0 ... 0 0 0 \\\n", - "SRR8534050 0 0 0 ... 0 0 0 \n", - "SRR8534049 0 0 0 ... 0 0 0 \n", - "SRR8534045 0 0 0 ... 0 0 0 \n", - "SRR8534044 0 0 0 ... 0 0 3 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534236 0 0 0 ... 0 0 0 \n", - "SRR8534229 0 0 0 ... 0 0 0 \n", - "SRR8534230 0 0 0 ... 0 0 0 \n", - "SRR8534200 0 0 0 ... 0 0 0 \n", - "SRR8534125 1 0 0 ... 0 0 0 \n", - "\n", - "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", - "SRR8534047 0 0 0 0 0 0 0 \n", - "SRR8534050 0 0 0 0 0 0 0 \n", - "SRR8534049 0 0 0 0 0 0 0 \n", - "SRR8534045 0 0 0 0 0 0 0 \n", - "SRR8534044 0 0 0 0 1 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534236 0 0 2 15 0 0 0 \n", - "SRR8534229 0 0 0 0 0 0 0 \n", - "SRR8534230 0 0 0 0 0 0 0 \n", - "SRR8534200 0 0 0 0 0 0 0 \n", - "SRR8534125 0 0 0 0 0 1 0 \n", - "\n", - "[80 rows x 3318 columns]\n" - ] - } - ], - "source": [ - " print(y)\n", - " print(groups)\n", - " print(X_signal)" - ] - }, - { - "cell_type": "markdown", - "id": "6b7c4b6e", - "metadata": {}, - "source": [ - "#### Collect Data" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "9c59b411", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All Features: 3318\n", - "Reduced Features: 938\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - " # Remove very rare ASVs (<= 4 occurances)\n", - " X_removed = np.where(X_signal.values > 0, True, False)\n", - " occ = np.where(X_removed.sum(axis = 0) > 4, True, False)\n", - " X_removed = X_signal.values[:, occ]\n", - " reduced_features = asv_name[occ]\n", - " \n", - " print(\"All Features: \", X_signal.shape[1])\n", - " print(\"Reduced Features: \", X_removed.shape[1])\n", - " \n", - " # Get a threshold from the dendrogram\n", - " tg_model = Triglav(n_jobs = 10, \n", - " verbose = 0,\n", - " n_iter_fwer = 5,\n", - " p_1 = 0.70,\n", - " p_2 = 0.4,\n", - " transformer = CLRTransformer(),\n", - " run_stage_2 = True, \n", - " alpha = 0.01,\n", - " metric = \"correlation\", \n", - " linkage = \"complete\")\n", - " \n", - " fig = tg_model.visualize_hclust(X_removed, y)\n", - " plt.show()\n", - " plt.close()" - ] - }, - { - "cell_type": "markdown", - "id": "f1bcc7c7", - "metadata": {}, - "source": [ - "#### Loop through samples and select features / calculate generalization performance" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "ec52d3ef", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.8333333333333333 Control\n", - "0.7833333333333333 Mutual Information\n", - "0.8333333333333333 ANOVA\n", - "0.8333333333333333 Triglav (All) 228\n", - "0.7333333333333334 RFE 20\n", - "0.8333333333333333 RFE-CV 248\n", - "0.7333333333333334 Boruta 44\n", - "0.95 Control\n", - "0.7666666666666666 Mutual Information\n", - "0.95 ANOVA\n", - "0.95 Triglav (All) 229\n", - "0.95 RFE 20\n", - "0.95 RFE-CV 156\n", - "0.95 Boruta 46\n", - "0.95 Control\n", - "0.7166666666666667 Mutual Information\n", - "0.9 ANOVA\n", - "0.9 Triglav (All) 248\n", - "0.9 RFE 20\n", - "0.9 RFE-CV 64\n", - "0.9 Boruta 46\n", - "0.8 Control\n", - "0.85 Mutual Information\n", - "0.85 ANOVA\n", - "0.85 Triglav (All) 192\n", - "0.85 RFE 20\n", - "0.85 RFE-CV 708\n", - "0.85 Boruta 53\n", - "0.75 Control\n", - "0.7 Mutual Information\n", - "0.75 ANOVA\n", - "0.75 Triglav (All) 252\n", - "0.7833333333333333 RFE 20\n", - "0.7833333333333333 RFE-CV 20\n", - "0.8333333333333333 Boruta 50\n", - "0.9375 Control\n", - "1.0 Mutual Information\n", - "0.9375 ANOVA\n", - "0.9375 Triglav (All) 235\n", - "0.9375 RFE 20\n", - "0.9375 RFE-CV 156\n", - "0.9375 Boruta 46\n", - "0.7916666666666667 Control\n", - "0.7916666666666667 Mutual Information\n", - "0.9166666666666667 ANOVA\n", - "0.9166666666666667 Triglav (All) 233\n", - "0.9166666666666667 RFE 20\n", - "0.75 RFE-CV 294\n", - "0.875 Boruta 49\n", - "0.8333333333333333 Control\n", - "0.8333333333333333 Mutual Information\n", - "0.8333333333333333 ANOVA\n", - "0.8333333333333333 Triglav (All) 216\n", - "0.8333333333333333 RFE 20\n", - "0.8333333333333333 RFE-CV 20\n", - "0.8333333333333333 Boruta 48\n", - "1.0 Control\n", - "0.8125 Mutual Information\n", - "1.0 ANOVA\n", - "1.0 Triglav (All) 247\n", - "1.0 RFE 20\n", - "1.0 RFE-CV 294\n", - "0.9375 Boruta 43\n", - "0.6875 Control\n", - "0.625 Mutual Information\n", - "0.6875 ANOVA\n", - "0.6875 Triglav (All) 201\n", - "0.8125 RFE 20\n", - "0.8125 RFE-CV 20\n", - "0.6875 Boruta 49\n", - "0.8333333333333333 Control\n", - "0.7833333333333333 Mutual Information\n", - "0.7833333333333333 ANOVA\n", - "0.7833333333333333 Triglav (All) 211\n", - "0.7833333333333333 RFE 20\n", - "0.7833333333333333 RFE-CV 20\n", - "0.8333333333333333 Boruta 44\n", - "0.9166666666666667 Control\n", - "0.8166666666666667 Mutual Information\n", - "0.9166666666666667 ANOVA\n", - "0.7833333333333333 Triglav (All) 247\n", - "0.8166666666666667 RFE 20\n", - "0.8666666666666667 RFE-CV 110\n", - "0.8333333333333333 Boruta 53\n", - "1.0 Control\n", - "1.0 Mutual Information\n", - "1.0 ANOVA\n", - "1.0 Triglav (All) 227\n", - "1.0 RFE 20\n", - "1.0 RFE-CV 708\n", - "1.0 Boruta 39\n", - "0.8125 Control\n", - "0.8125 Mutual Information\n", - "0.875 ANOVA\n", - "0.875 Triglav (All) 230\n", - "0.8125 RFE 20\n", - "0.9375 RFE-CV 64\n", - "0.875 Boruta 38\n", - "0.5 Control\n", - "0.875 Mutual Information\n", - "0.5 ANOVA\n", - "0.5 Triglav (All) 209\n", - "0.625 RFE 20\n", - "0.625 RFE-CV 20\n", - "0.5 Boruta 59\n", - "0.9 Control\n", - "0.7 Mutual Information\n", - "0.95 ANOVA\n", - "0.9 Triglav (All) 253\n", - "0.9 RFE 20\n", - "0.9 RFE-CV 248\n", - "0.85 Boruta 44\n", - "0.9 Control\n", - "0.9 Mutual Information\n", - "0.9 ANOVA\n", - "0.9 Triglav (All) 246\n", - "0.9 RFE 20\n", - "0.9 RFE-CV 20\n", - "0.85 Boruta 47\n", - "0.8333333333333333 Control\n", - "0.7833333333333333 Mutual Information\n", - "0.8333333333333333 ANOVA\n", - "0.9166666666666667 Triglav (All) 218\n", - "1.0 RFE 20\n", - "0.8333333333333333 RFE-CV 340\n", - "0.9166666666666667 Boruta 53\n", - "0.875 Control\n", - "0.875 Mutual Information\n", - "0.875 ANOVA\n", - "0.875 Triglav (All) 206\n", - "0.875 RFE 20\n", - "0.875 RFE-CV 20\n", - "0.875 Boruta 52\n", - "0.75 Control\n", - "0.6875 Mutual Information\n", - "0.6875 ANOVA\n", - "0.75 Triglav (All) 230\n", - "0.8125 RFE 20\n", - "0.6875 RFE-CV 64\n", - "0.6875 Boruta 50\n", - "0.95 Control\n", - "0.8166666666666667 Mutual Information\n", - "0.95 ANOVA\n", - "0.9 Triglav (All) 253\n", - "0.85 RFE 20\n", - "0.9 RFE-CV 708\n", - "0.9 Boruta 48\n", - "0.9166666666666667 Control\n", - "0.9166666666666667 Mutual Information\n", - "0.9166666666666667 ANOVA\n", - "0.9166666666666667 Triglav (All) 260\n", - "0.9166666666666667 RFE 20\n", - "0.9166666666666667 RFE-CV 64\n", - "0.9166666666666667 Boruta 50\n", - "0.75 Control\n", - "0.75 Mutual Information\n", - "0.75 ANOVA\n", - "0.75 Triglav (All) 221\n", - "0.75 RFE 20\n", - "0.75 RFE-CV 202\n", - "0.75 Boruta 51\n", - "0.9 Control\n", - "0.95 Mutual Information\n", - "0.9 ANOVA\n", - "0.85 Triglav (All) 231\n", - "0.8166666666666667 RFE 20\n", - "0.9 RFE-CV 708\n", - "1.0 Boruta 51\n", - "0.7833333333333333 Control\n", - "0.8666666666666667 Mutual Information\n", - "0.8333333333333333 ANOVA\n", - "0.8333333333333333 Triglav (All) 200\n", - "1.0 RFE 20\n", - "0.8333333333333333 RFE-CV 248\n", - "0.9166666666666667 Boruta 45\n", - "0.875 Control\n", - "0.8333333333333333 Mutual Information\n", - "0.875 ANOVA\n", - "0.875 Triglav (All) 243\n", - "0.875 RFE 20\n", - "0.875 RFE-CV 20\n", - "0.8333333333333333 Boruta 51\n", - "1.0 Control\n", - "0.6833333333333333 Mutual Information\n", - "0.95 ANOVA\n", - "1.0 Triglav (All) 254\n", - "0.9 RFE 20\n", - "0.9 RFE-CV 20\n", - "0.95 Boruta 48\n", - "0.875 Control\n", - "1.0 Mutual Information\n", - "0.875 ANOVA\n", - "0.875 Triglav (All) 206\n", - "1.0 RFE 20\n", - "0.8125 RFE-CV 64\n", - "0.9375 Boruta 47\n", - "0.95 Control\n", - "0.8 Mutual Information\n", - "1.0 ANOVA\n", - "1.0 Triglav (All) 218\n", - "1.0 RFE 20\n", - "0.95 RFE-CV 754\n", - "1.0 Boruta 35\n", - "0.5333333333333333 Control\n", - "0.5333333333333333 Mutual Information\n", - "0.5833333333333334 ANOVA\n", - "0.5333333333333333 Triglav (All) 248\n", - "0.6666666666666666 RFE 20\n", - "0.6666666666666666 RFE-CV 20\n", - "0.5833333333333334 Boruta 63\n", - "0.9583333333333333 Control\n", - "0.9583333333333333 Mutual Information\n", - "0.9583333333333333 ANOVA\n", - "0.9583333333333333 Triglav (All) 214\n", - "0.9166666666666667 RFE 20\n", - "0.9166666666666667 RFE-CV 20\n", - "0.9583333333333333 Boruta 46\n", - "0.95 Control\n", - "0.75 Mutual Information\n", - "1.0 ANOVA\n", - "0.95 Triglav (All) 245\n", - "1.0 RFE 20\n", - "1.0 RFE-CV 340\n", - "0.9166666666666667 Boruta 45\n", - "0.9 Control\n", - "0.9 Mutual Information\n", - "0.95 ANOVA\n", - "0.95 Triglav (All) 258\n", - "0.9 RFE 20\n", - "0.85 RFE-CV 64\n", - "1.0 Boruta 46\n", - "0.7666666666666666 Control\n", - "0.7333333333333334 Mutual Information\n", - "0.7666666666666666 ANOVA\n", - "0.6833333333333333 Triglav (All) 244\n", - "0.7333333333333334 RFE 20\n", - "0.85 RFE-CV 294\n", - "0.7333333333333334 Boruta 53\n", - "0.5 Control\n", - "0.75 Mutual Information\n", - "0.5 ANOVA\n", - "0.5 Triglav (All) 202\n", - "0.5 RFE 20\n", - "0.5 RFE-CV 20\n", - "0.5 Boruta 57\n", - "0.7083333333333333 Control\n", - "0.6666666666666667 Mutual Information\n", - "0.7083333333333333 ANOVA\n", - "0.625 Triglav (All) 220\n", - "0.625 RFE 20\n", - "0.6666666666666667 RFE-CV 202\n", - "0.625 Boruta 59\n", - "0.9375 Control\n", - "0.8125 Mutual Information\n", - "0.875 ANOVA\n", - "0.875 Triglav (All) 239\n", - "0.875 RFE 20\n", - "0.8125 RFE-CV 156\n", - "0.875 Boruta 54\n", - "0.85 Control\n", - "0.85 Mutual Information\n", - "0.85 ANOVA\n", - "0.85 Triglav (All) 214\n", - "0.9 RFE 20\n", - "0.85 RFE-CV 386\n", - "0.85 Boruta 47\n", - "1.0 Control\n", - "0.95 Mutual Information\n", - "1.0 ANOVA\n", - "1.0 Triglav (All) 226\n", - "1.0 RFE 20\n", - "1.0 RFE-CV 754\n", - "1.0 Boruta 42\n", - "0.75 Control\n", - "0.7833333333333333 Mutual Information\n", - "0.75 ANOVA\n", - "0.7 Triglav (All) 232\n", - "0.8333333333333333 RFE 20\n", - "0.8333333333333333 RFE-CV 156\n", - "0.8333333333333333 Boruta 51\n", - "0.9583333333333333 Control\n", - "0.8333333333333333 Mutual Information\n", - "0.9166666666666667 ANOVA\n", - "0.9166666666666667 Triglav (All) 235\n", - "0.9583333333333333 RFE 20\n", - "0.9166666666666667 RFE-CV 248\n", - "0.875 Boruta 41\n", - "0.7666666666666666 Control\n", - "0.8 Mutual Information\n", - "0.9 ANOVA\n", - "0.9 Triglav (All) 231\n", - "0.9 RFE 20\n", - "0.9 RFE-CV 64\n", - "0.85 Boruta 46\n", - "0.9583333333333333 Control\n", - "0.9166666666666667 Mutual Information\n", - "0.9583333333333333 ANOVA\n", - "0.9583333333333333 Triglav (All) 227\n", - "1.0 RFE 20\n", - "0.9583333333333333 RFE-CV 616\n", - "1.0 Boruta 43\n", - "0.7833333333333333 Control\n", - "0.7833333333333333 Mutual Information\n", - "0.8333333333333333 ANOVA\n", - "0.7833333333333333 Triglav (All) 243\n", - "0.8333333333333333 RFE 20\n", - "0.8333333333333333 RFE-CV 20\n", - "0.8333333333333333 Boruta 46\n", - "0.75 Control\n", - "0.8333333333333333 Mutual Information\n", - "0.6666666666666666 ANOVA\n", - "0.6666666666666666 Triglav (All) 190\n", - "0.75 RFE 20\n", - "0.75 RFE-CV 20\n", - "0.6666666666666666 Boruta 63\n", - "0.6666666666666667 Control\n", - "0.6666666666666667 Mutual Information\n", - "0.6666666666666667 ANOVA\n", - "0.6666666666666667 Triglav (All) 254\n", - "0.6666666666666667 RFE 20\n", - "0.6666666666666667 RFE-CV 20\n", - "0.6666666666666667 Boruta 46\n", - "0.9375 Control\n", - "0.625 Mutual Information\n", - "0.9375 ANOVA\n", - "0.9375 Triglav (All) 243\n", - "0.875 RFE 20\n", - "0.9375 RFE-CV 156\n", - "0.9375 Boruta 45\n", - "0.9166666666666667 Control\n", - "0.7333333333333334 Mutual Information\n", - "1.0 ANOVA\n", - "1.0 Triglav (All) 223\n", - "1.0 RFE 20\n", - "0.9166666666666667 RFE-CV 248\n", - "1.0 Boruta 41\n", - "0.8125 Control\n", - "0.875 Mutual Information\n", - "0.75 ANOVA\n", - "0.75 Triglav (All) 204\n", - "0.875 RFE 20\n", - "0.75 RFE-CV 64\n", - "0.75 Boruta 49\n", - "0.875 Control\n", - "0.9375 Mutual Information\n", - "0.9375 ANOVA\n", - "0.9375 Triglav (All) 246\n", - "0.9375 RFE 20\n", - "0.9375 RFE-CV 20\n", - "1.0 Boruta 45\n" - ] - } - ], - "source": [ - " arr = []\n", - "\n", - " idx = np.asarray([i for i in range(0, X_removed.shape[1])])\n", - " \n", - " for i in range(10):\n", - " splitter = StratifiedGroupKFold(n_splits = 5, random_state = i, shuffle = True)\n", - "\n", - " #Set the iteration counter\n", - " j = 1\n", - "\n", - " for train, test in splitter.split(X_removed, y, groups):\n", - "\n", - " X_train = X_removed[train]\n", - " y_train = y[train]\n", - "\n", - " X_test = X_removed[test]\n", - " y_test = y[test]\n", - "\n", - " # Control - Get base balanced accuracy score\n", - " clf = ExtraTreesClassifier(128, random_state = i).fit(clr(multiplicative_replacement(closure(X_train))), np.asarray(y_train))\n", - " p = clf.predict(clr(multiplicative_replacement(closure(X_test))))\n", - " BA = balanced_accuracy_score(y_test, p)\n", - "\n", - " tmp = [BA, \"Control\", \";\".join([str(j) for j in range(X_train.shape[1])]), X_train.shape[1], j]\n", - "\n", - " arr.append(tmp)\n", - "\n", - " print(BA, \"Control\")\n", - "\n", - " #Mutual Information\n", - " p_sel = mutual_info_classif(clr(multiplicative_replacement(closure(X_train))), y_train, discrete_features=False)\n", - " p_idx = [(p_sel[j], j) for j in range(X_train.shape[1])]\n", - " p_idx.sort()\n", - " p_idx = p_idx[::-1]\n", - " p_sel = [p_idx[j][1] for j in range(20)]\n", - " p_sel.sort()\n", - " p_sel = np.asarray(p_sel)\n", - "\n", - " clf = ExtraTreesClassifier(128, random_state = i).fit(clr(multiplicative_replacement(closure(X_train)))[:, p_sel], np.asarray(y_train))\n", - " p = clf.predict(clr(multiplicative_replacement(closure(X_test)))[:, p_sel])\n", - " BA = balanced_accuracy_score(y_test, p)\n", - "\n", - " tmp = [BA, \"Mutual Information\", \";\".join(p_sel.astype(str)), len(p_sel), j]\n", - "\n", - " arr.append(tmp)\n", - "\n", - " print(BA, \"Mutual Information\")\n", - "\n", - " #ANOVA\n", - " p_sel = f_classif(clr(multiplicative_replacement(closure(X_train))), y_train)[1]\n", - " p_sel = multipletests(p_sel, 0.05, method = \"fdr_bh\")[0]\n", - " p_sel = np.asarray([j for j in range(X_train.shape[1])])[p_sel]\n", - "\n", - " clf = ExtraTreesClassifier(128, random_state = i).fit(clr(multiplicative_replacement(closure(X_train)))[:, p_sel], np.asarray(y_train))\n", - " p = clf.predict(clr(multiplicative_replacement(closure(X_test)))[:, p_sel])\n", - " BA = balanced_accuracy_score(y_test, p)\n", - "\n", - " tmp = [BA, \"ANOVA\", \";\".join(p_sel.astype(str)), len(p_sel), j]\n", - "\n", - " arr.append(tmp)\n", - "\n", - " print(BA, \"ANOVA\")\n", - "\n", - " #Triglav - All\n", - " clf_a = Triglav(n_jobs = 15,\n", - " estimator = ExtraTreesClassifier(512, max_depth = 7, bootstrap = True),\n", - " verbose = 0,\n", - " n_iter_fwer = 5,\n", - " p_1 = 0.70,\n", - " p_2 = 0.4,\n", - " transformer = CLRTransformer(),\n", - " run_stage_2 = False, \n", - " alpha = 0.01,\n", - " metric = \"correlation\", \n", - " linkage = \"complete\",\n", - " thresh = 0.5).fit(X_train, np.asarray(y_train))\n", - " \n", - " p_sel = clf_a.selected_\n", - "\n", - " clf = ExtraTreesClassifier(128, random_state = i).fit(clr(multiplicative_replacement(closure(X_train)))[:, p_sel], y_train)\n", - " p = clf.predict(clr(multiplicative_replacement(closure(X_test)))[:, p_sel])\n", - " BA = balanced_accuracy_score(y_test, p)\n", - "\n", - " tmp = [BA, \"Triglav (All)\", \";\".join(p_sel.astype(str)), p_sel.sum(), j]\n", - "\n", - " arr.append(tmp)\n", - "\n", - " print(BA, \"Triglav (All)\", p_sel.sum())\n", - "\n", - " #RFE\n", - " clf = RFE(ExtraTreesClassifier(128, random_state = i), n_features_to_select = 20, step = 0.05).fit(clr(multiplicative_replacement(closure(X_train))), y_train)\n", - " filt_best = clf.transform([idx])[0]\n", - "\n", - " p = clf.predict(clr(multiplicative_replacement(closure(X_test))))\n", - " BA = balanced_accuracy_score(y_test, p)\n", - "\n", - " tmp = [BA, \"RFE\", \";\".join(filt_best.astype(str)), len(filt_best), j]\n", - "\n", - " arr.append(tmp)\n", - "\n", - " print(BA, \"RFE\", len(filt_best))\n", - "\n", - " #RFE-CV\n", - " clf = RFECV(ExtraTreesClassifier(128, random_state = i), min_features_to_select = 20, step = 0.05, cv = 5, n_jobs = 5).fit(clr(multiplicative_replacement(closure(X_train))), y_train)\n", - " filt_best = clf.transform([idx])[0]\n", - "\n", - " p = clf.predict(clr(multiplicative_replacement(closure(X_test))))\n", - " BA = balanced_accuracy_score(y_test, p)\n", - "\n", - " tmp = [BA, \"RFE-CV\", \";\".join(filt_best.astype(str)), len(filt_best), j]\n", - "\n", - " arr.append(tmp)\n", - "\n", - " print(BA, \"RFE-CV\", len(filt_best))\n", - "\n", - " #Boruta\n", - " clf = BorutaPy(ExtraTreesClassifier(random_state = i), n_estimators=128, verbose = 0)\n", - " clf.fit(clr(multiplicative_replacement(closure(X_train))), y_train)\n", - "\n", - " filt_best = np.asarray(idx)[clf.support_]\n", - "\n", - " clf = ExtraTreesClassifier(128, random_state = i).fit(clr(multiplicative_replacement(closure(X_train)))[:, filt_best], y_train)\n", - " p = clf.predict(clr(multiplicative_replacement(closure(X_test)))[:, filt_best])\n", - " BA = balanced_accuracy_score(y_test, p)\n", - "\n", - " tmp = [BA, \"Boruta\", \";\".join(filt_best.astype(str)), len(filt_best), j]\n", - "\n", - " arr.append(tmp)\n", - "\n", - " print(BA, \"Boruta\", len(filt_best))\n", - "\n", - " j += 1" - ] - }, - { - "cell_type": "markdown", - "id": "6b9d7e45", - "metadata": {}, - "source": [ - "#### Organize selected features into a binary matrix, one for each method tested" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "c7fd38c5", - "metadata": {}, - "outputs": [], - "source": [ - " features = np.asarray(arr)[:, [1,2]]\n", - "\n", - " comp_dict = {\"Mutual Information\": [],\n", - " \"Triglav (All)\": [],\n", - " \"RFE\": [],\n", - " \"RFE-CV\": [],\n", - " \"Boruta\": [],\n", - " \"ANOVA\": []}\n", - "\n", - " for row in features:\n", - " data_set = np.zeros(shape = (X_train.shape[1],), dtype = int)\n", - " feature_info = row[1].split(\";\")\n", - " \n", - " if row[0] == \"Triglav (All)\":\n", - " for i, entry in enumerate(feature_info):\n", - " if entry == \"True\":\n", - " data_set[i] = 1\n", - " \n", - " comp_dict[row[0]].append(data_set)\n", - "\n", - " else:\n", - " if row[0] == \"Control\":\n", - " pass\n", - " \n", - " else:\n", - " for entry in feature_info:\n", - " data_set[int(entry)] = 1\n", - "\n", - " comp_dict[row[0]].append(data_set)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "4a660a83", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Triglav (All)-RFE': ['Triglav (All)', 'RFE', -6.196304106784489, 5.780438350200257e-10, 0.6210238479678467, 0.6302143344116073, 0.639404820855368, 0.5352991786845709, 0.5566697790227202, 0.5780403793608695], 'Triglav (All)-RFE-CV': ['Triglav (All)', 'RFE-CV', -21.97581066199772, 0.0, 0.6210238479678467, 0.6302143344116073, 0.639404820855368, 0.09732151762055435, 0.1400600767689376, 0.18279863591732087], 'Triglav (All)-Boruta': ['Triglav (All)', 'Boruta', -3.5682682002569646, 0.0003593485689947773, 0.6210238479678467, 0.6302143344116073, 0.639404820855368, 0.5744271385948925, 0.5928051932837829, 0.6111832479726733], 'Triglav (All)-Mutual Information': ['Triglav (All)', 'Mutual Information', -21.34580217572756, 0.0, 0.6210238479678467, 0.6302143344116073, 0.639404820855368, 0.26755497075059714, 0.2967606598194833, 0.32596634888836945], 'Triglav (All)-ANOVA': ['Triglav (All)', 'ANOVA', 0.8931382528470838, 0.37178313998400814, 0.6210238479678467, 0.6302143344116073, 0.639404820855368, 0.6246602151092735, 0.6373567220791527, 0.650053229049032], 'RFE-RFE-CV': ['RFE', 'RFE-CV', -17.088235443962684, 0.0, 0.5352991786845709, 0.5566697790227202, 0.5780403793608695, 0.09732151762055435, 0.1400600767689376, 0.18279863591732087], 'RFE-Boruta': ['RFE', 'Boruta', 2.5127330598038453, 0.011979994535016525, 0.5352991786845709, 0.5566697790227202, 0.5780403793608695, 0.5744271385948925, 0.5928051932837829, 0.6111832479726733], 'RFE-Mutual Information': ['RFE', 'Mutual Information', -14.076279041042834, 0.0, 0.5352991786845709, 0.5566697790227202, 0.5780403793608695, 0.26755497075059714, 0.2967606598194833, 0.32596634888836945], 'RFE-ANOVA': ['RFE', 'ANOVA', 6.361959542787696, 1.9919599303364066e-10, 0.5352991786845709, 0.5566697790227202, 0.5780403793608695, 0.6246602151092735, 0.6373567220791527, 0.650053229049032], 'RFE-CV-Boruta': ['RFE-CV', 'Boruta', 19.07389511958094, 0.0, 0.09732151762055435, 0.1400600767689376, 0.18279863591732087, 0.5744271385948925, 0.5928051932837829, 0.6111832479726733], 'RFE-CV-Mutual Information': ['RFE-CV', 'Mutual Information', 5.933175938517747, 2.9713014271237626e-09, 0.09732151762055435, 0.1400600767689376, 0.18279863591732087, 0.26755497075059714, 0.2967606598194833, 0.32596634888836945], 'RFE-CV-ANOVA': ['RFE-CV', 'ANOVA', 21.861443590206033, 0.0, 0.09732151762055435, 0.1400600767689376, 0.18279863591732087, 0.6246602151092735, 0.6373567220791527, 0.650053229049032], 'Boruta-Mutual Information': ['Boruta', 'Mutual Information', -16.81509675042279, 0.0, 0.5744271385948925, 0.5928051932837829, 0.6111832479726733, 0.26755497075059714, 0.2967606598194833, 0.32596634888836945], 'Boruta-ANOVA': ['Boruta', 'ANOVA', 3.9091322961490893, 9.262822940958593e-05, 0.5744271385948925, 0.5928051932837829, 0.6111832479726733, 0.6246602151092735, 0.6373567220791527, 0.650053229049032], 'Mutual Information-ANOVA': ['Mutual Information', 'ANOVA', 20.961944699583714, 0.0, 0.26755497075059714, 0.2967606598194833, 0.32596634888836945, 0.6246602151092735, 0.6373567220791527, 0.650053229049032]}\n" - ] - } - ], - "source": [ - " from stability import hypothesisTestT, getStability\n", - " comparison_list = [\"Triglav (All)\", \"RFE\", \"RFE-CV\", \"Boruta\", \"Mutual Information\", \"ANOVA\"]\n", - " p_vals = []\n", - " comp_dict_final = dict()\n", - " for i in range(len(comparison_list) - 1):\n", - " for j in range(i+1, len(comparison_list)):\n", - "\n", - " method_a = comparison_list[i]\n", - " method_b = comparison_list[j]\n", - "\n", - " a_loc = np.asarray(comp_dict[method_a])\n", - " b_loc = np.asarray(comp_dict[method_b])\n", - "\n", - " res = hypothesisTestT(a_loc, b_loc)\n", - "\n", - " a_conf = confidenceIntervals(a_loc)\n", - " b_conf = confidenceIntervals(b_loc)\n", - "\n", - " comp_dict_final[\"%s-%s\" %(method_a, method_b)] = [method_a, method_b, res[\"T\"], res[\"p-value\"], a_conf[\"lower\"], a_conf[\"stability\"], a_conf[\"upper\"], b_conf[\"lower\"], b_conf[\"stability\"], b_conf[\"upper\"]]\n", - " p_vals.append((\"%s-%s\" %(method_a, method_b), res[\"p-value\"]))\n", - " \n", - " print(comp_dict_final)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "14ff9ae8", - "metadata": {}, - "outputs": [], - "source": [ - " from statsmodels.stats.multitest import multipletests\n", - " p_vals = np.asarray(p_vals)\n", - " p_vals_float = p_vals[:, 1].astype(float)\n", - "\n", - " p_adjs = multipletests(p_vals_float, alpha = 0.05, method = \"fdr_bh\")\n", - "\n", - " for i in range(p_vals.shape[0]):\n", - " key = p_vals[i, 0]\n", - " adj_pval = p_adjs[0][i]\n", - " \n", - " comp_dict_final[key].append(adj_pval)\n", - "\n", - " comp_dict_df = pd.DataFrame.from_dict(comp_dict_final, orient = \"index\", columns = [\"Model A\", \"Model B\", \"Test Statistic\", \"p-value\", \n", - " \"Conf A Lower\", \"Model A Stability\", \"Conf A Upper\",\n", - " \"Conf B Lower\", \"Model B Stability\", \"Conf B Upper\",\n", - " \"Statistically Significant (FDR)\"])\n", - "\n", - " df = pd.DataFrame(arr,\n", - " index = None,\n", - " columns = [\"Balanced Accuracy\", \"Method\", \"Selected Features\", \"Total Selected\", \"Iteration\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "04b7daba", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Model A Model B \n", - "Triglav (All)-RFE Triglav (All) RFE \\\n", - "Triglav (All)-RFE-CV Triglav (All) RFE-CV \n", - "Triglav (All)-Boruta Triglav (All) Boruta \n", - "Triglav (All)-Mutual Information Triglav (All) Mutual Information \n", - "Triglav (All)-ANOVA Triglav (All) ANOVA \n", - "RFE-RFE-CV RFE RFE-CV \n", - "RFE-Boruta RFE Boruta \n", - "RFE-Mutual Information RFE Mutual Information \n", - "RFE-ANOVA RFE ANOVA \n", - "RFE-CV-Boruta RFE-CV Boruta \n", - "RFE-CV-Mutual Information RFE-CV Mutual Information \n", - "RFE-CV-ANOVA RFE-CV ANOVA \n", - "Boruta-Mutual Information Boruta Mutual Information \n", - "Boruta-ANOVA Boruta ANOVA \n", - "Mutual Information-ANOVA Mutual Information ANOVA \n", - "\n", - " Test Statistic p-value Conf A Lower \n", - "Triglav (All)-RFE -6.196304 5.780438e-10 0.621024 \\\n", - "Triglav (All)-RFE-CV -21.975811 0.000000e+00 0.621024 \n", - "Triglav (All)-Boruta -3.568268 3.593486e-04 0.621024 \n", - "Triglav (All)-Mutual Information -21.345802 0.000000e+00 0.621024 \n", - "Triglav (All)-ANOVA 0.893138 3.717831e-01 0.621024 \n", - "RFE-RFE-CV -17.088235 0.000000e+00 0.535299 \n", - "RFE-Boruta 2.512733 1.197999e-02 0.535299 \n", - "RFE-Mutual Information -14.076279 0.000000e+00 0.535299 \n", - "RFE-ANOVA 6.361960 1.991960e-10 0.535299 \n", - "RFE-CV-Boruta 19.073895 0.000000e+00 0.097322 \n", - "RFE-CV-Mutual Information 5.933176 2.971301e-09 0.097322 \n", - "RFE-CV-ANOVA 21.861444 0.000000e+00 0.097322 \n", - "Boruta-Mutual Information -16.815097 0.000000e+00 0.574427 \n", - "Boruta-ANOVA 3.909132 9.262823e-05 0.574427 \n", - "Mutual Information-ANOVA 20.961945 0.000000e+00 0.267555 \n", - "\n", - " Model A Stability Conf A Upper \n", - "Triglav (All)-RFE 0.630214 0.639405 \\\n", - "Triglav (All)-RFE-CV 0.630214 0.639405 \n", - "Triglav (All)-Boruta 0.630214 0.639405 \n", - "Triglav (All)-Mutual Information 0.630214 0.639405 \n", - "Triglav (All)-ANOVA 0.630214 0.639405 \n", - "RFE-RFE-CV 0.556670 0.578040 \n", - "RFE-Boruta 0.556670 0.578040 \n", - "RFE-Mutual Information 0.556670 0.578040 \n", - "RFE-ANOVA 0.556670 0.578040 \n", - "RFE-CV-Boruta 0.140060 0.182799 \n", - "RFE-CV-Mutual Information 0.140060 0.182799 \n", - "RFE-CV-ANOVA 0.140060 0.182799 \n", - "Boruta-Mutual Information 0.592805 0.611183 \n", - "Boruta-ANOVA 0.592805 0.611183 \n", - "Mutual Information-ANOVA 0.296761 0.325966 \n", - "\n", - " Conf B Lower Model B Stability \n", - "Triglav (All)-RFE 0.535299 0.556670 \\\n", - "Triglav (All)-RFE-CV 0.097322 0.140060 \n", - "Triglav (All)-Boruta 0.574427 0.592805 \n", - "Triglav (All)-Mutual Information 0.267555 0.296761 \n", - "Triglav (All)-ANOVA 0.624660 0.637357 \n", - "RFE-RFE-CV 0.097322 0.140060 \n", - "RFE-Boruta 0.574427 0.592805 \n", - "RFE-Mutual Information 0.267555 0.296761 \n", - "RFE-ANOVA 0.624660 0.637357 \n", - "RFE-CV-Boruta 0.574427 0.592805 \n", - "RFE-CV-Mutual Information 0.267555 0.296761 \n", - "RFE-CV-ANOVA 0.624660 0.637357 \n", - "Boruta-Mutual Information 0.267555 0.296761 \n", - "Boruta-ANOVA 0.624660 0.637357 \n", - "Mutual Information-ANOVA 0.624660 0.637357 \n", - "\n", - " Conf B Upper \n", - "Triglav (All)-RFE 0.578040 \\\n", - "Triglav (All)-RFE-CV 0.182799 \n", - "Triglav (All)-Boruta 0.611183 \n", - "Triglav (All)-Mutual Information 0.325966 \n", - "Triglav (All)-ANOVA 0.650053 \n", - "RFE-RFE-CV 0.182799 \n", - "RFE-Boruta 0.611183 \n", - "RFE-Mutual Information 0.325966 \n", - "RFE-ANOVA 0.650053 \n", - "RFE-CV-Boruta 0.611183 \n", - "RFE-CV-Mutual Information 0.325966 \n", - "RFE-CV-ANOVA 0.650053 \n", - "Boruta-Mutual Information 0.325966 \n", - "Boruta-ANOVA 0.650053 \n", - "Mutual Information-ANOVA 0.650053 \n", - "\n", - " Statistically Significant (FDR) \n", - "Triglav (All)-RFE True \n", - "Triglav (All)-RFE-CV True \n", - "Triglav (All)-Boruta True \n", - "Triglav (All)-Mutual Information True \n", - "Triglav (All)-ANOVA False \n", - "RFE-RFE-CV True \n", - "RFE-Boruta True \n", - "RFE-Mutual Information True \n", - "RFE-ANOVA True \n", - "RFE-CV-Boruta True \n", - "RFE-CV-Mutual Information True \n", - "RFE-CV-ANOVA True \n", - "Boruta-Mutual Information True \n", - "Boruta-ANOVA True \n", - "Mutual Information-ANOVA True \n", - " Balanced Accuracy Method \n", - "0 0.833333 Control \\\n", - "1 0.783333 Mutual Information \n", - "2 0.833333 ANOVA \n", - "3 0.833333 Triglav (All) \n", - "4 0.733333 RFE \n", - ".. ... ... \n", - "345 0.937500 ANOVA \n", - "346 0.937500 Triglav (All) \n", - "347 0.937500 RFE \n", - "348 0.937500 RFE-CV \n", - "349 1.000000 Boruta \n", - "\n", - " Selected Features Total Selected \n", - "0 0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18... 938 \\\n", - "1 84;272;342;370;390;402;415;417;421;462;553;554... 20 \n", - "2 3;10;12;17;18;19;22;23;27;29;30;42;44;47;48;49... 335 \n", - "3 False;False;False;False;False;False;False;Fals... 228 \n", - "4 47;84;263;285;298;300;342;393;402;405;485;513;... 20 \n", - ".. ... ... \n", - "345 0;10;11;12;16;17;19;29;30;47;48;49;52;56;61;64... 218 \n", - "346 True;True;False;False;False;False;False;False;... 246 \n", - "347 12;84;263;285;289;339;342;364;402;405;408;439;... 20 \n", - "348 12;84;263;285;289;339;342;364;402;405;408;439;... 20 \n", - "349 12;47;70;77;84;109;133;151;194;236;263;285;289... 45 \n", - "\n", - " Iteration \n", - "0 1 \n", - "1 1 \n", - "2 1 \n", - "3 1 \n", - "4 1 \n", - ".. ... \n", - "345 5 \n", - "346 5 \n", - "347 5 \n", - "348 5 \n", - "349 5 \n", - "\n", - "[350 rows x 5 columns]\n" - ] - } - ], - "source": [ - "print(comp_dict_df)\n", - "print(df)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "0c3c4ec9", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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SxEdHZ1seWRkJCpWrIg7d+7gzp07avmFCxcQGRmJSpUqpflYuXLlgk6n+8/1SpcujVy5cuHIkSNqWXx8PIKDg406HpnWWz0Ue/z4cUybNg2+vr5wdXXFhAkT4OLigo8++gijR4/OqBiJiIiIsqWlS5dCp9OhTp062LFjB65evYqLFy/i22+/Rf369dGiRQtUrlwZPXr0wKlTp3D8+HH06tULTZo0Megq819KlCiBv/76C7du3UJERESqrfe5c+fGwIEDMWbMGAQEBODChQvo378/Xr58iX79+mXUaVMGM3qg0YcPH2Ljxo1Yt24drl69irZt22LLli3w8PBQp7Hu3bs3WrZsifnz52d4wERERERGET2Qtt4nb38cI5UqVQqnTp3C7NmzMWrUKDx48AAFChRAzZo1sXz5ciiKgt27d2Po0KFo3LgxNBoNWrZsicWLFxt1nNGjR8PLywuVKlXCq1evcPPmzVTXnTNnDvR6PXr27Innz5+jVq1aCAwMRL58+Yw+PzINoxP6IkWKoHTp0ujbty969+6NAgUKJFunSpUqqF27doYESERERIZidXGZfgwRQZw+HgCQS2OjNtpllsw4J0VR4JTPGTixPsP3nRqnfM5G11XBggWxZMkSLFmyJMXlxYoVw+7du1Pdfvr06Zg+fbpB2YgRIzBixAj1fbly5XD06FGDdUqUKJHig7larRbffvstvv322xSP17RpU6Mmz6LMZ3RCHxQUhEaNGr1xHQcHB+zfvz/dQREREVHqxhzgHfC0sLKywq6d202afCqKYjAkJJEppKuF/urVqyhbtqxB+dWrV2FjY4MSJUpkVGxEREREb4XJNeUERif0vXv3Rt++fZMl9H/99Rf8/Pxw4MCBjIqNiIiI/p9Wq0VgYKDJjhcTE4P27dsDAHbv3g2tVmuyY5vyWETZgdEJ/enTpw0mG0hUr149DBkyJEOCIiIiIkOKosDOzs4sx9ZqtWY7NhH9N6OHrVQUBc+fP09W/uzZszSNb0pERERERBnH6IS+cePG8PHxMUjedTodfHx88N5772VocERERERE9GZGd7mZO3cuGjdujPLly6uj3Rw6dAhRUVGcIZaIiIiIyMSMbqGvVKkSzp49i08++QQPHz7E8+fP0atXL1y6dAnvvvtuZsRIRERERESpMLqFHgAKFSqEr776KqNjISIiIiIiIxnd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Y/78+W+cW+fYsWNo0aIFWrRogV9++QVubm44fvw4Ro0ahaCgIOzfvx81a9ZE1apVsXbt2mQJ/a1bt7B//378/PPPatn69evxySef4M8//8Rff/2FunXrGn1ulPmMvrzHjx8PnU6XrFxEMH78+AwJioiIiCjDaEz4SocXL17g+++/x8CBA9GmTRusX78+2TpDhw7FggUL8PDhwxT3ISLo168fKlasiJ07d6JOnTooXrw4unTpgp9//hlHjx7FwoULAQD9+vXD999/j5cvXxrsY/369ShYsCBatmyp7nPdunXo2bMnunfvjjVr1qTvBCnTGX3pXb16FZUqVUpWXqFCBVy7di1DgiIiIiLKKX744QdUqFAB5cuXh6enJ9auXZuslb9bt24oU6YMZsyYkeI+QkJCcOHCBXh7eycb4rtq1apo0aIFtmzZAgDo0aMHYmNjsX37dnUdEcGGDRvQu3dvtbvQ/v378fLlS7Ro0QKenp7YunUroqOjM/LUKYMYndA7Ojrixo0bycqvXbuG3LlzZ0hQRERERDnFmjVr4OnpCQBo2bIlnj17hoMHDxqsoygK5syZg1WrVuH69evJ9nHlyhUAQMWKFVM8RsWKFdV18ufPj44dO2Lt2rXq8v379+PWrVvq0OGJcX366aewsrLCu+++i1KlSmHbtm1vd7KUKYxO6Nu3b48RI0YYXEzXrl3DqFGj0K5duwwNjoiIiCg7u3z5Mo4fP45u3boBeD2iX9euXVPs3uLh4YH33nsPU6ZMSXV/ae2/37dvX/z5559qPrd27Vo0adIEZcqUAQBERkZi586d6hcNAPD09GS3myzK6IT+66+/Ru7cuVGhQgWULFkSJUuWRMWKFeHs7Iz58+dnRoxERERE2dKaNWuQkJCAQoUKwdraGtbW1li+fDl27NiBZ8+eJVt/zpw5+P7773H69GmD8nLlygEALl68mOJxLl68qK4DvB7NplixYli/fj2ioqKwc+dO9OvXT12+efNmxMTEoG7dumpc48aNw+HDh9WWfso6jB7lxtHREf/73/+wb98+nDlzBnZ2dqhSpQoaN26cGfERERERZUsJCQn47rvv4Ovriw8//NBgWYcOHbBlyxb1AdVEderUQadOnZINRFKtWjVUqFABCxcuxKeffmrQj/7MmTP4/fff4ePjo5ZpNBr06dMHa9asQeHChZErVy58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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - " ax = sns.boxplot(x = \"Method\", y = \"Balanced Accuracy\", hue = \"Method\", data = df, dodge = False)\n", - " plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))\n", - " plt.xticks(rotation = 45)\n", - " plt.show()\n", - " plt.close()" - ] - }, - { - "cell_type": "markdown", - "id": "e3776113", - "metadata": {}, - "source": [ - "#### Examine ANOVA and Triglav a little more since they both produced stable feature sets" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "55d6651c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "266.34 43.099604619617416\n", - "938\n", - "229.64 18.43218126328105\n", - "938\n" - ] - } - ], - "source": [ - " anova_loc = np.where(df[\"Method\"].values == \"ANOVA\", True, False)\n", - " anova_ss = df[anova_loc]\n", - " anova_mean = np.mean(anova_ss[\"Total Selected\"])\n", - " anova_std = np.std(anova_ss[\"Total Selected\"], ddof = 1)\n", - "\n", - " print(anova_mean, anova_std)\n", - " print(X_train.shape[1])\n", - "\n", - " t_loc = np.where(df[\"Method\"].values == \"Triglav (All)\", True, False)\n", - " t_ss = df[t_loc]\n", - " t_mean = np.mean(t_ss[\"Total Selected\"])\n", - " t_std = np.std(t_ss[\"Total Selected\"], ddof = 1)\n", - "\n", - " print(t_mean, t_std)\n", - " print(X_train.shape[1])" - ] - }, - { - "cell_type": "markdown", - "id": "23b1b5c1", - "metadata": {}, - "source": [ - "### Triglav and ANOVA appear to be statistically significant and more stable than competing methods. ANOVA may work well with CLR transformed data but it cannot take into account dependencies between features. For example, in this experiment we used decision trees. These are naturally capable of modelling such dependencies. For example, the successful classification of Sample X may depend on the presence of feature 1 and the absence of feature 2. Of the remaining methods, Triglav selects a large number of features (229.64 +/- 18.43) and feature sets which are selected appear to be the stable across runs (95% CI of stability scores is 0.624-0.643). It should also be noted these features belong to clusters which are more impactful than random. A per-cluster analysis for the most impactful features was not performed in this notebook." - ] - }, - { - "cell_type": "markdown", - "id": "a69dff94", - "metadata": {}, - "source": [ - "#### References\n", - "\n", - "Rudar, J., Porter, T.M., Wright, M., Golding G.B., Hajibabaei, M. LANDMark: an ensemble \n", - "approach to the supervised selection of biomarkers in high-throughput sequencing data. \n", - "BMC Bioinformatics 23, 110 (2022). https://doi.org/10.1186/s12859-022-04631-z\n", - "\n", - "Pedregosa F, Varoquaux G, Gramfort A, Michel V, Thirion B, Grisel O, et al. Scikit-learn: \n", - "Machine Learning in Python. Journal of Machine Learning Research. 2011;12:2825–30. \n", - "\n", - "Geurts P, Ernst D, Wehenkel L. Extremely Randomized Trees. Machine Learning. 2006;63(1):3–42.\n", - "\n", - "Rudar, J., Golding, G.B., Kremer, S.C., Hajibabaei, M. (2023). Decision Tree Ensembles Utilizing \n", - "Multivariate Splits Are Effective at Investigating Beta Diversity in Medically Relevant 16S Amplicon \n", - "Sequencing Data. Microbiology Spectrum e02065-22.\n", - "\n", - "Porter, T. M., & Hajibabaei, M. (2022). MetaWorks: A flexible, scalable bioinformatic pipeline for high-throughput multi-marker \n", - "biodiversity assessments. PLOS ONE, 17(9), e0274260. doi: 10.1371/journal.pone.0274260\n", - "\n", - "Wang, Q., Garrity, G. M., Tiedje, J. M., & Cole, J. R. (2007). Naive Bayesian Classifier for Rapid Assignment of rRNA Sequences into the New Bacterial Taxonomy. Applied and Environmental Microbiology, 73(16), 5261–5267. doi:10.1128/AEM.00062-07\n", - "\n", - "Forbes JD, Chen C-Y, Knox NC, Marrie R-A, El-Gabalawy H, de Kievit T, et al. A comparative study of the gut microbiota in immune-mediated inflammatory diseases-does a common dysbiosis exist? Microbiome. 2018 Dec 13;6(1):221–221.\n", - "\n", - "The scikit-bio development team (2020). scikit-bio: A Bioinformatics Library for Data Scientists, Students, and Developers. http://scikit-bio.org. version 0.5.8.\n", - " \n", - "Sarah Nogueira, Konstantinos Sechidis, Gavin Brown (2017). On the Stability of Feature Selection. Journal of Machine Learning Reasearch (JMLR). 2017." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9245eef0", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/Diseased-Gut-Analysis/16S_Test_PSO_CLR.ipynb b/notebooks/Diseased-Gut-Analysis/16S_Test_PSO_CLR.ipynb new file mode 100644 index 0000000..70b6b1a --- /dev/null +++ b/notebooks/Diseased-Gut-Analysis/16S_Test_PSO_CLR.ipynb @@ -0,0 +1,10789 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9c54f025", + "metadata": {}, + "source": [ + "## In a previous notebook, we demonstrated how Triglav can be used to calculate feature stability scores. We showed that Triglav will produce a set of stable features. In this notebook, we will run a simple analysis of the gut microbiomes of patients suffering from Crohn's Disease and compare that to healthy controls. We will select a set of non-redundant (one feature per cluster) features using Triglav's first and second stage. Finally, we will demonstrate how Triglav can be used with other tools to analyze which features are important and how these features can explain a sample's location in a projected space. ASVs and taxonomic assignments were created using FASTQ files analyzed with the MetaWorks pipeline (available here: https://github.com/terrimporter/MetaWorks)" + ] + }, + { + "cell_type": "markdown", + "id": "ab0d0a4a", + "metadata": {}, + "source": [ + "#### Import required packages" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "adb6999f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:34: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:53: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:62: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:68: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:76: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:4: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @numba.jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:9: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @numba.jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:14: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @numba.jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:19: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @numba.jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:362: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit # we can't use this when using a custom link function...\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:384: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:427: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:438: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_tabular.py:185: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_tabular.py:196: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_image.py:174: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\explainers\\_partition.py:675: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "\u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + "\u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import StratifiedGroupKFold, GridSearchCV\n", + "from sklearn.ensemble import ExtraTreesClassifier\n", + "from sklearn.metrics import balanced_accuracy_score\n", + "from sklearn.svm import LinearSVC\n", + "\n", + "from TreeOrdination import TreeOrdination\n", + "\n", + "from triglav import Triglav, ETCProx\n", + "\n", + "import shap as sh\n", + "\n", + "import sage as sg\n", + "\n", + "import numpy as np\n", + "\n", + "import pandas as pd\n", + "\n", + "from random import shuffle\n", + "\n", + "import seaborn as sns\n", + "\n", + "from matplotlib import pyplot as plt\n", + "\n", + "from skbio.stats.composition import clr, multiplicative_replacement, closure\n", + "\n", + "from statsmodels.stats.multitest import multipletests" + ] + }, + { + "cell_type": "markdown", + "id": "f8e7d2fd", + "metadata": {}, + "source": [ + "#### Read in taxonomic data and select high-confidence ASVs" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4b57a4dd", + "metadata": {}, + "outputs": [], + "source": [ + "if __name__ == \"__main__\":\n", + "\n", + " #Read in ASV table\n", + " X = pd.read_csv(\"Diseased Gut/ESV.table\", index_col=0, sep=\"\\t\")\n", + " X_features = X.index.values #Get features\n", + " X_index = [s_name.split(\"_\")[0] for s_name in X.columns.values] #Get the right index\n", + " X_original = X.transpose()\n", + " X_original.index = X_index #Fix the index so it can be ordered\n", + " \n", + " # Read in taxa data\n", + " taxa_tab = pd.read_csv(\n", + " \"Diseased Gut/rdp.out.tmp\", delimiter=\"\\t\", header=None\n", + " ).values\n", + "\n", + " #Convert taxa tab into a dictionary for quick searching\n", + " taxa_dict = {t[0]: np.asarray(t)[1:] for t in taxa_tab}\n", + " \n", + " # Keep all ASVs assigned to Bacteria and Archaea, remove Cyanobacteria and Chloroplasts\n", + " idx = np.where(\n", + " ((taxa_tab[:, 2] == \"Bacteria\") | (taxa_tab[:, 2] == \"Archaea\")), True, False\n", + " )\n", + " taxa_tab = taxa_tab[idx]\n", + " idx = np.where(taxa_tab[:, 5] != \"Cyanobacteria/Chloroplast\", True, False)\n", + " taxa_tab = taxa_tab[idx]\n", + " X_selected = set([x[0] for x in taxa_tab])\n", + " taxa_tab_ss = {x[0]: x for x in taxa_tab}\n", + "\n", + " # Get names of high confidence features\n", + " n_list = [4, 7, 10, 13, 16, 19]\n", + " asv_name = []\n", + "\n", + " for entry in X_features:\n", + " if entry in taxa_dict:\n", + " if float(taxa_dict[entry][-1]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-3], entry))\n", + "\n", + " elif float(taxa_dict[entry][-4]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-6], entry))\n", + "\n", + " elif float(taxa_dict[entry][-7]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-9], entry))\n", + "\n", + " elif float(taxa_dict[entry][-10]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-12], entry))\n", + "\n", + " elif float(taxa_dict[entry][-13]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-15], entry))\n", + "\n", + " else:\n", + " asv_name.append(\"Unclassified-%s\" % entry)\n", + " \n", + " asv_name = np.asarray(asv_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6cef0596", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(3318,)\n", + "(3318,)\n", + "(214, 3318)\n", + "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", + "SRR8534033 926 1 0 0 0 0 0 \\\n", + "SRR8534034 38586 14 1 0 0 0 0 \n", + "SRR8534035 49718 1069 1 0 2 0 0 \n", + "SRR8534036 1016 236 0 0 0 0 0 \n", + "SRR8534037 4247 3416 0 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534250 5231 2880 0 0 1 0 0 \n", + "SRR8534251 636 145 0 0 0 0 0 \n", + "SRR8534252 3026 347 332 0 0 0 0 \n", + "SRR8534253 111 163 0 0 0 0 0 \n", + "SRR8534254 12386 2485 0 0 0 0 0 \n", + "\n", + "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", + "SRR8534033 0 0 0 ... 0 0 0 \\\n", + "SRR8534034 0 0 0 ... 0 0 0 \n", + "SRR8534035 0 0 0 ... 0 0 0 \n", + "SRR8534036 0 0 0 ... 0 0 0 \n", + "SRR8534037 0 0 0 ... 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534250 0 0 0 ... 0 0 0 \n", + "SRR8534251 0 0 0 ... 0 0 0 \n", + "SRR8534252 0 0 0 ... 0 0 69 \n", + "SRR8534253 0 0 0 ... 0 0 0 \n", + "SRR8534254 0 0 0 ... 0 0 0 \n", + "\n", + "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", + "SRR8534033 0 0 0 0 0 0 0 \n", + "SRR8534034 0 0 0 0 4 0 0 \n", + "SRR8534035 0 0 0 0 0 0 0 \n", + "SRR8534036 0 0 0 0 0 0 0 \n", + "SRR8534037 0 0 0 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534250 0 0 0 0 0 0 0 \n", + "SRR8534251 0 0 0 0 0 1 0 \n", + "SRR8534252 0 0 0 0 0 0 0 \n", + "SRR8534253 0 0 0 0 0 0 0 \n", + "SRR8534254 0 0 0 0 0 0 0 \n", + "\n", + "[214 rows x 3318 columns]\n", + "['Blautia-Zotu1' 'Anaerostipes-Zotu10' 'Blautia-Zotu100' ...\n", + " 'Lachnospiraceae-Zotu997' 'Clostridiales-Zotu998' 'Clostridia-Zotu999']\n" + ] + } + ], + "source": [ + " print(asv_name.shape)\n", + " print(X_features.shape)\n", + " print(X_original.shape)\n", + " print(X_original)\n", + " print(asv_name)" + ] + }, + { + "cell_type": "markdown", + "id": "6facf0ed", + "metadata": {}, + "source": [ + "#### Read in metadata and order X" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "898fd152", + "metadata": {}, + "outputs": [], + "source": [ + " # Read in metadata\n", + " meta = pd.read_csv(\"Diseased Gut/metadata.csv\", index_col=0)\n", + " meta = meta[[\"Sample Name\", \"Host_disease\", \"Timepoint\"]]\n", + "\n", + " # Correct locations so they are more informative\n", + " meta[\"Host_disease\"] = np.where(\n", + " meta[\"Host_disease\"] == \"CD\", \"Crohn's Disease\", meta[\"Host_disease\"]\n", + " )\n", + " meta[\"Host_disease\"] = np.where(\n", + " meta[\"Host_disease\"] == \"RA\", \"Rheumatoid Arthritis\", meta[\"Host_disease\"]\n", + " )\n", + " meta[\"Host_diseaes\"] = np.where(\n", + " meta[\"Host_disease\"] == \"MS\", \"Multiple Sclerosis\", meta[\"Host_disease\"]\n", + " )\n", + " meta[\"Host_disease\"] = np.where(\n", + " meta[\"Host_disease\"] == \"US\", \"Ulcerative Colitis\", meta[\"Host_disease\"]\n", + " )\n", + " meta[\"Host_disease\"] = np.where(\n", + " meta[\"Host_disease\"] == \"HC\", \"Healthy Control\", meta[\"Host_disease\"]\n", + " )\n", + " \n", + " #Order samples according to the metadata\n", + " X_original = X_original.loc[meta.index]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "11c5c2c9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Sample Name Host_disease Timepoint Host_diseaes\n", + "SRR8534151 1003.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", + "SRR8534152 1003.2 Rheumatoid Arthritis 2 Rheumatoid Arthritis\n", + "SRR8534149 1021.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", + "SRR8534083 1021.2 Rheumatoid Arthritis 2 Rheumatoid Arthritis\n", + "SRR8534155 1024.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", + "... ... ... ... ...\n", + "SRR8534199 8399.2 UC 2 UC\n", + "SRR8534200 8407.1 Crohn's Disease 1 Crohn's Disease\n", + "SRR8534125 8407.2 Crohn's Disease 2 Crohn's Disease\n", + "SRR8534128 8702.1 UC 1 UC\n", + "SRR8534126 8702.2 UC 2 UC\n", + "\n", + "[198 rows x 4 columns]\n", + "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", + "SRR8534151 776 23 0 0 0 0 0 \\\n", + "SRR8534152 30315 1134 2 0 0 0 0 \n", + "SRR8534149 443 23 54 0 0 0 0 \n", + "SRR8534083 6206 2328 226 0 1 0 2 \n", + "SRR8534155 33147 271 0 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534199 17255 5 0 0 0 0 0 \n", + "SRR8534200 295 82 0 0 0 0 0 \n", + "SRR8534125 6785 823 5 0 0 0 0 \n", + "SRR8534128 5802 451 3 0 0 0 0 \n", + "SRR8534126 717 512 0 0 0 0 0 \n", + "\n", + "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", + "SRR8534151 0 0 0 ... 0 0 0 \\\n", + "SRR8534152 0 0 0 ... 0 0 0 \n", + "SRR8534149 0 0 0 ... 0 0 0 \n", + "SRR8534083 0 0 0 ... 0 0 0 \n", + "SRR8534155 0 0 0 ... 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534199 0 0 0 ... 0 0 0 \n", + "SRR8534200 0 0 0 ... 0 0 0 \n", + "SRR8534125 1 0 0 ... 0 0 0 \n", + "SRR8534128 1 0 0 ... 0 0 0 \n", + "SRR8534126 2 0 0 ... 0 0 0 \n", + "\n", + "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", + "SRR8534151 0 0 0 0 0 0 0 \n", + "SRR8534152 0 0 1 10 0 0 1 \n", + "SRR8534149 0 0 0 0 0 0 0 \n", + "SRR8534083 0 0 0 0 0 1 4 \n", + "SRR8534155 0 0 3 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534199 0 0 0 0 0 0 0 \n", + "SRR8534200 0 0 0 0 0 0 0 \n", + "SRR8534125 0 0 0 0 0 1 0 \n", + "SRR8534128 0 0 0 0 0 0 0 \n", + "SRR8534126 0 0 0 0 0 0 0 \n", + "\n", + "[198 rows x 3318 columns]\n" + ] + } + ], + "source": [ + " print(meta)\n", + " print(X_original)" + ] + }, + { + "cell_type": "markdown", + "id": "e4ed25e3", + "metadata": {}, + "source": [ + "#### Get the group metadata (Sample Name)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e8fa6086", + "metadata": {}, + "outputs": [], + "source": [ + " # Get groups\n", + " groups = meta[\"Sample Name\"].astype(str).values\n", + " groups = np.asarray([x.split(\".\")[0] for x in groups])\n", + " \n", + " # List of phenotypes/datasets to test\n", + " pheno = \"Crohn's Disease-Healthy Control\"\n", + "\n", + " pheno_a, pheno_b = pheno.split(\"-\")\n", + "\n", + " idx = np.where(\n", + " ((meta[\"Host_disease\"] == pheno_a) | (meta[\"Host_disease\"] == pheno_b)),\n", + " True,\n", + " False,\n", + " )\n", + "\n", + " y = meta[idx][\"Host_disease\"]\n", + " y = y.values\n", + " \n", + " X_signal = X_original[idx]\n", + " \n", + " groups = groups[idx]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "83ee9304", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " \"Crohn's Disease\" \"Crohn's Disease\" 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"]\n", + "['2001' '2001' '2006' '2006' '2008' '2008' '2011' '2011' '2012' '2012'\n", + " '2013' '2013' '2014' '2014' '2015' '2015' '2018' '2018' '2019' '2019'\n", + " '2020' '2020' '2021' '2021' '2022' '2022' '2023' '2023' '2026' '2026'\n", + " '2030' '2030' '2031' '2031' '2037' '2037' '2043' '2043' '2046' '2046'\n", + " '2048' '2048' '2049' '2049' '2057' '2057' '2061' '2061' '2062' '2062'\n", + " '2063' '2063' '2064' '2064' '2084' '2084' '2093' '2093' '2101' '2101'\n", + " '2196' '2196' '2201' '2201' '8101' '8101' '8102' '8102' '8114' '8114'\n", + " '8124' '8124' '8160' '8160' '8170' '8170' '8182' '8182' '8407' '8407']\n", + "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", + "SRR8534047 253 277 0 0 0 0 0 \\\n", + "SRR8534050 4319 2289 0 0 0 1 1 \n", + "SRR8534049 673 216 8 0 0 0 1 \n", + "SRR8534045 6891 1434 56 0 3 0 0 \n", + "SRR8534044 10664 3777 305 0 0 1 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534236 8629 397 1 0 0 0 0 \n", + "SRR8534229 591 81 0 0 0 0 0 \n", + "SRR8534230 361 40 0 0 0 0 0 \n", + "SRR8534200 295 82 0 0 0 0 0 \n", + "SRR8534125 6785 823 5 0 0 0 0 \n", + "\n", + "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", + "SRR8534047 0 0 0 ... 0 0 0 \\\n", + "SRR8534050 0 0 0 ... 0 0 0 \n", + "SRR8534049 0 0 0 ... 0 0 0 \n", + "SRR8534045 0 0 0 ... 0 0 0 \n", + "SRR8534044 0 0 0 ... 0 0 3 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534236 0 0 0 ... 0 0 0 \n", + "SRR8534229 0 0 0 ... 0 0 0 \n", + "SRR8534230 0 0 0 ... 0 0 0 \n", + "SRR8534200 0 0 0 ... 0 0 0 \n", + "SRR8534125 1 0 0 ... 0 0 0 \n", + "\n", + "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", + "SRR8534047 0 0 0 0 0 0 0 \n", + "SRR8534050 0 0 0 0 0 0 0 \n", + "SRR8534049 0 0 0 0 0 0 0 \n", + "SRR8534045 0 0 0 0 0 0 0 \n", + "SRR8534044 0 0 0 0 1 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534236 0 0 2 15 0 0 0 \n", + "SRR8534229 0 0 0 0 0 0 0 \n", + "SRR8534230 0 0 0 0 0 0 0 \n", + "SRR8534200 0 0 0 0 0 0 0 \n", + "SRR8534125 0 0 0 0 0 1 0 \n", + "\n", + "[80 rows x 3318 columns]\n" + ] + } + ], + "source": [ + " print(y)\n", + " print(groups)\n", + " print(X_signal)" + ] + }, + { + "cell_type": "markdown", + "id": "35a197a9", + "metadata": {}, + "source": [ + "#### We want to identify a good depth for trees. This is because identifying the most predictive features is likely to occur at shallow depths. A max depth of 5 seems OK" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "3f589ae7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All Features: 3318\n", + "Reduced Features: 938\n", + "{'max_depth': 8} 0.8128205128205128\n", + "{'max_depth': 5} 0.8397435897435898\n", + "{'max_depth': None} 0.826923076923077\n", + "{'max_depth': 6} 0.8897435897435898\n", + "{'max_depth': 6} 0.8602564102564104\n" + ] + } + ], + "source": [ + " # Remove very rare ASVs (<= 4 occurances)\n", + " X_removed = np.where(X_signal.values > 0, True, False)\n", + " occ = np.where(X_removed.sum(axis = 0) > 4, True, False)\n", + " X_removed = X_signal.values[:, occ]\n", + " reduced_features = asv_name[occ]\n", + " \n", + " print(\"All Features: \", X_signal.shape[1])\n", + " print(\"Reduced Features: \", X_removed.shape[1])\n", + " \n", + " # Split samples based on disease status and patient number\n", + " splitter = StratifiedGroupKFold(n_splits = 5, random_state = 0, shuffle = True) \n", + " for train, test in splitter.split(X_signal.values, y, groups):\n", + " \n", + " X_train = X_signal.values[train]\n", + " y_train = y[train]\n", + " \n", + " X_test = X_signal.values[test]\n", + " y_test = y[test]\n", + " \n", + " # Determine the best tree-depth. \n", + " # We want a shallow depth to avoid poorly discrimative features\n", + " clf = GridSearchCV(estimator = ExtraTreesClassifier(512),\n", + " param_grid = {\"max_depth\": [None, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},\n", + " n_jobs = 5).fit(clr(multiplicative_replacement(closure(X_train))), y_train)\n", + " \n", + " print(clf.best_params_, clf.best_score_)\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "id": "165808b9", + "metadata": {}, + "source": [ + "#### Define simple transformer function to create CLR transformed data." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "1660973c", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.base import BaseEstimator, TransformerMixin\n", + "\n", + "class CLRTransformer(BaseEstimator, TransformerMixin):\n", + " def __init__(self):\n", + " pass\n", + " \n", + " def fit_transform(self, X):\n", + " \n", + " return clr(multiplicative_replacement(closure(X)))" + ] + }, + { + "cell_type": "markdown", + "id": "99d85cdd", + "metadata": {}, + "source": [ + "#### Prepare the nature-based solutions to be tested" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "id": "249f2adf", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + " from mealpy.swarm_based import PSO, ABC\n", + " from mealpy.swarm_based.NMRA import ImprovedNMRA\n", + " from mealpy.swarm_based.GWO import GWO_WOA\n", + " from mealpy.utils.logger import Logger\n", + " from mealpy.utils.problem import Problem\n", + " \n", + " from sklearn.svm import LinearSVC\n", + " from sklearn.linear_model import LogisticRegressionCV\n", + " from sklearn.model_selection import GridSearchCV, cross_val_score, cross_val_predict, cross_validate\n", + " from sklearn.metrics import make_scorer, pairwise_distances\n", + " from sklearn.ensemble import StackingClassifier\n", + " \n", + " from skrebate import MultiSURF\n", + " \n", + " from skbio.stats.distance._cutils import permanova_f_stat_sW_cy\n", + " from skbio.stats.distance._base import _preprocess_input_sng\n", + " from skbio.stats.ordination import pcoa\n", + " from skbio import DistanceMatrix\n", + " \n", + " import warnings\n", + " from sklearn.exceptions import ConvergenceWarning\n", + " warnings.filterwarnings('ignore', category=ConvergenceWarning)\n", + " \n", + " def f_stat(X, y):\n", + " \n", + " D = DistanceMatrix(pairwise_distances(X, metric = \"euclidean\").astype(np.float32))\n", + " \n", + " SST = D[:] ** 2\n", + " SST = SST.sum() / X.shape[0]\n", + " SST = SST / 2.0\n", + " \n", + " n_groups, grouping = _preprocess_input_sng(D.ids, X.shape[0], y, None)\n", + " \n", + " grouping = np.asarray(grouping)\n", + " \n", + " group_sizes = np.bincount(grouping)\n", + " \n", + " SSW = permanova_f_stat_sW_cy(DistanceMatrix(D).data,\n", + " group_sizes, \n", + " grouping)\n", + " \n", + " SSA = SST - SSW\n", + " \n", + " return (SSW / (X.shape[0] - n_groups)) / (SSA / (n_groups - 1)) # To turn this into a minimization problem\n", + " \n", + " \n", + " class FSProblem(Problem):\n", + "\n", + " SUPPORTED_ARRAY = (list, tuple, np.ndarray)\n", + "\n", + " def __init__(self, lb=None, ub=None, minmax=\"min\", X=None, y=None, **kwargs):\n", + " r\"\"\"Initialize Problem.\n", + "\n", + " Args:\n", + " lb (numpy.ndarray, list, tuple): Lower bounds of the problem.\n", + " ub (numpy.ndarray, list, tuple): Upper bounds of the problem.\n", + " minmax (str): Minimization or maximization problem (min, max)\n", + " name (str): Name for this particular problem\n", + " \"\"\"\n", + " self.name, self.log_to, self.log_file = \"P\", \"console\", \"history.txt\"\n", + " self.n_objs, self.obj_is_list, self.multi_objs = 1, False, False\n", + " self.n_dims, self.lb, self.ub, self.save_population = None, None, None, False\n", + " self.X, self.y = X, y\n", + " self.obj_weights = [0.98, 0.02]\n", + "\n", + " self.__set_keyword_arguments(kwargs)\n", + " self.__set_domain_range(lb, ub)\n", + " self.__set_functions(kwargs)\n", + " self.logger = Logger(self.log_to, log_file=self.log_file).create_logger(name=f\"{__name__}.{__class__.__name__}\",\n", + " format_str='%(asctime)s, %(levelname)s, %(name)s [line: %(lineno)d]: %(message)s')\n", + " self.minmax = minmax\n", + "\n", + " def __set_keyword_arguments(self, kwargs):\n", + " for key, value in kwargs.items():\n", + " setattr(self, key, value)\n", + "\n", + " def __set_domain_range(self, lb, ub):\n", + " if type(lb) in self.SUPPORTED_ARRAY and type(ub) in self.SUPPORTED_ARRAY:\n", + " self.lb = np.array(lb).flatten()\n", + " self.ub = np.array(ub).flatten()\n", + " if len(self.lb) == len(self.ub):\n", + " self.n_dims = len(self.lb)\n", + " if len(self.lb) < 1:\n", + " raise ValueError(f'Dimensions do not qualify. Length(lb) = {len(self.lb)} < 1.')\n", + " else:\n", + " raise ValueError(f\"Length of lb and ub do not match. {len(self.lb)} != {len(self.ub)}.\")\n", + " else:\n", + " raise ValueError(f\"lb and ub need to be a list, tuple or np.array.\")\n", + "\n", + " def __set_functions(self, kwargs):\n", + " tested_solution = self.generate_position(self.lb, self.ub)\n", + " if \"amend_position\" in kwargs:\n", + " if not callable(self.amend_position):\n", + " raise ValueError(f\"Use default 'amend_position()' or passed a callable function. {type(self.amend_position)} != function\")\n", + " else:\n", + " tested_solution = self.amend_position(tested_solution, self.lb, self.ub)\n", + " result = self.fit_func(tested_solution)\n", + " if type(result) in self.SUPPORTED_ARRAY:\n", + " result = np.array(result).flatten()\n", + " self.n_objs = len(result)\n", + " self.obj_is_list = True\n", + " if self.n_objs > 1:\n", + " self.multi_objs = True\n", + " if type(self.obj_weights) in self.SUPPORTED_ARRAY:\n", + " self.obj_weights = np.array(self.obj_weights).flatten()\n", + " if self.n_objs != len(self.obj_weights):\n", + " raise ValueError(f\"{self.n_objs}-objective problem, but N weights = {len(self.obj_weights)}.\")\n", + " self.msg = f\"Solving {self.n_objs}-objective optimization problem with weights: {self.obj_weights}.\"\n", + " else:\n", + " raise ValueError(f\"Solving {self.n_objs}-objective optimization, need to set obj_weights list with length: {self.n_objs}\")\n", + " elif self.n_objs == 1:\n", + " self.multi_objs = False\n", + " self.obj_weights = np.ones(1)\n", + " self.msg = f\"Solving single objective optimization problem.\"\n", + " else:\n", + " raise ValueError(f\"fit_func needs to return a single value or a list of values list\")\n", + " elif type(result) in (int, float) or isinstance(result, np.floating) or isinstance(result, np.integer):\n", + " self.multi_objs = False\n", + " self.obj_is_list = False\n", + " self.obj_weights = np.ones(1)\n", + " self.msg = f\"Solving single objective optimization problem.\"\n", + " else:\n", + " raise ValueError(f\"fit_func needs to return a single value or a list of values list\")\n", + "\n", + " def fit_func(self, x):\n", + " \"\"\"Fitness function\n", + "\n", + " Args:\n", + " x (numpy.ndarray): Solution.\n", + "\n", + " Returns:\n", + " float: Function value of `x`.\n", + " \"\"\"\n", + " selected = x > 0.4\n", + " \n", + " num_selected = selected.sum()\n", + " if num_selected == 0:\n", + " return 1.0 \n", + " \n", + " if num_selected > 100:\n", + " n_to_select = 100\n", + " \n", + " else:\n", + " n_to_select = int(num_selected * 0.8)\n", + " \n", + " # Select an initial group of features\n", + " x_train = self.X[:, selected].astype(float)\n", + " \n", + " # Split data and train\n", + " c1 = [\"et\", ExtraTreesClassifier(128, max_depth = 5)]\n", + " c2 = [\"lc\", LogisticRegressionCV(max_iter = 1000)]\n", + " \n", + " c3 = StackingClassifier([c1, c2])\n", + " \n", + " c4 = cross_val_score(c3, x_train, self.y, cv = 3, scoring = make_scorer(balanced_accuracy_score), n_jobs = 3)\n", + " \n", + " # Score \n", + " score = 1 - c4.mean()\n", + "\n", + " num_features = self.X.shape[1] \n", + " f_frac = num_selected / num_features\n", + " \n", + " o_1 = (0.99*score) + ((0.01)*f_frac)\n", + " o_2 = (0.99*f_stat(x_train, self.y)) + ((0.01)*f_frac)\n", + " \n", + " return o_1, o_2\n", + "\n", + " def get_name(self):\n", + " \"\"\"\n", + " Returns:\n", + " string: The name of the problem\n", + " \"\"\"\n", + " return self.name\n", + "\n", + " def get_class_name(self):\n", + " \"\"\"Get class name.\"\"\"\n", + " return self.__class__.__name__\n", + "\n", + " def generate_position(self, lb=None, ub=None):\n", + " \"\"\"\n", + " Generate the position depends on the problem. For discrete problem such as permutation, this method can be override.\n", + "\n", + " Args:\n", + " lb: list of lower bound values\n", + " ub: list of upper bound values\n", + "\n", + " Returns:\n", + " np.array: the position (the solution for the problem)\n", + " \"\"\"\n", + " return np.random.uniform(lb, ub)\n", + "\n", + " def amend_position(self, position=None, lb=None, ub=None):\n", + " \"\"\"\n", + " The goal is to transform the solution into the right format corresponding to the problem.\n", + " For example, with discrete problems, floating-point numbers must be converted to integers\n", + " to ensure the solution is in the correct format.\n", + "\n", + " Args:\n", + " position: vector position (location) of the solution.\n", + " lb: list of lower bound values\n", + " ub: list of upper bound values\n", + "\n", + " Returns:\n", + " Amended position (make the right format of the solution)\n", + " \"\"\"\n", + " return position\n", + " \n", + " \n", + " \n", + " from sklearn.utils import resample\n", + " from sklearn.neighbors import KNeighborsClassifier\n", + " from sklearn.metrics import log_loss\n", + " class DSFSProblem(Problem):\n", + "\n", + " SUPPORTED_ARRAY = (list, tuple, np.ndarray)\n", + "\n", + " def __init__(self, lb=None, ub=None, minmax=\"min\", X=None, y=None, **kwargs):\n", + " r\"\"\"Initialize Problem.\n", + "\n", + " Args:\n", + " lb (numpy.ndarray, list, tuple): Lower bounds of the problem.\n", + " ub (numpy.ndarray, list, tuple): Upper bounds of the problem.\n", + " minmax (str): Minimization or maximization problem (min, max)\n", + " name (str): Name for this particular problem\n", + " \"\"\"\n", + " self.name, self.log_to, self.log_file = \"P\", \"console\", \"history.txt\"\n", + " self.n_objs, self.obj_is_list, self.multi_objs = 1, False, False\n", + " self.n_dims, self.lb, self.ub, self.save_population = None, None, None, False\n", + " self.X, self.y = X, y\n", + " self.obj_weights = [0.6, 0.4]\n", + "\n", + " self.__set_keyword_arguments(kwargs)\n", + " self.__set_domain_range(lb, ub)\n", + " self.__set_functions(kwargs)\n", + " self.logger = Logger(self.log_to, log_file=self.log_file).create_logger(name=f\"{__name__}.{__class__.__name__}\",\n", + " format_str='%(asctime)s, %(levelname)s, %(name)s [line: %(lineno)d]: %(message)s')\n", + " self.minmax = minmax\n", + "\n", + " def __set_keyword_arguments(self, kwargs):\n", + " for key, value in kwargs.items():\n", + " setattr(self, key, value)\n", + "\n", + " def __set_domain_range(self, lb, ub):\n", + " if type(lb) in self.SUPPORTED_ARRAY and type(ub) in self.SUPPORTED_ARRAY:\n", + " self.lb = np.array(lb).flatten()\n", + " self.ub = np.array(ub).flatten()\n", + " if len(self.lb) == len(self.ub):\n", + " self.n_dims = len(self.lb)\n", + " if len(self.lb) < 1:\n", + " raise ValueError(f'Dimensions do not qualify. Length(lb) = {len(self.lb)} < 1.')\n", + " else:\n", + " raise ValueError(f\"Length of lb and ub do not match. {len(self.lb)} != {len(self.ub)}.\")\n", + " else:\n", + " raise ValueError(f\"lb and ub need to be a list, tuple or np.array.\")\n", + "\n", + " def __set_functions(self, kwargs):\n", + " tested_solution = self.generate_position(self.lb, self.ub)\n", + " if \"amend_position\" in kwargs:\n", + " if not callable(self.amend_position):\n", + " raise ValueError(f\"Use default 'amend_position()' or passed a callable function. {type(self.amend_position)} != function\")\n", + " else:\n", + " tested_solution = self.amend_position(tested_solution, self.lb, self.ub)\n", + " result = self.fit_func(tested_solution)\n", + " if type(result) in self.SUPPORTED_ARRAY:\n", + " result = np.array(result).flatten()\n", + " self.n_objs = len(result)\n", + " self.obj_is_list = True\n", + " if self.n_objs > 1:\n", + " self.multi_objs = True\n", + " if type(self.obj_weights) in self.SUPPORTED_ARRAY:\n", + " self.obj_weights = np.array(self.obj_weights).flatten()\n", + " if self.n_objs != len(self.obj_weights):\n", + " raise ValueError(f\"{self.n_objs}-objective problem, but N weights = {len(self.obj_weights)}.\")\n", + " self.msg = f\"Solving {self.n_objs}-objective optimization problem with weights: {self.obj_weights}.\"\n", + " else:\n", + " raise ValueError(f\"Solving {self.n_objs}-objective optimization, need to set obj_weights list with length: {self.n_objs}\")\n", + " elif self.n_objs == 1:\n", + " self.multi_objs = False\n", + " self.obj_weights = np.ones(1)\n", + " self.msg = f\"Solving single objective optimization problem.\"\n", + " else:\n", + " raise ValueError(f\"fit_func needs to return a single value or a list of values list\")\n", + " elif type(result) in (int, float) or isinstance(result, np.floating) or isinstance(result, np.integer):\n", + " self.multi_objs = False\n", + " self.obj_is_list = False\n", + " self.obj_weights = np.ones(1)\n", + " self.msg = f\"Solving single objective optimization problem.\"\n", + " else:\n", + " raise ValueError(f\"fit_func needs to return a single value or a list of values list\")\n", + "\n", + " def fit_func(self, x):\n", + " \"\"\"Fitness function\n", + "\n", + " Args:\n", + " x (numpy.ndarray): Solution.\n", + "\n", + " Returns:\n", + " float: Function value of `x`.\n", + " \"\"\"\n", + " selected = x > 0\n", + " \n", + " num_selected = selected.sum()\n", + " if num_selected == 0:\n", + " return 1.0 \n", + " \n", + " # Subset\n", + " x_train = self.X[:, selected].astype(float)\n", + " \n", + " # Train\n", + " c1 = cross_validate(ExtraTreesClassifier(128, max_depth = 3), \n", + " x_train, self.y, \n", + " cv = 3, \n", + " scoring = \"balanced_accuracy\",\n", + " return_estimator = True,\n", + " return_indices = True,\n", + " n_jobs = 5)\n", + " \n", + " test_ind = [inds for inds in c1[\"indices\"][\"test\"]]\n", + " log_losses_1 = [log_loss(self.y[test_ind[i]], c1[\"estimator\"][i].predict_proba(x_train[test_ind[i]])) for i in range(3)]\n", + " log_losses_1 = np.asarray(log_losses_1).mean()\n", + " \n", + " # Score\n", + " s_1 = 1 - c1[\"test_score\"].mean()\n", + " s_2 = np.asarray(log_losses_1).mean()\n", + " s_3 = f_stat(x_train, self.y)\n", + " score = 1.0 - s_1\n", + "\n", + " num_features = self.X.shape[1] \n", + " f_frac = num_selected / num_features\n", + "\n", + " o_1 = (0.85 * s_1) + (0.10 * s_2) + (0.05 * s_3)\n", + " o_4 = f_frac\n", + " \n", + " return o_1, o_4\n", + "\n", + " def get_name(self):\n", + " \"\"\"\n", + " Returns:\n", + " string: The name of the problem\n", + " \"\"\"\n", + " return self.name\n", + "\n", + " def get_class_name(self):\n", + " \"\"\"Get class name.\"\"\"\n", + " return self.__class__.__name__\n", + "\n", + " def generate_position(self, lb=None, ub=None):\n", + " \"\"\"\n", + " Generate the position depends on the problem. For discrete problem such as permutation, this method can be override.\n", + "\n", + " Args:\n", + " lb: list of lower bound values\n", + " ub: list of upper bound values\n", + "\n", + " Returns:\n", + " np.array: the position (the solution for the problem)\n", + " \"\"\"\n", + " pos = np.random.uniform(lb, ub)\n", + " pos = np.where(pos > 0.4, 1, 0)\n", + " \n", + " return pos\n", + "\n", + " def amend_position(self, position=None, lb=None, ub=None):\n", + " \"\"\"\n", + " The goal is to transform the solution into the right format corresponding to the problem.\n", + " For example, with discrete problems, floating-point numbers must be converted to integers\n", + " to ensure the solution is in the correct format.\n", + "\n", + " Args:\n", + " position: vector position (location) of the solution.\n", + " lb: list of lower bound values\n", + " ub: list of upper bound values\n", + "\n", + " Returns:\n", + " Amended position (make the right format of the solution)\n", + " \"\"\"\n", + " position_clipped = np.where(position > 0.4, 1, 0)\n", + " \n", + " return position_clipped\n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "26ccc1ed", + "metadata": {}, + "source": [ + "#### Test to see if there are differences between algorithms" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "id": "83de1e2a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 210\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 210\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 210\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 210\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 210\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 210\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 210\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 210\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 210\n", + "Round 26 / Tentative (Accepted): 125 / Tentative (Not Accepted): 116 / Rejected: 210\n", + "Round 27 / Tentative (Accepted): 125 / Tentative (Not Accepted): 113 / Rejected: 213\n", + "Round 28 / Tentative (Accepted): 125 / Tentative (Not Accepted): 113 / Rejected: 213\n", + "Round 29 / Tentative (Accepted): 125 / Tentative (Not Accepted): 113 / Rejected: 213\n", + "Round 30 / Tentative (Accepted): 125 / Tentative (Not Accepted): 107 / Rejected: 219\n", + "Round 31 / Tentative (Accepted): 125 / Tentative (Not Accepted): 107 / Rejected: 219\n", + "Round 32 / Tentative (Accepted): 125 / Tentative (Not Accepted): 107 / Rejected: 219\n", + "Round 33 / Tentative (Accepted): 125 / Tentative (Not Accepted): 107 / Rejected: 219\n", + "Round 34 / Tentative (Accepted): 125 / Tentative (Not Accepted): 107 / Rejected: 219\n", + "Round 35 / Tentative (Accepted): 125 / Tentative (Not Accepted): 107 / Rejected: 219\n", + "Round 36 / Tentative (Accepted): 132 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 37 / Tentative (Accepted): 132 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 38 / Tentative (Accepted): 132 / Tentative (Not Accepted): 98 / Rejected: 221\n", + "Round 39 / Tentative (Accepted): 132 / Tentative (Not Accepted): 98 / Rejected: 221\n", + "Round 40 / Tentative (Accepted): 132 / Tentative (Not Accepted): 98 / Rejected: 221\n", + "Final Feature Set Contains 272 Features.\n", + "Control (Positive) 0.8333333333333333 0.6833333333333333 938\n", + "Control (Negative) 0.5166666666666666 0.3666666666666667 938\n", + "ANOVA Base 0.8333333333333333 0.7333333333333334 335\n", + "Mutual Information (10) Base 0.7333333333333334 0.6666666666666667 10\n", + "RFE (10) Base 0.8333333333333333 0.7833333333333333 10\n", + "MultiSURF (10) 0.8333333333333333 0.7833333333333333 10\n", + "Mutual Information (20) Base 0.7833333333333333 0.7833333333333333 20\n", + "RFE (20) Base 0.7833333333333333 0.7833333333333333 20\n", + "MultiSURF (20) 0.8333333333333333 0.7833333333333333 20\n", + "Mutual Information (40) Base 0.7833333333333333 0.7333333333333334 40\n", + "RFE (40) Base 0.8333333333333333 0.7333333333333334 40\n", + "MultiSURF (40) 0.8333333333333333 0.7833333333333333 40\n", + "Mutual Information (60) Base 0.7833333333333333 0.7333333333333334 60\n", + "RFE (60) Base 0.7833333333333333 0.7333333333333334 60\n", + "MultiSURF (60) 0.8333333333333333 0.7833333333333333 60\n", + "Mutual Information (80) Base 0.8333333333333333 0.8166666666666667 80\n", + "RFE (80) Base 0.8333333333333333 0.7333333333333334 80\n", + "MultiSURF (80) 0.8333333333333333 0.7333333333333334 80\n", + "Mutual Information (100) Base 0.8333333333333333 0.6833333333333333 100\n", + "RFE (100) Base 0.8333333333333333 0.7333333333333334 100\n", + "MultiSURF (100) 0.8333333333333333 0.7333333333333334 100\n", + "RFECV Base 0.7833333333333333 0.7833333333333333 18\n", + "Boruta Base 0.8333333333333333 0.7333333333333334 47\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 05:30:38 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 05:31:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.30149853671227406, Global best: 0.30149853671227406, Runtime: 13.60535 seconds\n", + "2023/10/14 05:31:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.30149853671227406, Global best: 0.30149853671227406, Runtime: 13.58549 seconds\n", + "2023/10/14 05:31:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.30149853671227406, Global best: 0.30149853671227406, Runtime: 13.70401 seconds\n", + "2023/10/14 05:31:42 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3095490160850194, Global best: 0.30149853671227406, Runtime: 14.74204 seconds\n", + "2023/10/14 05:31:56 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3121417453332649, Global best: 0.30149853671227406, Runtime: 14.79884 seconds\n", + "2023/10/14 05:32:11 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3050710270532704, Global best: 0.30149853671227406, Runtime: 14.92612 seconds\n", + "2023/10/14 05:32:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3050710270532704, Global best: 0.30149853671227406, Runtime: 14.33377 seconds\n", + "2023/10/14 05:32:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3050710270532704, Global best: 0.30149853671227406, Runtime: 14.67352 seconds\n", + "2023/10/14 05:32:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3122149327768833, Global best: 0.30149853671227406, Runtime: 14.32716 seconds\n", + "2023/10/14 05:33:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.2898081257840265, Global best: 0.2898081257840265, Runtime: 14.69338 seconds\n", + "2023/10/14 05:33:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.2898081257840265, Global best: 0.2898081257840265, Runtime: 14.76067 seconds\n", + "2023/10/14 05:33:39 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.2898081257840265, Global best: 0.2898081257840265, Runtime: 15.26990 seconds\n", + "2023/10/14 05:33:54 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.301597015854995, Global best: 0.2898081257840265, Runtime: 14.66164 seconds\n", + "2023/10/14 05:34:08 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3033663783878927, Global best: 0.2898081257840265, Runtime: 14.30731 seconds\n", + "2023/10/14 05:34:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3033663783878927, Global best: 0.2898081257840265, Runtime: 13.83773 seconds\n", + "2023/10/14 05:34:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3033663783878927, Global best: 0.2898081257840265, Runtime: 14.76450 seconds\n", + "2023/10/14 05:34:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3033663783878927, Global best: 0.2898081257840265, Runtime: 14.49351 seconds\n", + "2023/10/14 05:35:07 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3061976249045578, Global best: 0.2898081257840265, Runtime: 15.92140 seconds\n", + "2023/10/14 05:35:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3061976249045578, Global best: 0.2898081257840265, Runtime: 14.10333 seconds\n", + "2023/10/14 05:35:36 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3061976249045578, Global best: 0.2898081257840265, Runtime: 14.37515 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.8333333333333333 0.7333333333333334 555\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 05:35:40 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 05:35:54 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3123322156701373, Global best: 0.3123322156701373, Runtime: 6.79214 seconds\n", + "2023/10/14 05:36:01 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3123322156701373, Global best: 0.3123322156701373, Runtime: 6.87658 seconds\n", + "2023/10/14 05:36:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.30977474850128234, Global best: 0.30977474850128234, Runtime: 6.83535 seconds\n", + "2023/10/14 05:36:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.30977474850128234, Global best: 0.30977474850128234, Runtime: 6.75322 seconds\n", + "2023/10/14 05:36:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3081045387540174, Global best: 0.3081045387540174, Runtime: 6.79372 seconds\n", + "2023/10/14 05:36:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.30391899640990694, Global best: 0.30391899640990694, Runtime: 6.75089 seconds\n", + "2023/10/14 05:36:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.2884581827614794, Global best: 0.2884581827614794, Runtime: 6.79616 seconds\n", + "2023/10/14 05:36:42 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.2884581827614794, Global best: 0.2884581827614794, Runtime: 6.75976 seconds\n", + "2023/10/14 05:36:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.2884581827614794, Global best: 0.2884581827614794, Runtime: 6.80640 seconds\n", + "2023/10/14 05:36:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2884581827614794, Global best: 0.2884581827614794, Runtime: 6.70102 seconds\n", + "2023/10/14 05:37:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.2884581827614794, Global best: 0.2884581827614794, Runtime: 6.77142 seconds\n", + "2023/10/14 05:37:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2884581827614794, Global best: 0.2884581827614794, Runtime: 7.28389 seconds\n", + "2023/10/14 05:37:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2884581827614794, Global best: 0.2884581827614794, Runtime: 6.80985 seconds\n", + "2023/10/14 05:37:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.28730391370671765, Global best: 0.28730391370671765, Runtime: 6.73145 seconds\n", + "2023/10/14 05:37:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.28730391370671765, Global best: 0.28730391370671765, Runtime: 6.80520 seconds\n", + "2023/10/14 05:37:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.28730391370671765, Global best: 0.28730391370671765, Runtime: 6.83538 seconds\n", + "2023/10/14 05:37:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.28730391370671765, Global best: 0.28730391370671765, Runtime: 6.80130 seconds\n", + "2023/10/14 05:37:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.28730391370671765, Global best: 0.28730391370671765, Runtime: 6.77730 seconds\n", + "2023/10/14 05:37:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.28730391370671765, Global best: 0.28730391370671765, Runtime: 6.77180 seconds\n", + "2023/10/14 05:38:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.28730391370671765, Global best: 0.28730391370671765, Runtime: 6.74871 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.8333333333333333 0.7333333333333334 531\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 05:38:09 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 05:38:23 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3033289397956471, Global best: 0.3033289397956471, Runtime: 6.75795 seconds\n", + "2023/10/14 05:38:29 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.71152 seconds\n", + "2023/10/14 05:38:36 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.86911 seconds\n", + "2023/10/14 05:38:43 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.84146 seconds\n", + "2023/10/14 05:38:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.85939 seconds\n", + "2023/10/14 05:38:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.83278 seconds\n", + "2023/10/14 05:39:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.84019 seconds\n", + "2023/10/14 05:39:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.84293 seconds\n", + "2023/10/14 05:39:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.90785 seconds\n", + "2023/10/14 05:39:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.77745 seconds\n", + "2023/10/14 05:39:31 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 7.01651 seconds\n", + "2023/10/14 05:39:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.66872 seconds\n", + "2023/10/14 05:39:45 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.72885 seconds\n", + "2023/10/14 05:39:51 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.65659 seconds\n", + "2023/10/14 05:39:58 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.66572 seconds\n", + "2023/10/14 05:40:05 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.64417 seconds\n", + "2023/10/14 05:40:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.78889 seconds\n", + "2023/10/14 05:40:18 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.70497 seconds\n", + "2023/10/14 05:40:25 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.96269 seconds\n", + "2023/10/14 05:40:32 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3029008469015114, Global best: 0.3029008469015114, Runtime: 6.79257 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.8333333333333333 0.7333333333333334 544\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 05:40:36 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 05:40:51 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2954582062235067, Global best: 0.2954582062235067, Runtime: 6.93702 seconds\n", + "2023/10/14 05:40:58 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.2954582062235067, Global best: 0.2954582062235067, Runtime: 6.84689 seconds\n", + "2023/10/14 05:41:05 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2867023424741188, Global best: 0.2867023424741188, Runtime: 6.88554 seconds\n", + "2023/10/14 05:41:12 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2867023424741188, Global best: 0.2867023424741188, Runtime: 6.90014 seconds\n", + "2023/10/14 05:41:18 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2837270390095987, Global best: 0.2837270390095987, Runtime: 6.87459 seconds\n", + "2023/10/14 05:41:25 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.2837270390095987, Global best: 0.2837270390095987, Runtime: 6.86563 seconds\n", + "2023/10/14 05:41:32 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2824935087172717, Global best: 0.2824935087172717, Runtime: 6.93075 seconds\n", + "2023/10/14 05:41:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2824935087172717, Global best: 0.2824935087172717, Runtime: 7.25156 seconds\n", + "2023/10/14 05:41:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2818235611124625, Global best: 0.2818235611124625, Runtime: 6.91761 seconds\n", + "2023/10/14 05:41:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2818235611124625, Global best: 0.2818235611124625, Runtime: 6.89451 seconds\n", + "2023/10/14 05:42:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2818235611124625, Global best: 0.2818235611124625, Runtime: 6.68386 seconds\n", + "2023/10/14 05:42:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2818235611124625, Global best: 0.2818235611124625, Runtime: 6.74812 seconds\n", + "2023/10/14 05:42:14 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2818235611124625, Global best: 0.2818235611124625, Runtime: 6.75444 seconds\n", + "2023/10/14 05:42:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2818235611124625, Global best: 0.2818235611124625, Runtime: 6.71160 seconds\n", + "2023/10/14 05:42:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2780905382614721, Global best: 0.2780905382614721, Runtime: 6.70734 seconds\n", + "2023/10/14 05:42:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2780905382614721, Global best: 0.2780905382614721, Runtime: 6.68688 seconds\n", + "2023/10/14 05:42:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2780905382614721, Global best: 0.2780905382614721, Runtime: 6.64116 seconds\n", + "2023/10/14 05:42:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2765542337715102, Global best: 0.2765542337715102, Runtime: 6.73353 seconds\n", + "2023/10/14 05:42:54 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2765542337715102, Global best: 0.2765542337715102, Runtime: 6.86777 seconds\n", + "2023/10/14 05:43:01 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2765542337715102, Global best: 0.2765542337715102, Runtime: 6.98498 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.8333333333333333 0.6833333333333333 523\n", + "Triglav Stage 1 Base 0.7833333333333333 0.7333333333333334 272\n", + "Triglav MultiSURF 10 0.7333333333333334 0.7833333333333333 10\n", + "Triglav MultiSURF 20 0.7833333333333333 0.7833333333333333 20\n", + "Triglav MultiSURF 40 0.8333333333333333 0.7833333333333333 40\n", + "Triglav MultiSURF 60 0.7833333333333333 0.7833333333333333 60\n", + "Triglav MultiSURF 80 0.7833333333333333 0.7833333333333333 80\n", + "Triglav MultiSURF 100 0.7833333333333333 0.7833333333333333 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 05:43:30 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 05:43:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.2908916610270654, Global best: 0.2908916610270654, Runtime: 13.28945 seconds\n", + "2023/10/14 05:44:03 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.2908916610270654, Global best: 0.2908916610270654, Runtime: 13.07839 seconds\n", + "2023/10/14 05:44:17 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.29168068525296154, Global best: 0.2908916610270654, Runtime: 13.59769 seconds\n", + "2023/10/14 05:44:30 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.29168068525296154, Global best: 0.2908916610270654, Runtime: 13.46617 seconds\n", + "2023/10/14 05:44:44 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.2870834286704797, Global best: 0.2870834286704797, Runtime: 14.09370 seconds\n", + "2023/10/14 05:44:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.2870834286704797, Global best: 0.2870834286704797, Runtime: 13.99365 seconds\n", + "2023/10/14 05:45:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.2870834286704797, Global best: 0.2870834286704797, Runtime: 13.34080 seconds\n", + "2023/10/14 05:45:25 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.2870834286704797, Global best: 0.2870834286704797, Runtime: 13.65522 seconds\n", + "2023/10/14 05:45:39 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.2870834286704797, Global best: 0.2870834286704797, Runtime: 13.98380 seconds\n", + "2023/10/14 05:45:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.30172583642172945, Global best: 0.2870834286704797, Runtime: 13.76290 seconds\n", + "2023/10/14 05:46:07 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.30172583642172945, Global best: 0.2870834286704797, Runtime: 13.84255 seconds\n", + "2023/10/14 05:46:21 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.30172583642172945, Global best: 0.2870834286704797, Runtime: 13.89934 seconds\n", + "2023/10/14 05:46:36 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3029905348440663, Global best: 0.2870834286704797, Runtime: 14.57389 seconds\n", + "2023/10/14 05:46:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.30799748155346834, Global best: 0.2870834286704797, Runtime: 14.42403 seconds\n", + "2023/10/14 05:47:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3055606604073605, Global best: 0.2870834286704797, Runtime: 13.82025 seconds\n", + "2023/10/14 05:47:17 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.30231766011049976, Global best: 0.2870834286704797, Runtime: 13.66643 seconds\n", + "2023/10/14 05:47:31 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.30231766011049976, Global best: 0.2870834286704797, Runtime: 13.41916 seconds\n", + "2023/10/14 05:47:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.2963798200565771, Global best: 0.2870834286704797, Runtime: 13.98912 seconds\n", + "2023/10/14 05:47:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.2963798200565771, Global best: 0.2870834286704797, Runtime: 13.33127 seconds\n", + "2023/10/14 05:48:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.2963798200565771, Global best: 0.2870834286704797, Runtime: 14.15745 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.8333333333333333 0.7333333333333334 142\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 05:48:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 05:48:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.2914091813255959, Global best: 0.2914091813255959, Runtime: 6.65873 seconds\n", + "2023/10/14 05:48:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.2914091813255959, Global best: 0.2914091813255959, Runtime: 6.67589 seconds\n", + "2023/10/14 05:48:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.2914091813255959, Global best: 0.2914091813255959, Runtime: 6.64737 seconds\n", + "2023/10/14 05:48:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.2914091813255959, Global best: 0.2914091813255959, Runtime: 6.49848 seconds\n", + "2023/10/14 05:48:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.2914091813255959, Global best: 0.2914091813255959, Runtime: 6.51812 seconds\n", + "2023/10/14 05:49:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.28771341818963625, Global best: 0.28771341818963625, Runtime: 6.46243 seconds\n", + "2023/10/14 05:49:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.28771341818963625, Global best: 0.28771341818963625, Runtime: 6.57050 seconds\n", + "2023/10/14 05:49:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.28771341818963625, Global best: 0.28771341818963625, Runtime: 6.54661 seconds\n", + "2023/10/14 05:49:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.2864696064862444, Global best: 0.2864696064862444, Runtime: 6.47132 seconds\n", + "2023/10/14 05:49:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2863646249263184, Global best: 0.2863646249263184, Runtime: 6.50078 seconds\n", + "2023/10/14 05:49:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.28590505873020233, Global best: 0.28590505873020233, Runtime: 6.49010 seconds\n", + "2023/10/14 05:49:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.27543944769085627, Global best: 0.27543944769085627, Runtime: 6.53281 seconds\n", + "2023/10/14 05:49:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.27543944769085627, Global best: 0.27543944769085627, Runtime: 6.50097 seconds\n", + "2023/10/14 05:49:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.27543944769085627, Global best: 0.27543944769085627, Runtime: 6.87745 seconds\n", + "2023/10/14 05:50:03 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.27543944769085627, Global best: 0.27543944769085627, Runtime: 6.69846 seconds\n", + "2023/10/14 05:50:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2753155033162587, Global best: 0.2753155033162587, Runtime: 6.56332 seconds\n", + "2023/10/14 05:50:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2753155033162587, Global best: 0.2753155033162587, Runtime: 6.61333 seconds\n", + "2023/10/14 05:50:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2753155033162587, Global best: 0.2753155033162587, Runtime: 6.61706 seconds\n", + "2023/10/14 05:50:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2750544219415535, Global best: 0.2750544219415535, Runtime: 6.55896 seconds\n", + "2023/10/14 05:50:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2750544219415535, Global best: 0.2750544219415535, Runtime: 6.55034 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.7833333333333333 0.7333333333333334 134\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 05:50:40 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 05:50:54 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.59557 seconds\n", + "2023/10/14 05:51:00 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.47169 seconds\n", + "2023/10/14 05:51:07 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.50393 seconds\n", + "2023/10/14 05:51:13 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.47963 seconds\n", + "2023/10/14 05:51:20 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.49427 seconds\n", + "2023/10/14 05:51:26 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.48643 seconds\n", + "2023/10/14 05:51:33 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.47589 seconds\n", + "2023/10/14 05:51:39 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.48839 seconds\n", + "2023/10/14 05:51:46 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.89282 seconds\n", + "2023/10/14 05:51:53 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.62120 seconds\n", + "2023/10/14 05:51:59 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.28547031997542716, Global best: 0.28547031997542716, Runtime: 6.53706 seconds\n", + "2023/10/14 05:52:06 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.2841718729023604, Global best: 0.2841718729023604, Runtime: 6.61416 seconds\n", + "2023/10/14 05:52:12 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2841718729023604, Global best: 0.2841718729023604, Runtime: 6.55129 seconds\n", + "2023/10/14 05:52:19 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2841718729023604, Global best: 0.2841718729023604, Runtime: 6.58829 seconds\n", + "2023/10/14 05:52:25 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.2841718729023604, Global best: 0.2841718729023604, Runtime: 6.52267 seconds\n", + "2023/10/14 05:52:32 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2841718729023604, Global best: 0.2841718729023604, Runtime: 6.52433 seconds\n", + "2023/10/14 05:52:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2841718729023604, Global best: 0.2841718729023604, Runtime: 6.48927 seconds\n", + "2023/10/14 05:52:45 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.283359255902631, Global best: 0.283359255902631, Runtime: 6.53161 seconds\n", + "2023/10/14 05:52:52 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.283359255902631, Global best: 0.283359255902631, Runtime: 6.53508 seconds\n", + "2023/10/14 05:52:58 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.283359255902631, Global best: 0.283359255902631, Runtime: 6.48412 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.7833333333333333 0.7333333333333334 139\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 05:53:02 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 05:53:16 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.28424988437041576, Global best: 0.28424988437041576, Runtime: 6.55841 seconds\n", + "2023/10/14 05:53:22 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.2771117351591761, Global best: 0.2771117351591761, Runtime: 6.54859 seconds\n", + "2023/10/14 05:53:29 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2771117351591761, Global best: 0.2771117351591761, Runtime: 6.52401 seconds\n", + "2023/10/14 05:53:35 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2771117351591761, Global best: 0.2771117351591761, Runtime: 6.51978 seconds\n", + "2023/10/14 05:53:42 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2769570075229286, Global best: 0.2769570075229286, Runtime: 6.75846 seconds\n", + "2023/10/14 05:53:49 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.27171885799761525, Global best: 0.27171885799761525, Runtime: 6.58316 seconds\n", + "2023/10/14 05:53:56 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.26657835093762283, Global best: 0.26657835093762283, Runtime: 6.98945 seconds\n", + "2023/10/14 05:54:02 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.26432230065783535, Global best: 0.26432230065783535, Runtime: 6.62406 seconds\n", + "2023/10/14 05:54:09 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.26183047898819894, Global best: 0.26183047898819894, Runtime: 6.62397 seconds\n", + "2023/10/14 05:54:15 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2557352194119266, Global best: 0.2557352194119266, Runtime: 6.59920 seconds\n", + "2023/10/14 05:54:22 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2557352194119266, Global best: 0.2557352194119266, Runtime: 6.51118 seconds\n", + "2023/10/14 05:54:28 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2557352194119266, Global best: 0.2557352194119266, Runtime: 6.50441 seconds\n", + "2023/10/14 05:54:35 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2555288717484831, Global best: 0.2555288717484831, Runtime: 6.48527 seconds\n", + "2023/10/14 05:54:41 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.24888722708123892, Global best: 0.24888722708123892, Runtime: 6.46747 seconds\n", + "2023/10/14 05:54:48 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.24888722708123892, Global best: 0.24888722708123892, Runtime: 6.61302 seconds\n", + "2023/10/14 05:54:55 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.24888722708123892, Global best: 0.24888722708123892, Runtime: 6.53028 seconds\n", + "2023/10/14 05:55:01 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.24888722708123892, Global best: 0.24888722708123892, Runtime: 6.49924 seconds\n", + "2023/10/14 05:55:08 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.24888722708123892, Global best: 0.24888722708123892, Runtime: 6.55392 seconds\n", + "2023/10/14 05:55:14 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.24888722708123892, Global best: 0.24888722708123892, Runtime: 6.51126 seconds\n", + "2023/10/14 05:55:21 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.24888722708123892, Global best: 0.24888722708123892, Runtime: 6.45144 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.7833333333333333 0.65 126\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 226\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 226\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 226\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 226\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 226\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 226\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 226\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 226\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 226\n", + "Round 26 / Tentative (Accepted): 145 / Tentative (Not Accepted): 104 / Rejected: 226\n", + "Round 27 / Tentative (Accepted): 145 / Tentative (Not Accepted): 104 / Rejected: 226\n", + "Round 28 / Tentative (Accepted): 145 / Tentative (Not Accepted): 104 / Rejected: 226\n", + "Round 29 / Tentative (Accepted): 145 / Tentative (Not Accepted): 104 / Rejected: 226\n", + "Round 30 / Tentative (Accepted): 145 / Tentative (Not Accepted): 100 / Rejected: 230\n", + "Round 31 / Tentative (Accepted): 145 / Tentative (Not Accepted): 100 / Rejected: 230\n", + "Round 32 / Tentative (Accepted): 145 / Tentative (Not Accepted): 100 / Rejected: 230\n", + "Round 33 / Tentative (Accepted): 145 / Tentative (Not Accepted): 100 / Rejected: 230\n", + "Round 34 / Tentative (Accepted): 145 / Tentative (Not Accepted): 100 / Rejected: 230\n", + "Round 35 / Tentative (Accepted): 145 / Tentative (Not Accepted): 100 / Rejected: 230\n", + "Round 36 / Tentative (Accepted): 150 / Tentative (Not Accepted): 95 / Rejected: 230\n", + "Round 37 / Tentative (Accepted): 150 / Tentative (Not Accepted): 93 / Rejected: 232\n", + "Round 38 / Tentative (Accepted): 150 / Tentative (Not Accepted): 93 / Rejected: 232\n", + "Round 39 / Tentative (Accepted): 150 / Tentative (Not Accepted): 93 / Rejected: 232\n", + "Round 40 / Tentative (Accepted): 150 / Tentative (Not Accepted): 93 / Rejected: 232\n", + "Final Feature Set Contains 276 Features.\n", + "Control (Positive) 0.95 0.95 938\n", + "Control (Negative) 0.4333333333333333 0.55 938\n", + "ANOVA Base 0.95 0.95 248\n", + "Mutual Information (10) Base 1.0 0.8166666666666667 10\n", + "RFE (10) Base 0.95 1.0 10\n", + "MultiSURF (10) 0.95 0.8666666666666667 10\n", + "Mutual Information (20) Base 0.8666666666666667 0.7333333333333334 20\n", + "RFE (20) Base 0.95 0.95 20\n", + "MultiSURF (20) 0.95 0.7833333333333333 20\n", + "Mutual Information (40) Base 0.8166666666666667 0.8333333333333333 40\n", + "RFE (40) Base 0.95 0.9 40\n", + "MultiSURF (40) 0.95 0.7833333333333333 40\n", + "Mutual Information (60) Base 0.8166666666666667 0.9166666666666667 60\n", + "RFE (60) Base 0.95 0.95 60\n", + "MultiSURF (60) 0.95 0.95 60\n", + "Mutual Information (80) Base 0.7333333333333334 0.8333333333333333 80\n", + "RFE (80) Base 0.95 0.95 80\n", + "MultiSURF (80) 0.95 0.95 80\n", + "Mutual Information (100) Base 0.7833333333333333 0.8166666666666667 100\n", + "RFE (100) Base 0.95 0.95 100\n", + "MultiSURF (100) 0.95 0.95 100\n", + "RFECV Base 0.95 0.95 110\n", + "Boruta Base 0.95 0.95 50\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:04:25 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:04:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.33291992561803374, Global best: 0.33291992561803374, Runtime: 13.84535 seconds\n", + "2023/10/14 06:05:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.33291992561803374, Global best: 0.33291992561803374, Runtime: 13.82170 seconds\n", + "2023/10/14 06:05:14 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.33291992561803374, Global best: 0.33291992561803374, Runtime: 13.70535 seconds\n", + "2023/10/14 06:05:28 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.33291992561803374, Global best: 0.33291992561803374, Runtime: 14.69634 seconds\n", + "2023/10/14 06:05:43 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.34264462397777246, Global best: 0.33291992561803374, Runtime: 14.95529 seconds\n", + "2023/10/14 06:05:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.34264462397777246, Global best: 0.33291992561803374, Runtime: 14.73053 seconds\n", + "2023/10/14 06:06:14 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3380578643560195, Global best: 0.33291992561803374, Runtime: 15.62084 seconds\n", + "2023/10/14 06:06:29 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3380578643560195, Global best: 0.33291992561803374, Runtime: 15.01233 seconds\n", + "2023/10/14 06:06:43 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3380578643560195, Global best: 0.33291992561803374, Runtime: 14.28297 seconds\n", + "2023/10/14 06:06:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3412125151253773, Global best: 0.33291992561803374, Runtime: 15.12791 seconds\n", + "2023/10/14 06:07:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3412125151253773, Global best: 0.33291992561803374, Runtime: 14.46833 seconds\n", + "2023/10/14 06:07:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.34056937123757036, Global best: 0.33291992561803374, Runtime: 14.70972 seconds\n", + "2023/10/14 06:07:41 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.34056937123757036, Global best: 0.33291992561803374, Runtime: 14.18378 seconds\n", + "2023/10/14 06:07:56 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.34056937123757036, Global best: 0.33291992561803374, Runtime: 14.53237 seconds\n", + "2023/10/14 06:08:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.34056937123757036, Global best: 0.33291992561803374, Runtime: 14.07056 seconds\n", + "2023/10/14 06:08:25 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.34056937123757036, Global best: 0.33291992561803374, Runtime: 14.87164 seconds\n", + "2023/10/14 06:08:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.34222593667933454, Global best: 0.33291992561803374, Runtime: 15.33791 seconds\n", + "2023/10/14 06:08:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.34051828811267654, Global best: 0.33291992561803374, Runtime: 14.76488 seconds\n", + "2023/10/14 06:09:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.34051828811267654, Global best: 0.33291992561803374, Runtime: 14.23938 seconds\n", + "2023/10/14 06:09:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.34051828811267654, Global best: 0.33291992561803374, Runtime: 14.84446 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.95 0.95 562\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:09:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:09:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3320249975230765, Global best: 0.3320249975230765, Runtime: 6.79687 seconds\n", + "2023/10/14 06:09:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3320249975230765, Global best: 0.3320249975230765, Runtime: 6.93416 seconds\n", + "2023/10/14 06:09:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3320249975230765, Global best: 0.3320249975230765, Runtime: 6.85514 seconds\n", + "2023/10/14 06:10:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3320249975230765, Global best: 0.3320249975230765, Runtime: 6.79300 seconds\n", + "2023/10/14 06:10:11 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3320249975230765, Global best: 0.3320249975230765, Runtime: 6.72571 seconds\n", + "2023/10/14 06:10:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3320249975230765, Global best: 0.3320249975230765, Runtime: 6.73125 seconds\n", + "2023/10/14 06:10:24 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3320249975230765, Global best: 0.3320249975230765, Runtime: 6.71670 seconds\n", + "2023/10/14 06:10:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3320249975230765, Global best: 0.3320249975230765, Runtime: 6.71739 seconds\n", + "2023/10/14 06:10:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3320249975230765, Global best: 0.3320249975230765, Runtime: 6.79363 seconds\n", + "2023/10/14 06:10:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.32922891866501514, Global best: 0.32922891866501514, Runtime: 6.75190 seconds\n", + "2023/10/14 06:10:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.32922891866501514, Global best: 0.32922891866501514, Runtime: 6.93833 seconds\n", + "2023/10/14 06:10:58 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3254195583632362, Global best: 0.3254195583632362, Runtime: 6.80387 seconds\n", + "2023/10/14 06:11:05 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3196763080954048, Global best: 0.3196763080954048, Runtime: 6.84608 seconds\n", + "2023/10/14 06:11:12 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3196763080954048, Global best: 0.3196763080954048, Runtime: 6.87605 seconds\n", + "2023/10/14 06:11:19 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3196763080954048, Global best: 0.3196763080954048, Runtime: 6.87760 seconds\n", + "2023/10/14 06:11:26 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3196763080954048, Global best: 0.3196763080954048, Runtime: 6.85518 seconds\n", + "2023/10/14 06:11:33 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3196763080954048, Global best: 0.3196763080954048, Runtime: 6.84747 seconds\n", + "2023/10/14 06:11:39 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3196763080954048, Global best: 0.3196763080954048, Runtime: 6.84854 seconds\n", + "2023/10/14 06:11:46 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3196763080954048, Global best: 0.3196763080954048, Runtime: 6.92084 seconds\n", + "2023/10/14 06:11:53 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3196763080954048, Global best: 0.3196763080954048, Runtime: 6.84244 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.95 0.9 534\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:11:58 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:12:13 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3234101421974867, Global best: 0.3234101421974867, Runtime: 6.82444 seconds\n", + "2023/10/14 06:12:19 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.87590 seconds\n", + "2023/10/14 06:12:26 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.85187 seconds\n", + "2023/10/14 06:12:33 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.73489 seconds\n", + "2023/10/14 06:12:40 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.87115 seconds\n", + "2023/10/14 06:12:47 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.90611 seconds\n", + "2023/10/14 06:12:54 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.84577 seconds\n", + "2023/10/14 06:13:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.92390 seconds\n", + "2023/10/14 06:13:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.90318 seconds\n", + "2023/10/14 06:13:14 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.81314 seconds\n", + "2023/10/14 06:13:21 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.90935 seconds\n", + "2023/10/14 06:13:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.87209 seconds\n", + "2023/10/14 06:13:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.86482 seconds\n", + "2023/10/14 06:13:42 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.86205 seconds\n", + "2023/10/14 06:13:49 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.88683 seconds\n", + "2023/10/14 06:13:56 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.87348 seconds\n", + "2023/10/14 06:14:03 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.86662 seconds\n", + "2023/10/14 06:14:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 7.31703 seconds\n", + "2023/10/14 06:14:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.90872 seconds\n", + "2023/10/14 06:14:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.31860566320658923, Global best: 0.31860566320658923, Runtime: 6.84281 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.95 0.95 563\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:14:28 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:14:42 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.31319758675227294, Global best: 0.31319758675227294, Runtime: 6.82769 seconds\n", + "2023/10/14 06:14:50 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.31319758675227294, Global best: 0.31319758675227294, Runtime: 7.05259 seconds\n", + "2023/10/14 06:14:56 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.85337 seconds\n", + "2023/10/14 06:15:03 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.85680 seconds\n", + "2023/10/14 06:15:10 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.87339 seconds\n", + "2023/10/14 06:15:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.83685 seconds\n", + "2023/10/14 06:15:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.89358 seconds\n", + "2023/10/14 06:15:31 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.85262 seconds\n", + "2023/10/14 06:15:38 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.86649 seconds\n", + "2023/10/14 06:15:44 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.79965 seconds\n", + "2023/10/14 06:15:51 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.88907 seconds\n", + "2023/10/14 06:15:58 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.89165 seconds\n", + "2023/10/14 06:16:05 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 7.24448 seconds\n", + "2023/10/14 06:16:12 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.81164 seconds\n", + "2023/10/14 06:16:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.93226 seconds\n", + "2023/10/14 06:16:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.76796 seconds\n", + "2023/10/14 06:16:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.67126 seconds\n", + "2023/10/14 06:16:39 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.73291 seconds\n", + "2023/10/14 06:16:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.88369 seconds\n", + "2023/10/14 06:16:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.30244807272301477, Global best: 0.30244807272301477, Runtime: 6.89232 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.95 0.9 540\n", + "Triglav Stage 1 Base 0.8666666666666667 0.95 276\n", + "Triglav MultiSURF 10 0.8666666666666667 0.8333333333333333 10\n", + "Triglav MultiSURF 20 0.8666666666666667 0.8333333333333333 20\n", + "Triglav MultiSURF 40 0.8666666666666667 0.95 40\n", + "Triglav MultiSURF 60 0.8666666666666667 0.95 60\n", + "Triglav MultiSURF 80 0.8666666666666667 0.8666666666666667 80\n", + "Triglav MultiSURF 100 0.8666666666666667 0.8666666666666667 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:17:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:17:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3063314793169349, Global best: 0.3063314793169349, Runtime: 13.49654 seconds\n", + "2023/10/14 06:17:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.30493415949785324, Global best: 0.30493415949785324, Runtime: 13.14918 seconds\n", + "2023/10/14 06:18:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3004071693232848, Global best: 0.3004071693232848, Runtime: 13.64645 seconds\n", + "2023/10/14 06:18:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.2990007586056289, Global best: 0.2990007586056289, Runtime: 14.44861 seconds\n", + "2023/10/14 06:18:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.2990007586056289, Global best: 0.2990007586056289, Runtime: 13.82343 seconds\n", + "2023/10/14 06:18:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.2990007586056289, Global best: 0.2990007586056289, Runtime: 13.46536 seconds\n", + "2023/10/14 06:19:08 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.2990007586056289, Global best: 0.2990007586056289, Runtime: 14.18198 seconds\n", + "2023/10/14 06:19:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.2993329940279313, Global best: 0.2990007586056289, Runtime: 14.50030 seconds\n", + "2023/10/14 06:19:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.2993329940279313, Global best: 0.2990007586056289, Runtime: 14.72790 seconds\n", + "2023/10/14 06:19:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.291203714709962, Global best: 0.291203714709962, Runtime: 14.22779 seconds\n", + "2023/10/14 06:20:06 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.291203714709962, Global best: 0.291203714709962, Runtime: 14.69973 seconds\n", + "2023/10/14 06:20:20 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.291203714709962, Global best: 0.291203714709962, Runtime: 14.23368 seconds\n", + "2023/10/14 06:20:34 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3010444985878756, Global best: 0.291203714709962, Runtime: 13.98831 seconds\n", + "2023/10/14 06:20:48 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.30123767589634753, Global best: 0.291203714709962, Runtime: 14.52424 seconds\n", + "2023/10/14 06:21:02 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.30123767589634753, Global best: 0.291203714709962, Runtime: 13.93289 seconds\n", + "2023/10/14 06:21:16 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.30123767589634753, Global best: 0.291203714709962, Runtime: 13.77350 seconds\n", + "2023/10/14 06:21:30 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3061975209644455, Global best: 0.291203714709962, Runtime: 14.20846 seconds\n", + "2023/10/14 06:21:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3061975209644455, Global best: 0.291203714709962, Runtime: 14.18316 seconds\n", + "2023/10/14 06:21:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.30271652716936204, Global best: 0.291203714709962, Runtime: 13.93298 seconds\n", + "2023/10/14 06:22:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.30271652716936204, Global best: 0.291203714709962, Runtime: 13.99296 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.8666666666666667 0.95 150\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:22:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:22:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.30787474847459906, Global best: 0.30787474847459906, Runtime: 6.81262 seconds\n", + "2023/10/14 06:22:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.30787474847459906, Global best: 0.30787474847459906, Runtime: 6.62115 seconds\n", + "2023/10/14 06:22:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.30787474847459906, Global best: 0.30787474847459906, Runtime: 6.52006 seconds\n", + "2023/10/14 06:22:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3072377743311688, Global best: 0.3072377743311688, Runtime: 6.55581 seconds\n", + "2023/10/14 06:22:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.29963136933905987, Global best: 0.29963136933905987, Runtime: 6.66774 seconds\n", + "2023/10/14 06:23:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.67495 seconds\n", + "2023/10/14 06:23:11 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.61406 seconds\n", + "2023/10/14 06:23:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.71216 seconds\n", + "2023/10/14 06:23:24 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.56719 seconds\n", + "2023/10/14 06:23:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.62918 seconds\n", + "2023/10/14 06:23:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.57214 seconds\n", + "2023/10/14 06:23:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.66867 seconds\n", + "2023/10/14 06:23:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.66156 seconds\n", + "2023/10/14 06:23:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.68215 seconds\n", + "2023/10/14 06:24:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.62616 seconds\n", + "2023/10/14 06:24:11 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.64062 seconds\n", + "2023/10/14 06:24:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.94257 seconds\n", + "2023/10/14 06:24:24 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.47882 seconds\n", + "2023/10/14 06:24:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 6.51407 seconds\n", + "2023/10/14 06:24:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.28573298241835554, Global best: 0.28573298241835554, Runtime: 7.70515 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.8666666666666667 1.0 134\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:24:44 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:25:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.2976926482685215, Global best: 0.2976926482685215, Runtime: 6.82300 seconds\n", + "2023/10/14 06:25:07 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.27250757736162334, Global best: 0.27250757736162334, Runtime: 6.77540 seconds\n", + "2023/10/14 06:25:14 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.27250757736162334, Global best: 0.27250757736162334, Runtime: 6.64594 seconds\n", + "2023/10/14 06:25:21 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.2717937317303015, Global best: 0.2717937317303015, Runtime: 6.70739 seconds\n", + "2023/10/14 06:25:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.2717937317303015, Global best: 0.2717937317303015, Runtime: 6.69470 seconds\n", + "2023/10/14 06:25:34 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.2675554582381783, Global best: 0.2675554582381783, Runtime: 6.61681 seconds\n", + "2023/10/14 06:25:41 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.2675554582381783, Global best: 0.2675554582381783, Runtime: 6.75236 seconds\n", + "2023/10/14 06:25:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.2675554582381783, Global best: 0.2675554582381783, Runtime: 6.74842 seconds\n", + "2023/10/14 06:25:54 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2675554582381783, Global best: 0.2675554582381783, Runtime: 6.70423 seconds\n", + "2023/10/14 06:26:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.26753710464020247, Global best: 0.26753710464020247, Runtime: 6.68571 seconds\n", + "2023/10/14 06:26:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.26171804976754015, Global best: 0.26171804976754015, Runtime: 6.65878 seconds\n", + "2023/10/14 06:26:14 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.2555200754206385, Global best: 0.2555200754206385, Runtime: 6.66315 seconds\n", + "2023/10/14 06:26:21 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2555200754206385, Global best: 0.2555200754206385, Runtime: 6.66520 seconds\n", + "2023/10/14 06:26:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2533043736988017, Global best: 0.2533043736988017, Runtime: 6.67491 seconds\n", + "2023/10/14 06:26:34 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.2533043736988017, Global best: 0.2533043736988017, Runtime: 6.66710 seconds\n", + "2023/10/14 06:26:41 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.25187667503871103, Global best: 0.25187667503871103, Runtime: 6.65183 seconds\n", + "2023/10/14 06:26:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.25187667503871103, Global best: 0.25187667503871103, Runtime: 6.63443 seconds\n", + "2023/10/14 06:26:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.25187667503871103, Global best: 0.25187667503871103, Runtime: 7.18912 seconds\n", + "2023/10/14 06:27:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.2490187360265891, Global best: 0.2490187360265891, Runtime: 6.69926 seconds\n", + "2023/10/14 06:27:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.2490187360265891, Global best: 0.2490187360265891, Runtime: 6.72590 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.8666666666666667 0.8666666666666667 130\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:27:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:27:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.29315729874556307, Global best: 0.29315729874556307, Runtime: 6.76851 seconds\n", + "2023/10/14 06:27:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.28616384673126977, Global best: 0.28616384673126977, Runtime: 6.78761 seconds\n", + "2023/10/14 06:27:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.28451134871395134, Global best: 0.28451134871395134, Runtime: 6.69422 seconds\n", + "2023/10/14 06:27:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.28202567914934756, Global best: 0.28202567914934756, Runtime: 6.74821 seconds\n", + "2023/10/14 06:27:54 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.28202567914934756, Global best: 0.28202567914934756, Runtime: 6.68064 seconds\n", + "2023/10/14 06:28:01 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.28202567914934756, Global best: 0.28202567914934756, Runtime: 6.71390 seconds\n", + "2023/10/14 06:28:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2798994255806748, Global best: 0.2798994255806748, Runtime: 6.68900 seconds\n", + "2023/10/14 06:28:14 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2798994255806748, Global best: 0.2798994255806748, Runtime: 6.68155 seconds\n", + "2023/10/14 06:28:21 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2793433655882237, Global best: 0.2793433655882237, Runtime: 6.65117 seconds\n", + "2023/10/14 06:28:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2768051412873639, Global best: 0.2768051412873639, Runtime: 6.69579 seconds\n", + "2023/10/14 06:28:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.27463552438258027, Global best: 0.27463552438258027, Runtime: 7.06427 seconds\n", + "2023/10/14 06:28:41 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2710383486334177, Global best: 0.2710383486334177, Runtime: 6.70220 seconds\n", + "2023/10/14 06:28:48 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.26740341901663006, Global best: 0.26740341901663006, Runtime: 6.86452 seconds\n", + "2023/10/14 06:28:55 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.26740341901663006, Global best: 0.26740341901663006, Runtime: 6.73620 seconds\n", + "2023/10/14 06:29:01 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.26059794474119274, Global best: 0.26059794474119274, Runtime: 6.80166 seconds\n", + "2023/10/14 06:29:08 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2601039443848743, Global best: 0.2601039443848743, Runtime: 6.83246 seconds\n", + "2023/10/14 06:29:15 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.25909598003898715, Global best: 0.25909598003898715, Runtime: 6.82514 seconds\n", + "2023/10/14 06:29:22 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.255529818940727, Global best: 0.255529818940727, Runtime: 6.77589 seconds\n", + "2023/10/14 06:29:29 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.255529818940727, Global best: 0.255529818940727, Runtime: 6.76636 seconds\n", + "2023/10/14 06:29:35 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.24941287759463804, Global best: 0.24941287759463804, Runtime: 6.81987 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.8666666666666667 0.9166666666666667 120\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 226\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 226\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 226\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 226\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 226\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 226\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 226\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 226\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 226\n", + "Round 26 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 233\n", + "Round 27 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 233\n", + "Round 28 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 233\n", + "Round 29 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 233\n", + "Round 30 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 233\n", + "Round 31 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 233\n", + "Round 32 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 233\n", + "Round 33 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 233\n", + "Round 34 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 233\n", + "Round 35 / Tentative (Accepted): 146 / Tentative (Not Accepted): 92 / Rejected: 234\n", + "Round 36 / Tentative (Accepted): 149 / Tentative (Not Accepted): 89 / Rejected: 234\n", + "Round 37 / Tentative (Accepted): 149 / Tentative (Not Accepted): 89 / Rejected: 234\n", + "Round 38 / Tentative (Accepted): 149 / Tentative (Not Accepted): 89 / Rejected: 234\n", + "Round 39 / Tentative (Accepted): 149 / Tentative (Not Accepted): 89 / Rejected: 234\n", + "Round 40 / Tentative (Accepted): 149 / Tentative (Not Accepted): 89 / Rejected: 234\n", + "Final Feature Set Contains 291 Features.\n", + "Control (Positive) 0.9 0.9 938\n", + "Control (Negative) 0.5333333333333333 0.5166666666666666 938\n", + "ANOVA Base 0.9 0.9 255\n", + "Mutual Information (10) Base 0.7666666666666666 0.85 10\n", + "RFE (10) Base 0.9 0.9 10\n", + "MultiSURF (10) 0.9 0.8 10\n", + "Mutual Information (20) Base 0.7166666666666667 0.75 20\n", + "RFE (20) Base 0.9 0.9 20\n", + "MultiSURF (20) 0.9 0.9 20\n", + "Mutual Information (40) Base 0.85 0.9 40\n", + "RFE (40) Base 0.9 0.9 40\n", + "MultiSURF (40) 0.9 0.9 40\n", + "Mutual Information (60) Base 0.8 0.9 60\n", + "RFE (60) Base 0.9 0.9 60\n", + "MultiSURF (60) 0.9 0.9 60\n", + "Mutual Information (80) Base 0.8 0.9 80\n", + "RFE (80) Base 0.9 0.9 80\n", + "MultiSURF (80) 0.9 0.9 80\n", + "Mutual Information (100) Base 0.8 0.9 100\n", + "RFE (100) Base 0.9 0.9 100\n", + "MultiSURF (100) 0.9 0.9 100\n", + "RFECV Base 0.9 0.9 156\n", + "Boruta Base 0.9 0.9 53\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:39:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:40:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3197878444523748, Global best: 0.3197878444523748, Runtime: 13.74064 seconds\n", + "2023/10/14 06:40:25 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3197878444523748, Global best: 0.3197878444523748, Runtime: 13.76821 seconds\n", + "2023/10/14 06:40:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3197878444523748, Global best: 0.3197878444523748, Runtime: 14.43465 seconds\n", + "2023/10/14 06:40:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3219113015249141, Global best: 0.3197878444523748, Runtime: 15.10531 seconds\n", + "2023/10/14 06:41:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3314717128925497, Global best: 0.3197878444523748, Runtime: 14.96853 seconds\n", + "2023/10/14 06:41:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3314717128925497, Global best: 0.3197878444523748, Runtime: 14.54370 seconds\n", + "2023/10/14 06:41:39 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3314717128925497, Global best: 0.3197878444523748, Runtime: 14.15930 seconds\n", + "2023/10/14 06:41:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3314717128925497, Global best: 0.3197878444523748, Runtime: 14.59183 seconds\n", + "2023/10/14 06:42:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.33153825884737803, Global best: 0.3197878444523748, Runtime: 15.39622 seconds\n", + "2023/10/14 06:42:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.32552092540215016, Global best: 0.3197878444523748, Runtime: 15.25936 seconds\n", + "2023/10/14 06:42:39 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.32552092540215016, Global best: 0.3197878444523748, Runtime: 14.66016 seconds\n", + "2023/10/14 06:42:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.32552092540215016, Global best: 0.3197878444523748, Runtime: 14.88426 seconds\n", + "2023/10/14 06:43:08 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3247298603000256, Global best: 0.3197878444523748, Runtime: 14.49320 seconds\n", + "2023/10/14 06:43:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3247298603000256, Global best: 0.3197878444523748, Runtime: 14.29767 seconds\n", + "2023/10/14 06:43:36 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3247298603000256, Global best: 0.3197878444523748, Runtime: 14.17955 seconds\n", + "2023/10/14 06:43:52 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3247298603000256, Global best: 0.3197878444523748, Runtime: 15.45260 seconds\n", + "2023/10/14 06:44:07 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3305896056032014, Global best: 0.3197878444523748, Runtime: 14.66996 seconds\n", + "2023/10/14 06:44:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3231499828398984, Global best: 0.3197878444523748, Runtime: 14.97234 seconds\n", + "2023/10/14 06:44:36 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3231499828398984, Global best: 0.3197878444523748, Runtime: 14.75005 seconds\n", + "2023/10/14 06:44:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3231499828398984, Global best: 0.3197878444523748, Runtime: 14.31556 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.9 0.9 526\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:44:54 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:45:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.32536033298524214, Global best: 0.32536033298524214, Runtime: 6.86146 seconds\n", + "2023/10/14 06:45:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.32536033298524214, Global best: 0.32536033298524214, Runtime: 6.88907 seconds\n", + "2023/10/14 06:45:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.32536033298524214, Global best: 0.32536033298524214, Runtime: 7.25977 seconds\n", + "2023/10/14 06:45:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.32536033298524214, Global best: 0.32536033298524214, Runtime: 6.81591 seconds\n", + "2023/10/14 06:45:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.32536033298524214, Global best: 0.32536033298524214, Runtime: 6.81883 seconds\n", + "2023/10/14 06:45:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3235350113224329, Global best: 0.3235350113224329, Runtime: 6.91087 seconds\n", + "2023/10/14 06:45:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3235350113224329, Global best: 0.3235350113224329, Runtime: 6.88861 seconds\n", + "2023/10/14 06:45:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3201511170419625, Global best: 0.3201511170419625, Runtime: 6.78970 seconds\n", + "2023/10/14 06:46:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3201511170419625, Global best: 0.3201511170419625, Runtime: 6.80408 seconds\n", + "2023/10/14 06:46:11 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3201511170419625, Global best: 0.3201511170419625, Runtime: 6.82528 seconds\n", + "2023/10/14 06:46:18 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3190534460885127, Global best: 0.3190534460885127, Runtime: 6.81640 seconds\n", + "2023/10/14 06:46:24 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.31650857209038075, Global best: 0.31650857209038075, Runtime: 6.80958 seconds\n", + "2023/10/14 06:46:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.31563595413904266, Global best: 0.31563595413904266, Runtime: 6.79916 seconds\n", + "2023/10/14 06:46:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.31563595413904266, Global best: 0.31563595413904266, Runtime: 6.79256 seconds\n", + "2023/10/14 06:46:45 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.31563595413904266, Global best: 0.31563595413904266, Runtime: 6.84311 seconds\n", + "2023/10/14 06:46:52 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3129043219541487, Global best: 0.3129043219541487, Runtime: 6.90810 seconds\n", + "2023/10/14 06:46:59 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3129043219541487, Global best: 0.3129043219541487, Runtime: 6.80607 seconds\n", + "2023/10/14 06:47:05 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3129043219541487, Global best: 0.3129043219541487, Runtime: 6.87934 seconds\n", + "2023/10/14 06:47:13 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3129043219541487, Global best: 0.3129043219541487, Runtime: 7.24427 seconds\n", + "2023/10/14 06:47:19 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3129043219541487, Global best: 0.3129043219541487, Runtime: 6.78550 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.9 0.9 511\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:47:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:47:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.32609188158335745, Global best: 0.32609188158335745, Runtime: 6.86437 seconds\n", + "2023/10/14 06:47:45 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.32609188158335745, Global best: 0.32609188158335745, Runtime: 6.80648 seconds\n", + "2023/10/14 06:47:52 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.32609188158335745, Global best: 0.32609188158335745, Runtime: 6.89499 seconds\n", + "2023/10/14 06:47:59 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.32609188158335745, Global best: 0.32609188158335745, Runtime: 6.88136 seconds\n", + "2023/10/14 06:48:06 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3253859021530471, Global best: 0.3253859021530471, Runtime: 6.96622 seconds\n", + "2023/10/14 06:48:13 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3253859021530471, Global best: 0.3253859021530471, Runtime: 6.92591 seconds\n", + "2023/10/14 06:48:20 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.95157 seconds\n", + "2023/10/14 06:48:26 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.84754 seconds\n", + "2023/10/14 06:48:33 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.87791 seconds\n", + "2023/10/14 06:48:40 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.88496 seconds\n", + "2023/10/14 06:48:47 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.92021 seconds\n", + "2023/10/14 06:48:54 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.91457 seconds\n", + "2023/10/14 06:49:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.90601 seconds\n", + "2023/10/14 06:49:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.89180 seconds\n", + "2023/10/14 06:49:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.93513 seconds\n", + "2023/10/14 06:49:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.75735 seconds\n", + "2023/10/14 06:49:29 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.93075 seconds\n", + "2023/10/14 06:49:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.88327 seconds\n", + "2023/10/14 06:49:42 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.99539 seconds\n", + "2023/10/14 06:49:49 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.32506233332749795, Global best: 0.32506233332749795, Runtime: 6.90387 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.9 0.9 537\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:49:54 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:50:09 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.93232 seconds\n", + "2023/10/14 06:50:16 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.91827 seconds\n", + "2023/10/14 06:50:23 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.95926 seconds\n", + "2023/10/14 06:50:30 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.90654 seconds\n", + "2023/10/14 06:50:36 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.85252 seconds\n", + "2023/10/14 06:50:43 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.92552 seconds\n", + "2023/10/14 06:50:50 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.96870 seconds\n", + "2023/10/14 06:50:57 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.93564 seconds\n", + "2023/10/14 06:51:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.93696 seconds\n", + "2023/10/14 06:51:11 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3145972807927301, Global best: 0.3145972807927301, Runtime: 6.94552 seconds\n", + "2023/10/14 06:51:18 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3144442820195241, Global best: 0.3144442820195241, Runtime: 6.89404 seconds\n", + "2023/10/14 06:51:25 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3144442820195241, Global best: 0.3144442820195241, Runtime: 6.94076 seconds\n", + "2023/10/14 06:51:32 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.3144442820195241, Global best: 0.3144442820195241, Runtime: 6.94732 seconds\n", + "2023/10/14 06:51:39 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.29987488615131946, Global best: 0.29987488615131946, Runtime: 6.88478 seconds\n", + "2023/10/14 06:51:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.29987488615131946, Global best: 0.29987488615131946, Runtime: 6.94252 seconds\n", + "2023/10/14 06:51:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.29987488615131946, Global best: 0.29987488615131946, Runtime: 6.94324 seconds\n", + "2023/10/14 06:52:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.29987488615131946, Global best: 0.29987488615131946, Runtime: 6.87576 seconds\n", + "2023/10/14 06:52:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.29987488615131946, Global best: 0.29987488615131946, Runtime: 7.39279 seconds\n", + "2023/10/14 06:52:14 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.29987488615131946, Global best: 0.29987488615131946, Runtime: 6.85706 seconds\n", + "2023/10/14 06:52:21 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2998637202860179, Global best: 0.2998637202860179, Runtime: 6.90261 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.9 0.9 503\n", + "Triglav Stage 1 Base 0.9 0.9 291\n", + "Triglav MultiSURF 10 0.9 0.9 10\n", + "Triglav MultiSURF 20 0.8 0.8 20\n", + "Triglav MultiSURF 40 0.85 0.9 40\n", + "Triglav MultiSURF 60 0.9 0.9 60\n", + "Triglav MultiSURF 80 0.9 0.9 80\n", + "Triglav MultiSURF 100 0.9 0.9 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:52:52 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:53:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3156287713753221, Global best: 0.3156287713753221, Runtime: 13.54842 seconds\n", + "2023/10/14 06:53:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3156287713753221, Global best: 0.3156287713753221, Runtime: 13.32952 seconds\n", + "2023/10/14 06:53:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3149447368472492, Global best: 0.3149447368472492, Runtime: 13.80154 seconds\n", + "2023/10/14 06:53:54 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3091518188046561, Global best: 0.3091518188046561, Runtime: 14.49001 seconds\n", + "2023/10/14 06:54:08 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3091518188046561, Global best: 0.3091518188046561, Runtime: 13.89745 seconds\n", + "2023/10/14 06:54:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3091518188046561, Global best: 0.3091518188046561, Runtime: 14.64722 seconds\n", + "2023/10/14 06:54:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.321283405543396, Global best: 0.3091518188046561, Runtime: 14.21325 seconds\n", + "2023/10/14 06:54:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.31949289648406076, Global best: 0.3091518188046561, Runtime: 13.92530 seconds\n", + "2023/10/14 06:55:07 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.31949289648406076, Global best: 0.3091518188046561, Runtime: 15.42440 seconds\n", + "2023/10/14 06:55:21 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.31949289648406076, Global best: 0.3091518188046561, Runtime: 14.76727 seconds\n", + "2023/10/14 06:55:35 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.31713085593799206, Global best: 0.3091518188046561, Runtime: 13.61545 seconds\n", + "2023/10/14 06:55:49 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.31713085593799206, Global best: 0.3091518188046561, Runtime: 14.09657 seconds\n", + "2023/10/14 06:56:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3063121642456201, Global best: 0.3063121642456201, Runtime: 14.55052 seconds\n", + "2023/10/14 06:56:17 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3063121642456201, Global best: 0.3063121642456201, Runtime: 13.84207 seconds\n", + "2023/10/14 06:56:32 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3063121642456201, Global best: 0.3063121642456201, Runtime: 14.30318 seconds\n", + "2023/10/14 06:56:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3063121642456201, Global best: 0.3063121642456201, Runtime: 13.84023 seconds\n", + "2023/10/14 06:57:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3137072172711938, Global best: 0.3063121642456201, Runtime: 14.57575 seconds\n", + "2023/10/14 06:57:15 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.31428088228997, Global best: 0.3063121642456201, Runtime: 14.48889 seconds\n", + "2023/10/14 06:57:29 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3107000594198445, Global best: 0.3063121642456201, Runtime: 14.08957 seconds\n", + "2023/10/14 06:57:42 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3107000594198445, Global best: 0.3063121642456201, Runtime: 13.59254 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.9 0.9 160\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 06:57:47 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 06:58:01 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3146083269436818, Global best: 0.3146083269436818, Runtime: 6.66263 seconds\n", + "2023/10/14 06:58:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.313139451707376, Global best: 0.313139451707376, Runtime: 6.70003 seconds\n", + "2023/10/14 06:58:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.72497 seconds\n", + "2023/10/14 06:58:21 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.63029 seconds\n", + "2023/10/14 06:58:28 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.70288 seconds\n", + "2023/10/14 06:58:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.64210 seconds\n", + "2023/10/14 06:58:41 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.68844 seconds\n", + "2023/10/14 06:58:48 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.67047 seconds\n", + "2023/10/14 06:58:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.73237 seconds\n", + "2023/10/14 06:59:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.72321 seconds\n", + "2023/10/14 06:59:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.67355 seconds\n", + "2023/10/14 06:59:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.71530 seconds\n", + "2023/10/14 06:59:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.70576 seconds\n", + "2023/10/14 06:59:28 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.67462 seconds\n", + "2023/10/14 06:59:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.69029 seconds\n", + "2023/10/14 06:59:42 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.64587 seconds\n", + "2023/10/14 06:59:48 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.63179 seconds\n", + "2023/10/14 06:59:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 7.12242 seconds\n", + "2023/10/14 07:00:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.68241 seconds\n", + "2023/10/14 07:00:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.28468578101768893, Global best: 0.28468578101768893, Runtime: 6.67040 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.9 0.9 137\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:00:13 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:00:27 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.30921776140370405, Global best: 0.30921776140370405, Runtime: 6.74484 seconds\n", + "2023/10/14 07:00:34 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3043159822272879, Global best: 0.3043159822272879, Runtime: 6.69942 seconds\n", + "2023/10/14 07:00:41 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.2948711721094121, Global best: 0.2948711721094121, Runtime: 6.66552 seconds\n", + "2023/10/14 07:00:47 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.2908283723710287, Global best: 0.2908283723710287, Runtime: 6.66292 seconds\n", + "2023/10/14 07:00:54 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.2908283723710287, Global best: 0.2908283723710287, Runtime: 6.64768 seconds\n", + "2023/10/14 07:01:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.2908283723710287, Global best: 0.2908283723710287, Runtime: 6.60593 seconds\n", + "2023/10/14 07:01:07 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.2848853724124648, Global best: 0.2848853724124648, Runtime: 6.66441 seconds\n", + "2023/10/14 07:01:14 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.2848853724124648, Global best: 0.2848853724124648, Runtime: 6.71826 seconds\n", + "2023/10/14 07:01:21 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.68131 seconds\n", + "2023/10/14 07:01:27 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.67346 seconds\n", + "2023/10/14 07:01:34 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.69319 seconds\n", + "2023/10/14 07:01:41 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.65082 seconds\n", + "2023/10/14 07:01:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 7.06100 seconds\n", + "2023/10/14 07:01:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.70863 seconds\n", + "2023/10/14 07:02:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.69382 seconds\n", + "2023/10/14 07:02:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.70476 seconds\n", + "2023/10/14 07:02:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.63725 seconds\n", + "2023/10/14 07:02:21 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.65422 seconds\n", + "2023/10/14 07:02:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.26820569558347296, Global best: 0.26820569558347296, Runtime: 6.70215 seconds\n", + "2023/10/14 07:02:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.26535708882469444, Global best: 0.26535708882469444, Runtime: 6.64157 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.9 0.9 136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:02:39 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:02:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3076246012501046, Global best: 0.3076246012501046, Runtime: 6.64557 seconds\n", + "2023/10/14 07:03:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.29570067062714994, Global best: 0.29570067062714994, Runtime: 6.65294 seconds\n", + "2023/10/14 07:03:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.29570067062714994, Global best: 0.29570067062714994, Runtime: 6.61228 seconds\n", + "2023/10/14 07:03:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2933890127587164, Global best: 0.2933890127587164, Runtime: 6.70305 seconds\n", + "2023/10/14 07:03:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.29173364450714645, Global best: 0.29173364450714645, Runtime: 6.60845 seconds\n", + "2023/10/14 07:03:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.28832120179556264, Global best: 0.28832120179556264, Runtime: 6.66842 seconds\n", + "2023/10/14 07:03:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.28520342690560024, Global best: 0.28520342690560024, Runtime: 6.66560 seconds\n", + "2023/10/14 07:03:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.28520342690560024, Global best: 0.28520342690560024, Runtime: 6.68029 seconds\n", + "2023/10/14 07:03:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.28520342690560024, Global best: 0.28520342690560024, Runtime: 6.59802 seconds\n", + "2023/10/14 07:03:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.28520342690560024, Global best: 0.28520342690560024, Runtime: 6.68510 seconds\n", + "2023/10/14 07:04:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.28520342690560024, Global best: 0.28520342690560024, Runtime: 6.62041 seconds\n", + "2023/10/14 07:04:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.28520342690560024, Global best: 0.28520342690560024, Runtime: 6.60231 seconds\n", + "2023/10/14 07:04:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.28520342690560024, Global best: 0.28520342690560024, Runtime: 7.14702 seconds\n", + "2023/10/14 07:04:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2746920579764578, Global best: 0.2746920579764578, Runtime: 6.59279 seconds\n", + "2023/10/14 07:04:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2679077809802497, Global best: 0.2679077809802497, Runtime: 6.60539 seconds\n", + "2023/10/14 07:04:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2679077809802497, Global best: 0.2679077809802497, Runtime: 6.65772 seconds\n", + "2023/10/14 07:04:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2678456607396081, Global best: 0.2678456607396081, Runtime: 6.67071 seconds\n", + "2023/10/14 07:04:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2678456607396081, Global best: 0.2678456607396081, Runtime: 6.60750 seconds\n", + "2023/10/14 07:04:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2678456607396081, Global best: 0.2678456607396081, Runtime: 6.72515 seconds\n", + "2023/10/14 07:05:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.25921480453234014, Global best: 0.25921480453234014, Runtime: 6.65999 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.9 0.9 133\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 251\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 251\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 251\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 251\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 251\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 251\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 251\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 251\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 204 / Rejected: 260\n", + "Round 26 / Tentative (Accepted): 112 / Tentative (Not Accepted): 92 / Rejected: 260\n", + "Round 27 / Tentative (Accepted): 112 / Tentative (Not Accepted): 92 / Rejected: 260\n", + "Round 28 / Tentative (Accepted): 112 / Tentative (Not Accepted): 92 / Rejected: 260\n", + "Round 29 / Tentative (Accepted): 112 / Tentative (Not Accepted): 92 / Rejected: 260\n", + "Round 30 / Tentative (Accepted): 112 / Tentative (Not Accepted): 92 / Rejected: 260\n", + "Round 31 / Tentative (Accepted): 112 / Tentative (Not Accepted): 92 / Rejected: 260\n", + "Round 32 / Tentative (Accepted): 112 / Tentative (Not Accepted): 92 / Rejected: 260\n", + "Round 33 / Tentative (Accepted): 112 / Tentative (Not Accepted): 92 / Rejected: 260\n", + "Round 34 / Tentative (Accepted): 112 / Tentative (Not Accepted): 92 / Rejected: 260\n", + "Round 35 / Tentative (Accepted): 112 / Tentative (Not Accepted): 91 / Rejected: 261\n", + "Round 36 / Tentative (Accepted): 116 / Tentative (Not Accepted): 84 / Rejected: 264\n", + "Round 37 / Tentative (Accepted): 116 / Tentative (Not Accepted): 84 / Rejected: 264\n", + "Round 38 / Tentative (Accepted): 116 / Tentative (Not Accepted): 84 / Rejected: 264\n", + "Round 39 / Tentative (Accepted): 116 / Tentative (Not Accepted): 84 / Rejected: 264\n", + "Round 40 / Tentative (Accepted): 116 / Tentative (Not Accepted): 84 / Rejected: 264\n", + "Final Feature Set Contains 226 Features.\n", + "Control (Positive) 0.85 1.0 938\n", + "Control (Negative) 0.3333333333333333 0.5 938\n", + "ANOVA Base 0.85 0.9 196\n", + "Mutual Information (10) Base 0.85 0.8166666666666667 10\n", + "RFE (10) Base 0.7666666666666666 0.85 10\n", + "MultiSURF (10) 0.9 1.0 10\n", + "Mutual Information (20) Base 0.85 0.6833333333333333 20\n", + "RFE (20) Base 0.9 0.95 20\n", + "MultiSURF (20) 0.85 0.95 20\n", + "Mutual Information (40) Base 0.85 0.85 40\n", + "RFE (40) Base 0.9 0.9 40\n", + "MultiSURF (40) 0.85 1.0 40\n", + "Mutual Information (60) Base 0.85 0.95 60\n", + "RFE (60) Base 0.85 0.9 60\n", + "MultiSURF (60) 0.85 0.95 60\n", + "Mutual Information (80) Base 0.85 0.9 80\n", + "RFE (80) Base 0.85 0.95 80\n", + "MultiSURF (80) 0.85 0.9 80\n", + "Mutual Information (100) Base 0.85 0.85 100\n", + "RFE (100) Base 0.85 0.95 100\n", + "MultiSURF (100) 0.85 0.9 100\n", + "RFECV Base 0.85 0.95 754\n", + "Boruta Base 0.85 0.9 55\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:15:02 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:15:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.333433784229884, Global best: 0.333433784229884, Runtime: 13.70771 seconds\n", + "2023/10/14 07:15:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.333433784229884, Global best: 0.333433784229884, Runtime: 13.81053 seconds\n", + "2023/10/14 07:15:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.333433784229884, Global best: 0.333433784229884, Runtime: 13.98169 seconds\n", + "2023/10/14 07:16:06 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.333433784229884, Global best: 0.333433784229884, Runtime: 14.87519 seconds\n", + "2023/10/14 07:16:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33556157701419614, Global best: 0.333433784229884, Runtime: 15.48891 seconds\n", + "2023/10/14 07:16:36 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.33556157701419614, Global best: 0.333433784229884, Runtime: 14.21984 seconds\n", + "2023/10/14 07:16:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.32971102016092646, Global best: 0.32971102016092646, Runtime: 15.00126 seconds\n", + "2023/10/14 07:17:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.32971102016092646, Global best: 0.32971102016092646, Runtime: 14.39280 seconds\n", + "2023/10/14 07:17:21 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.32971102016092646, Global best: 0.32971102016092646, Runtime: 15.25161 seconds\n", + "2023/10/14 07:17:35 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.32971102016092646, Global best: 0.32971102016092646, Runtime: 14.27296 seconds\n", + "2023/10/14 07:17:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.329506308840557, Global best: 0.329506308840557, Runtime: 14.77011 seconds\n", + "2023/10/14 07:18:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.329506308840557, Global best: 0.329506308840557, Runtime: 14.86129 seconds\n", + "2023/10/14 07:18:19 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.329506308840557, Global best: 0.329506308840557, Runtime: 14.86464 seconds\n", + "2023/10/14 07:18:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.329506308840557, Global best: 0.329506308840557, Runtime: 13.96717 seconds\n", + "2023/10/14 07:18:49 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.329506308840557, Global best: 0.329506308840557, Runtime: 15.88633 seconds\n", + "2023/10/14 07:19:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.330873428419365, Global best: 0.329506308840557, Runtime: 14.58433 seconds\n", + "2023/10/14 07:19:18 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.33471466300745667, Global best: 0.329506308840557, Runtime: 14.20710 seconds\n", + "2023/10/14 07:19:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.33544942375796793, Global best: 0.329506308840557, Runtime: 15.19683 seconds\n", + "2023/10/14 07:19:47 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.33622956632287615, Global best: 0.329506308840557, Runtime: 14.18431 seconds\n", + "2023/10/14 07:20:03 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3282910300705278, Global best: 0.3282910300705278, Runtime: 15.34562 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.85 0.9 530\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:20:07 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:20:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3225572746079867, Global best: 0.3225572746079867, Runtime: 6.86810 seconds\n", + "2023/10/14 07:20:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3225572746079867, Global best: 0.3225572746079867, Runtime: 6.92540 seconds\n", + "2023/10/14 07:20:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3225572746079867, Global best: 0.3225572746079867, Runtime: 7.01534 seconds\n", + "2023/10/14 07:20:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3225572746079867, Global best: 0.3225572746079867, Runtime: 6.80905 seconds\n", + "2023/10/14 07:20:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3225572746079867, Global best: 0.3225572746079867, Runtime: 6.95757 seconds\n", + "2023/10/14 07:20:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3225572746079867, Global best: 0.3225572746079867, Runtime: 6.90884 seconds\n", + "2023/10/14 07:21:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3225572746079867, Global best: 0.3225572746079867, Runtime: 7.31973 seconds\n", + "2023/10/14 07:21:11 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3225572746079867, Global best: 0.3225572746079867, Runtime: 6.87676 seconds\n", + "2023/10/14 07:21:18 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.90600 seconds\n", + "2023/10/14 07:21:24 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.86143 seconds\n", + "2023/10/14 07:21:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 7.04150 seconds\n", + "2023/10/14 07:21:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.73433 seconds\n", + "2023/10/14 07:21:45 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.68255 seconds\n", + "2023/10/14 07:21:52 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.78728 seconds\n", + "2023/10/14 07:21:58 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.75037 seconds\n", + "2023/10/14 07:22:05 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.74473 seconds\n", + "2023/10/14 07:22:12 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.70275 seconds\n", + "2023/10/14 07:22:19 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.78473 seconds\n", + "2023/10/14 07:22:25 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.75300 seconds\n", + "2023/10/14 07:22:32 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.31871529332503845, Global best: 0.31871529332503845, Runtime: 6.69389 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.85 1.0 525\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:22:36 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:22:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.74301 seconds\n", + "2023/10/14 07:22:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.69940 seconds\n", + "2023/10/14 07:23:03 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.66722 seconds\n", + "2023/10/14 07:23:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.71852 seconds\n", + "2023/10/14 07:23:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.72039 seconds\n", + "2023/10/14 07:23:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.71784 seconds\n", + "2023/10/14 07:23:31 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 7.10975 seconds\n", + "2023/10/14 07:23:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.68757 seconds\n", + "2023/10/14 07:23:44 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.73525 seconds\n", + "2023/10/14 07:23:51 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.74399 seconds\n", + "2023/10/14 07:23:58 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.67857 seconds\n", + "2023/10/14 07:24:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.70366 seconds\n", + "2023/10/14 07:24:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.68351 seconds\n", + "2023/10/14 07:24:18 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.72514 seconds\n", + "2023/10/14 07:24:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.73100 seconds\n", + "2023/10/14 07:24:31 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.65753 seconds\n", + "2023/10/14 07:24:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.65210 seconds\n", + "2023/10/14 07:24:45 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.77343 seconds\n", + "2023/10/14 07:24:51 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.70259 seconds\n", + "2023/10/14 07:24:58 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.32373303343618776, Global best: 0.32373303343618776, Runtime: 6.74358 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.85 1.0 541\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:25:02 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:25:16 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3273906061720573, Global best: 0.3273906061720573, Runtime: 6.74955 seconds\n", + "2023/10/14 07:25:23 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3181587198273653, Global best: 0.3181587198273653, Runtime: 6.73129 seconds\n", + "2023/10/14 07:25:29 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3181587198273653, Global best: 0.3181587198273653, Runtime: 6.71867 seconds\n", + "2023/10/14 07:25:36 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.31740393933451233, Global best: 0.31740393933451233, Runtime: 7.07593 seconds\n", + "2023/10/14 07:25:43 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.31740393933451233, Global best: 0.31740393933451233, Runtime: 6.74211 seconds\n", + "2023/10/14 07:25:50 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3116959736372121, Global best: 0.3116959736372121, Runtime: 6.73551 seconds\n", + "2023/10/14 07:25:57 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3116959736372121, Global best: 0.3116959736372121, Runtime: 6.70868 seconds\n", + "2023/10/14 07:26:03 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.74972 seconds\n", + "2023/10/14 07:26:10 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.69590 seconds\n", + "2023/10/14 07:26:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.72115 seconds\n", + "2023/10/14 07:26:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.74770 seconds\n", + "2023/10/14 07:26:30 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.72030 seconds\n", + "2023/10/14 07:26:37 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.71508 seconds\n", + "2023/10/14 07:26:44 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.76762 seconds\n", + "2023/10/14 07:26:51 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.71007 seconds\n", + "2023/10/14 07:26:57 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.69446 seconds\n", + "2023/10/14 07:27:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.3111101958135831, Global best: 0.3111101958135831, Runtime: 6.72357 seconds\n", + "2023/10/14 07:27:11 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.30910746558996804, Global best: 0.30910746558996804, Runtime: 6.67384 seconds\n", + "2023/10/14 07:27:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.3050122595709592, Global best: 0.3050122595709592, Runtime: 6.68290 seconds\n", + "2023/10/14 07:27:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.3050122595709592, Global best: 0.3050122595709592, Runtime: 6.71764 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.85 0.95 513\n", + "Triglav Stage 1 Base 0.8 0.85 226\n", + "Triglav MultiSURF 10 0.95 0.85 10\n", + "Triglav MultiSURF 20 0.85 0.85 20\n", + "Triglav MultiSURF 40 0.8 0.8 40\n", + "Triglav MultiSURF 60 0.8 0.95 60\n", + "Triglav MultiSURF 80 0.8 0.95 80\n", + "Triglav MultiSURF 100 0.8 0.85 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:27:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:28:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.31131371762145743, Global best: 0.31131371762145743, Runtime: 13.06784 seconds\n", + "2023/10/14 07:28:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.30479919403824673, Global best: 0.30479919403824673, Runtime: 13.00949 seconds\n", + "2023/10/14 07:28:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.30479919403824673, Global best: 0.30479919403824673, Runtime: 13.84273 seconds\n", + "2023/10/14 07:28:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3129217959335889, Global best: 0.30479919403824673, Runtime: 13.46743 seconds\n", + "2023/10/14 07:29:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.30947641967065087, Global best: 0.30479919403824673, Runtime: 13.59350 seconds\n", + "2023/10/14 07:29:18 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.30947641967065087, Global best: 0.30479919403824673, Runtime: 13.68399 seconds\n", + "2023/10/14 07:29:31 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.30947641967065087, Global best: 0.30479919403824673, Runtime: 13.48467 seconds\n", + "2023/10/14 07:29:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3095978594356392, Global best: 0.30479919403824673, Runtime: 13.40670 seconds\n", + "2023/10/14 07:29:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.30262637044168783, Global best: 0.30262637044168783, Runtime: 13.61460 seconds\n", + "2023/10/14 07:30:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.30262637044168783, Global best: 0.30262637044168783, Runtime: 14.04019 seconds\n", + "2023/10/14 07:30:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.30262637044168783, Global best: 0.30262637044168783, Runtime: 13.80951 seconds\n", + "2023/10/14 07:30:39 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.2972671444696117, Global best: 0.2972671444696117, Runtime: 13.22051 seconds\n", + "2023/10/14 07:30:52 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.2972671444696117, Global best: 0.2972671444696117, Runtime: 12.93114 seconds\n", + "2023/10/14 07:31:06 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.2972671444696117, Global best: 0.2972671444696117, Runtime: 14.09924 seconds\n", + "2023/10/14 07:31:20 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3067261561485165, Global best: 0.2972671444696117, Runtime: 13.95901 seconds\n", + "2023/10/14 07:31:34 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3067261561485165, Global best: 0.2972671444696117, Runtime: 13.45080 seconds\n", + "2023/10/14 07:31:47 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3067261561485165, Global best: 0.2972671444696117, Runtime: 13.62984 seconds\n", + "2023/10/14 07:32:01 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3067851832594138, Global best: 0.2972671444696117, Runtime: 13.62566 seconds\n", + "2023/10/14 07:32:14 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3067851832594138, Global best: 0.2972671444696117, Runtime: 13.43766 seconds\n", + "2023/10/14 07:32:29 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3067851832594138, Global best: 0.2972671444696117, Runtime: 14.03520 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.8 0.8 117\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:32:32 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:32:46 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.30366019520255666, Global best: 0.30366019520255666, Runtime: 6.45802 seconds\n", + "2023/10/14 07:32:52 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.30366019520255666, Global best: 0.30366019520255666, Runtime: 6.54133 seconds\n", + "2023/10/14 07:32:59 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.30366019520255666, Global best: 0.30366019520255666, Runtime: 6.47143 seconds\n", + "2023/10/14 07:33:05 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.30366019520255666, Global best: 0.30366019520255666, Runtime: 6.45397 seconds\n", + "2023/10/14 07:33:12 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.43707 seconds\n", + "2023/10/14 07:33:18 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.46909 seconds\n", + "2023/10/14 07:33:25 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.47642 seconds\n", + "2023/10/14 07:33:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.41306 seconds\n", + "2023/10/14 07:33:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.47177 seconds\n", + "2023/10/14 07:33:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.43629 seconds\n", + "2023/10/14 07:33:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.50709 seconds\n", + "2023/10/14 07:33:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.52825 seconds\n", + "2023/10/14 07:34:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.84419 seconds\n", + "2023/10/14 07:34:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.50353 seconds\n", + "2023/10/14 07:34:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.47811 seconds\n", + "2023/10/14 07:34:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.50334 seconds\n", + "2023/10/14 07:34:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.45958 seconds\n", + "2023/10/14 07:34:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.28469160018696127, Global best: 0.28469160018696127, Runtime: 6.49265 seconds\n", + "2023/10/14 07:34:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.28119457235939915, Global best: 0.28119457235939915, Runtime: 6.51783 seconds\n", + "2023/10/14 07:34:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.28119457235939915, Global best: 0.28119457235939915, Runtime: 6.51676 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.8 0.95 108\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:34:53 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:35:07 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3082487225932347, Global best: 0.3082487225932347, Runtime: 6.42973 seconds\n", + "2023/10/14 07:35:13 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3082487225932347, Global best: 0.3082487225932347, Runtime: 6.50678 seconds\n", + "2023/10/14 07:35:20 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3047300966363822, Global best: 0.3047300966363822, Runtime: 6.46691 seconds\n", + "2023/10/14 07:35:26 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.30169753113557174, Global best: 0.30169753113557174, Runtime: 6.49564 seconds\n", + "2023/10/14 07:35:33 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.29215071481264926, Global best: 0.29215071481264926, Runtime: 6.48432 seconds\n", + "2023/10/14 07:35:39 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.28823660239632765, Global best: 0.28823660239632765, Runtime: 6.41428 seconds\n", + "2023/10/14 07:35:45 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.27765206362656064, Global best: 0.27765206362656064, Runtime: 6.42752 seconds\n", + "2023/10/14 07:35:52 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.27460104771119986, Global best: 0.27460104771119986, Runtime: 6.48338 seconds\n", + "2023/10/14 07:35:58 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2708231667684291, Global best: 0.2708231667684291, Runtime: 6.41026 seconds\n", + "2023/10/14 07:36:05 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2647256625960455, Global best: 0.2647256625960455, Runtime: 6.39225 seconds\n", + "2023/10/14 07:36:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.2635025499417106, Global best: 0.2635025499417106, Runtime: 6.44323 seconds\n", + "2023/10/14 07:36:18 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.2635025499417106, Global best: 0.2635025499417106, Runtime: 6.46815 seconds\n", + "2023/10/14 07:36:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.26002473816199445, Global best: 0.26002473816199445, Runtime: 6.79888 seconds\n", + "2023/10/14 07:36:31 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.25254011172886337, Global best: 0.25254011172886337, Runtime: 6.44374 seconds\n", + "2023/10/14 07:36:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.25254011172886337, Global best: 0.25254011172886337, Runtime: 6.42357 seconds\n", + "2023/10/14 07:36:44 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2514083286718066, Global best: 0.2514083286718066, Runtime: 6.46963 seconds\n", + "2023/10/14 07:36:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.24788099145242085, Global best: 0.24788099145242085, Runtime: 6.49950 seconds\n", + "2023/10/14 07:36:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.24631176218719206, Global best: 0.24631176218719206, Runtime: 6.48091 seconds\n", + "2023/10/14 07:37:03 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.23966486852389768, Global best: 0.23966486852389768, Runtime: 6.47396 seconds\n", + "2023/10/14 07:37:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.23966486852389768, Global best: 0.23966486852389768, Runtime: 6.41556 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.8 0.95 89\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:37:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:37:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.29891028476650544, Global best: 0.29891028476650544, Runtime: 6.47777 seconds\n", + "2023/10/14 07:37:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.284815282831296, Global best: 0.284815282831296, Runtime: 6.49826 seconds\n", + "2023/10/14 07:37:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2827966911045747, Global best: 0.2827966911045747, Runtime: 6.41537 seconds\n", + "2023/10/14 07:37:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.27885491139783836, Global best: 0.27885491139783836, Runtime: 6.44512 seconds\n", + "2023/10/14 07:37:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.27810692278585597, Global best: 0.27810692278585597, Runtime: 6.46691 seconds\n", + "2023/10/14 07:37:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.27810692278585597, Global best: 0.27810692278585597, Runtime: 6.44929 seconds\n", + "2023/10/14 07:38:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.27586942923589663, Global best: 0.27586942923589663, Runtime: 6.48267 seconds\n", + "2023/10/14 07:38:12 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.27155597454386077, Global best: 0.27155597454386077, Runtime: 6.45326 seconds\n", + "2023/10/14 07:38:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.26748368476055184, Global best: 0.26748368476055184, Runtime: 6.84423 seconds\n", + "2023/10/14 07:38:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.26748368476055184, Global best: 0.26748368476055184, Runtime: 6.50164 seconds\n", + "2023/10/14 07:38:32 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.26748368476055184, Global best: 0.26748368476055184, Runtime: 6.44131 seconds\n", + "2023/10/14 07:38:39 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2669878320064134, Global best: 0.2669878320064134, Runtime: 6.49223 seconds\n", + "2023/10/14 07:38:45 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2669878320064134, Global best: 0.2669878320064134, Runtime: 6.45675 seconds\n", + "2023/10/14 07:38:52 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.26563314354363166, Global best: 0.26563314354363166, Runtime: 6.50955 seconds\n", + "2023/10/14 07:38:58 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2595254220350848, Global best: 0.2595254220350848, Runtime: 6.43697 seconds\n", + "2023/10/14 07:39:05 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2595254220350848, Global best: 0.2595254220350848, Runtime: 6.55180 seconds\n", + "2023/10/14 07:39:11 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.25511301353973004, Global best: 0.25511301353973004, Runtime: 6.46577 seconds\n", + "2023/10/14 07:39:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2508140768248066, Global best: 0.2508140768248066, Runtime: 6.44580 seconds\n", + "2023/10/14 07:39:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2508140768248066, Global best: 0.2508140768248066, Runtime: 6.45181 seconds\n", + "2023/10/14 07:39:30 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2508140768248066, Global best: 0.2508140768248066, Runtime: 6.46588 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.8 1.0 95\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 186\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 186\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 186\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 186\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 186\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 186\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 186\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 249 / Rejected: 186\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 240 / Rejected: 195\n", + "Round 26 / Tentative (Accepted): 146 / Tentative (Not Accepted): 94 / Rejected: 195\n", + "Round 27 / Tentative (Accepted): 146 / Tentative (Not Accepted): 94 / Rejected: 195\n", + "Round 28 / Tentative (Accepted): 146 / Tentative (Not Accepted): 94 / Rejected: 195\n", + "Round 29 / Tentative (Accepted): 146 / Tentative (Not Accepted): 94 / Rejected: 195\n", + "Round 30 / Tentative (Accepted): 146 / Tentative (Not Accepted): 94 / Rejected: 195\n", + "Round 31 / Tentative (Accepted): 146 / Tentative (Not Accepted): 94 / Rejected: 195\n", + "Round 32 / Tentative (Accepted): 146 / Tentative (Not Accepted): 94 / Rejected: 195\n", + "Round 33 / Tentative (Accepted): 146 / Tentative (Not Accepted): 94 / Rejected: 195\n", + "Round 34 / Tentative (Accepted): 146 / Tentative (Not Accepted): 94 / Rejected: 195\n", + "Round 35 / Tentative (Accepted): 146 / Tentative (Not Accepted): 93 / Rejected: 196\n", + "Round 36 / Tentative (Accepted): 153 / Tentative (Not Accepted): 86 / Rejected: 196\n", + "Round 37 / Tentative (Accepted): 153 / Tentative (Not Accepted): 86 / Rejected: 196\n", + "Round 38 / Tentative (Accepted): 153 / Tentative (Not Accepted): 86 / Rejected: 196\n", + "Round 39 / Tentative (Accepted): 153 / Tentative (Not Accepted): 86 / Rejected: 196\n", + "Round 40 / Tentative (Accepted): 153 / Tentative (Not Accepted): 85 / Rejected: 197\n", + "Final Feature Set Contains 309 Features.\n", + "Control (Positive) 0.7 0.8333333333333333 938\n", + "Control (Negative) 0.5166666666666666 0.31666666666666665 938\n", + "ANOVA Base 0.75 0.8333333333333333 293\n", + "Mutual Information (10) Base 0.7 0.5333333333333333 10\n", + "RFE (10) Base 0.7333333333333334 0.8333333333333333 10\n", + "MultiSURF (10) 0.8333333333333333 0.8333333333333333 10\n", + "Mutual Information (20) Base 0.7 0.6 20\n", + "RFE (20) Base 0.8333333333333333 0.8333333333333333 20\n", + "MultiSURF (20) 0.8333333333333333 0.7 20\n", + "Mutual Information (40) Base 0.7 0.7333333333333334 40\n", + "RFE (40) Base 0.8333333333333333 0.8333333333333333 40\n", + "MultiSURF (40) 0.8333333333333333 0.7333333333333334 40\n", + "Mutual Information (60) Base 0.7 0.95 60\n", + "RFE (60) Base 0.75 0.8333333333333333 60\n", + "MultiSURF (60) 0.7833333333333333 0.8333333333333333 60\n", + "Mutual Information (80) Base 0.7 0.7833333333333333 80\n", + "RFE (80) Base 0.75 0.8333333333333333 80\n", + "MultiSURF (80) 0.8333333333333333 0.8333333333333333 80\n", + "Mutual Information (100) Base 0.7 0.8333333333333333 100\n", + "RFE (100) Base 0.75 0.8333333333333333 100\n", + "MultiSURF (100) 0.8333333333333333 0.8333333333333333 100\n", + "RFECV Base 0.8333333333333333 0.8333333333333333 18\n", + "Boruta Base 0.8333333333333333 0.8333333333333333 46\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:48:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:48:34 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3248555918846692, Global best: 0.3248555918846692, Runtime: 13.43477 seconds\n", + "2023/10/14 07:48:47 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3248555918846692, Global best: 0.3248555918846692, Runtime: 13.47329 seconds\n", + "2023/10/14 07:49:01 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3248555918846692, Global best: 0.3248555918846692, Runtime: 14.13113 seconds\n", + "2023/10/14 07:49:16 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3381759100244459, Global best: 0.3248555918846692, Runtime: 14.33258 seconds\n", + "2023/10/14 07:49:30 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33401438410532835, Global best: 0.3248555918846692, Runtime: 14.78868 seconds\n", + "2023/10/14 07:49:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.33401438410532835, Global best: 0.3248555918846692, Runtime: 14.64380 seconds\n", + "2023/10/14 07:50:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.33401438410532835, Global best: 0.3248555918846692, Runtime: 14.51228 seconds\n", + "2023/10/14 07:50:14 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.33401438410532835, Global best: 0.3248555918846692, Runtime: 14.44710 seconds\n", + "2023/10/14 07:50:29 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.33683195249571213, Global best: 0.3248555918846692, Runtime: 14.48101 seconds\n", + "2023/10/14 07:50:44 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.33683195249571213, Global best: 0.3248555918846692, Runtime: 15.24505 seconds\n", + "2023/10/14 07:50:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.33683195249571213, Global best: 0.3248555918846692, Runtime: 14.35927 seconds\n", + "2023/10/14 07:51:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.333471335005805, Global best: 0.3248555918846692, Runtime: 13.91615 seconds\n", + "2023/10/14 07:51:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.333471335005805, Global best: 0.3248555918846692, Runtime: 14.36180 seconds\n", + "2023/10/14 07:51:41 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.33005782195830924, Global best: 0.3248555918846692, Runtime: 14.58961 seconds\n", + "2023/10/14 07:51:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.33005782195830924, Global best: 0.3248555918846692, Runtime: 13.85635 seconds\n", + "2023/10/14 07:52:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.325234012760063, Global best: 0.3248555918846692, Runtime: 15.27879 seconds\n", + "2023/10/14 07:52:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.325234012760063, Global best: 0.3248555918846692, Runtime: 13.68021 seconds\n", + "2023/10/14 07:52:38 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.325234012760063, Global best: 0.3248555918846692, Runtime: 14.11451 seconds\n", + "2023/10/14 07:52:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.32519283809071264, Global best: 0.3248555918846692, Runtime: 14.58419 seconds\n", + "2023/10/14 07:53:07 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.32519283809071264, Global best: 0.3248555918846692, Runtime: 14.37555 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.75 0.8333333333333333 533\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:53:11 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:53:25 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.78435 seconds\n", + "2023/10/14 07:53:32 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.71184 seconds\n", + "2023/10/14 07:53:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.77267 seconds\n", + "2023/10/14 07:53:45 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.72653 seconds\n", + "2023/10/14 07:53:52 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.74730 seconds\n", + "2023/10/14 07:53:59 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.74994 seconds\n", + "2023/10/14 07:54:05 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.74144 seconds\n", + "2023/10/14 07:54:12 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.71986 seconds\n", + "2023/10/14 07:54:19 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.77707 seconds\n", + "2023/10/14 07:54:26 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.32751957756468403, Global best: 0.32751957756468403, Runtime: 6.72279 seconds\n", + "2023/10/14 07:54:32 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3268044076749601, Global best: 0.3268044076749601, Runtime: 6.73785 seconds\n", + "2023/10/14 07:54:39 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.31969489878201857, Global best: 0.31969489878201857, Runtime: 7.10340 seconds\n", + "2023/10/14 07:54:46 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.31969489878201857, Global best: 0.31969489878201857, Runtime: 6.73473 seconds\n", + "2023/10/14 07:54:53 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.31969489878201857, Global best: 0.31969489878201857, Runtime: 6.73020 seconds\n", + "2023/10/14 07:55:00 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.31969489878201857, Global best: 0.31969489878201857, Runtime: 6.72327 seconds\n", + "2023/10/14 07:55:06 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.31969489878201857, Global best: 0.31969489878201857, Runtime: 6.76946 seconds\n", + "2023/10/14 07:55:13 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.31969489878201857, Global best: 0.31969489878201857, Runtime: 6.75285 seconds\n", + "2023/10/14 07:55:20 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.31969489878201857, Global best: 0.31969489878201857, Runtime: 6.71229 seconds\n", + "2023/10/14 07:55:27 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.31969489878201857, Global best: 0.31969489878201857, Runtime: 6.76895 seconds\n", + "2023/10/14 07:55:33 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.31969489878201857, Global best: 0.31969489878201857, Runtime: 6.74552 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.7 0.8333333333333333 523\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:55:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:55:51 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.71374 seconds\n", + "2023/10/14 07:55:58 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.72392 seconds\n", + "2023/10/14 07:56:05 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.75161 seconds\n", + "2023/10/14 07:56:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.68636 seconds\n", + "2023/10/14 07:56:18 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.74833 seconds\n", + "2023/10/14 07:56:25 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.67975 seconds\n", + "2023/10/14 07:56:32 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.66686 seconds\n", + "2023/10/14 07:56:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.67663 seconds\n", + "2023/10/14 07:56:45 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 7.10406 seconds\n", + "2023/10/14 07:56:52 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.72468 seconds\n", + "2023/10/14 07:56:59 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.69108 seconds\n", + "2023/10/14 07:57:05 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.65817 seconds\n", + "2023/10/14 07:57:12 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.71973 seconds\n", + "2023/10/14 07:57:19 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.69035 seconds\n", + "2023/10/14 07:57:26 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.66599 seconds\n", + "2023/10/14 07:57:32 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.71387 seconds\n", + "2023/10/14 07:57:39 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.70827 seconds\n", + "2023/10/14 07:57:46 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.70533 seconds\n", + "2023/10/14 07:57:52 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.71935 seconds\n", + "2023/10/14 07:57:59 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3338399737803037, Global best: 0.3338399737803037, Runtime: 6.75320 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.7 0.8333333333333333 551\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 07:58:03 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 07:58:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.32391354577968146, Global best: 0.32391354577968146, Runtime: 6.70421 seconds\n", + "2023/10/14 07:58:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.32020435559718696, Global best: 0.32020435559718696, Runtime: 6.67752 seconds\n", + "2023/10/14 07:58:30 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.31946673154899363, Global best: 0.31946673154899363, Runtime: 6.71471 seconds\n", + "2023/10/14 07:58:37 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.3191657009031205, Global best: 0.3191657009031205, Runtime: 6.67955 seconds\n", + "2023/10/14 07:58:44 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3182942269993223, Global best: 0.3182942269993223, Runtime: 6.69460 seconds\n", + "2023/10/14 07:58:50 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.31667245710735187, Global best: 0.31667245710735187, Runtime: 6.64202 seconds\n", + "2023/10/14 07:58:57 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.66441 seconds\n", + "2023/10/14 07:59:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.65029 seconds\n", + "2023/10/14 07:59:10 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.64673 seconds\n", + "2023/10/14 07:59:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 7.05849 seconds\n", + "2023/10/14 07:59:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.61273 seconds\n", + "2023/10/14 07:59:31 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.68578 seconds\n", + "2023/10/14 07:59:37 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.66021 seconds\n", + "2023/10/14 07:59:44 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.64813 seconds\n", + "2023/10/14 07:59:51 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.65539 seconds\n", + "2023/10/14 07:59:57 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.61359 seconds\n", + "2023/10/14 08:00:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.63898 seconds\n", + "2023/10/14 08:00:11 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.65237 seconds\n", + "2023/10/14 08:00:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.63147 seconds\n", + "2023/10/14 08:00:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.30566281190112804, Global best: 0.30566281190112804, Runtime: 6.59637 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.7 0.8333333333333333 510\n", + "Triglav Stage 1 Base 0.7833333333333333 0.8333333333333333 309\n", + "Triglav MultiSURF 10 0.8333333333333333 0.8333333333333333 10\n", + "Triglav MultiSURF 20 0.8333333333333333 0.8333333333333333 20\n", + "Triglav MultiSURF 40 0.7833333333333333 0.8333333333333333 40\n", + "Triglav MultiSURF 60 0.7833333333333333 0.8333333333333333 60\n", + "Triglav MultiSURF 80 0.7833333333333333 0.8333333333333333 80\n", + "Triglav MultiSURF 100 0.7833333333333333 0.8333333333333333 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:00:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:01:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.2943139471507807, Global best: 0.2943139471507807, Runtime: 13.11754 seconds\n", + "2023/10/14 08:01:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.2943139471507807, Global best: 0.2943139471507807, Runtime: 13.00701 seconds\n", + "2023/10/14 08:01:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.2943139471507807, Global best: 0.2943139471507807, Runtime: 13.81052 seconds\n", + "2023/10/14 08:01:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.29404210472052306, Global best: 0.29404210472052306, Runtime: 13.47725 seconds\n", + "2023/10/14 08:02:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.2926707481733576, Global best: 0.2926707481733576, Runtime: 13.51244 seconds\n", + "2023/10/14 08:02:18 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.2926707481733576, Global best: 0.2926707481733576, Runtime: 13.42153 seconds\n", + "2023/10/14 08:02:32 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.2926707481733576, Global best: 0.2926707481733576, Runtime: 13.91252 seconds\n", + "2023/10/14 08:02:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.29173481329591666, Global best: 0.29173481329591666, Runtime: 14.55203 seconds\n", + "2023/10/14 08:02:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.29173481329591666, Global best: 0.29173481329591666, Runtime: 13.05066 seconds\n", + "2023/10/14 08:03:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.29173481329591666, Global best: 0.29173481329591666, Runtime: 13.68898 seconds\n", + "2023/10/14 08:03:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.29173481329591666, Global best: 0.29173481329591666, Runtime: 14.06538 seconds\n", + "2023/10/14 08:03:41 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.29173481329591666, Global best: 0.29173481329591666, Runtime: 14.50128 seconds\n", + "2023/10/14 08:03:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.29173481329591666, Global best: 0.29173481329591666, Runtime: 13.59741 seconds\n", + "2023/10/14 08:04:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.2921976791719103, Global best: 0.29173481329591666, Runtime: 13.90151 seconds\n", + "2023/10/14 08:04:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.2921976791719103, Global best: 0.29173481329591666, Runtime: 13.73465 seconds\n", + "2023/10/14 08:04:36 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.2921976791719103, Global best: 0.29173481329591666, Runtime: 13.29877 seconds\n", + "2023/10/14 08:04:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.2921976791719103, Global best: 0.29173481329591666, Runtime: 13.71554 seconds\n", + "2023/10/14 08:05:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.2921976791719103, Global best: 0.29173481329591666, Runtime: 13.89347 seconds\n", + "2023/10/14 08:05:19 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.2954221646128742, Global best: 0.29173481329591666, Runtime: 15.15359 seconds\n", + "2023/10/14 08:05:32 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.2954221646128742, Global best: 0.29173481329591666, Runtime: 13.78635 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.7833333333333333 0.8333333333333333 169\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:05:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:05:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.54041 seconds\n", + "2023/10/14 08:05:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.52245 seconds\n", + "2023/10/14 08:06:03 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.50474 seconds\n", + "2023/10/14 08:06:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.46245 seconds\n", + "2023/10/14 08:06:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.51078 seconds\n", + "2023/10/14 08:06:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.47091 seconds\n", + "2023/10/14 08:06:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.41943 seconds\n", + "2023/10/14 08:06:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.54721 seconds\n", + "2023/10/14 08:06:42 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.44421 seconds\n", + "2023/10/14 08:06:48 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.29456790228973495, Global best: 0.29456790228973495, Runtime: 6.50739 seconds\n", + "2023/10/14 08:06:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.28992572401520356, Global best: 0.28992572401520356, Runtime: 6.47523 seconds\n", + "2023/10/14 08:07:01 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2803844833498696, Global best: 0.2803844833498696, Runtime: 6.50778 seconds\n", + "2023/10/14 08:07:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2803844833498696, Global best: 0.2803844833498696, Runtime: 6.44838 seconds\n", + "2023/10/14 08:07:14 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2803844833498696, Global best: 0.2803844833498696, Runtime: 6.54045 seconds\n", + "2023/10/14 08:07:21 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2803844833498696, Global best: 0.2803844833498696, Runtime: 6.47702 seconds\n", + "2023/10/14 08:07:27 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2722541174136687, Global best: 0.2722541174136687, Runtime: 6.50599 seconds\n", + "2023/10/14 08:07:34 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2722541174136687, Global best: 0.2722541174136687, Runtime: 6.48613 seconds\n", + "2023/10/14 08:07:40 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.26975360806067367, Global best: 0.26975360806067367, Runtime: 6.53006 seconds\n", + "2023/10/14 08:07:47 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.26975360806067367, Global best: 0.26975360806067367, Runtime: 6.49763 seconds\n", + "2023/10/14 08:07:53 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.26975360806067367, Global best: 0.26975360806067367, Runtime: 6.45766 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.7833333333333333 0.8333333333333333 153\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:07:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:08:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.29850606827601195, Global best: 0.29850606827601195, Runtime: 6.87020 seconds\n", + "2023/10/14 08:08:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.29574254116988996, Global best: 0.29574254116988996, Runtime: 6.48642 seconds\n", + "2023/10/14 08:08:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.2914694838053823, Global best: 0.2914694838053823, Runtime: 6.45948 seconds\n", + "2023/10/14 08:08:30 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.2762094687068049, Global best: 0.2762094687068049, Runtime: 6.49183 seconds\n", + "2023/10/14 08:08:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.2762094687068049, Global best: 0.2762094687068049, Runtime: 6.49800 seconds\n", + "2023/10/14 08:08:43 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.27190934204173434, Global best: 0.27190934204173434, Runtime: 6.52909 seconds\n", + "2023/10/14 08:08:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.26584627505275044, Global best: 0.26584627505275044, Runtime: 6.57001 seconds\n", + "2023/10/14 08:08:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.2579457482922967, Global best: 0.2579457482922967, Runtime: 6.48409 seconds\n", + "2023/10/14 08:09:03 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2579457482922967, Global best: 0.2579457482922967, Runtime: 6.48273 seconds\n", + "2023/10/14 08:09:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2579457482922967, Global best: 0.2579457482922967, Runtime: 6.48845 seconds\n", + "2023/10/14 08:09:16 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.2579457482922967, Global best: 0.2579457482922967, Runtime: 6.51153 seconds\n", + "2023/10/14 08:09:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.2579457482922967, Global best: 0.2579457482922967, Runtime: 6.46747 seconds\n", + "2023/10/14 08:09:29 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2500288351767616, Global best: 0.2500288351767616, Runtime: 6.50722 seconds\n", + "2023/10/14 08:09:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2500288351767616, Global best: 0.2500288351767616, Runtime: 6.49039 seconds\n", + "2023/10/14 08:09:42 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.2500288351767616, Global best: 0.2500288351767616, Runtime: 6.49209 seconds\n", + "2023/10/14 08:09:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2491165780577343, Global best: 0.2491165780577343, Runtime: 6.49647 seconds\n", + "2023/10/14 08:09:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2455606744284214, Global best: 0.2455606744284214, Runtime: 6.53073 seconds\n", + "2023/10/14 08:10:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.2455606744284214, Global best: 0.2455606744284214, Runtime: 6.54670 seconds\n", + "2023/10/14 08:10:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.2385530572750976, Global best: 0.2385530572750976, Runtime: 6.44224 seconds\n", + "2023/10/14 08:10:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.2385530572750976, Global best: 0.2385530572750976, Runtime: 6.50412 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.7833333333333333 0.8333333333333333 133\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:10:18 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:10:32 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.28458099737987363, Global best: 0.28458099737987363, Runtime: 6.47872 seconds\n", + "2023/10/14 08:10:38 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.28236437344605986, Global best: 0.28236437344605986, Runtime: 6.54837 seconds\n", + "2023/10/14 08:10:45 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2811736161694308, Global best: 0.2811736161694308, Runtime: 6.46491 seconds\n", + "2023/10/14 08:10:51 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2761575737351608, Global best: 0.2761575737351608, Runtime: 6.51371 seconds\n", + "2023/10/14 08:10:58 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2747748934639765, Global best: 0.2747748934639765, Runtime: 6.49868 seconds\n", + "2023/10/14 08:11:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.2646232137459682, Global best: 0.2646232137459682, Runtime: 6.52731 seconds\n", + "2023/10/14 08:11:11 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2646232137459682, Global best: 0.2646232137459682, Runtime: 6.47243 seconds\n", + "2023/10/14 08:11:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.26347431740994404, Global best: 0.26347431740994404, Runtime: 6.47354 seconds\n", + "2023/10/14 08:11:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.26338887699306623, Global best: 0.26338887699306623, Runtime: 6.42585 seconds\n", + "2023/10/14 08:11:30 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.25495794090846036, Global best: 0.25495794090846036, Runtime: 6.48277 seconds\n", + "2023/10/14 08:11:37 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.25495794090846036, Global best: 0.25495794090846036, Runtime: 6.84454 seconds\n", + "2023/10/14 08:11:44 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.25477793215062094, Global best: 0.25477793215062094, Runtime: 6.51960 seconds\n", + "2023/10/14 08:11:50 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.25364294149963107, Global best: 0.25364294149963107, Runtime: 6.51478 seconds\n", + "2023/10/14 08:11:57 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2535192356715787, Global best: 0.2535192356715787, Runtime: 6.46348 seconds\n", + "2023/10/14 08:12:03 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2535192356715787, Global best: 0.2535192356715787, Runtime: 6.48327 seconds\n", + "2023/10/14 08:12:10 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2476568216041666, Global best: 0.2476568216041666, Runtime: 6.48535 seconds\n", + "2023/10/14 08:12:16 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2476568216041666, Global best: 0.2476568216041666, Runtime: 6.49668 seconds\n", + "2023/10/14 08:12:23 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2476568216041666, Global best: 0.2476568216041666, Runtime: 6.50464 seconds\n", + "2023/10/14 08:12:29 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2476568216041666, Global best: 0.2476568216041666, Runtime: 6.50047 seconds\n", + "2023/10/14 08:12:36 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2469137701042551, Global best: 0.2469137701042551, Runtime: 6.48020 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.7833333333333333 0.8333333333333333 141\n", + "1\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 258 / Rejected: 210\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 258 / Rejected: 210\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 258 / Rejected: 210\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 258 / Rejected: 210\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 258 / Rejected: 210\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 258 / Rejected: 210\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 258 / Rejected: 210\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 258 / Rejected: 210\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 258 / Rejected: 210\n", + "Round 26 / Tentative (Accepted): 142 / Tentative (Not Accepted): 116 / Rejected: 210\n", + "Round 27 / Tentative (Accepted): 142 / Tentative (Not Accepted): 116 / Rejected: 210\n", + "Round 28 / Tentative (Accepted): 142 / Tentative (Not Accepted): 116 / Rejected: 210\n", + "Round 29 / Tentative (Accepted): 142 / Tentative (Not Accepted): 116 / Rejected: 210\n", + "Round 30 / Tentative (Accepted): 142 / Tentative (Not Accepted): 116 / Rejected: 210\n", + "Round 31 / Tentative (Accepted): 142 / Tentative (Not Accepted): 116 / Rejected: 210\n", + "Round 32 / Tentative (Accepted): 142 / Tentative (Not Accepted): 116 / Rejected: 210\n", + "Round 33 / Tentative (Accepted): 142 / Tentative (Not Accepted): 116 / Rejected: 210\n", + "Round 34 / Tentative (Accepted): 142 / Tentative (Not Accepted): 115 / Rejected: 211\n", + "Round 35 / Tentative (Accepted): 142 / Tentative (Not Accepted): 115 / Rejected: 211\n", + "Round 36 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 215\n", + "Round 37 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 215\n", + "Round 38 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 215\n", + "Round 39 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 215\n", + "Round 40 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 215\n", + "Final Feature Set Contains 280 Features.\n", + "Control (Positive) 0.9375 0.875 938\n", + "Control (Negative) 0.5625 0.5 938\n", + "ANOVA Base 0.9375 0.875 259\n", + "Mutual Information (10) Base 0.9375 0.6875 10\n", + "RFE (10) Base 0.875 0.75 10\n", + "MultiSURF (10) 0.875 0.8125 10\n", + "Mutual Information (20) Base 1.0 0.875 20\n", + "RFE (20) Base 0.9375 0.75 20\n", + "MultiSURF (20) 0.9375 0.75 20\n", + "Mutual Information (40) Base 0.9375 0.8125 40\n", + "RFE (40) Base 0.9375 0.875 40\n", + "MultiSURF (40) 0.9375 0.875 40\n", + "Mutual Information (60) Base 0.9375 0.75 60\n", + "RFE (60) Base 0.9375 0.875 60\n", + "MultiSURF (60) 0.9375 0.875 60\n", + "Mutual Information (80) Base 0.875 0.75 80\n", + "RFE (80) Base 0.9375 0.9375 80\n", + "MultiSURF (80) 0.9375 0.875 80\n", + "Mutual Information (100) Base 0.875 0.6875 100\n", + "RFE (100) Base 0.9375 0.875 100\n", + "MultiSURF (100) 0.9375 0.9375 100\n", + "RFECV Base 0.9375 0.875 110\n", + "Boruta Base 0.9375 0.9375 44\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:21:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:21:48 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.31812358403931695, Global best: 0.31812358403931695, Runtime: 13.43378 seconds\n", + "2023/10/14 08:22:01 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.31812358403931695, Global best: 0.31812358403931695, Runtime: 13.26292 seconds\n", + "2023/10/14 08:22:15 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.31812358403931695, Global best: 0.31812358403931695, Runtime: 13.84141 seconds\n", + "2023/10/14 08:22:29 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3306477895564621, Global best: 0.31812358403931695, Runtime: 14.20157 seconds\n", + "2023/10/14 08:22:43 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3351021308472875, Global best: 0.31812358403931695, Runtime: 13.81359 seconds\n", + "2023/10/14 08:22:57 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3370685018148484, Global best: 0.31812358403931695, Runtime: 14.23080 seconds\n", + "2023/10/14 08:23:11 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3360921976089467, Global best: 0.31812358403931695, Runtime: 14.01563 seconds\n", + "2023/10/14 08:23:25 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3328342130393373, Global best: 0.31812358403931695, Runtime: 13.81087 seconds\n", + "2023/10/14 08:23:39 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.33225971648558744, Global best: 0.31812358403931695, Runtime: 13.75914 seconds\n", + "2023/10/14 08:23:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3230088993025507, Global best: 0.31812358403931695, Runtime: 14.73889 seconds\n", + "2023/10/14 08:24:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.31556692026153155, Global best: 0.31556692026153155, Runtime: 15.19807 seconds\n", + "2023/10/14 08:24:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.31267109732229076, Global best: 0.31267109732229076, Runtime: 13.65730 seconds\n", + "2023/10/14 08:24:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.31267109732229076, Global best: 0.31267109732229076, Runtime: 14.88986 seconds\n", + "2023/10/14 08:24:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.31556692026153155, Global best: 0.31267109732229076, Runtime: 14.17067 seconds\n", + "2023/10/14 08:25:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.31556692026153155, Global best: 0.31267109732229076, Runtime: 13.67593 seconds\n", + "2023/10/14 08:25:19 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.32656708863864786, Global best: 0.31267109732229076, Runtime: 14.06914 seconds\n", + "2023/10/14 08:25:34 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.32656708863864786, Global best: 0.31267109732229076, Runtime: 14.84548 seconds\n", + "2023/10/14 08:25:48 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.32587100571000027, Global best: 0.31267109732229076, Runtime: 14.46620 seconds\n", + "2023/10/14 08:26:03 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.32587100571000027, Global best: 0.31267109732229076, Runtime: 14.51803 seconds\n", + "2023/10/14 08:26:17 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.32587100571000027, Global best: 0.31267109732229076, Runtime: 14.29384 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.9375 0.875 547\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:26:21 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:26:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.76570 seconds\n", + "2023/10/14 08:26:42 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.73555 seconds\n", + "2023/10/14 08:26:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.66980 seconds\n", + "2023/10/14 08:26:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.73566 seconds\n", + "2023/10/14 08:27:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.69028 seconds\n", + "2023/10/14 08:27:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.72809 seconds\n", + "2023/10/14 08:27:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.74437 seconds\n", + "2023/10/14 08:27:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.73060 seconds\n", + "2023/10/14 08:27:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.79342 seconds\n", + "2023/10/14 08:27:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.32170974927479407, Global best: 0.32170974927479407, Runtime: 6.79155 seconds\n", + "2023/10/14 08:27:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.31971071503952164, Global best: 0.31971071503952164, Runtime: 6.76575 seconds\n", + "2023/10/14 08:27:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.31411247370055206, Global best: 0.31411247370055206, Runtime: 6.77018 seconds\n", + "2023/10/14 08:27:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.31411247370055206, Global best: 0.31411247370055206, Runtime: 6.72514 seconds\n", + "2023/10/14 08:28:03 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.31411247370055206, Global best: 0.31411247370055206, Runtime: 6.71872 seconds\n", + "2023/10/14 08:28:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.31411247370055206, Global best: 0.31411247370055206, Runtime: 7.08730 seconds\n", + "2023/10/14 08:28:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.31411247370055206, Global best: 0.31411247370055206, Runtime: 6.74633 seconds\n", + "2023/10/14 08:28:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.30652365625822664, Global best: 0.30652365625822664, Runtime: 6.68433 seconds\n", + "2023/10/14 08:28:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.30652365625822664, Global best: 0.30652365625822664, Runtime: 6.73242 seconds\n", + "2023/10/14 08:28:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.30652365625822664, Global best: 0.30652365625822664, Runtime: 6.70810 seconds\n", + "2023/10/14 08:28:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.30652365625822664, Global best: 0.30652365625822664, Runtime: 6.74274 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.9375 0.875 532\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:28:47 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:29:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.32134453445760974, Global best: 0.32134453445760974, Runtime: 6.67154 seconds\n", + "2023/10/14 08:29:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.32134453445760974, Global best: 0.32134453445760974, Runtime: 6.70923 seconds\n", + "2023/10/14 08:29:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.32134453445760974, Global best: 0.32134453445760974, Runtime: 6.66621 seconds\n", + "2023/10/14 08:29:21 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.32134453445760974, Global best: 0.32134453445760974, Runtime: 6.66199 seconds\n", + "2023/10/14 08:29:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.32134453445760974, Global best: 0.32134453445760974, Runtime: 6.69931 seconds\n", + "2023/10/14 08:29:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.66935 seconds\n", + "2023/10/14 08:29:42 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.74164 seconds\n", + "2023/10/14 08:29:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.66030 seconds\n", + "2023/10/14 08:29:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.61879 seconds\n", + "2023/10/14 08:30:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.63543 seconds\n", + "2023/10/14 08:30:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.74976 seconds\n", + "2023/10/14 08:30:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.72437 seconds\n", + "2023/10/14 08:30:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.64614 seconds\n", + "2023/10/14 08:30:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.70539 seconds\n", + "2023/10/14 08:30:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.68672 seconds\n", + "2023/10/14 08:30:42 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.64659 seconds\n", + "2023/10/14 08:30:49 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 7.10409 seconds\n", + "2023/10/14 08:30:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.72160 seconds\n", + "2023/10/14 08:31:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.72224 seconds\n", + "2023/10/14 08:31:09 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3204673799709454, Global best: 0.3204673799709454, Runtime: 6.68406 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.9375 0.875 584\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:31:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:31:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.30410805896334453, Global best: 0.30410805896334453, Runtime: 6.71713 seconds\n", + "2023/10/14 08:31:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.30410805896334453, Global best: 0.30410805896334453, Runtime: 6.65139 seconds\n", + "2023/10/14 08:31:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.30410805896334453, Global best: 0.30410805896334453, Runtime: 6.66908 seconds\n", + "2023/10/14 08:31:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.30410805896334453, Global best: 0.30410805896334453, Runtime: 6.67336 seconds\n", + "2023/10/14 08:31:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.30410805896334453, Global best: 0.30410805896334453, Runtime: 6.68319 seconds\n", + "2023/10/14 08:32:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.30410805896334453, Global best: 0.30410805896334453, Runtime: 6.62460 seconds\n", + "2023/10/14 08:32:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.30210695269550303, Global best: 0.30210695269550303, Runtime: 6.63269 seconds\n", + "2023/10/14 08:32:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.30210695269550303, Global best: 0.30210695269550303, Runtime: 6.69270 seconds\n", + "2023/10/14 08:32:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.30210695269550303, Global best: 0.30210695269550303, Runtime: 6.66758 seconds\n", + "2023/10/14 08:32:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.30210695269550303, Global best: 0.30210695269550303, Runtime: 6.69756 seconds\n", + "2023/10/14 08:32:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.30042135365666944, Global best: 0.30042135365666944, Runtime: 6.67906 seconds\n", + "2023/10/14 08:32:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2906876363891334, Global best: 0.2906876363891334, Runtime: 7.01179 seconds\n", + "2023/10/14 08:32:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2906876363891334, Global best: 0.2906876363891334, Runtime: 6.69275 seconds\n", + "2023/10/14 08:32:54 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2906876363891334, Global best: 0.2906876363891334, Runtime: 6.70538 seconds\n", + "2023/10/14 08:33:01 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2906876363891334, Global best: 0.2906876363891334, Runtime: 6.67090 seconds\n", + "2023/10/14 08:33:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2906876363891334, Global best: 0.2906876363891334, Runtime: 6.74228 seconds\n", + "2023/10/14 08:33:14 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2906876363891334, Global best: 0.2906876363891334, Runtime: 6.72655 seconds\n", + "2023/10/14 08:33:21 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2906876363891334, Global best: 0.2906876363891334, Runtime: 6.57695 seconds\n", + "2023/10/14 08:33:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2906876363891334, Global best: 0.2906876363891334, Runtime: 6.69240 seconds\n", + "2023/10/14 08:33:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2906876363891334, Global best: 0.2906876363891334, Runtime: 6.67120 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.9375 0.9375 533\n", + "Triglav Stage 1 Base 0.875 0.875 280\n", + "Triglav MultiSURF 10 0.8125 0.8125 10\n", + "Triglav MultiSURF 20 0.875 0.9375 20\n", + "Triglav MultiSURF 40 0.875 0.8125 40\n", + "Triglav MultiSURF 60 0.875 0.8125 60\n", + "Triglav MultiSURF 80 0.875 0.9375 80\n", + "Triglav MultiSURF 100 0.875 1.0 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:34:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:34:20 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.309387018597074, Global best: 0.309387018597074, Runtime: 12.99068 seconds\n", + "2023/10/14 08:34:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3080134302149871, Global best: 0.3080134302149871, Runtime: 12.93021 seconds\n", + "2023/10/14 08:34:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3016751974744202, Global best: 0.3016751974744202, Runtime: 12.94886 seconds\n", + "2023/10/14 08:35:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.29893270116248094, Global best: 0.29893270116248094, Runtime: 13.84488 seconds\n", + "2023/10/14 08:35:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.29893270116248094, Global best: 0.29893270116248094, Runtime: 13.66554 seconds\n", + "2023/10/14 08:35:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.29893270116248094, Global best: 0.29893270116248094, Runtime: 13.19847 seconds\n", + "2023/10/14 08:35:41 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.2903196305731837, Global best: 0.2903196305731837, Runtime: 14.92110 seconds\n", + "2023/10/14 08:35:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.2903196305731837, Global best: 0.2903196305731837, Runtime: 13.98760 seconds\n", + "2023/10/14 08:36:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.2903196305731837, Global best: 0.2903196305731837, Runtime: 13.79621 seconds\n", + "2023/10/14 08:36:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.2903196305731837, Global best: 0.2903196305731837, Runtime: 13.35727 seconds\n", + "2023/10/14 08:36:36 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.31061198036261695, Global best: 0.2903196305731837, Runtime: 13.82358 seconds\n", + "2023/10/14 08:36:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.31176697461200964, Global best: 0.2903196305731837, Runtime: 13.47588 seconds\n", + "2023/10/14 08:37:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3101986851187138, Global best: 0.2903196305731837, Runtime: 14.20296 seconds\n", + "2023/10/14 08:37:18 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3101986851187138, Global best: 0.2903196305731837, Runtime: 14.05265 seconds\n", + "2023/10/14 08:37:31 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3101986851187138, Global best: 0.2903196305731837, Runtime: 13.20258 seconds\n", + "2023/10/14 08:37:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3101986851187138, Global best: 0.2903196305731837, Runtime: 13.57924 seconds\n", + "2023/10/14 08:37:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.30821075047718344, Global best: 0.2903196305731837, Runtime: 14.02102 seconds\n", + "2023/10/14 08:38:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3048892622886221, Global best: 0.2903196305731837, Runtime: 13.86709 seconds\n", + "2023/10/14 08:38:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3048892622886221, Global best: 0.2903196305731837, Runtime: 13.40909 seconds\n", + "2023/10/14 08:38:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3048892622886221, Global best: 0.2903196305731837, Runtime: 13.81598 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.875 0.8125 145\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:38:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:38:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.51668 seconds\n", + "2023/10/14 08:39:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.43156 seconds\n", + "2023/10/14 08:39:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.50690 seconds\n", + "2023/10/14 08:39:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.48925 seconds\n", + "2023/10/14 08:39:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.42951 seconds\n", + "2023/10/14 08:39:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.53992 seconds\n", + "2023/10/14 08:39:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.45107 seconds\n", + "2023/10/14 08:39:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.44732 seconds\n", + "2023/10/14 08:39:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.44043 seconds\n", + "2023/10/14 08:39:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.44961 seconds\n", + "2023/10/14 08:40:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.51905 seconds\n", + "2023/10/14 08:40:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.43919 seconds\n", + "2023/10/14 08:40:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.86350 seconds\n", + "2023/10/14 08:40:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.50054 seconds\n", + "2023/10/14 08:40:28 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.38876 seconds\n", + "2023/10/14 08:40:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.48585 seconds\n", + "2023/10/14 08:40:41 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.47530 seconds\n", + "2023/10/14 08:40:48 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.47562 seconds\n", + "2023/10/14 08:40:54 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2914098845551094, Global best: 0.2914098845551094, Runtime: 6.46976 seconds\n", + "2023/10/14 08:41:01 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2845987396711031, Global best: 0.2845987396711031, Runtime: 6.49025 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.875 0.875 146\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:41:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:41:18 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.29497487923648036, Global best: 0.29497487923648036, Runtime: 6.49014 seconds\n", + "2023/10/14 08:41:25 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.29497487923648036, Global best: 0.29497487923648036, Runtime: 6.49796 seconds\n", + "2023/10/14 08:41:31 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.29497487923648036, Global best: 0.29497487923648036, Runtime: 6.54671 seconds\n", + "2023/10/14 08:41:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.28034707895240774, Global best: 0.28034707895240774, Runtime: 6.50343 seconds\n", + "2023/10/14 08:41:44 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.28034707895240774, Global best: 0.28034707895240774, Runtime: 6.57602 seconds\n", + "2023/10/14 08:41:51 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.28034707895240774, Global best: 0.28034707895240774, Runtime: 6.50260 seconds\n", + "2023/10/14 08:41:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.28034707895240774, Global best: 0.28034707895240774, Runtime: 6.46886 seconds\n", + "2023/10/14 08:42:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.27639192805320967, Global best: 0.27639192805320967, Runtime: 6.53141 seconds\n", + "2023/10/14 08:42:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.27475941471729115, Global best: 0.27475941471729115, Runtime: 6.89088 seconds\n", + "2023/10/14 08:42:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2663314905771158, Global best: 0.2663314905771158, Runtime: 6.47985 seconds\n", + "2023/10/14 08:42:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.2663314905771158, Global best: 0.2663314905771158, Runtime: 6.45845 seconds\n", + "2023/10/14 08:42:30 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.26483030399324026, Global best: 0.26483030399324026, Runtime: 6.49091 seconds\n", + "2023/10/14 08:42:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.26483030399324026, Global best: 0.26483030399324026, Runtime: 6.50657 seconds\n", + "2023/10/14 08:42:43 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.26483030399324026, Global best: 0.26483030399324026, Runtime: 6.52408 seconds\n", + "2023/10/14 08:42:49 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.26483030399324026, Global best: 0.26483030399324026, Runtime: 6.43577 seconds\n", + "2023/10/14 08:42:56 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.26483030399324026, Global best: 0.26483030399324026, Runtime: 6.54276 seconds\n", + "2023/10/14 08:43:03 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2612793824385382, Global best: 0.2612793824385382, Runtime: 6.57380 seconds\n", + "2023/10/14 08:43:09 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.2612793824385382, Global best: 0.2612793824385382, Runtime: 6.48700 seconds\n", + "2023/10/14 08:43:16 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.2612793824385382, Global best: 0.2612793824385382, Runtime: 6.49007 seconds\n", + "2023/10/14 08:43:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.2612793824385382, Global best: 0.2612793824385382, Runtime: 6.43787 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.875 0.875 134\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:43:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:43:39 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2938679709867218, Global best: 0.2938679709867218, Runtime: 6.48530 seconds\n", + "2023/10/14 08:43:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.28498342737880505, Global best: 0.28498342737880505, Runtime: 6.48274 seconds\n", + "2023/10/14 08:43:52 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2806239686117816, Global best: 0.2806239686117816, Runtime: 6.47521 seconds\n", + "2023/10/14 08:43:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2806239686117816, Global best: 0.2806239686117816, Runtime: 6.48842 seconds\n", + "2023/10/14 08:44:05 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2740617436256063, Global best: 0.2740617436256063, Runtime: 6.47051 seconds\n", + "2023/10/14 08:44:12 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.2740617436256063, Global best: 0.2740617436256063, Runtime: 6.45062 seconds\n", + "2023/10/14 08:44:18 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.26891435319581464, Global best: 0.26891435319581464, Runtime: 6.51230 seconds\n", + "2023/10/14 08:44:25 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2677130537077321, Global best: 0.2677130537077321, Runtime: 6.46973 seconds\n", + "2023/10/14 08:44:32 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.26599336683036523, Global best: 0.26599336683036523, Runtime: 6.82717 seconds\n", + "2023/10/14 08:44:38 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2654549134795241, Global best: 0.2654549134795241, Runtime: 6.49846 seconds\n", + "2023/10/14 08:44:45 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.25898217276366353, Global best: 0.25898217276366353, Runtime: 6.52077 seconds\n", + "2023/10/14 08:44:51 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2509140993363588, Global best: 0.2509140993363588, Runtime: 6.48948 seconds\n", + "2023/10/14 08:44:58 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2509140993363588, Global best: 0.2509140993363588, Runtime: 6.46733 seconds\n", + "2023/10/14 08:45:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.24542347255213437, Global best: 0.24542347255213437, Runtime: 6.47211 seconds\n", + "2023/10/14 08:45:11 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.24542347255213437, Global best: 0.24542347255213437, Runtime: 6.45323 seconds\n", + "2023/10/14 08:45:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.24360694706205627, Global best: 0.24360694706205627, Runtime: 6.49033 seconds\n", + "2023/10/14 08:45:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.24089700550735407, Global best: 0.24089700550735407, Runtime: 6.51938 seconds\n", + "2023/10/14 08:45:30 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.24089700550735407, Global best: 0.24089700550735407, Runtime: 6.51734 seconds\n", + "2023/10/14 08:45:37 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.24089700550735407, Global best: 0.24089700550735407, Runtime: 6.51034 seconds\n", + "2023/10/14 08:45:43 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.24089700550735407, Global best: 0.24089700550735407, Runtime: 6.46793 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.875 0.875 121\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 459 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 213\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 213\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 213\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 213\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 213\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 213\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 213\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 246 / Rejected: 213\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 236 / Rejected: 223\n", + "Round 26 / Tentative (Accepted): 133 / Tentative (Not Accepted): 103 / Rejected: 223\n", + "Round 27 / Tentative (Accepted): 133 / Tentative (Not Accepted): 103 / Rejected: 223\n", + "Round 28 / Tentative (Accepted): 133 / Tentative (Not Accepted): 103 / Rejected: 223\n", + "Round 29 / Tentative (Accepted): 133 / Tentative (Not Accepted): 103 / Rejected: 223\n", + "Round 30 / Tentative (Accepted): 133 / Tentative (Not Accepted): 103 / Rejected: 223\n", + "Round 31 / Tentative (Accepted): 133 / Tentative (Not Accepted): 100 / Rejected: 226\n", + "Round 32 / Tentative (Accepted): 133 / Tentative (Not Accepted): 100 / Rejected: 226\n", + "Round 33 / Tentative (Accepted): 133 / Tentative (Not Accepted): 100 / Rejected: 226\n", + "Round 34 / Tentative (Accepted): 133 / Tentative (Not Accepted): 100 / Rejected: 226\n", + "Round 35 / Tentative (Accepted): 133 / Tentative (Not Accepted): 100 / Rejected: 226\n", + "Round 36 / Tentative (Accepted): 143 / Tentative (Not Accepted): 90 / Rejected: 226\n", + "Round 37 / Tentative (Accepted): 143 / Tentative (Not Accepted): 90 / Rejected: 226\n", + "Round 38 / Tentative (Accepted): 143 / Tentative (Not Accepted): 90 / Rejected: 226\n", + "Round 39 / Tentative (Accepted): 143 / Tentative (Not Accepted): 90 / Rejected: 226\n", + "Round 40 / Tentative (Accepted): 143 / Tentative (Not Accepted): 90 / Rejected: 226\n", + "Final Feature Set Contains 281 Features.\n", + "Control (Positive) 0.7916666666666667 0.875 938\n", + "Control (Negative) 0.25 0.33333333333333337 938\n", + "ANOVA Base 0.9166666666666667 0.875 289\n", + "Mutual Information (10) Base 0.7916666666666667 0.625 10\n", + "RFE (10) Base 0.875 0.9166666666666667 10\n", + "MultiSURF (10) 0.9166666666666667 0.9166666666666667 10\n", + "Mutual Information (20) Base 0.75 0.625 20\n", + "RFE (20) Base 0.9166666666666667 0.875 20\n", + "MultiSURF (20) 0.7916666666666667 0.9166666666666667 20\n", + "Mutual Information (40) Base 0.875 0.8333333333333333 40\n", + "RFE (40) Base 0.9166666666666667 0.875 40\n", + "MultiSURF (40) 0.9166666666666667 0.875 40\n", + "Mutual Information (60) Base 0.875 0.875 60\n", + "RFE (60) Base 0.9166666666666667 0.875 60\n", + "MultiSURF (60) 0.9166666666666667 0.75 60\n", + "Mutual Information (80) Base 0.875 0.875 80\n", + "RFE (80) Base 0.9166666666666667 0.875 80\n", + "MultiSURF (80) 0.9166666666666667 0.875 80\n", + "Mutual Information (100) Base 0.875 0.8333333333333333 100\n", + "RFE (100) Base 0.9166666666666667 0.875 100\n", + "MultiSURF (100) 0.9166666666666667 0.875 100\n", + "RFECV Base 0.9166666666666667 0.875 110\n", + "Boruta Base 0.9166666666666667 0.875 51\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:54:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:54:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3388252860191754, Global best: 0.3388252860191754, Runtime: 13.44656 seconds\n", + "2023/10/14 08:54:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3388252860191754, Global best: 0.3388252860191754, Runtime: 13.32983 seconds\n", + "2023/10/14 08:55:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3388252860191754, Global best: 0.3388252860191754, Runtime: 13.71039 seconds\n", + "2023/10/14 08:55:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.348821844790863, Global best: 0.3388252860191754, Runtime: 15.13732 seconds\n", + "2023/10/14 08:55:42 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.348821844790863, Global best: 0.3388252860191754, Runtime: 14.51503 seconds\n", + "2023/10/14 08:55:57 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3464706579997276, Global best: 0.3388252860191754, Runtime: 14.73122 seconds\n", + "2023/10/14 08:56:11 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3464706579997276, Global best: 0.3388252860191754, Runtime: 14.00937 seconds\n", + "2023/10/14 08:56:25 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3464706579997276, Global best: 0.3388252860191754, Runtime: 14.27819 seconds\n", + "2023/10/14 08:56:39 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3464706579997276, Global best: 0.3388252860191754, Runtime: 14.55128 seconds\n", + "2023/10/14 08:56:54 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3464706579997276, Global best: 0.3388252860191754, Runtime: 14.99305 seconds\n", + "2023/10/14 08:57:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.34384207952683093, Global best: 0.3388252860191754, Runtime: 14.11357 seconds\n", + "2023/10/14 08:57:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.34384207952683093, Global best: 0.3388252860191754, Runtime: 14.31173 seconds\n", + "2023/10/14 08:57:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.34384207952683093, Global best: 0.3388252860191754, Runtime: 14.24510 seconds\n", + "2023/10/14 08:57:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.34384207952683093, Global best: 0.3388252860191754, Runtime: 14.04709 seconds\n", + "2023/10/14 08:58:06 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.34574541349127, Global best: 0.3388252860191754, Runtime: 15.10983 seconds\n", + "2023/10/14 08:58:21 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.34574541349127, Global best: 0.3388252860191754, Runtime: 14.55929 seconds\n", + "2023/10/14 08:58:35 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.34574541349127, Global best: 0.3388252860191754, Runtime: 14.26767 seconds\n", + "2023/10/14 08:58:49 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.34488583650946225, Global best: 0.3388252860191754, Runtime: 14.31492 seconds\n", + "2023/10/14 08:59:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3402405884967521, Global best: 0.3388252860191754, Runtime: 14.66308 seconds\n", + "2023/10/14 08:59:18 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3402405884967521, Global best: 0.3388252860191754, Runtime: 13.84482 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.8333333333333333 0.75 535\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 08:59:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 08:59:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3358996611628831, Global best: 0.3358996611628831, Runtime: 6.78294 seconds\n", + "2023/10/14 08:59:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3358996611628831, Global best: 0.3358996611628831, Runtime: 6.73124 seconds\n", + "2023/10/14 08:59:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3358996611628831, Global best: 0.3358996611628831, Runtime: 6.73055 seconds\n", + "2023/10/14 08:59:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3358996611628831, Global best: 0.3358996611628831, Runtime: 6.68472 seconds\n", + "2023/10/14 09:00:03 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.33583441575755446, Global best: 0.33583441575755446, Runtime: 6.70628 seconds\n", + "2023/10/14 09:00:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.33583441575755446, Global best: 0.33583441575755446, Runtime: 6.70835 seconds\n", + "2023/10/14 09:00:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.33583441575755446, Global best: 0.33583441575755446, Runtime: 6.71967 seconds\n", + "2023/10/14 09:00:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.33583441575755446, Global best: 0.33583441575755446, Runtime: 7.06261 seconds\n", + "2023/10/14 09:00:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.33583441575755446, Global best: 0.33583441575755446, Runtime: 6.75254 seconds\n", + "2023/10/14 09:00:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.332661345910035, Global best: 0.332661345910035, Runtime: 6.71897 seconds\n", + "2023/10/14 09:00:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.332661345910035, Global best: 0.332661345910035, Runtime: 6.72511 seconds\n", + "2023/10/14 09:00:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.332661345910035, Global best: 0.332661345910035, Runtime: 6.76868 seconds\n", + "2023/10/14 09:00:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.332661345910035, Global best: 0.332661345910035, Runtime: 6.75070 seconds\n", + "2023/10/14 09:01:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.332661345910035, Global best: 0.332661345910035, Runtime: 6.72527 seconds\n", + "2023/10/14 09:01:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.332661345910035, Global best: 0.332661345910035, Runtime: 6.69311 seconds\n", + "2023/10/14 09:01:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3315993649048945, Global best: 0.3315993649048945, Runtime: 6.66086 seconds\n", + "2023/10/14 09:01:24 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3315993649048945, Global best: 0.3315993649048945, Runtime: 6.71866 seconds\n", + "2023/10/14 09:01:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3315993649048945, Global best: 0.3315993649048945, Runtime: 6.68772 seconds\n", + "2023/10/14 09:01:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3315993649048945, Global best: 0.3315993649048945, Runtime: 6.67182 seconds\n", + "2023/10/14 09:01:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3304084052388667, Global best: 0.3304084052388667, Runtime: 6.72875 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.75 0.75 514\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:01:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:02:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3346186694241099, Global best: 0.3346186694241099, Runtime: 6.72715 seconds\n", + "2023/10/14 09:02:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3346186694241099, Global best: 0.3346186694241099, Runtime: 6.66602 seconds\n", + "2023/10/14 09:02:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3323283596882485, Global best: 0.3323283596882485, Runtime: 6.68770 seconds\n", + "2023/10/14 09:02:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3323283596882485, Global best: 0.3323283596882485, Runtime: 6.71066 seconds\n", + "2023/10/14 09:02:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3280231844120948, Global best: 0.3280231844120948, Runtime: 6.65995 seconds\n", + "2023/10/14 09:02:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3280231844120948, Global best: 0.3280231844120948, Runtime: 6.68898 seconds\n", + "2023/10/14 09:02:42 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3280231844120948, Global best: 0.3280231844120948, Runtime: 6.69529 seconds\n", + "2023/10/14 09:02:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3280231844120948, Global best: 0.3280231844120948, Runtime: 6.68054 seconds\n", + "2023/10/14 09:02:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3280231844120948, Global best: 0.3280231844120948, Runtime: 6.68318 seconds\n", + "2023/10/14 09:03:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3280231844120948, Global best: 0.3280231844120948, Runtime: 7.10216 seconds\n", + "2023/10/14 09:03:09 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.68055 seconds\n", + "2023/10/14 09:03:16 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.68789 seconds\n", + "2023/10/14 09:03:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.72106 seconds\n", + "2023/10/14 09:03:29 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.70056 seconds\n", + "2023/10/14 09:03:36 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.66644 seconds\n", + "2023/10/14 09:03:42 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.65284 seconds\n", + "2023/10/14 09:03:49 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.67393 seconds\n", + "2023/10/14 09:03:56 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.67466 seconds\n", + "2023/10/14 09:04:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.64723 seconds\n", + "2023/10/14 09:04:09 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3276362417349438, Global best: 0.3276362417349438, Runtime: 6.66955 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.7916666666666667 0.75 512\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:04:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:04:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.333728798346049, Global best: 0.333728798346049, Runtime: 6.63589 seconds\n", + "2023/10/14 09:04:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3254572102718137, Global best: 0.3254572102718137, Runtime: 6.67114 seconds\n", + "2023/10/14 09:04:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3254572102718137, Global best: 0.3254572102718137, Runtime: 6.63075 seconds\n", + "2023/10/14 09:04:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.3254572102718137, Global best: 0.3254572102718137, Runtime: 6.62647 seconds\n", + "2023/10/14 09:04:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3237454605697416, Global best: 0.3237454605697416, Runtime: 6.68714 seconds\n", + "2023/10/14 09:05:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3216288422583589, Global best: 0.3216288422583589, Runtime: 6.65777 seconds\n", + "2023/10/14 09:05:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.321114720968528, Global best: 0.321114720968528, Runtime: 6.66137 seconds\n", + "2023/10/14 09:05:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.32038471224882525, Global best: 0.32038471224882525, Runtime: 6.59030 seconds\n", + "2023/10/14 09:05:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.31911565216541793, Global best: 0.31911565216541793, Runtime: 6.64597 seconds\n", + "2023/10/14 09:05:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.31911565216541793, Global best: 0.31911565216541793, Runtime: 7.07142 seconds\n", + "2023/10/14 09:05:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.31865683037067727, Global best: 0.31865683037067727, Runtime: 6.65220 seconds\n", + "2023/10/14 09:05:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3172823896505142, Global best: 0.3172823896505142, Runtime: 6.70250 seconds\n", + "2023/10/14 09:05:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.31662128721151983, Global best: 0.31662128721151983, Runtime: 6.62614 seconds\n", + "2023/10/14 09:05:54 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.3155321646707072, Global best: 0.3155321646707072, Runtime: 6.67937 seconds\n", + "2023/10/14 09:06:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.31515455994546643, Global best: 0.31515455994546643, Runtime: 6.59378 seconds\n", + "2023/10/14 09:06:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.314739441554151, Global best: 0.314739441554151, Runtime: 6.61834 seconds\n", + "2023/10/14 09:06:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.31393366931364836, Global best: 0.31393366931364836, Runtime: 6.58233 seconds\n", + "2023/10/14 09:06:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.3121479997349186, Global best: 0.3121479997349186, Runtime: 6.60397 seconds\n", + "2023/10/14 09:06:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.3097013936734969, Global best: 0.3097013936734969, Runtime: 6.70374 seconds\n", + "2023/10/14 09:06:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.30893752958384124, Global best: 0.30893752958384124, Runtime: 6.62586 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.8333333333333333 0.9166666666666667 468\n", + "Triglav Stage 1 Base 0.9166666666666667 0.875 281\n", + "Triglav MultiSURF 10 0.7916666666666667 0.8333333333333333 10\n", + "Triglav MultiSURF 20 0.9166666666666667 0.75 20\n", + "Triglav MultiSURF 40 0.9166666666666667 0.9583333333333333 40\n", + "Triglav MultiSURF 60 0.9166666666666667 0.875 60\n", + "Triglav MultiSURF 80 0.9166666666666667 0.875 80\n", + "Triglav MultiSURF 100 0.9166666666666667 0.875 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:06:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:07:20 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.31426712376870325, Global best: 0.31426712376870325, Runtime: 13.10101 seconds\n", + "2023/10/14 09:07:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.31426712376870325, Global best: 0.31426712376870325, Runtime: 13.07946 seconds\n", + "2023/10/14 09:07:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.31426712376870325, Global best: 0.31426712376870325, Runtime: 13.09071 seconds\n", + "2023/10/14 09:07:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.31426712376870325, Global best: 0.31426712376870325, Runtime: 13.47271 seconds\n", + "2023/10/14 09:08:14 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.31683239609101094, Global best: 0.31426712376870325, Runtime: 14.53267 seconds\n", + "2023/10/14 09:08:28 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3249074919170879, Global best: 0.31426712376870325, Runtime: 14.16567 seconds\n", + "2023/10/14 09:08:42 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.305381374007467, Global best: 0.305381374007467, Runtime: 14.36013 seconds\n", + "2023/10/14 09:08:56 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.305381374007467, Global best: 0.305381374007467, Runtime: 13.27429 seconds\n", + "2023/10/14 09:09:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.305381374007467, Global best: 0.305381374007467, Runtime: 13.93147 seconds\n", + "2023/10/14 09:09:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.30976384912835797, Global best: 0.305381374007467, Runtime: 13.75614 seconds\n", + "2023/10/14 09:09:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3233324459181941, Global best: 0.305381374007467, Runtime: 13.44097 seconds\n", + "2023/10/14 09:09:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3233324459181941, Global best: 0.305381374007467, Runtime: 13.63136 seconds\n", + "2023/10/14 09:10:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3217618484675426, Global best: 0.305381374007467, Runtime: 14.35570 seconds\n", + "2023/10/14 09:10:19 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3217618484675426, Global best: 0.305381374007467, Runtime: 14.06717 seconds\n", + "2023/10/14 09:10:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3217618484675426, Global best: 0.305381374007467, Runtime: 13.71455 seconds\n", + "2023/10/14 09:10:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3113596833324008, Global best: 0.305381374007467, Runtime: 13.55230 seconds\n", + "2023/10/14 09:11:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3113596833324008, Global best: 0.305381374007467, Runtime: 13.70267 seconds\n", + "2023/10/14 09:11:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3113596833324008, Global best: 0.305381374007467, Runtime: 13.40230 seconds\n", + "2023/10/14 09:11:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.32600370519030536, Global best: 0.305381374007467, Runtime: 14.18105 seconds\n", + "2023/10/14 09:11:41 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.31899153666189634, Global best: 0.305381374007467, Runtime: 13.69946 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.9166666666666667 0.9166666666666667 144\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:11:45 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:11:59 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.31488739841341823, Global best: 0.31488739841341823, Runtime: 6.51436 seconds\n", + "2023/10/14 09:12:05 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.31488739841341823, Global best: 0.31488739841341823, Runtime: 6.47632 seconds\n", + "2023/10/14 09:12:12 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.31488739841341823, Global best: 0.31488739841341823, Runtime: 6.50480 seconds\n", + "2023/10/14 09:12:18 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.31488739841341823, Global best: 0.31488739841341823, Runtime: 6.48438 seconds\n", + "2023/10/14 09:12:25 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.31488739841341823, Global best: 0.31488739841341823, Runtime: 6.45278 seconds\n", + "2023/10/14 09:12:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.31488739841341823, Global best: 0.31488739841341823, Runtime: 6.51439 seconds\n", + "2023/10/14 09:12:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.31353201834695416, Global best: 0.31353201834695416, Runtime: 6.50776 seconds\n", + "2023/10/14 09:12:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.30502170199133727, Global best: 0.30502170199133727, Runtime: 6.87044 seconds\n", + "2023/10/14 09:12:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.30212820967063614, Global best: 0.30212820967063614, Runtime: 6.40737 seconds\n", + "2023/10/14 09:12:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.30212820967063614, Global best: 0.30212820967063614, Runtime: 6.49710 seconds\n", + "2023/10/14 09:13:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.30212820967063614, Global best: 0.30212820967063614, Runtime: 6.46255 seconds\n", + "2023/10/14 09:13:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.30212820967063614, Global best: 0.30212820967063614, Runtime: 6.46493 seconds\n", + "2023/10/14 09:13:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.30212820967063614, Global best: 0.30212820967063614, Runtime: 6.45767 seconds\n", + "2023/10/14 09:13:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.30212820967063614, Global best: 0.30212820967063614, Runtime: 6.56844 seconds\n", + "2023/10/14 09:13:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.30212820967063614, Global best: 0.30212820967063614, Runtime: 6.45724 seconds\n", + "2023/10/14 09:13:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.30212820967063614, Global best: 0.30212820967063614, Runtime: 6.48116 seconds\n", + "2023/10/14 09:13:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3001885896791049, Global best: 0.3001885896791049, Runtime: 6.48541 seconds\n", + "2023/10/14 09:13:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3001885896791049, Global best: 0.3001885896791049, Runtime: 6.48541 seconds\n", + "2023/10/14 09:13:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3001885896791049, Global best: 0.3001885896791049, Runtime: 6.43652 seconds\n", + "2023/10/14 09:14:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2846050403663499, Global best: 0.2846050403663499, Runtime: 6.49006 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.9166666666666667 0.9166666666666667 142\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:14:06 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:14:19 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3108885633113816, Global best: 0.3108885633113816, Runtime: 6.45486 seconds\n", + "2023/10/14 09:14:26 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3108885633113816, Global best: 0.3108885633113816, Runtime: 6.56725 seconds\n", + "2023/10/14 09:14:33 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3108885633113816, Global best: 0.3108885633113816, Runtime: 6.52851 seconds\n", + "2023/10/14 09:14:39 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3088256461248558, Global best: 0.3088256461248558, Runtime: 6.45732 seconds\n", + "2023/10/14 09:14:46 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3088256461248558, Global best: 0.3088256461248558, Runtime: 6.50960 seconds\n", + "2023/10/14 09:14:52 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.30853697925979334, Global best: 0.30853697925979334, Runtime: 6.56943 seconds\n", + "2023/10/14 09:14:59 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3023346758759147, Global best: 0.3023346758759147, Runtime: 6.90736 seconds\n", + "2023/10/14 09:15:06 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.29684497462534676, Global best: 0.29684497462534676, Runtime: 6.51482 seconds\n", + "2023/10/14 09:15:12 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2968058610615234, Global best: 0.2968058610615234, Runtime: 6.49573 seconds\n", + "2023/10/14 09:15:19 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.28875169948789947, Global best: 0.28875169948789947, Runtime: 6.51411 seconds\n", + "2023/10/14 09:15:25 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.28288044221836983, Global best: 0.28288044221836983, Runtime: 6.49158 seconds\n", + "2023/10/14 09:15:32 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.28288044221836983, Global best: 0.28288044221836983, Runtime: 6.53065 seconds\n", + "2023/10/14 09:15:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.28272328450285633, Global best: 0.28272328450285633, Runtime: 6.49589 seconds\n", + "2023/10/14 09:15:45 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2762424475210348, Global best: 0.2762424475210348, Runtime: 6.49381 seconds\n", + "2023/10/14 09:15:51 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.2762424475210348, Global best: 0.2762424475210348, Runtime: 6.49124 seconds\n", + "2023/10/14 09:15:58 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2762424475210348, Global best: 0.2762424475210348, Runtime: 6.49859 seconds\n", + "2023/10/14 09:16:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2749097017663346, Global best: 0.2749097017663346, Runtime: 6.47688 seconds\n", + "2023/10/14 09:16:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.2749097017663346, Global best: 0.2749097017663346, Runtime: 6.49327 seconds\n", + "2023/10/14 09:16:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.2739439969748993, Global best: 0.2739439969748993, Runtime: 6.50727 seconds\n", + "2023/10/14 09:16:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.26782521743550924, Global best: 0.26782521743550924, Runtime: 6.48104 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.9166666666666667 0.875 136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:16:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:16:41 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.30479459803667597, Global best: 0.30479459803667597, Runtime: 6.51308 seconds\n", + "2023/10/14 09:16:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.30479459803667597, Global best: 0.30479459803667597, Runtime: 6.47395 seconds\n", + "2023/10/14 09:16:54 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2989482577339061, Global best: 0.2989482577339061, Runtime: 6.54285 seconds\n", + "2023/10/14 09:17:01 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2981545434513831, Global best: 0.2981545434513831, Runtime: 6.50937 seconds\n", + "2023/10/14 09:17:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2931550548266396, Global best: 0.2931550548266396, Runtime: 6.49616 seconds\n", + "2023/10/14 09:17:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.29163319191856996, Global best: 0.29163319191856996, Runtime: 6.47692 seconds\n", + "2023/10/14 09:17:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.29163319191856996, Global best: 0.29163319191856996, Runtime: 6.55892 seconds\n", + "2023/10/14 09:17:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.29086438509542395, Global best: 0.29086438509542395, Runtime: 6.50655 seconds\n", + "2023/10/14 09:17:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2872590101038862, Global best: 0.2872590101038862, Runtime: 6.53492 seconds\n", + "2023/10/14 09:17:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2872590101038862, Global best: 0.2872590101038862, Runtime: 6.83322 seconds\n", + "2023/10/14 09:17:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2872590101038862, Global best: 0.2872590101038862, Runtime: 6.43728 seconds\n", + "2023/10/14 09:17:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2872590101038862, Global best: 0.2872590101038862, Runtime: 6.48082 seconds\n", + "2023/10/14 09:17:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2852945622837525, Global best: 0.2852945622837525, Runtime: 6.45917 seconds\n", + "2023/10/14 09:18:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2852945622837525, Global best: 0.2852945622837525, Runtime: 6.41874 seconds\n", + "2023/10/14 09:18:12 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2852945622837525, Global best: 0.2852945622837525, Runtime: 6.50204 seconds\n", + "2023/10/14 09:18:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2843675616192335, Global best: 0.2843675616192335, Runtime: 6.43521 seconds\n", + "2023/10/14 09:18:25 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2843675616192335, Global best: 0.2843675616192335, Runtime: 6.51172 seconds\n", + "2023/10/14 09:18:32 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2843675616192335, Global best: 0.2843675616192335, Runtime: 6.50656 seconds\n", + "2023/10/14 09:18:38 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.28110760028215115, Global best: 0.28110760028215115, Runtime: 6.48230 seconds\n", + "2023/10/14 09:18:45 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2796764855476014, Global best: 0.2796764855476014, Runtime: 6.47830 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.9166666666666667 0.875 139\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 437 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 208\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 208\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 208\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 208\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 208\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 208\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 208\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 208\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 208\n", + "Round 26 / Tentative (Accepted): 129 / Tentative (Not Accepted): 100 / Rejected: 208\n", + "Round 27 / Tentative (Accepted): 129 / Tentative (Not Accepted): 100 / Rejected: 208\n", + "Round 28 / Tentative (Accepted): 129 / Tentative (Not Accepted): 100 / Rejected: 208\n", + "Round 29 / Tentative (Accepted): 129 / Tentative (Not Accepted): 100 / Rejected: 208\n", + "Round 30 / Tentative (Accepted): 129 / Tentative (Not Accepted): 99 / Rejected: 209\n", + "Round 31 / Tentative (Accepted): 129 / Tentative (Not Accepted): 99 / Rejected: 209\n", + "Round 32 / Tentative (Accepted): 129 / Tentative (Not Accepted): 99 / Rejected: 209\n", + "Round 33 / Tentative (Accepted): 129 / Tentative (Not Accepted): 97 / Rejected: 211\n", + "Round 34 / Tentative (Accepted): 129 / Tentative (Not Accepted): 97 / Rejected: 211\n", + "Round 35 / Tentative (Accepted): 129 / Tentative (Not Accepted): 97 / Rejected: 211\n", + "Round 36 / Tentative (Accepted): 129 / Tentative (Not Accepted): 97 / Rejected: 211\n", + "Round 37 / Tentative (Accepted): 129 / Tentative (Not Accepted): 97 / Rejected: 211\n", + "Round 38 / Tentative (Accepted): 131 / Tentative (Not Accepted): 95 / Rejected: 211\n", + "Round 39 / Tentative (Accepted): 131 / Tentative (Not Accepted): 95 / Rejected: 211\n", + "Round 40 / Tentative (Accepted): 131 / Tentative (Not Accepted): 94 / Rejected: 212\n", + "Final Feature Set Contains 255 Features.\n", + "Control (Positive) 0.8333333333333333 0.8333333333333333 938\n", + "Control (Negative) 0.6666666666666666 0.6166666666666667 938\n", + "ANOVA Base 0.8333333333333333 0.8333333333333333 273\n", + "Mutual Information (10) Base 0.8333333333333333 0.6833333333333333 10\n", + "RFE (10) Base 0.8333333333333333 0.8333333333333333 10\n", + "MultiSURF (10) 0.8333333333333333 0.8333333333333333 10\n", + "Mutual Information (20) Base 0.8333333333333333 0.9166666666666667 20\n", + "RFE (20) Base 0.8333333333333333 0.8333333333333333 20\n", + "MultiSURF (20) 0.8333333333333333 0.8333333333333333 20\n", + "Mutual Information (40) Base 0.8333333333333333 0.5833333333333334 40\n", + "RFE (40) Base 0.8333333333333333 0.8333333333333333 40\n", + "MultiSURF (40) 0.8333333333333333 0.8333333333333333 40\n", + "Mutual Information (60) Base 0.8333333333333333 0.75 60\n", + "RFE (60) Base 0.8333333333333333 0.8333333333333333 60\n", + "MultiSURF (60) 0.8333333333333333 0.8333333333333333 60\n", + "Mutual Information (80) Base 0.8333333333333333 0.6666666666666666 80\n", + "RFE (80) Base 0.8333333333333333 0.8333333333333333 80\n", + "MultiSURF (80) 0.8333333333333333 0.8333333333333333 80\n", + "Mutual Information (100) Base 0.8333333333333333 0.75 100\n", + "RFE (100) Base 0.8333333333333333 0.8333333333333333 100\n", + "MultiSURF (100) 0.8333333333333333 0.8333333333333333 100\n", + "RFECV Base 0.8333333333333333 0.8333333333333333 64\n", + "Boruta Base 0.8333333333333333 0.8333333333333333 46\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:27:28 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:27:49 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.33291495815995575, Global best: 0.33291495815995575, Runtime: 13.45526 seconds\n", + "2023/10/14 09:28:03 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.33291495815995575, Global best: 0.33291495815995575, Runtime: 13.61041 seconds\n", + "2023/10/14 09:28:17 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3359994404159182, Global best: 0.33291495815995575, Runtime: 13.84671 seconds\n", + "2023/10/14 09:28:30 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3359994404159182, Global best: 0.33291495815995575, Runtime: 13.64589 seconds\n", + "2023/10/14 09:28:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33316394468114435, Global best: 0.33291495815995575, Runtime: 14.78484 seconds\n", + "2023/10/14 09:28:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.33316394468114435, Global best: 0.33291495815995575, Runtime: 14.04897 seconds\n", + "2023/10/14 09:29:14 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3386734426993327, Global best: 0.33291495815995575, Runtime: 15.15826 seconds\n", + "2023/10/14 09:29:28 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.342026241739787, Global best: 0.33291495815995575, Runtime: 14.20128 seconds\n", + "2023/10/14 09:29:43 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3437802096970537, Global best: 0.33291495815995575, Runtime: 14.96326 seconds\n", + "2023/10/14 09:29:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.34439339625566034, Global best: 0.33291495815995575, Runtime: 14.36651 seconds\n", + "2023/10/14 09:30:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.32249195275879594, Global best: 0.32249195275879594, Runtime: 14.79789 seconds\n", + "2023/10/14 09:30:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.32249195275879594, Global best: 0.32249195275879594, Runtime: 14.35827 seconds\n", + "2023/10/14 09:30:41 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3406505998981236, Global best: 0.32249195275879594, Runtime: 14.20954 seconds\n", + "2023/10/14 09:30:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3406505998981236, Global best: 0.32249195275879594, Runtime: 14.32081 seconds\n", + "2023/10/14 09:31:11 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.33998882600292724, Global best: 0.32249195275879594, Runtime: 15.28111 seconds\n", + "2023/10/14 09:31:25 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.33998882600292724, Global best: 0.32249195275879594, Runtime: 13.84827 seconds\n", + "2023/10/14 09:31:39 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.33998882600292724, Global best: 0.32249195275879594, Runtime: 14.34170 seconds\n", + "2023/10/14 09:31:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.34212853117887676, Global best: 0.32249195275879594, Runtime: 14.26112 seconds\n", + "2023/10/14 09:32:08 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3417317294508577, Global best: 0.32249195275879594, Runtime: 14.84333 seconds\n", + "2023/10/14 09:32:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.33553052998439553, Global best: 0.32249195275879594, Runtime: 14.77034 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.8333333333333333 0.8333333333333333 517\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:32:27 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:32:41 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.32829358269207964, Global best: 0.32829358269207964, Runtime: 6.76445 seconds\n", + "2023/10/14 09:32:47 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.32829358269207964, Global best: 0.32829358269207964, Runtime: 6.78170 seconds\n", + "2023/10/14 09:32:54 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.32829358269207964, Global best: 0.32829358269207964, Runtime: 6.78274 seconds\n", + "2023/10/14 09:33:01 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.32829358269207964, Global best: 0.32829358269207964, Runtime: 6.75841 seconds\n", + "2023/10/14 09:33:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.32829358269207964, Global best: 0.32829358269207964, Runtime: 6.71760 seconds\n", + "2023/10/14 09:33:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.32829358269207964, Global best: 0.32829358269207964, Runtime: 6.76618 seconds\n", + "2023/10/14 09:33:21 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3274348998997571, Global best: 0.3274348998997571, Runtime: 6.76105 seconds\n", + "2023/10/14 09:33:28 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3274348998997571, Global best: 0.3274348998997571, Runtime: 6.70458 seconds\n", + "2023/10/14 09:33:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.75026 seconds\n", + "2023/10/14 09:33:41 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.71151 seconds\n", + "2023/10/14 09:33:48 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.77431 seconds\n", + "2023/10/14 09:33:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.72276 seconds\n", + "2023/10/14 09:34:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.71277 seconds\n", + "2023/10/14 09:34:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.73515 seconds\n", + "2023/10/14 09:34:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.66879 seconds\n", + "2023/10/14 09:34:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.74284 seconds\n", + "2023/10/14 09:34:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.75552 seconds\n", + "2023/10/14 09:34:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.69795 seconds\n", + "2023/10/14 09:34:42 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 7.20789 seconds\n", + "2023/10/14 09:34:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3171289364516179, Global best: 0.3171289364516179, Runtime: 6.74070 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.8333333333333333 0.8333333333333333 548\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:34:53 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:35:07 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3315220469147109, Global best: 0.3315220469147109, Runtime: 6.71916 seconds\n", + "2023/10/14 09:35:14 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3315220469147109, Global best: 0.3315220469147109, Runtime: 6.67873 seconds\n", + "2023/10/14 09:35:20 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3315220469147109, Global best: 0.3315220469147109, Runtime: 6.63246 seconds\n", + "2023/10/14 09:35:27 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3315220469147109, Global best: 0.3315220469147109, Runtime: 6.63782 seconds\n", + "2023/10/14 09:35:34 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3315220469147109, Global best: 0.3315220469147109, Runtime: 6.72034 seconds\n", + "2023/10/14 09:35:41 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3315220469147109, Global best: 0.3315220469147109, Runtime: 6.69338 seconds\n", + "2023/10/14 09:35:47 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.73419 seconds\n", + "2023/10/14 09:35:54 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.70403 seconds\n", + "2023/10/14 09:36:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.70476 seconds\n", + "2023/10/14 09:36:07 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.66369 seconds\n", + "2023/10/14 09:36:14 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.71325 seconds\n", + "2023/10/14 09:36:21 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.68922 seconds\n", + "2023/10/14 09:36:27 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.67945 seconds\n", + "2023/10/14 09:36:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 7.09749 seconds\n", + "2023/10/14 09:36:41 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.68231 seconds\n", + "2023/10/14 09:36:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.74630 seconds\n", + "2023/10/14 09:36:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.64147 seconds\n", + "2023/10/14 09:37:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.76991 seconds\n", + "2023/10/14 09:37:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.71399 seconds\n", + "2023/10/14 09:37:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3293892441180042, Global best: 0.3293892441180042, Runtime: 6.68657 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.8333333333333333 0.8333333333333333 543\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:37:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:37:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3279963985951152, Global best: 0.3279963985951152, Runtime: 6.71157 seconds\n", + "2023/10/14 09:37:39 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3279963985951152, Global best: 0.3279963985951152, Runtime: 6.67942 seconds\n", + "2023/10/14 09:37:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3279963985951152, Global best: 0.3279963985951152, Runtime: 6.66087 seconds\n", + "2023/10/14 09:37:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.3279963985951152, Global best: 0.3279963985951152, Runtime: 6.66837 seconds\n", + "2023/10/14 09:37:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3279963985951152, Global best: 0.3279963985951152, Runtime: 6.68824 seconds\n", + "2023/10/14 09:38:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.32001824091359393, Global best: 0.32001824091359393, Runtime: 6.65991 seconds\n", + "2023/10/14 09:38:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.32001824091359393, Global best: 0.32001824091359393, Runtime: 6.67690 seconds\n", + "2023/10/14 09:38:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.32001824091359393, Global best: 0.32001824091359393, Runtime: 6.67432 seconds\n", + "2023/10/14 09:38:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.64539 seconds\n", + "2023/10/14 09:38:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.66176 seconds\n", + "2023/10/14 09:38:39 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.74896 seconds\n", + "2023/10/14 09:38:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.69834 seconds\n", + "2023/10/14 09:38:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.63301 seconds\n", + "2023/10/14 09:38:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.68984 seconds\n", + "2023/10/14 09:39:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.65710 seconds\n", + "2023/10/14 09:39:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.64284 seconds\n", + "2023/10/14 09:39:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.69306 seconds\n", + "2023/10/14 09:39:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 6.66769 seconds\n", + "2023/10/14 09:39:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.3124824429504793, Global best: 0.3124824429504793, Runtime: 7.02152 seconds\n", + "2023/10/14 09:39:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.3121632411669589, Global best: 0.3121632411669589, Runtime: 6.69834 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.8333333333333333 0.8333333333333333 556\n", + "Triglav Stage 1 Base 0.8333333333333333 0.8333333333333333 255\n", + "Triglav MultiSURF 10 0.8333333333333333 0.8333333333333333 10\n", + "Triglav MultiSURF 20 0.8333333333333333 0.8333333333333333 20\n", + "Triglav MultiSURF 40 0.8333333333333333 0.8333333333333333 40\n", + "Triglav MultiSURF 60 0.8333333333333333 0.8333333333333333 60\n", + "Triglav MultiSURF 80 0.8333333333333333 0.8333333333333333 80\n", + "Triglav MultiSURF 100 0.8333333333333333 0.8333333333333333 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:40:06 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:40:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.2957334084044521, Global best: 0.2957334084044521, Runtime: 12.99327 seconds\n", + "2023/10/14 09:40:39 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.2957334084044521, Global best: 0.2957334084044521, Runtime: 12.99845 seconds\n", + "2023/10/14 09:40:52 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.29164973456085647, Global best: 0.29164973456085647, Runtime: 13.01383 seconds\n", + "2023/10/14 09:41:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.29164973456085647, Global best: 0.29164973456085647, Runtime: 13.65631 seconds\n", + "2023/10/14 09:41:20 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.2951760578251791, Global best: 0.29164973456085647, Runtime: 14.08955 seconds\n", + "2023/10/14 09:41:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.2951760578251791, Global best: 0.29164973456085647, Runtime: 13.90132 seconds\n", + "2023/10/14 09:41:48 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.2968686281761558, Global best: 0.29164973456085647, Runtime: 14.12301 seconds\n", + "2023/10/14 09:42:01 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.2960780683792039, Global best: 0.29164973456085647, Runtime: 13.44275 seconds\n", + "2023/10/14 09:42:15 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.2960780683792039, Global best: 0.29164973456085647, Runtime: 14.08339 seconds\n", + "2023/10/14 09:42:29 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.2946758611428165, Global best: 0.29164973456085647, Runtime: 13.41927 seconds\n", + "2023/10/14 09:42:43 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.2946758611428165, Global best: 0.29164973456085647, Runtime: 14.55928 seconds\n", + "2023/10/14 09:42:56 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.2946758611428165, Global best: 0.29164973456085647, Runtime: 13.01595 seconds\n", + "2023/10/14 09:43:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.2946758611428165, Global best: 0.29164973456085647, Runtime: 13.87906 seconds\n", + "2023/10/14 09:43:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.2989459303723619, Global best: 0.29164973456085647, Runtime: 14.28221 seconds\n", + "2023/10/14 09:43:38 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3019013326921084, Global best: 0.29164973456085647, Runtime: 13.62413 seconds\n", + "2023/10/14 09:43:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3019013326921084, Global best: 0.29164973456085647, Runtime: 13.16816 seconds\n", + "2023/10/14 09:44:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3019013326921084, Global best: 0.29164973456085647, Runtime: 14.20377 seconds\n", + "2023/10/14 09:44:20 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.30472926206616086, Global best: 0.29164973456085647, Runtime: 14.25564 seconds\n", + "2023/10/14 09:44:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3076266091377332, Global best: 0.29164973456085647, Runtime: 13.41455 seconds\n", + "2023/10/14 09:44:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.30584205566704603, Global best: 0.29164973456085647, Runtime: 13.50422 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.8333333333333333 0.8333333333333333 141\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:44:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:45:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.30508465626226344, Global best: 0.30508465626226344, Runtime: 6.45536 seconds\n", + "2023/10/14 09:45:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.2959537970840992, Global best: 0.2959537970840992, Runtime: 6.49743 seconds\n", + "2023/10/14 09:45:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.2959537970840992, Global best: 0.2959537970840992, Runtime: 6.48227 seconds\n", + "2023/10/14 09:45:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.2959537970840992, Global best: 0.2959537970840992, Runtime: 6.47302 seconds\n", + "2023/10/14 09:45:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.45866 seconds\n", + "2023/10/14 09:45:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.43649 seconds\n", + "2023/10/14 09:45:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.47624 seconds\n", + "2023/10/14 09:45:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.48800 seconds\n", + "2023/10/14 09:45:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.47638 seconds\n", + "2023/10/14 09:46:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.51515 seconds\n", + "2023/10/14 09:46:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.90798 seconds\n", + "2023/10/14 09:46:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.49109 seconds\n", + "2023/10/14 09:46:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.53119 seconds\n", + "2023/10/14 09:46:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.49944 seconds\n", + "2023/10/14 09:46:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.48445 seconds\n", + "2023/10/14 09:46:42 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.54650 seconds\n", + "2023/10/14 09:46:48 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.51701 seconds\n", + "2023/10/14 09:46:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2834787111671213, Global best: 0.2834787111671213, Runtime: 6.50880 seconds\n", + "2023/10/14 09:47:01 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.27431322142431047, Global best: 0.27431322142431047, Runtime: 6.46829 seconds\n", + "2023/10/14 09:47:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.27431322142431047, Global best: 0.27431322142431047, Runtime: 6.47994 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.8333333333333333 0.8333333333333333 135\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:47:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:47:25 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.2861361106936966, Global best: 0.2861361106936966, Runtime: 6.54374 seconds\n", + "2023/10/14 09:47:32 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.28032099073202, Global best: 0.28032099073202, Runtime: 6.42238 seconds\n", + "2023/10/14 09:47:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.28032099073202, Global best: 0.28032099073202, Runtime: 6.43289 seconds\n", + "2023/10/14 09:47:44 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.27337829370056455, Global best: 0.27337829370056455, Runtime: 6.48211 seconds\n", + "2023/10/14 09:47:51 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.27016609962706206, Global best: 0.27016609962706206, Runtime: 6.48147 seconds\n", + "2023/10/14 09:47:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.2615742141631107, Global best: 0.2615742141631107, Runtime: 6.51029 seconds\n", + "2023/10/14 09:48:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.2615742141631107, Global best: 0.2615742141631107, Runtime: 6.42866 seconds\n", + "2023/10/14 09:48:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.25842849812207486, Global best: 0.25842849812207486, Runtime: 6.45063 seconds\n", + "2023/10/14 09:48:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.25796268083896234, Global best: 0.25796268083896234, Runtime: 6.40921 seconds\n", + "2023/10/14 09:48:23 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.25311504359192516, Global best: 0.25311504359192516, Runtime: 6.47238 seconds\n", + "2023/10/14 09:48:30 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.24868811244698347, Global best: 0.24868811244698347, Runtime: 6.48711 seconds\n", + "2023/10/14 09:48:36 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.24868811244698347, Global best: 0.24868811244698347, Runtime: 6.54501 seconds\n", + "2023/10/14 09:48:43 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2458450040700168, Global best: 0.2458450040700168, Runtime: 6.88431 seconds\n", + "2023/10/14 09:48:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.23649780216649458, Global best: 0.23649780216649458, Runtime: 6.51102 seconds\n", + "2023/10/14 09:48:56 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.23649780216649458, Global best: 0.23649780216649458, Runtime: 6.46629 seconds\n", + "2023/10/14 09:49:03 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.23649780216649458, Global best: 0.23649780216649458, Runtime: 6.52341 seconds\n", + "2023/10/14 09:49:09 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.23649780216649458, Global best: 0.23649780216649458, Runtime: 6.53279 seconds\n", + "2023/10/14 09:49:16 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.23649780216649458, Global best: 0.23649780216649458, Runtime: 6.44107 seconds\n", + "2023/10/14 09:49:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.23388744531847655, Global best: 0.23388744531847655, Runtime: 6.51172 seconds\n", + "2023/10/14 09:49:29 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.23388744531847655, Global best: 0.23388744531847655, Runtime: 6.50074 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.8333333333333333 0.8333333333333333 109\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 09:49:32 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 09:49:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.27520931799545056, Global best: 0.27520931799545056, Runtime: 6.48637 seconds\n", + "2023/10/14 09:49:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.27520931799545056, Global best: 0.27520931799545056, Runtime: 6.53012 seconds\n", + "2023/10/14 09:49:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2727397335077657, Global best: 0.2727397335077657, Runtime: 6.48497 seconds\n", + "2023/10/14 09:50:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.25652161080351843, Global best: 0.25652161080351843, Runtime: 6.52216 seconds\n", + "2023/10/14 09:50:12 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.25652161080351843, Global best: 0.25652161080351843, Runtime: 6.49425 seconds\n", + "2023/10/14 09:50:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.25652161080351843, Global best: 0.25652161080351843, Runtime: 6.46344 seconds\n", + "2023/10/14 09:50:25 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.25652161080351843, Global best: 0.25652161080351843, Runtime: 6.47114 seconds\n", + "2023/10/14 09:50:32 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.25652161080351843, Global best: 0.25652161080351843, Runtime: 6.49662 seconds\n", + "2023/10/14 09:50:38 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.25652161080351843, Global best: 0.25652161080351843, Runtime: 6.49138 seconds\n", + "2023/10/14 09:50:45 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.25652161080351843, Global best: 0.25652161080351843, Runtime: 6.48647 seconds\n", + "2023/10/14 09:50:51 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.25189940233573643, Global best: 0.25189940233573643, Runtime: 6.90014 seconds\n", + "2023/10/14 09:50:58 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.25189940233573643, Global best: 0.25189940233573643, Runtime: 6.45256 seconds\n", + "2023/10/14 09:51:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2505221498839125, Global best: 0.2505221498839125, Runtime: 6.53080 seconds\n", + "2023/10/14 09:51:11 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2505221498839125, Global best: 0.2505221498839125, Runtime: 6.51593 seconds\n", + "2023/10/14 09:51:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.24873842555838194, Global best: 0.24873842555838194, Runtime: 6.43221 seconds\n", + "2023/10/14 09:51:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.24250125517772733, Global best: 0.24250125517772733, Runtime: 6.48309 seconds\n", + "2023/10/14 09:51:30 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.24235422590342015, Global best: 0.24235422590342015, Runtime: 6.49912 seconds\n", + "2023/10/14 09:51:37 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.24232400518541888, Global best: 0.24232400518541888, Runtime: 6.52217 seconds\n", + "2023/10/14 09:51:43 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.23848161565942175, Global best: 0.23848161565942175, Runtime: 6.50315 seconds\n", + "2023/10/14 09:51:50 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.23805669065736915, Global best: 0.23805669065736915, Runtime: 6.50229 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.8333333333333333 0.8333333333333333 107\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 229\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 229\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 229\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 229\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 229\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 229\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 229\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 229\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 229\n", + "Round 26 / Tentative (Accepted): 147 / Tentative (Not Accepted): 99 / Rejected: 236\n", + "Round 27 / Tentative (Accepted): 147 / Tentative (Not Accepted): 99 / Rejected: 236\n", + "Round 28 / Tentative (Accepted): 147 / Tentative (Not Accepted): 99 / Rejected: 236\n", + "Round 29 / Tentative (Accepted): 147 / Tentative (Not Accepted): 99 / Rejected: 236\n", + "Round 30 / Tentative (Accepted): 147 / Tentative (Not Accepted): 99 / Rejected: 236\n", + "Round 31 / Tentative (Accepted): 147 / Tentative (Not Accepted): 99 / Rejected: 236\n", + "Round 32 / Tentative (Accepted): 147 / Tentative (Not Accepted): 99 / Rejected: 236\n", + "Round 33 / Tentative (Accepted): 147 / Tentative (Not Accepted): 99 / Rejected: 236\n", + "Round 34 / Tentative (Accepted): 147 / Tentative (Not Accepted): 99 / Rejected: 236\n", + "Round 35 / Tentative (Accepted): 147 / Tentative (Not Accepted): 98 / Rejected: 237\n", + "Round 36 / Tentative (Accepted): 147 / Tentative (Not Accepted): 98 / Rejected: 237\n", + "Round 37 / Tentative (Accepted): 147 / Tentative (Not Accepted): 98 / Rejected: 237\n", + "Round 38 / Tentative (Accepted): 149 / Tentative (Not Accepted): 94 / Rejected: 239\n", + "Round 39 / Tentative (Accepted): 149 / Tentative (Not Accepted): 94 / Rejected: 239\n", + "Round 40 / Tentative (Accepted): 149 / Tentative (Not Accepted): 94 / Rejected: 239\n", + "Final Feature Set Contains 283 Features.\n", + "Control (Positive) 1.0 0.9375 938\n", + "Control (Negative) 0.5 0.5625 938\n", + "ANOVA Base 1.0 1.0 216\n", + "Mutual Information (10) Base 0.9375 1.0 10\n", + "RFE (10) Base 1.0 0.875 10\n", + "MultiSURF (10) 0.9375 0.6875 10\n", + "Mutual Information (20) Base 0.875 0.8125 20\n", + "RFE (20) Base 0.9375 1.0 20\n", + "MultiSURF (20) 0.9375 0.9375 20\n", + "Mutual Information (40) Base 1.0 1.0 40\n", + "RFE (40) Base 1.0 1.0 40\n", + "MultiSURF (40) 0.9375 0.9375 40\n", + "Mutual Information (60) Base 1.0 0.875 60\n", + "RFE (60) Base 1.0 1.0 60\n", + "MultiSURF (60) 1.0 1.0 60\n", + "Mutual Information (80) Base 1.0 1.0 80\n", + "RFE (80) Base 1.0 1.0 80\n", + "MultiSURF (80) 1.0 1.0 80\n", + "Mutual Information (100) Base 1.0 1.0 100\n", + "RFE (100) Base 1.0 1.0 100\n", + "MultiSURF (100) 0.9375 1.0 100\n", + "RFECV Base 1.0 1.0 64\n", + "Boruta Base 1.0 1.0 49\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:00:41 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:01:01 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.34286753570574496, Global best: 0.34286753570574496, Runtime: 13.35502 seconds\n", + "2023/10/14 10:01:15 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.34286753570574496, Global best: 0.34286753570574496, Runtime: 13.81299 seconds\n", + "2023/10/14 10:01:29 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.33929631282200234, Global best: 0.33929631282200234, Runtime: 13.60404 seconds\n", + "2023/10/14 10:01:42 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.33766414561446106, Global best: 0.33766414561446106, Runtime: 13.51536 seconds\n", + "2023/10/14 10:01:57 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33766414561446106, Global best: 0.33766414561446106, Runtime: 14.29311 seconds\n", + "2023/10/14 10:02:11 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.33766414561446106, Global best: 0.33766414561446106, Runtime: 14.67478 seconds\n", + "2023/10/14 10:02:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.34208171645566365, Global best: 0.33766414561446106, Runtime: 14.44050 seconds\n", + "2023/10/14 10:02:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.34208171645566365, Global best: 0.33766414561446106, Runtime: 14.22530 seconds\n", + "2023/10/14 10:02:54 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.34208171645566365, Global best: 0.33766414561446106, Runtime: 13.76480 seconds\n", + "2023/10/14 10:03:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.34447431199388323, Global best: 0.33766414561446106, Runtime: 14.88485 seconds\n", + "2023/10/14 10:03:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3498300850874073, Global best: 0.33766414561446106, Runtime: 14.49905 seconds\n", + "2023/10/14 10:03:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3526431463347603, Global best: 0.33766414561446106, Runtime: 14.03794 seconds\n", + "2023/10/14 10:03:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.34973080096631115, Global best: 0.33766414561446106, Runtime: 13.78145 seconds\n", + "2023/10/14 10:04:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.33996569791000103, Global best: 0.33766414561446106, Runtime: 14.25624 seconds\n", + "2023/10/14 10:04:21 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.33996569791000103, Global best: 0.33766414561446106, Runtime: 15.60933 seconds\n", + "2023/10/14 10:04:34 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.33996569791000103, Global best: 0.33766414561446106, Runtime: 13.65404 seconds\n", + "2023/10/14 10:04:48 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.34021252882199754, Global best: 0.33766414561446106, Runtime: 13.64126 seconds\n", + "2023/10/14 10:05:03 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.34021252882199754, Global best: 0.33766414561446106, Runtime: 14.77586 seconds\n", + "2023/10/14 10:05:16 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.34021252882199754, Global best: 0.33766414561446106, Runtime: 13.40408 seconds\n", + "2023/10/14 10:05:31 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.34021252882199754, Global best: 0.33766414561446106, Runtime: 14.90449 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 1.0 1.0 575\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:05:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:05:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.72470 seconds\n", + "2023/10/14 10:05:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.74841 seconds\n", + "2023/10/14 10:06:03 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.72074 seconds\n", + "2023/10/14 10:06:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.69776 seconds\n", + "2023/10/14 10:06:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.77850 seconds\n", + "2023/10/14 10:06:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.68839 seconds\n", + "2023/10/14 10:06:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.75435 seconds\n", + "2023/10/14 10:06:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.79161 seconds\n", + "2023/10/14 10:06:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.69881 seconds\n", + "2023/10/14 10:06:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.74409 seconds\n", + "2023/10/14 10:06:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3307777511086264, Global best: 0.3307777511086264, Runtime: 6.74925 seconds\n", + "2023/10/14 10:07:03 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3262240947000297, Global best: 0.3262240947000297, Runtime: 6.68953 seconds\n", + "2023/10/14 10:07:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3262240947000297, Global best: 0.3262240947000297, Runtime: 6.72033 seconds\n", + "2023/10/14 10:07:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.31848915887386825, Global best: 0.31848915887386825, Runtime: 6.70434 seconds\n", + "2023/10/14 10:07:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.31848915887386825, Global best: 0.31848915887386825, Runtime: 6.69150 seconds\n", + "2023/10/14 10:07:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.31848915887386825, Global best: 0.31848915887386825, Runtime: 6.70763 seconds\n", + "2023/10/14 10:07:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.31848915887386825, Global best: 0.31848915887386825, Runtime: 7.11658 seconds\n", + "2023/10/14 10:07:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.31848915887386825, Global best: 0.31848915887386825, Runtime: 6.72272 seconds\n", + "2023/10/14 10:07:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.31848915887386825, Global best: 0.31848915887386825, Runtime: 6.74964 seconds\n", + "2023/10/14 10:07:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.31848915887386825, Global best: 0.31848915887386825, Runtime: 6.72655 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 1.0 0.9375 511\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:08:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:08:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.70238 seconds\n", + "2023/10/14 10:08:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.63790 seconds\n", + "2023/10/14 10:08:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.65174 seconds\n", + "2023/10/14 10:08:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.64521 seconds\n", + "2023/10/14 10:08:42 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.60945 seconds\n", + "2023/10/14 10:08:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.67055 seconds\n", + "2023/10/14 10:08:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.59801 seconds\n", + "2023/10/14 10:09:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.67920 seconds\n", + "2023/10/14 10:09:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.64734 seconds\n", + "2023/10/14 10:09:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.63640 seconds\n", + "2023/10/14 10:09:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.72657 seconds\n", + "2023/10/14 10:09:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.70614 seconds\n", + "2023/10/14 10:09:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.66095 seconds\n", + "2023/10/14 10:09:42 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.64031 seconds\n", + "2023/10/14 10:09:49 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.85101 seconds\n", + "2023/10/14 10:09:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.69931 seconds\n", + "2023/10/14 10:10:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.69222 seconds\n", + "2023/10/14 10:10:09 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.66610 seconds\n", + "2023/10/14 10:10:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.74858 seconds\n", + "2023/10/14 10:10:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.33447437880412756, Global best: 0.33447437880412756, Runtime: 6.70096 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 1.0 0.875 551\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:10:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:10:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.32303055812101394, Global best: 0.32303055812101394, Runtime: 7.06208 seconds\n", + "2023/10/14 10:10:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3226600495251328, Global best: 0.3226600495251328, Runtime: 6.69293 seconds\n", + "2023/10/14 10:10:54 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3226600495251328, Global best: 0.3226600495251328, Runtime: 6.67392 seconds\n", + "2023/10/14 10:11:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.3140746678153227, Global best: 0.3140746678153227, Runtime: 6.66902 seconds\n", + "2023/10/14 10:11:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3140746678153227, Global best: 0.3140746678153227, Runtime: 6.65412 seconds\n", + "2023/10/14 10:11:14 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3140746678153227, Global best: 0.3140746678153227, Runtime: 6.69151 seconds\n", + "2023/10/14 10:11:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3140746678153227, Global best: 0.3140746678153227, Runtime: 6.65002 seconds\n", + "2023/10/14 10:11:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3140746678153227, Global best: 0.3140746678153227, Runtime: 6.62869 seconds\n", + "2023/10/14 10:11:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3115192038083133, Global best: 0.3115192038083133, Runtime: 6.70027 seconds\n", + "2023/10/14 10:11:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3115192038083133, Global best: 0.3115192038083133, Runtime: 6.62630 seconds\n", + "2023/10/14 10:11:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3115192038083133, Global best: 0.3115192038083133, Runtime: 6.63878 seconds\n", + "2023/10/14 10:11:54 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3115192038083133, Global best: 0.3115192038083133, Runtime: 6.67408 seconds\n", + "2023/10/14 10:12:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.3115192038083133, Global best: 0.3115192038083133, Runtime: 6.66030 seconds\n", + "2023/10/14 10:12:07 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.3115192038083133, Global best: 0.3115192038083133, Runtime: 6.61093 seconds\n", + "2023/10/14 10:12:14 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.30819134172734763, Global best: 0.30819134172734763, Runtime: 6.68549 seconds\n", + "2023/10/14 10:12:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.30819134172734763, Global best: 0.30819134172734763, Runtime: 6.59326 seconds\n", + "2023/10/14 10:12:27 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.30642074826257903, Global best: 0.30642074826257903, Runtime: 6.68720 seconds\n", + "2023/10/14 10:12:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2967517763026875, Global best: 0.2967517763026875, Runtime: 6.64352 seconds\n", + "2023/10/14 10:12:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2967517763026875, Global best: 0.2967517763026875, Runtime: 6.57755 seconds\n", + "2023/10/14 10:12:47 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2967517763026875, Global best: 0.2967517763026875, Runtime: 6.63286 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 1.0 0.9375 506\n", + "Triglav Stage 1 Base 1.0 1.0 283\n", + "Triglav MultiSURF 10 1.0 0.8125 10\n", + "Triglav MultiSURF 20 0.875 0.875 20\n", + "Triglav MultiSURF 40 0.875 1.0 40\n", + "Triglav MultiSURF 60 1.0 1.0 60\n", + "Triglav MultiSURF 80 1.0 0.875 80\n", + "Triglav MultiSURF 100 1.0 0.9375 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:13:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:13:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.31762355363091294, Global best: 0.31762355363091294, Runtime: 13.12061 seconds\n", + "2023/10/14 10:13:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.31762355363091294, Global best: 0.31762355363091294, Runtime: 13.35244 seconds\n", + "2023/10/14 10:14:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.31762355363091294, Global best: 0.31762355363091294, Runtime: 13.23839 seconds\n", + "2023/10/14 10:14:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.31660950647450203, Global best: 0.31660950647450203, Runtime: 13.61955 seconds\n", + "2023/10/14 10:14:28 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.31660950647450203, Global best: 0.31660950647450203, Runtime: 14.32294 seconds\n", + "2023/10/14 10:14:41 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.31660950647450203, Global best: 0.31660950647450203, Runtime: 13.31918 seconds\n", + "2023/10/14 10:14:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.31660950647450203, Global best: 0.31660950647450203, Runtime: 13.75029 seconds\n", + "2023/10/14 10:15:08 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.325041321583637, Global best: 0.31660950647450203, Runtime: 13.68002 seconds\n", + "2023/10/14 10:15:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.325041321583637, Global best: 0.31660950647450203, Runtime: 13.64650 seconds\n", + "2023/10/14 10:15:36 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.325041321583637, Global best: 0.31660950647450203, Runtime: 13.63691 seconds\n", + "2023/10/14 10:15:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3221104579613263, Global best: 0.31660950647450203, Runtime: 14.76592 seconds\n", + "2023/10/14 10:16:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3221104579613263, Global best: 0.31660950647450203, Runtime: 13.51714 seconds\n", + "2023/10/14 10:16:17 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3221104579613263, Global best: 0.31660950647450203, Runtime: 12.96562 seconds\n", + "2023/10/14 10:16:31 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3182242451561997, Global best: 0.31660950647450203, Runtime: 14.35143 seconds\n", + "2023/10/14 10:16:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3182242451561997, Global best: 0.31660950647450203, Runtime: 14.05356 seconds\n", + "2023/10/14 10:16:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3182242451561997, Global best: 0.31660950647450203, Runtime: 13.59724 seconds\n", + "2023/10/14 10:17:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3233102279075239, Global best: 0.31660950647450203, Runtime: 13.37954 seconds\n", + "2023/10/14 10:17:26 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3233102279075239, Global best: 0.31660950647450203, Runtime: 13.35690 seconds\n", + "2023/10/14 10:17:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3257855671714286, Global best: 0.31660950647450203, Runtime: 14.06136 seconds\n", + "2023/10/14 10:17:54 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3257855671714286, Global best: 0.31660950647450203, Runtime: 14.08449 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 1.0 1.0 152\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:17:58 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:18:11 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.32073864342943803, Global best: 0.32073864342943803, Runtime: 6.49302 seconds\n", + "2023/10/14 10:18:18 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3183302428419421, Global best: 0.3183302428419421, Runtime: 6.52037 seconds\n", + "2023/10/14 10:18:24 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3183302428419421, Global best: 0.3183302428419421, Runtime: 6.50325 seconds\n", + "2023/10/14 10:18:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3183302428419421, Global best: 0.3183302428419421, Runtime: 6.45830 seconds\n", + "2023/10/14 10:18:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3183302428419421, Global best: 0.3183302428419421, Runtime: 6.89933 seconds\n", + "2023/10/14 10:18:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.50235 seconds\n", + "2023/10/14 10:18:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.52929 seconds\n", + "2023/10/14 10:18:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.53967 seconds\n", + "2023/10/14 10:19:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.78465 seconds\n", + "2023/10/14 10:19:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.50447 seconds\n", + "2023/10/14 10:19:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.44380 seconds\n", + "2023/10/14 10:19:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.54690 seconds\n", + "2023/10/14 10:19:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.51853 seconds\n", + "2023/10/14 10:19:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.50689 seconds\n", + "2023/10/14 10:19:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.50040 seconds\n", + "2023/10/14 10:19:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.53929 seconds\n", + "2023/10/14 10:19:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.58273 seconds\n", + "2023/10/14 10:20:03 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.52163 seconds\n", + "2023/10/14 10:20:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.71716 seconds\n", + "2023/10/14 10:20:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3062970282068974, Global best: 0.3062970282068974, Runtime: 6.52467 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 1.0 1.0 148\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:20:25 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:20:39 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.315760653299624, Global best: 0.315760653299624, Runtime: 6.40180 seconds\n", + "2023/10/14 10:20:45 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.315760653299624, Global best: 0.315760653299624, Runtime: 6.41206 seconds\n", + "2023/10/14 10:20:52 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3128868915683367, Global best: 0.3128868915683367, Runtime: 6.39765 seconds\n", + "2023/10/14 10:20:58 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3091768332553615, Global best: 0.3091768332553615, Runtime: 6.36927 seconds\n", + "2023/10/14 10:21:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3091768332553615, Global best: 0.3091768332553615, Runtime: 6.39650 seconds\n", + "2023/10/14 10:21:11 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3064919439343297, Global best: 0.3064919439343297, Runtime: 6.33419 seconds\n", + "2023/10/14 10:21:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3064919439343297, Global best: 0.3064919439343297, Runtime: 6.40678 seconds\n", + "2023/10/14 10:21:23 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3012948061414211, Global best: 0.3012948061414211, Runtime: 6.37723 seconds\n", + "2023/10/14 10:21:30 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3012948061414211, Global best: 0.3012948061414211, Runtime: 6.36386 seconds\n", + "2023/10/14 10:21:36 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.30119840825164573, Global best: 0.30119840825164573, Runtime: 6.39600 seconds\n", + "2023/10/14 10:21:43 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.29880500154786493, Global best: 0.29880500154786493, Runtime: 6.44015 seconds\n", + "2023/10/14 10:21:49 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.29880500154786493, Global best: 0.29880500154786493, Runtime: 6.41357 seconds\n", + "2023/10/14 10:21:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2960360085578739, Global best: 0.2960360085578739, Runtime: 6.38896 seconds\n", + "2023/10/14 10:22:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2910265397137348, Global best: 0.2910265397137348, Runtime: 6.31624 seconds\n", + "2023/10/14 10:22:08 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.28846334297983794, Global best: 0.28846334297983794, Runtime: 6.36294 seconds\n", + "2023/10/14 10:22:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.28846334297983794, Global best: 0.28846334297983794, Runtime: 6.37551 seconds\n", + "2023/10/14 10:22:21 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.28360359241336264, Global best: 0.28360359241336264, Runtime: 6.40072 seconds\n", + "2023/10/14 10:22:27 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.28360359241336264, Global best: 0.28360359241336264, Runtime: 6.29842 seconds\n", + "2023/10/14 10:22:34 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.28209903061117564, Global best: 0.28209903061117564, Runtime: 6.29865 seconds\n", + "2023/10/14 10:22:40 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.2813935463149228, Global best: 0.2813935463149228, Runtime: 6.72761 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 1.0 1.0 132\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:22:44 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:22:58 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.31352962601625106, Global best: 0.31352962601625106, Runtime: 6.54931 seconds\n", + "2023/10/14 10:23:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3071221529075461, Global best: 0.3071221529075461, Runtime: 6.53891 seconds\n", + "2023/10/14 10:23:11 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2984258999047382, Global best: 0.2984258999047382, Runtime: 6.51380 seconds\n", + "2023/10/14 10:23:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2982704122418133, Global best: 0.2982704122418133, Runtime: 6.57662 seconds\n", + "2023/10/14 10:23:24 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.29415884279886034, Global best: 0.29415884279886034, Runtime: 6.52568 seconds\n", + "2023/10/14 10:23:30 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.28740140443095474, Global best: 0.28740140443095474, Runtime: 6.46802 seconds\n", + "2023/10/14 10:23:37 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2838865289728302, Global best: 0.2838865289728302, Runtime: 6.54762 seconds\n", + "2023/10/14 10:23:44 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2785500903665801, Global best: 0.2785500903665801, Runtime: 6.55193 seconds\n", + "2023/10/14 10:23:50 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2785500903665801, Global best: 0.2785500903665801, Runtime: 6.52943 seconds\n", + "2023/10/14 10:23:57 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.27666652338660563, Global best: 0.27666652338660563, Runtime: 6.49542 seconds\n", + "2023/10/14 10:24:03 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2747402624151216, Global best: 0.2747402624151216, Runtime: 6.46494 seconds\n", + "2023/10/14 10:24:10 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.27286116770654, Global best: 0.27286116770654, Runtime: 6.56234 seconds\n", + "2023/10/14 10:24:16 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2726537733974509, Global best: 0.2726537733974509, Runtime: 6.47151 seconds\n", + "2023/10/14 10:24:23 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.27255688094339414, Global best: 0.27255688094339414, Runtime: 6.51287 seconds\n", + "2023/10/14 10:24:29 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.27061520370615116, Global best: 0.27061520370615116, Runtime: 6.50746 seconds\n", + "2023/10/14 10:24:36 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2675934854584441, Global best: 0.2675934854584441, Runtime: 6.52736 seconds\n", + "2023/10/14 10:24:42 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2675934854584441, Global best: 0.2675934854584441, Runtime: 6.52077 seconds\n", + "2023/10/14 10:24:49 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2643880778728041, Global best: 0.2643880778728041, Runtime: 6.50795 seconds\n", + "2023/10/14 10:24:55 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2613604557157315, Global best: 0.2613604557157315, Runtime: 6.53773 seconds\n", + "2023/10/14 10:25:02 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2601038915911521, Global best: 0.2601038915911521, Runtime: 6.61373 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 1.0 0.875 117\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 448 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 218 / Rejected: 230\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 218 / Rejected: 230\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 218 / Rejected: 230\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 218 / Rejected: 230\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 218 / Rejected: 230\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 218 / Rejected: 230\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 218 / Rejected: 230\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 205 / Rejected: 243\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 205 / Rejected: 243\n", + "Round 26 / Tentative (Accepted): 114 / Tentative (Not Accepted): 91 / Rejected: 243\n", + "Round 27 / Tentative (Accepted): 114 / Tentative (Not Accepted): 91 / Rejected: 243\n", + "Round 28 / Tentative (Accepted): 114 / Tentative (Not Accepted): 91 / Rejected: 243\n", + "Round 29 / Tentative (Accepted): 114 / Tentative (Not Accepted): 91 / Rejected: 243\n", + "Round 30 / Tentative (Accepted): 114 / Tentative (Not Accepted): 91 / Rejected: 243\n", + "Round 31 / Tentative (Accepted): 114 / Tentative (Not Accepted): 91 / Rejected: 243\n", + "Round 32 / Tentative (Accepted): 114 / Tentative (Not Accepted): 91 / Rejected: 243\n", + "Round 33 / Tentative (Accepted): 114 / Tentative (Not Accepted): 91 / Rejected: 243\n", + "Round 34 / Tentative (Accepted): 114 / Tentative (Not Accepted): 91 / Rejected: 243\n", + "Round 35 / Tentative (Accepted): 114 / Tentative (Not Accepted): 90 / Rejected: 244\n", + "Round 36 / Tentative (Accepted): 118 / Tentative (Not Accepted): 86 / Rejected: 244\n", + "Round 37 / Tentative (Accepted): 118 / Tentative (Not Accepted): 84 / Rejected: 246\n", + "Round 38 / Tentative (Accepted): 118 / Tentative (Not Accepted): 84 / Rejected: 246\n", + "Round 39 / Tentative (Accepted): 118 / Tentative (Not Accepted): 84 / Rejected: 246\n", + "Round 40 / Tentative (Accepted): 118 / Tentative (Not Accepted): 84 / Rejected: 246\n", + "Final Feature Set Contains 238 Features.\n", + "Control (Positive) 0.625 0.8125 938\n", + "Control (Negative) 0.3125 0.5625 938\n", + "ANOVA Base 0.6875 0.75 295\n", + "Mutual Information (10) Base 0.625 0.8125 10\n", + "RFE (10) Base 0.75 0.75 10\n", + "MultiSURF (10) 0.8125 0.8125 10\n", + "Mutual Information (20) Base 0.625 0.6875 20\n", + "RFE (20) Base 0.625 0.8125 20\n", + "MultiSURF (20) 0.6875 0.625 20\n", + "Mutual Information (40) Base 0.625 0.6875 40\n", + "RFE (40) Base 0.6875 0.8125 40\n", + "MultiSURF (40) 0.6875 0.8125 40\n", + "Mutual Information (60) Base 0.625 0.6875 60\n", + "RFE (60) Base 0.6875 0.75 60\n", + "MultiSURF (60) 0.6875 0.8125 60\n", + "Mutual Information (80) Base 0.6875 0.6875 80\n", + "RFE (80) Base 0.6875 0.75 80\n", + "MultiSURF (80) 0.6875 0.75 80\n", + "Mutual Information (100) Base 0.6875 0.625 100\n", + "RFE (100) Base 0.6875 0.75 100\n", + "MultiSURF (100) 0.6875 0.75 100\n", + "RFECV Base 0.6875 0.8125 18\n", + "Boruta Base 0.6875 0.75 49\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:33:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:34:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3093026872698008, Global best: 0.3093026872698008, Runtime: 13.43710 seconds\n", + "2023/10/14 10:34:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3093026872698008, Global best: 0.3093026872698008, Runtime: 13.34597 seconds\n", + "2023/10/14 10:34:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3093026872698008, Global best: 0.3093026872698008, Runtime: 13.30543 seconds\n", + "2023/10/14 10:34:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3178985344156971, Global best: 0.3093026872698008, Runtime: 14.88602 seconds\n", + "2023/10/14 10:35:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3178985344156971, Global best: 0.3093026872698008, Runtime: 15.00522 seconds\n", + "2023/10/14 10:35:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3172541172808891, Global best: 0.3093026872698008, Runtime: 14.34428 seconds\n", + "2023/10/14 10:35:38 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3172541172808891, Global best: 0.3093026872698008, Runtime: 14.27314 seconds\n", + "2023/10/14 10:35:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3172541172808891, Global best: 0.3093026872698008, Runtime: 14.26119 seconds\n", + "2023/10/14 10:36:08 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3147914742960679, Global best: 0.3093026872698008, Runtime: 15.10363 seconds\n", + "2023/10/14 10:36:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3147914742960679, Global best: 0.3093026872698008, Runtime: 14.45388 seconds\n", + "2023/10/14 10:36:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3114306090748781, Global best: 0.3093026872698008, Runtime: 14.28593 seconds\n", + "2023/10/14 10:36:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3114306090748781, Global best: 0.3093026872698008, Runtime: 14.27028 seconds\n", + "2023/10/14 10:37:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3114306090748781, Global best: 0.3093026872698008, Runtime: 14.07548 seconds\n", + "2023/10/14 10:37:20 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.30933752366184303, Global best: 0.3093026872698008, Runtime: 15.13259 seconds\n", + "2023/10/14 10:37:34 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.30933752366184303, Global best: 0.3093026872698008, Runtime: 14.39363 seconds\n", + "2023/10/14 10:37:48 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.30933752366184303, Global best: 0.3093026872698008, Runtime: 13.97869 seconds\n", + "2023/10/14 10:38:03 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3151573192623444, Global best: 0.3093026872698008, Runtime: 14.05922 seconds\n", + "2023/10/14 10:38:18 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3151573192623444, Global best: 0.3093026872698008, Runtime: 15.48462 seconds\n", + "2023/10/14 10:38:32 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3151573192623444, Global best: 0.3093026872698008, Runtime: 14.47061 seconds\n", + "2023/10/14 10:38:47 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.31595544114463925, Global best: 0.3093026872698008, Runtime: 14.52969 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.625 0.6875 541\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:38:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:39:05 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.31573167892041887, Global best: 0.31573167892041887, Runtime: 6.69949 seconds\n", + "2023/10/14 10:39:12 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.315456225641503, Global best: 0.315456225641503, Runtime: 6.68093 seconds\n", + "2023/10/14 10:39:18 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.315456225641503, Global best: 0.315456225641503, Runtime: 6.73017 seconds\n", + "2023/10/14 10:39:25 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.31236343413223217, Global best: 0.31236343413223217, Runtime: 6.67958 seconds\n", + "2023/10/14 10:39:32 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.31204826644991385, Global best: 0.31204826644991385, Runtime: 7.17364 seconds\n", + "2023/10/14 10:39:39 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.31204826644991385, Global best: 0.31204826644991385, Runtime: 6.68129 seconds\n", + "2023/10/14 10:39:46 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.31204826644991385, Global best: 0.31204826644991385, Runtime: 6.72721 seconds\n", + "2023/10/14 10:39:52 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3106461243862212, Global best: 0.3106461243862212, Runtime: 6.66154 seconds\n", + "2023/10/14 10:39:59 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3069560928408326, Global best: 0.3069560928408326, Runtime: 6.70874 seconds\n", + "2023/10/14 10:40:06 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3069560928408326, Global best: 0.3069560928408326, Runtime: 6.66423 seconds\n", + "2023/10/14 10:40:12 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3069560928408326, Global best: 0.3069560928408326, Runtime: 6.69602 seconds\n", + "2023/10/14 10:40:19 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3000525649335468, Global best: 0.3000525649335468, Runtime: 6.75597 seconds\n", + "2023/10/14 10:40:26 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3000525649335468, Global best: 0.3000525649335468, Runtime: 6.66733 seconds\n", + "2023/10/14 10:40:33 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3000525649335468, Global best: 0.3000525649335468, Runtime: 6.70084 seconds\n", + "2023/10/14 10:40:39 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.29885166148170383, Global best: 0.29885166148170383, Runtime: 6.65261 seconds\n", + "2023/10/14 10:40:46 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.29885166148170383, Global best: 0.29885166148170383, Runtime: 6.63571 seconds\n", + "2023/10/14 10:40:53 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.29885166148170383, Global best: 0.29885166148170383, Runtime: 6.73874 seconds\n", + "2023/10/14 10:40:59 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.29885166148170383, Global best: 0.29885166148170383, Runtime: 6.70489 seconds\n", + "2023/10/14 10:41:06 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.29885166148170383, Global best: 0.29885166148170383, Runtime: 6.77670 seconds\n", + "2023/10/14 10:41:13 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.29885166148170383, Global best: 0.29885166148170383, Runtime: 6.67714 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.625 0.625 505\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:41:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:41:31 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3180319426635317, Global best: 0.3180319426635317, Runtime: 6.67845 seconds\n", + "2023/10/14 10:41:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3180319426635317, Global best: 0.3180319426635317, Runtime: 6.57741 seconds\n", + "2023/10/14 10:41:44 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3170041458347536, Global best: 0.3170041458347536, Runtime: 6.62247 seconds\n", + "2023/10/14 10:41:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3131669627421969, Global best: 0.3131669627421969, Runtime: 6.60718 seconds\n", + "2023/10/14 10:41:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3131669627421969, Global best: 0.3131669627421969, Runtime: 6.59321 seconds\n", + "2023/10/14 10:42:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3131669627421969, Global best: 0.3131669627421969, Runtime: 6.62767 seconds\n", + "2023/10/14 10:42:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3131669627421969, Global best: 0.3131669627421969, Runtime: 6.59503 seconds\n", + "2023/10/14 10:42:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3131669627421969, Global best: 0.3131669627421969, Runtime: 7.01968 seconds\n", + "2023/10/14 10:42:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3131669627421969, Global best: 0.3131669627421969, Runtime: 6.63480 seconds\n", + "2023/10/14 10:42:31 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3131669627421969, Global best: 0.3131669627421969, Runtime: 6.57893 seconds\n", + "2023/10/14 10:42:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.63965 seconds\n", + "2023/10/14 10:42:44 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.63410 seconds\n", + "2023/10/14 10:42:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.64183 seconds\n", + "2023/10/14 10:42:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.67698 seconds\n", + "2023/10/14 10:43:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.68055 seconds\n", + "2023/10/14 10:43:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.63156 seconds\n", + "2023/10/14 10:43:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.63368 seconds\n", + "2023/10/14 10:43:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.59185 seconds\n", + "2023/10/14 10:43:30 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.62945 seconds\n", + "2023/10/14 10:43:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3049981771000666, Global best: 0.3049981771000666, Runtime: 6.58519 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.625 0.75 514\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:43:41 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:43:55 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.31185394423807966, Global best: 0.31185394423807966, Runtime: 6.68619 seconds\n", + "2023/10/14 10:44:01 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.30780950703375815, Global best: 0.30780950703375815, Runtime: 6.64826 seconds\n", + "2023/10/14 10:44:08 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3063335084201039, Global best: 0.3063335084201039, Runtime: 6.63999 seconds\n", + "2023/10/14 10:44:15 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.3041539563389414, Global best: 0.3041539563389414, Runtime: 6.64302 seconds\n", + "2023/10/14 10:44:21 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.29656100998697743, Global best: 0.29656100998697743, Runtime: 6.60378 seconds\n", + "2023/10/14 10:44:28 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.29656100998697743, Global best: 0.29656100998697743, Runtime: 6.61750 seconds\n", + "2023/10/14 10:44:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.29516982679697745, Global best: 0.29516982679697745, Runtime: 6.63059 seconds\n", + "2023/10/14 10:44:41 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.29485752138039806, Global best: 0.29485752138039806, Runtime: 6.54325 seconds\n", + "2023/10/14 10:44:48 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2904033162006545, Global best: 0.2904033162006545, Runtime: 6.64948 seconds\n", + "2023/10/14 10:44:55 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2902474409910834, Global best: 0.2902474409910834, Runtime: 7.02779 seconds\n", + "2023/10/14 10:45:01 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2900980253753067, Global best: 0.2900980253753067, Runtime: 6.65211 seconds\n", + "2023/10/14 10:45:08 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2898215087848387, Global best: 0.2898215087848387, Runtime: 6.61903 seconds\n", + "2023/10/14 10:45:15 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.28211553230913244, Global best: 0.28211553230913244, Runtime: 6.59901 seconds\n", + "2023/10/14 10:45:21 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.28211553230913244, Global best: 0.28211553230913244, Runtime: 6.58953 seconds\n", + "2023/10/14 10:45:28 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.28211553230913244, Global best: 0.28211553230913244, Runtime: 6.62692 seconds\n", + "2023/10/14 10:45:34 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.28211553230913244, Global best: 0.28211553230913244, Runtime: 6.62703 seconds\n", + "2023/10/14 10:45:41 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.28211553230913244, Global best: 0.28211553230913244, Runtime: 6.58272 seconds\n", + "2023/10/14 10:45:48 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.28194086469394253, Global best: 0.28194086469394253, Runtime: 6.56896 seconds\n", + "2023/10/14 10:45:54 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.28194086469394253, Global best: 0.28194086469394253, Runtime: 6.68013 seconds\n", + "2023/10/14 10:46:01 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.28194086469394253, Global best: 0.28194086469394253, Runtime: 6.66735 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.625 0.875 499\n", + "Triglav Stage 1 Base 0.5625 0.6875 238\n", + "Triglav MultiSURF 10 0.6875 0.875 10\n", + "Triglav MultiSURF 20 0.75 0.6875 20\n", + "Triglav MultiSURF 40 0.5625 0.625 40\n", + "Triglav MultiSURF 60 0.5625 0.625 60\n", + "Triglav MultiSURF 80 0.5625 0.8125 80\n", + "Triglav MultiSURF 100 0.5625 0.8125 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:46:29 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:46:51 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.2795456683830143, Global best: 0.2795456683830143, Runtime: 13.90815 seconds\n", + "2023/10/14 10:47:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.2795456683830143, Global best: 0.2795456683830143, Runtime: 13.23225 seconds\n", + "2023/10/14 10:47:17 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.28021632801023344, Global best: 0.2795456683830143, Runtime: 13.26993 seconds\n", + "2023/10/14 10:47:31 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.28021632801023344, Global best: 0.2795456683830143, Runtime: 13.57481 seconds\n", + "2023/10/14 10:47:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.28021632801023344, Global best: 0.2795456683830143, Runtime: 13.76975 seconds\n", + "2023/10/14 10:47:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.28021632801023344, Global best: 0.2795456683830143, Runtime: 13.75912 seconds\n", + "2023/10/14 10:48:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.2801514084179221, Global best: 0.2795456683830143, Runtime: 14.84851 seconds\n", + "2023/10/14 10:48:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.2801514084179221, Global best: 0.2795456683830143, Runtime: 14.23960 seconds\n", + "2023/10/14 10:48:42 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.27000879560475666, Global best: 0.27000879560475666, Runtime: 14.17241 seconds\n", + "2023/10/14 10:48:56 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.27000879560475666, Global best: 0.27000879560475666, Runtime: 13.96761 seconds\n", + "2023/10/14 10:49:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.27000879560475666, Global best: 0.27000879560475666, Runtime: 13.07024 seconds\n", + "2023/10/14 10:49:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.28184771115491847, Global best: 0.27000879560475666, Runtime: 14.16331 seconds\n", + "2023/10/14 10:49:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.28184771115491847, Global best: 0.27000879560475666, Runtime: 13.99115 seconds\n", + "2023/10/14 10:49:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.28184771115491847, Global best: 0.27000879560475666, Runtime: 13.48351 seconds\n", + "2023/10/14 10:50:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.28348233208756246, Global best: 0.27000879560475666, Runtime: 14.26400 seconds\n", + "2023/10/14 10:50:18 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.28236152017003247, Global best: 0.27000879560475666, Runtime: 13.41674 seconds\n", + "2023/10/14 10:50:31 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.28236152017003247, Global best: 0.27000879560475666, Runtime: 13.44838 seconds\n", + "2023/10/14 10:50:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.2742525702106499, Global best: 0.27000879560475666, Runtime: 13.47498 seconds\n", + "2023/10/14 10:50:58 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.2742525702106499, Global best: 0.27000879560475666, Runtime: 13.58408 seconds\n", + "2023/10/14 10:51:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.2742525702106499, Global best: 0.27000879560475666, Runtime: 13.23527 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.5625 0.8125 124\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:51:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:51:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.2833744367423836, Global best: 0.2833744367423836, Runtime: 6.50247 seconds\n", + "2023/10/14 10:51:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.2730829888119436, Global best: 0.2730829888119436, Runtime: 6.48415 seconds\n", + "2023/10/14 10:51:42 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.2730829888119436, Global best: 0.2730829888119436, Runtime: 6.49769 seconds\n", + "2023/10/14 10:51:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.2730829888119436, Global best: 0.2730829888119436, Runtime: 6.52612 seconds\n", + "2023/10/14 10:51:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.2730829888119436, Global best: 0.2730829888119436, Runtime: 6.48806 seconds\n", + "2023/10/14 10:52:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.2730829888119436, Global best: 0.2730829888119436, Runtime: 6.50991 seconds\n", + "2023/10/14 10:52:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.2730829888119436, Global best: 0.2730829888119436, Runtime: 6.54487 seconds\n", + "2023/10/14 10:52:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.2726101254357328, Global best: 0.2726101254357328, Runtime: 6.52725 seconds\n", + "2023/10/14 10:52:21 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.2677528085882787, Global best: 0.2677528085882787, Runtime: 6.48081 seconds\n", + "2023/10/14 10:52:28 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2677528085882787, Global best: 0.2677528085882787, Runtime: 6.47692 seconds\n", + "2023/10/14 10:52:34 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.2677528085882787, Global best: 0.2677528085882787, Runtime: 6.57060 seconds\n", + "2023/10/14 10:52:41 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2677528085882787, Global best: 0.2677528085882787, Runtime: 6.53694 seconds\n", + "2023/10/14 10:52:47 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.26440160228468124, Global best: 0.26440160228468124, Runtime: 6.49830 seconds\n", + "2023/10/14 10:52:54 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2592904985856029, Global best: 0.2592904985856029, Runtime: 6.96455 seconds\n", + "2023/10/14 10:53:01 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2592904985856029, Global best: 0.2592904985856029, Runtime: 6.53268 seconds\n", + "2023/10/14 10:53:07 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2569796719369682, Global best: 0.2569796719369682, Runtime: 6.46317 seconds\n", + "2023/10/14 10:53:14 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2569796719369682, Global best: 0.2569796719369682, Runtime: 6.48316 seconds\n", + "2023/10/14 10:53:20 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2569796719369682, Global best: 0.2569796719369682, Runtime: 6.52316 seconds\n", + "2023/10/14 10:53:27 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2569796719369682, Global best: 0.2569796719369682, Runtime: 6.52349 seconds\n", + "2023/10/14 10:53:33 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2569796719369682, Global best: 0.2569796719369682, Runtime: 6.50966 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.5625 0.75 121\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:53:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:53:51 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.27944318250357075, Global best: 0.27944318250357075, Runtime: 6.46692 seconds\n", + "2023/10/14 10:53:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.26587544847022976, Global best: 0.26587544847022976, Runtime: 6.52893 seconds\n", + "2023/10/14 10:54:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.26587544847022976, Global best: 0.26587544847022976, Runtime: 6.54629 seconds\n", + "2023/10/14 10:54:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.25619206520240223, Global best: 0.25619206520240223, Runtime: 6.51448 seconds\n", + "2023/10/14 10:54:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.2544499871921831, Global best: 0.2544499871921831, Runtime: 6.49857 seconds\n", + "2023/10/14 10:54:23 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.24033142767540283, Global best: 0.24033142767540283, Runtime: 6.52384 seconds\n", + "2023/10/14 10:54:30 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.24033142767540283, Global best: 0.24033142767540283, Runtime: 6.49958 seconds\n", + "2023/10/14 10:54:36 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.23613292875938713, Global best: 0.23613292875938713, Runtime: 6.50333 seconds\n", + "2023/10/14 10:54:43 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2326329916616826, Global best: 0.2326329916616826, Runtime: 6.47708 seconds\n", + "2023/10/14 10:54:49 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2326329916616826, Global best: 0.2326329916616826, Runtime: 6.47847 seconds\n", + "2023/10/14 10:54:56 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.23076255480231442, Global best: 0.23076255480231442, Runtime: 6.42466 seconds\n", + "2023/10/14 10:55:02 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.2279662667180325, Global best: 0.2279662667180325, Runtime: 6.46776 seconds\n", + "2023/10/14 10:55:09 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2260787657251159, Global best: 0.2260787657251159, Runtime: 6.47081 seconds\n", + "2023/10/14 10:55:15 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.22472015824404837, Global best: 0.22472015824404837, Runtime: 6.47771 seconds\n", + "2023/10/14 10:55:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.22455448647297768, Global best: 0.22455448647297768, Runtime: 6.48719 seconds\n", + "2023/10/14 10:55:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.22279358606660973, Global best: 0.22279358606660973, Runtime: 6.44720 seconds\n", + "2023/10/14 10:55:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.22101730002204437, Global best: 0.22101730002204437, Runtime: 6.49197 seconds\n", + "2023/10/14 10:55:41 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.2179241677006406, Global best: 0.2179241677006406, Runtime: 6.48075 seconds\n", + "2023/10/14 10:55:48 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.21773330103687233, Global best: 0.21773330103687233, Runtime: 6.92744 seconds\n", + "2023/10/14 10:55:55 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.21636911241495083, Global best: 0.21636911241495083, Runtime: 6.48446 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.5625 0.75 96\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 10:55:58 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 10:56:12 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2638131039034326, Global best: 0.2638131039034326, Runtime: 6.47606 seconds\n", + "2023/10/14 10:56:18 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.25905536780018357, Global best: 0.25905536780018357, Runtime: 6.52948 seconds\n", + "2023/10/14 10:56:25 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2583670093322776, Global best: 0.2583670093322776, Runtime: 6.49356 seconds\n", + "2023/10/14 10:56:31 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.24819574740343414, Global best: 0.24819574740343414, Runtime: 6.48014 seconds\n", + "2023/10/14 10:56:38 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.24553717094913866, Global best: 0.24553717094913866, Runtime: 6.44607 seconds\n", + "2023/10/14 10:56:44 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.243879230824913, Global best: 0.243879230824913, Runtime: 6.49624 seconds\n", + "2023/10/14 10:56:51 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.236770711235557, Global best: 0.236770711235557, Runtime: 6.47179 seconds\n", + "2023/10/14 10:56:57 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2366742746213473, Global best: 0.2366742746213473, Runtime: 6.44049 seconds\n", + "2023/10/14 10:57:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2366742746213473, Global best: 0.2366742746213473, Runtime: 6.48223 seconds\n", + "2023/10/14 10:57:10 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2366742746213473, Global best: 0.2366742746213473, Runtime: 6.46380 seconds\n", + "2023/10/14 10:57:17 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.23479631538606002, Global best: 0.23479631538606002, Runtime: 6.55627 seconds\n", + "2023/10/14 10:57:23 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.23479631538606002, Global best: 0.23479631538606002, Runtime: 6.46185 seconds\n", + "2023/10/14 10:57:30 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.23172393534098226, Global best: 0.23172393534098226, Runtime: 6.53191 seconds\n", + "2023/10/14 10:57:36 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2241085944164873, Global best: 0.2241085944164873, Runtime: 6.48603 seconds\n", + "2023/10/14 10:57:43 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.222118177819703, Global best: 0.222118177819703, Runtime: 6.48339 seconds\n", + "2023/10/14 10:57:50 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2181033379586219, Global best: 0.2181033379586219, Runtime: 6.94957 seconds\n", + "2023/10/14 10:57:56 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2181033379586219, Global best: 0.2181033379586219, Runtime: 6.46156 seconds\n", + "2023/10/14 10:58:03 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.21769269285835943, Global best: 0.21769269285835943, Runtime: 6.49913 seconds\n", + "2023/10/14 10:58:09 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.21769269285835943, Global best: 0.21769269285835943, Runtime: 6.43576 seconds\n", + "2023/10/14 10:58:16 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.21152841089248176, Global best: 0.21152841089248176, Runtime: 6.51666 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.5625 0.875 93\n", + "2\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 444 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 242 / Rejected: 202\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 242 / Rejected: 202\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 242 / Rejected: 202\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 242 / Rejected: 202\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 242 / Rejected: 202\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 242 / Rejected: 202\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 242 / Rejected: 202\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 228 / Rejected: 216\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 228 / Rejected: 216\n", + "Round 26 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 27 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 28 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 29 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 30 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 31 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 32 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 33 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 34 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 35 / Tentative (Accepted): 130 / Tentative (Not Accepted): 98 / Rejected: 216\n", + "Round 36 / Tentative (Accepted): 141 / Tentative (Not Accepted): 87 / Rejected: 216\n", + "Round 37 / Tentative (Accepted): 141 / Tentative (Not Accepted): 85 / Rejected: 218\n", + "Round 38 / Tentative (Accepted): 141 / Tentative (Not Accepted): 85 / Rejected: 218\n", + "Round 39 / Tentative (Accepted): 141 / Tentative (Not Accepted): 85 / Rejected: 218\n", + "Round 40 / Tentative (Accepted): 141 / Tentative (Not Accepted): 85 / Rejected: 218\n", + "Final Feature Set Contains 284 Features.\n", + "Control (Positive) 0.7833333333333333 0.8333333333333333 938\n", + "Control (Negative) 0.3833333333333333 0.55 938\n", + "ANOVA Base 0.7833333333333333 0.8333333333333333 327\n", + "Mutual Information (10) Base 0.7833333333333333 0.7833333333333333 10\n", + "RFE (10) Base 0.7333333333333334 0.8333333333333333 10\n", + "MultiSURF (10) 0.7333333333333334 0.8333333333333333 10\n", + "Mutual Information (20) Base 0.7833333333333333 0.6166666666666667 20\n", + "RFE (20) Base 0.7833333333333333 0.8333333333333333 20\n", + "MultiSURF (20) 0.7833333333333333 0.75 20\n", + "Mutual Information (40) Base 0.7 0.5666666666666667 40\n", + "RFE (40) Base 0.8333333333333333 0.8333333333333333 40\n", + "MultiSURF (40) 0.7833333333333333 0.8333333333333333 40\n", + "Mutual Information (60) Base 0.7 0.5666666666666667 60\n", + "RFE (60) Base 0.8333333333333333 0.8333333333333333 60\n", + "MultiSURF (60) 0.7833333333333333 0.8333333333333333 60\n", + "Mutual Information (80) Base 0.7 0.6 80\n", + "RFE (80) Base 0.8333333333333333 0.8333333333333333 80\n", + "MultiSURF (80) 0.8333333333333333 0.8333333333333333 80\n", + "Mutual Information (100) Base 0.65 0.6 100\n", + "RFE (100) Base 0.8333333333333333 0.8333333333333333 100\n", + "MultiSURF (100) 0.8333333333333333 0.8333333333333333 100\n", + "RFECV Base 0.7833333333333333 0.8333333333333333 64\n", + "Boruta Base 0.8333333333333333 0.8333333333333333 44\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:06:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:07:19 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3120351890656306, Global best: 0.3120351890656306, Runtime: 13.39206 seconds\n", + "2023/10/14 11:07:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3120351890656306, Global best: 0.3120351890656306, Runtime: 13.42857 seconds\n", + "2023/10/14 11:07:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3120351890656306, Global best: 0.3120351890656306, Runtime: 13.53154 seconds\n", + "2023/10/14 11:08:01 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.30821301703965714, Global best: 0.30821301703965714, Runtime: 14.31701 seconds\n", + "2023/10/14 11:08:16 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.30821301703965714, Global best: 0.30821301703965714, Runtime: 14.99063 seconds\n", + "2023/10/14 11:08:31 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.30821301703965714, Global best: 0.30821301703965714, Runtime: 15.16495 seconds\n", + "2023/10/14 11:08:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.31857434420139874, Global best: 0.30821301703965714, Runtime: 13.82310 seconds\n", + "2023/10/14 11:08:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.305049535659844, Global best: 0.305049535659844, Runtime: 14.37053 seconds\n", + "2023/10/14 11:09:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.305049535659844, Global best: 0.305049535659844, Runtime: 14.36242 seconds\n", + "2023/10/14 11:09:28 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.305049535659844, Global best: 0.305049535659844, Runtime: 14.13374 seconds\n", + "2023/10/14 11:09:43 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.305049535659844, Global best: 0.305049535659844, Runtime: 15.46069 seconds\n", + "2023/10/14 11:09:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.314465738857915, Global best: 0.305049535659844, Runtime: 15.49160 seconds\n", + "2023/10/14 11:10:12 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.314465738857915, Global best: 0.305049535659844, Runtime: 13.90755 seconds\n", + "2023/10/14 11:10:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.314465738857915, Global best: 0.305049535659844, Runtime: 14.30826 seconds\n", + "2023/10/14 11:10:42 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3145770649776114, Global best: 0.305049535659844, Runtime: 15.01324 seconds\n", + "2023/10/14 11:10:56 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3216629488747413, Global best: 0.305049535659844, Runtime: 14.17139 seconds\n", + "2023/10/14 11:11:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3216629488747413, Global best: 0.305049535659844, Runtime: 14.08636 seconds\n", + "2023/10/14 11:11:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.32397229077897977, Global best: 0.305049535659844, Runtime: 13.85213 seconds\n", + "2023/10/14 11:11:38 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.32397229077897977, Global best: 0.305049535659844, Runtime: 14.14125 seconds\n", + "2023/10/14 11:11:53 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3208765201538095, Global best: 0.305049535659844, Runtime: 14.77624 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.8333333333333333 0.8333333333333333 529\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:11:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:12:11 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.31873541002044214, Global best: 0.31873541002044214, Runtime: 6.64740 seconds\n", + "2023/10/14 11:12:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.31873541002044214, Global best: 0.31873541002044214, Runtime: 6.69506 seconds\n", + "2023/10/14 11:12:24 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.31873541002044214, Global best: 0.31873541002044214, Runtime: 6.70880 seconds\n", + "2023/10/14 11:12:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.31843948660535043, Global best: 0.31843948660535043, Runtime: 6.72115 seconds\n", + "2023/10/14 11:12:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.31778948869991613, Global best: 0.31778948869991613, Runtime: 6.67887 seconds\n", + "2023/10/14 11:12:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.31502858845818776, Global best: 0.31502858845818776, Runtime: 6.65060 seconds\n", + "2023/10/14 11:12:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.31315840871305023, Global best: 0.31315840871305023, Runtime: 7.13199 seconds\n", + "2023/10/14 11:12:58 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.31315840871305023, Global best: 0.31315840871305023, Runtime: 6.65854 seconds\n", + "2023/10/14 11:13:05 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.31315840871305023, Global best: 0.31315840871305023, Runtime: 6.66871 seconds\n", + "2023/10/14 11:13:11 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.31134480280301013, Global best: 0.31134480280301013, Runtime: 6.66880 seconds\n", + "2023/10/14 11:13:18 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3083335578891101, Global best: 0.3083335578891101, Runtime: 6.69843 seconds\n", + "2023/10/14 11:13:25 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3048071833958677, Global best: 0.3048071833958677, Runtime: 6.71632 seconds\n", + "2023/10/14 11:13:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3048071833958677, Global best: 0.3048071833958677, Runtime: 6.68955 seconds\n", + "2023/10/14 11:13:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3046780018853679, Global best: 0.3046780018853679, Runtime: 6.67446 seconds\n", + "2023/10/14 11:13:45 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3046780018853679, Global best: 0.3046780018853679, Runtime: 6.72852 seconds\n", + "2023/10/14 11:13:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3046780018853679, Global best: 0.3046780018853679, Runtime: 6.69097 seconds\n", + "2023/10/14 11:13:58 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2998307889179683, Global best: 0.2998307889179683, Runtime: 6.71616 seconds\n", + "2023/10/14 11:14:05 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2998307889179683, Global best: 0.2998307889179683, Runtime: 6.69455 seconds\n", + "2023/10/14 11:14:12 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2998307889179683, Global best: 0.2998307889179683, Runtime: 6.67298 seconds\n", + "2023/10/14 11:14:18 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2937466875626369, Global best: 0.2937466875626369, Runtime: 6.71522 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.7833333333333333 0.8333333333333333 506\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:14:22 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:14:36 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3106891908035606, Global best: 0.3106891908035606, Runtime: 6.76310 seconds\n", + "2023/10/14 11:14:43 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3106891908035606, Global best: 0.3106891908035606, Runtime: 6.70179 seconds\n", + "2023/10/14 11:14:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3106891908035606, Global best: 0.3106891908035606, Runtime: 6.74444 seconds\n", + "2023/10/14 11:14:56 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3106891908035606, Global best: 0.3106891908035606, Runtime: 6.70719 seconds\n", + "2023/10/14 11:15:03 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3106891908035606, Global best: 0.3106891908035606, Runtime: 6.71258 seconds\n", + "2023/10/14 11:15:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.67599 seconds\n", + "2023/10/14 11:15:16 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.64356 seconds\n", + "2023/10/14 11:15:23 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.71257 seconds\n", + "2023/10/14 11:15:30 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.69123 seconds\n", + "2023/10/14 11:15:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 7.05689 seconds\n", + "2023/10/14 11:15:43 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.65709 seconds\n", + "2023/10/14 11:15:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.68369 seconds\n", + "2023/10/14 11:15:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.67402 seconds\n", + "2023/10/14 11:16:03 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.68328 seconds\n", + "2023/10/14 11:16:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.69334 seconds\n", + "2023/10/14 11:16:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.69969 seconds\n", + "2023/10/14 11:16:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.74343 seconds\n", + "2023/10/14 11:16:30 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.67966 seconds\n", + "2023/10/14 11:16:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.64733 seconds\n", + "2023/10/14 11:16:44 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.30464577629611156, Global best: 0.30464577629611156, Runtime: 6.69083 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.7833333333333333 0.8333333333333333 530\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:16:48 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:17:02 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3119328388919686, Global best: 0.3119328388919686, Runtime: 6.63892 seconds\n", + "2023/10/14 11:17:08 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3119328388919686, Global best: 0.3119328388919686, Runtime: 6.66492 seconds\n", + "2023/10/14 11:17:15 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3085452933066423, Global best: 0.3085452933066423, Runtime: 6.64221 seconds\n", + "2023/10/14 11:17:22 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.304264634122827, Global best: 0.304264634122827, Runtime: 6.65635 seconds\n", + "2023/10/14 11:17:28 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.304264634122827, Global best: 0.304264634122827, Runtime: 6.60897 seconds\n", + "2023/10/14 11:17:35 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3028703913089341, Global best: 0.3028703913089341, Runtime: 6.67066 seconds\n", + "2023/10/14 11:17:41 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.30118667085299705, Global best: 0.30118667085299705, Runtime: 6.65230 seconds\n", + "2023/10/14 11:17:48 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.30118667085299705, Global best: 0.30118667085299705, Runtime: 6.65120 seconds\n", + "2023/10/14 11:17:55 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.30118667085299705, Global best: 0.30118667085299705, Runtime: 6.60491 seconds\n", + "2023/10/14 11:18:02 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.30118667085299705, Global best: 0.30118667085299705, Runtime: 7.12059 seconds\n", + "2023/10/14 11:18:09 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.30118667085299705, Global best: 0.30118667085299705, Runtime: 6.68480 seconds\n", + "2023/10/14 11:18:15 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.30118667085299705, Global best: 0.30118667085299705, Runtime: 6.70929 seconds\n", + "2023/10/14 11:18:22 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.30118667085299705, Global best: 0.30118667085299705, Runtime: 6.67763 seconds\n", + "2023/10/14 11:18:29 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.30075584808446215, Global best: 0.30075584808446215, Runtime: 6.63514 seconds\n", + "2023/10/14 11:18:35 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2933175632851997, Global best: 0.2933175632851997, Runtime: 6.63708 seconds\n", + "2023/10/14 11:18:42 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.29121798357397327, Global best: 0.29121798357397327, Runtime: 6.59609 seconds\n", + "2023/10/14 11:18:48 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2856315279549857, Global best: 0.2856315279549857, Runtime: 6.65052 seconds\n", + "2023/10/14 11:18:55 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.28202644428696017, Global best: 0.28202644428696017, Runtime: 6.65012 seconds\n", + "2023/10/14 11:19:02 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2798855126040738, Global best: 0.2798855126040738, Runtime: 6.62406 seconds\n", + "2023/10/14 11:19:08 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.27908209362169356, Global best: 0.27908209362169356, Runtime: 6.56812 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.7833333333333333 0.8333333333333333 469\n", + "Triglav Stage 1 Base 0.7 0.8333333333333333 284\n", + "Triglav MultiSURF 10 0.6 0.6833333333333333 10\n", + "Triglav MultiSURF 20 0.7 0.7833333333333333 20\n", + "Triglav MultiSURF 40 0.7 0.75 40\n", + "Triglav MultiSURF 60 0.7 0.8333333333333333 60\n", + "Triglav MultiSURF 80 0.7 0.8333333333333333 80\n", + "Triglav MultiSURF 100 0.7 0.8333333333333333 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:19:34 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:19:54 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.2574320438731943, Global best: 0.2574320438731943, Runtime: 13.05535 seconds\n", + "2023/10/14 11:20:07 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.2574320438731943, Global best: 0.2574320438731943, Runtime: 12.94709 seconds\n", + "2023/10/14 11:20:20 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.2733186257579949, Global best: 0.2574320438731943, Runtime: 13.21866 seconds\n", + "2023/10/14 11:20:34 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.27652117305775337, Global best: 0.2574320438731943, Runtime: 13.57778 seconds\n", + "2023/10/14 11:20:48 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.27652117305775337, Global best: 0.2574320438731943, Runtime: 14.04819 seconds\n", + "2023/10/14 11:21:02 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.27652117305775337, Global best: 0.2574320438731943, Runtime: 13.62300 seconds\n", + "2023/10/14 11:21:15 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.27652117305775337, Global best: 0.2574320438731943, Runtime: 13.36272 seconds\n", + "2023/10/14 11:21:29 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.28126097051473453, Global best: 0.2574320438731943, Runtime: 14.08119 seconds\n", + "2023/10/14 11:21:43 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.28034439585820414, Global best: 0.2574320438731943, Runtime: 13.68102 seconds\n", + "2023/10/14 11:21:56 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.28034439585820414, Global best: 0.2574320438731943, Runtime: 12.92428 seconds\n", + "2023/10/14 11:22:10 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.2696206299528045, Global best: 0.2574320438731943, Runtime: 14.19160 seconds\n", + "2023/10/14 11:22:24 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.2696206299528045, Global best: 0.2574320438731943, Runtime: 13.66459 seconds\n", + "2023/10/14 11:22:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.2696206299528045, Global best: 0.2574320438731943, Runtime: 13.59626 seconds\n", + "2023/10/14 11:22:52 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.2696206299528045, Global best: 0.2574320438731943, Runtime: 14.68138 seconds\n", + "2023/10/14 11:23:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.2696206299528045, Global best: 0.2574320438731943, Runtime: 13.39883 seconds\n", + "2023/10/14 11:23:19 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.2695085693020938, Global best: 0.2574320438731943, Runtime: 13.39258 seconds\n", + "2023/10/14 11:23:33 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.2695085693020938, Global best: 0.2574320438731943, Runtime: 14.46553 seconds\n", + "2023/10/14 11:23:47 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.2695085693020938, Global best: 0.2574320438731943, Runtime: 13.35428 seconds\n", + "2023/10/14 11:24:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.2666837954773662, Global best: 0.2574320438731943, Runtime: 13.73607 seconds\n", + "2023/10/14 11:24:14 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.2666837954773662, Global best: 0.2574320438731943, Runtime: 13.85437 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.7 0.8333333333333333 152\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:24:18 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:24:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.2804924707069124, Global best: 0.2804924707069124, Runtime: 6.50420 seconds\n", + "2023/10/14 11:24:38 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.2804924707069124, Global best: 0.2804924707069124, Runtime: 6.45588 seconds\n", + "2023/10/14 11:24:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.27381492402517904, Global best: 0.27381492402517904, Runtime: 6.45496 seconds\n", + "2023/10/14 11:24:51 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.26773060680783994, Global best: 0.26773060680783994, Runtime: 6.42481 seconds\n", + "2023/10/14 11:24:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.26773060680783994, Global best: 0.26773060680783994, Runtime: 6.48487 seconds\n", + "2023/10/14 11:25:04 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.26773060680783994, Global best: 0.26773060680783994, Runtime: 6.47072 seconds\n", + "2023/10/14 11:25:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.46287 seconds\n", + "2023/10/14 11:25:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.43923 seconds\n", + "2023/10/14 11:25:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.47760 seconds\n", + "2023/10/14 11:25:30 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.51069 seconds\n", + "2023/10/14 11:25:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.45708 seconds\n", + "2023/10/14 11:25:43 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.45324 seconds\n", + "2023/10/14 11:25:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.50319 seconds\n", + "2023/10/14 11:25:56 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.46879 seconds\n", + "2023/10/14 11:26:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.41175 seconds\n", + "2023/10/14 11:26:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.90401 seconds\n", + "2023/10/14 11:26:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.41337 seconds\n", + "2023/10/14 11:26:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.50316 seconds\n", + "2023/10/14 11:26:28 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.53934 seconds\n", + "2023/10/14 11:26:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.25531700871825325, Global best: 0.25531700871825325, Runtime: 6.47074 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.7 0.8333333333333333 150\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:26:39 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:26:52 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.26828187543752635, Global best: 0.26828187543752635, Runtime: 6.52315 seconds\n", + "2023/10/14 11:26:59 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.26828187543752635, Global best: 0.26828187543752635, Runtime: 6.48680 seconds\n", + "2023/10/14 11:27:05 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.262641858434986, Global best: 0.262641858434986, Runtime: 6.47333 seconds\n", + "2023/10/14 11:27:12 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.262641858434986, Global best: 0.262641858434986, Runtime: 6.49003 seconds\n", + "2023/10/14 11:27:18 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.25333658249691754, Global best: 0.25333658249691754, Runtime: 6.46697 seconds\n", + "2023/10/14 11:27:25 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.25333658249691754, Global best: 0.25333658249691754, Runtime: 6.47375 seconds\n", + "2023/10/14 11:27:31 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.25333658249691754, Global best: 0.25333658249691754, Runtime: 6.49953 seconds\n", + "2023/10/14 11:27:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.24198357546636168, Global best: 0.24198357546636168, Runtime: 6.48171 seconds\n", + "2023/10/14 11:27:44 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.24198357546636168, Global best: 0.24198357546636168, Runtime: 6.49360 seconds\n", + "2023/10/14 11:27:51 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.23493213243845776, Global best: 0.23493213243845776, Runtime: 6.54991 seconds\n", + "2023/10/14 11:27:57 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.2330840914948658, Global best: 0.2330840914948658, Runtime: 6.50330 seconds\n", + "2023/10/14 11:28:04 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.23170927276667458, Global best: 0.23170927276667458, Runtime: 6.53083 seconds\n", + "2023/10/14 11:28:10 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2269673721601485, Global best: 0.2269673721601485, Runtime: 6.47866 seconds\n", + "2023/10/14 11:28:17 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.22393093680885526, Global best: 0.22393093680885526, Runtime: 6.47900 seconds\n", + "2023/10/14 11:28:24 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.22148145615808565, Global best: 0.22148145615808565, Runtime: 6.90506 seconds\n", + "2023/10/14 11:28:30 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2188444708953589, Global best: 0.2188444708953589, Runtime: 6.53692 seconds\n", + "2023/10/14 11:28:37 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2188444708953589, Global best: 0.2188444708953589, Runtime: 6.54934 seconds\n", + "2023/10/14 11:28:43 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.21846685425090254, Global best: 0.21846685425090254, Runtime: 6.45316 seconds\n", + "2023/10/14 11:28:50 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.2159511236629616, Global best: 0.2159511236629616, Runtime: 6.48937 seconds\n", + "2023/10/14 11:28:56 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.2153945278684894, Global best: 0.2153945278684894, Runtime: 6.47137 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.7 0.8333333333333333 123\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:29:00 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:29:14 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2655849568045837, Global best: 0.2655849568045837, Runtime: 6.50913 seconds\n", + "2023/10/14 11:29:20 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.2580305854588679, Global best: 0.2580305854588679, Runtime: 6.50815 seconds\n", + "2023/10/14 11:29:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2520148335232828, Global best: 0.2520148335232828, Runtime: 6.47662 seconds\n", + "2023/10/14 11:29:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.24998648210834584, Global best: 0.24998648210834584, Runtime: 6.60096 seconds\n", + "2023/10/14 11:29:40 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.24709455832418342, Global best: 0.24709455832418342, Runtime: 6.49090 seconds\n", + "2023/10/14 11:29:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.24240995428105805, Global best: 0.24240995428105805, Runtime: 6.52387 seconds\n", + "2023/10/14 11:29:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.24240995428105805, Global best: 0.24240995428105805, Runtime: 6.46902 seconds\n", + "2023/10/14 11:29:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.24240995428105805, Global best: 0.24240995428105805, Runtime: 6.55920 seconds\n", + "2023/10/14 11:30:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.24240995428105805, Global best: 0.24240995428105805, Runtime: 6.56764 seconds\n", + "2023/10/14 11:30:12 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2388866762378759, Global best: 0.2388866762378759, Runtime: 6.49845 seconds\n", + "2023/10/14 11:30:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2388866762378759, Global best: 0.2388866762378759, Runtime: 6.52605 seconds\n", + "2023/10/14 11:30:25 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.23779324775240546, Global best: 0.23779324775240546, Runtime: 6.51610 seconds\n", + "2023/10/14 11:30:32 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.23779324775240546, Global best: 0.23779324775240546, Runtime: 6.55874 seconds\n", + "2023/10/14 11:30:38 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.23779324775240546, Global best: 0.23779324775240546, Runtime: 6.49780 seconds\n", + "2023/10/14 11:30:45 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.23398085967380544, Global best: 0.23398085967380544, Runtime: 6.50923 seconds\n", + "2023/10/14 11:30:51 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.23196526118051924, Global best: 0.23196526118051924, Runtime: 6.53386 seconds\n", + "2023/10/14 11:30:58 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.23196526118051924, Global best: 0.23196526118051924, Runtime: 6.50042 seconds\n", + "2023/10/14 11:31:04 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2313657947908653, Global best: 0.2313657947908653, Runtime: 6.56816 seconds\n", + "2023/10/14 11:31:11 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.23041151403328122, Global best: 0.23041151403328122, Runtime: 6.51739 seconds\n", + "2023/10/14 11:31:18 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.23041151403328122, Global best: 0.23041151403328122, Runtime: 6.56268 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.7 0.8333333333333333 132\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 487 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 230\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 230\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 230\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 230\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 230\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 230\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 230\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 230\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 230\n", + "Round 26 / Tentative (Accepted): 147 / Tentative (Not Accepted): 102 / Rejected: 238\n", + "Round 27 / Tentative (Accepted): 147 / Tentative (Not Accepted): 102 / Rejected: 238\n", + "Round 28 / Tentative (Accepted): 147 / Tentative (Not Accepted): 102 / Rejected: 238\n", + "Round 29 / Tentative (Accepted): 147 / Tentative (Not Accepted): 102 / Rejected: 238\n", + "Round 30 / Tentative (Accepted): 147 / Tentative (Not Accepted): 102 / Rejected: 238\n", + "Round 31 / Tentative (Accepted): 147 / Tentative (Not Accepted): 102 / Rejected: 238\n", + "Round 32 / Tentative (Accepted): 147 / Tentative (Not Accepted): 100 / Rejected: 240\n", + "Round 33 / Tentative (Accepted): 147 / Tentative (Not Accepted): 100 / Rejected: 240\n", + "Round 34 / Tentative (Accepted): 147 / Tentative (Not Accepted): 100 / Rejected: 240\n", + "Round 35 / Tentative (Accepted): 147 / Tentative (Not Accepted): 100 / Rejected: 240\n", + "Round 36 / Tentative (Accepted): 153 / Tentative (Not Accepted): 89 / Rejected: 245\n", + "Round 37 / Tentative (Accepted): 153 / Tentative (Not Accepted): 89 / Rejected: 245\n", + "Round 38 / Tentative (Accepted): 153 / Tentative (Not Accepted): 89 / Rejected: 245\n", + "Round 39 / Tentative (Accepted): 153 / Tentative (Not Accepted): 89 / Rejected: 245\n", + "Round 40 / Tentative (Accepted): 153 / Tentative (Not Accepted): 89 / Rejected: 245\n", + "Final Feature Set Contains 295 Features.\n", + "Control (Positive) 0.9166666666666667 0.75 938\n", + "Control (Negative) 0.55 0.4666666666666667 938\n", + "ANOVA Base 0.8666666666666667 0.75 235\n", + "Mutual Information (10) Base 0.6 0.65 10\n", + "RFE (10) Base 0.9166666666666667 0.8166666666666667 10\n", + "MultiSURF (10) 0.8166666666666667 0.7333333333333334 10\n", + "Mutual Information (20) Base 0.6833333333333333 0.6333333333333333 20\n", + "RFE (20) Base 0.7833333333333333 0.8166666666666667 20\n", + "MultiSURF (20) 0.9166666666666667 1.0 20\n", + "Mutual Information (40) Base 0.7833333333333333 0.7333333333333334 40\n", + "RFE (40) Base 0.8333333333333333 0.8333333333333333 40\n", + "MultiSURF (40) 0.9166666666666667 0.8333333333333333 40\n", + "Mutual Information (60) Base 0.8666666666666667 0.8166666666666667 60\n", + "RFE (60) Base 0.8333333333333333 0.8333333333333333 60\n", + "MultiSURF (60) 0.7833333333333333 0.75 60\n", + "Mutual Information (80) Base 0.7333333333333334 0.9 80\n", + "RFE (80) Base 0.8333333333333333 0.8333333333333333 80\n", + "MultiSURF (80) 0.7833333333333333 0.8333333333333333 80\n", + "Mutual Information (100) Base 0.7333333333333334 0.9 100\n", + "RFE (100) Base 0.8333333333333333 0.8333333333333333 100\n", + "MultiSURF (100) 0.8333333333333333 0.7833333333333333 100\n", + "RFECV Base 0.9166666666666667 0.75 202\n", + "Boruta Base 0.8333333333333333 0.8333333333333333 54\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:40:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:40:21 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3423435280431917, Global best: 0.3423435280431917, Runtime: 13.40223 seconds\n", + "2023/10/14 11:40:34 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3423435280431917, Global best: 0.3423435280431917, Runtime: 13.31382 seconds\n", + "2023/10/14 11:40:48 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3423435280431917, Global best: 0.3423435280431917, Runtime: 13.77257 seconds\n", + "2023/10/14 11:41:03 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3491998448842176, Global best: 0.3423435280431917, Runtime: 14.73918 seconds\n", + "2023/10/14 11:41:16 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3491998448842176, Global best: 0.3423435280431917, Runtime: 13.37309 seconds\n", + "2023/10/14 11:41:30 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.34527645733851564, Global best: 0.3423435280431917, Runtime: 14.47368 seconds\n", + "2023/10/14 11:41:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.34169183464057284, Global best: 0.34169183464057284, Runtime: 14.66828 seconds\n", + "2023/10/14 11:42:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.34169183464057284, Global best: 0.34169183464057284, Runtime: 14.50443 seconds\n", + "2023/10/14 11:42:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3265821559995611, Global best: 0.3265821559995611, Runtime: 13.59996 seconds\n", + "2023/10/14 11:42:28 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3265821559995611, Global best: 0.3265821559995611, Runtime: 14.59563 seconds\n", + "2023/10/14 11:42:42 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3265821559995611, Global best: 0.3265821559995611, Runtime: 14.23041 seconds\n", + "2023/10/14 11:42:57 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.33558483512669257, Global best: 0.3265821559995611, Runtime: 14.66072 seconds\n", + "2023/10/14 11:43:11 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.33558483512669257, Global best: 0.3265821559995611, Runtime: 14.02017 seconds\n", + "2023/10/14 11:43:25 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.33558483512669257, Global best: 0.3265821559995611, Runtime: 14.61765 seconds\n", + "2023/10/14 11:43:40 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.33713454270698934, Global best: 0.3265821559995611, Runtime: 14.44378 seconds\n", + "2023/10/14 11:43:54 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.34308147799073485, Global best: 0.3265821559995611, Runtime: 13.78302 seconds\n", + "2023/10/14 11:44:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.32878521988810055, Global best: 0.3265821559995611, Runtime: 15.10023 seconds\n", + "2023/10/14 11:44:22 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.32878521988810055, Global best: 0.3265821559995611, Runtime: 13.62649 seconds\n", + "2023/10/14 11:44:36 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.32878521988810055, Global best: 0.3265821559995611, Runtime: 13.54665 seconds\n", + "2023/10/14 11:44:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.32878521988810055, Global best: 0.3265821559995611, Runtime: 14.02653 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.9166666666666667 0.9166666666666667 571\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:44:54 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:45:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.71713 seconds\n", + "2023/10/14 11:45:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.72845 seconds\n", + "2023/10/14 11:45:21 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.68938 seconds\n", + "2023/10/14 11:45:28 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.71512 seconds\n", + "2023/10/14 11:45:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.69559 seconds\n", + "2023/10/14 11:45:41 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.71540 seconds\n", + "2023/10/14 11:45:48 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.72341 seconds\n", + "2023/10/14 11:45:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.68906 seconds\n", + "2023/10/14 11:46:01 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.68373 seconds\n", + "2023/10/14 11:46:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.63935 seconds\n", + "2023/10/14 11:46:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.71608 seconds\n", + "2023/10/14 11:46:22 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.68873 seconds\n", + "2023/10/14 11:46:28 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.74269 seconds\n", + "2023/10/14 11:46:35 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.69787 seconds\n", + "2023/10/14 11:46:42 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3328647339529745, Global best: 0.3328647339529745, Runtime: 6.72429 seconds\n", + "2023/10/14 11:46:48 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.32524178111697233, Global best: 0.32524178111697233, Runtime: 6.63217 seconds\n", + "2023/10/14 11:46:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.32524178111697233, Global best: 0.32524178111697233, Runtime: 6.68230 seconds\n", + "2023/10/14 11:47:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.32524178111697233, Global best: 0.32524178111697233, Runtime: 7.07110 seconds\n", + "2023/10/14 11:47:09 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.32524178111697233, Global best: 0.32524178111697233, Runtime: 6.67705 seconds\n", + "2023/10/14 11:47:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.32524178111697233, Global best: 0.32524178111697233, Runtime: 6.70734 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.8666666666666667 0.75 517\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:47:19 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:47:33 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.66852 seconds\n", + "2023/10/14 11:47:40 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.67611 seconds\n", + "2023/10/14 11:47:47 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.70398 seconds\n", + "2023/10/14 11:47:53 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.75194 seconds\n", + "2023/10/14 11:48:00 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.72595 seconds\n", + "2023/10/14 11:48:07 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.65739 seconds\n", + "2023/10/14 11:48:14 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.70759 seconds\n", + "2023/10/14 11:48:20 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.70435 seconds\n", + "2023/10/14 11:48:27 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.75625 seconds\n", + "2023/10/14 11:48:34 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.68869 seconds\n", + "2023/10/14 11:48:40 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.65993 seconds\n", + "2023/10/14 11:48:47 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.71242 seconds\n", + "2023/10/14 11:48:54 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.71652 seconds\n", + "2023/10/14 11:49:01 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.71552 seconds\n", + "2023/10/14 11:49:07 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.72624 seconds\n", + "2023/10/14 11:49:14 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 7.17643 seconds\n", + "2023/10/14 11:49:21 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.67268 seconds\n", + "2023/10/14 11:49:28 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.69738 seconds\n", + "2023/10/14 11:49:35 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.69556 seconds\n", + "2023/10/14 11:49:41 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.33443767354519993, Global best: 0.33443767354519993, Runtime: 6.73772 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.9166666666666667 0.75 552\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:49:45 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:49:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.33911794006260576, Global best: 0.33911794006260576, Runtime: 6.71935 seconds\n", + "2023/10/14 11:50:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.33788623710093024, Global best: 0.33788623710093024, Runtime: 6.68017 seconds\n", + "2023/10/14 11:50:12 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3250283243215526, Global best: 0.3250283243215526, Runtime: 6.72529 seconds\n", + "2023/10/14 11:50:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.324503235928389, Global best: 0.324503235928389, Runtime: 6.70369 seconds\n", + "2023/10/14 11:50:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.31645235500680735, Global best: 0.31645235500680735, Runtime: 6.61781 seconds\n", + "2023/10/14 11:50:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.31645235500680735, Global best: 0.31645235500680735, Runtime: 6.72945 seconds\n", + "2023/10/14 11:50:39 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.31645235500680735, Global best: 0.31645235500680735, Runtime: 6.66742 seconds\n", + "2023/10/14 11:50:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3065740600889683, Global best: 0.3065740600889683, Runtime: 6.73367 seconds\n", + "2023/10/14 11:50:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3065740600889683, Global best: 0.3065740600889683, Runtime: 6.61887 seconds\n", + "2023/10/14 11:50:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3065740600889683, Global best: 0.3065740600889683, Runtime: 6.70023 seconds\n", + "2023/10/14 11:51:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3065740600889683, Global best: 0.3065740600889683, Runtime: 6.69142 seconds\n", + "2023/10/14 11:51:13 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3065740600889683, Global best: 0.3065740600889683, Runtime: 6.71983 seconds\n", + "2023/10/14 11:51:19 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.3065740600889683, Global best: 0.3065740600889683, Runtime: 6.59947 seconds\n", + "2023/10/14 11:51:26 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2986575624262793, Global best: 0.2986575624262793, Runtime: 6.66416 seconds\n", + "2023/10/14 11:51:33 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2986575624262793, Global best: 0.2986575624262793, Runtime: 6.61891 seconds\n", + "2023/10/14 11:51:39 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2986575624262793, Global best: 0.2986575624262793, Runtime: 6.63149 seconds\n", + "2023/10/14 11:51:46 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2986575624262793, Global best: 0.2986575624262793, Runtime: 6.64314 seconds\n", + "2023/10/14 11:51:53 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2986575624262793, Global best: 0.2986575624262793, Runtime: 6.67247 seconds\n", + "2023/10/14 11:51:59 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2986575624262793, Global best: 0.2986575624262793, Runtime: 6.69356 seconds\n", + "2023/10/14 11:52:06 PM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.29498900347355217, Global best: 0.29498900347355217, Runtime: 6.66341 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.9166666666666667 0.75 513\n", + "Triglav Stage 1 Base 0.8333333333333333 0.75 295\n", + "Triglav MultiSURF 10 0.8666666666666667 0.6333333333333333 10\n", + "Triglav MultiSURF 20 0.8166666666666667 0.8 20\n", + "Triglav MultiSURF 40 0.9166666666666667 0.9166666666666667 40\n", + "Triglav MultiSURF 60 0.9166666666666667 0.8333333333333333 60\n", + "Triglav MultiSURF 80 0.9166666666666667 0.8333333333333333 80\n", + "Triglav MultiSURF 100 0.8333333333333333 0.8333333333333333 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:52:32 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:52:52 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.30462719006169925, Global best: 0.30462719006169925, Runtime: 13.38871 seconds\n", + "2023/10/14 11:53:05 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.30462719006169925, Global best: 0.30462719006169925, Runtime: 12.95352 seconds\n", + "2023/10/14 11:53:19 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.30462719006169925, Global best: 0.30462719006169925, Runtime: 13.42067 seconds\n", + "2023/10/14 11:53:32 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3194216403366179, Global best: 0.30462719006169925, Runtime: 13.63914 seconds\n", + "2023/10/14 11:53:45 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3194216403366179, Global best: 0.30462719006169925, Runtime: 13.22274 seconds\n", + "2023/10/14 11:53:59 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3126386677627317, Global best: 0.30462719006169925, Runtime: 13.86239 seconds\n", + "2023/10/14 11:54:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3126386677627317, Global best: 0.30462719006169925, Runtime: 13.38259 seconds\n", + "2023/10/14 11:54:27 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3126386677627317, Global best: 0.30462719006169925, Runtime: 14.49021 seconds\n", + "2023/10/14 11:54:41 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.320715527239694, Global best: 0.30462719006169925, Runtime: 13.43160 seconds\n", + "2023/10/14 11:54:55 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.33292784227488503, Global best: 0.30462719006169925, Runtime: 14.71698 seconds\n", + "2023/10/14 11:55:09 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.32238351312582514, Global best: 0.30462719006169925, Runtime: 13.89839 seconds\n", + "2023/10/14 11:55:23 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.32238351312582514, Global best: 0.30462719006169925, Runtime: 13.70124 seconds\n", + "2023/10/14 11:55:37 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3229102776720892, Global best: 0.30462719006169925, Runtime: 14.03290 seconds\n", + "2023/10/14 11:55:50 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3229102776720892, Global best: 0.30462719006169925, Runtime: 13.04261 seconds\n", + "2023/10/14 11:56:04 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3229102776720892, Global best: 0.30462719006169925, Runtime: 13.61955 seconds\n", + "2023/10/14 11:56:17 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3082377318333006, Global best: 0.30462719006169925, Runtime: 13.18770 seconds\n", + "2023/10/14 11:56:32 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3082377318333006, Global best: 0.30462719006169925, Runtime: 14.69616 seconds\n", + "2023/10/14 11:56:46 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3224807375481726, Global best: 0.30462719006169925, Runtime: 14.55840 seconds\n", + "2023/10/14 11:57:00 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3224807375481726, Global best: 0.30462719006169925, Runtime: 13.41728 seconds\n", + "2023/10/14 11:57:13 PM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3266920182970483, Global best: 0.30462719006169925, Runtime: 13.50500 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.75 0.8333333333333333 171\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:57:17 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:57:31 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3368005212681165, Global best: 0.3368005212681165, Runtime: 6.90679 seconds\n", + "2023/10/14 11:57:37 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.33427830385083807, Global best: 0.33427830385083807, Runtime: 6.47770 seconds\n", + "2023/10/14 11:57:44 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.33427830385083807, Global best: 0.33427830385083807, Runtime: 6.54271 seconds\n", + "2023/10/14 11:57:50 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3269204179532928, Global best: 0.3269204179532928, Runtime: 6.52712 seconds\n", + "2023/10/14 11:57:57 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.32549569541818246, Global best: 0.32549569541818246, Runtime: 6.48986 seconds\n", + "2023/10/14 11:58:03 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3252158444901922, Global best: 0.3252158444901922, Runtime: 6.53047 seconds\n", + "2023/10/14 11:58:10 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.31420956458557625, Global best: 0.31420956458557625, Runtime: 6.43405 seconds\n", + "2023/10/14 11:58:16 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3132999746933077, Global best: 0.3132999746933077, Runtime: 6.46800 seconds\n", + "2023/10/14 11:58:23 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3132999746933077, Global best: 0.3132999746933077, Runtime: 6.43588 seconds\n", + "2023/10/14 11:58:29 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3132999746933077, Global best: 0.3132999746933077, Runtime: 6.46086 seconds\n", + "2023/10/14 11:58:36 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.31288104374887443, Global best: 0.31288104374887443, Runtime: 6.51324 seconds\n", + "2023/10/14 11:58:42 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2949760034225598, Global best: 0.2949760034225598, Runtime: 6.54083 seconds\n", + "2023/10/14 11:58:49 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2949760034225598, Global best: 0.2949760034225598, Runtime: 6.46449 seconds\n", + "2023/10/14 11:58:55 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2949760034225598, Global best: 0.2949760034225598, Runtime: 6.47927 seconds\n", + "2023/10/14 11:59:02 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2949760034225598, Global best: 0.2949760034225598, Runtime: 6.49102 seconds\n", + "2023/10/14 11:59:08 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2949760034225598, Global best: 0.2949760034225598, Runtime: 6.51509 seconds\n", + "2023/10/14 11:59:15 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2949760034225598, Global best: 0.2949760034225598, Runtime: 6.49824 seconds\n", + "2023/10/14 11:59:21 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2949760034225598, Global best: 0.2949760034225598, Runtime: 6.47548 seconds\n", + "2023/10/14 11:59:28 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2949760034225598, Global best: 0.2949760034225598, Runtime: 6.49735 seconds\n", + "2023/10/14 11:59:34 PM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2949760034225598, Global best: 0.2949760034225598, Runtime: 6.49889 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.75 0.65 159\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/14 11:59:38 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/14 11:59:52 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.29829628558227095, Global best: 0.29829628558227095, Runtime: 6.95001 seconds\n", + "2023/10/14 11:59:59 PM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.29829628558227095, Global best: 0.29829628558227095, Runtime: 6.50732 seconds\n", + "2023/10/15 12:00:05 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.29829628558227095, Global best: 0.29829628558227095, Runtime: 6.54794 seconds\n", + "2023/10/15 12:00:12 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.2938920665355037, Global best: 0.2938920665355037, Runtime: 6.48532 seconds\n", + "2023/10/15 12:00:18 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.27549103964642935, Global best: 0.27549103964642935, Runtime: 6.50393 seconds\n", + "2023/10/15 12:00:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.27549103964642935, Global best: 0.27549103964642935, Runtime: 6.47892 seconds\n", + "2023/10/15 12:00:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.27549103964642935, Global best: 0.27549103964642935, Runtime: 6.49441 seconds\n", + "2023/10/15 12:00:38 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.27549103964642935, Global best: 0.27549103964642935, Runtime: 6.49919 seconds\n", + "2023/10/15 12:00:44 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.27549103964642935, Global best: 0.27549103964642935, Runtime: 6.52156 seconds\n", + "2023/10/15 12:00:51 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2713278844961672, Global best: 0.2713278844961672, Runtime: 6.55220 seconds\n", + "2023/10/15 12:00:57 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.26609939992803616, Global best: 0.26609939992803616, Runtime: 6.51029 seconds\n", + "2023/10/15 12:01:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.26609939992803616, Global best: 0.26609939992803616, Runtime: 6.53399 seconds\n", + "2023/10/15 12:01:10 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2649449522097568, Global best: 0.2649449522097568, Runtime: 6.49770 seconds\n", + "2023/10/15 12:01:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2649449522097568, Global best: 0.2649449522097568, Runtime: 6.45854 seconds\n", + "2023/10/15 12:01:23 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.2649449522097568, Global best: 0.2649449522097568, Runtime: 6.49155 seconds\n", + "2023/10/15 12:01:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2646890720998115, Global best: 0.2646890720998115, Runtime: 6.48394 seconds\n", + "2023/10/15 12:01:36 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2639943775081452, Global best: 0.2639943775081452, Runtime: 6.44352 seconds\n", + "2023/10/15 12:01:43 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.2639943775081452, Global best: 0.2639943775081452, Runtime: 6.47109 seconds\n", + "2023/10/15 12:01:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.2607713900887829, Global best: 0.2607713900887829, Runtime: 6.52370 seconds\n", + "2023/10/15 12:01:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.2607713900887829, Global best: 0.2607713900887829, Runtime: 6.39491 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.8333333333333333 0.7 135\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:01:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:02:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.32177621680026613, Global best: 0.32177621680026613, Runtime: 6.50257 seconds\n", + "2023/10/15 12:02:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.2945487872658791, Global best: 0.2945487872658791, Runtime: 6.46107 seconds\n", + "2023/10/15 12:02:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2945487872658791, Global best: 0.2945487872658791, Runtime: 6.51305 seconds\n", + "2023/10/15 12:02:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2945487872658791, Global best: 0.2945487872658791, Runtime: 6.51993 seconds\n", + "2023/10/15 12:02:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2945487872658791, Global best: 0.2945487872658791, Runtime: 6.50613 seconds\n", + "2023/10/15 12:02:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.2945487872658791, Global best: 0.2945487872658791, Runtime: 6.89945 seconds\n", + "2023/10/15 12:02:52 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2945487872658791, Global best: 0.2945487872658791, Runtime: 6.44459 seconds\n", + "2023/10/15 12:02:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2945487872658791, Global best: 0.2945487872658791, Runtime: 6.48291 seconds\n", + "2023/10/15 12:03:05 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2945487872658791, Global best: 0.2945487872658791, Runtime: 6.51971 seconds\n", + "2023/10/15 12:03:12 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2945487872658791, Global best: 0.2945487872658791, Runtime: 6.57631 seconds\n", + "2023/10/15 12:03:18 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2934055832044499, Global best: 0.2934055832044499, Runtime: 6.48924 seconds\n", + "2023/10/15 12:03:25 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2934055832044499, Global best: 0.2934055832044499, Runtime: 6.47291 seconds\n", + "2023/10/15 12:03:31 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2934055832044499, Global best: 0.2934055832044499, Runtime: 6.46315 seconds\n", + "2023/10/15 12:03:38 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2934055832044499, Global best: 0.2934055832044499, Runtime: 6.48099 seconds\n", + "2023/10/15 12:03:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2934055832044499, Global best: 0.2934055832044499, Runtime: 6.48729 seconds\n", + "2023/10/15 12:03:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2934055832044499, Global best: 0.2934055832044499, Runtime: 6.52861 seconds\n", + "2023/10/15 12:03:57 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2916115346256666, Global best: 0.2916115346256666, Runtime: 6.44136 seconds\n", + "2023/10/15 12:04:04 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2916115346256666, Global best: 0.2916115346256666, Runtime: 6.50438 seconds\n", + "2023/10/15 12:04:10 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2916115346256666, Global best: 0.2916115346256666, Runtime: 6.46941 seconds\n", + "2023/10/15 12:04:17 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2916115346256666, Global best: 0.2916115346256666, Runtime: 6.48083 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.8333333333333333 0.75 162\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 223\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 223\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 223\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 223\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 223\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 223\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 223\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 223\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 223\n", + "Round 26 / Tentative (Accepted): 129 / Tentative (Not Accepted): 109 / Rejected: 223\n", + "Round 27 / Tentative (Accepted): 129 / Tentative (Not Accepted): 109 / Rejected: 223\n", + "Round 28 / Tentative (Accepted): 129 / Tentative (Not Accepted): 109 / Rejected: 223\n", + "Round 29 / Tentative (Accepted): 129 / Tentative (Not Accepted): 109 / Rejected: 223\n", + "Round 30 / Tentative (Accepted): 129 / Tentative (Not Accepted): 109 / Rejected: 223\n", + "Round 31 / Tentative (Accepted): 129 / Tentative (Not Accepted): 105 / Rejected: 227\n", + "Round 32 / Tentative (Accepted): 129 / Tentative (Not Accepted): 105 / Rejected: 227\n", + "Round 33 / Tentative (Accepted): 129 / Tentative (Not Accepted): 105 / Rejected: 227\n", + "Round 34 / Tentative (Accepted): 129 / Tentative (Not Accepted): 105 / Rejected: 227\n", + "Round 35 / Tentative (Accepted): 129 / Tentative (Not Accepted): 105 / Rejected: 227\n", + "Round 36 / Tentative (Accepted): 133 / Tentative (Not Accepted): 101 / Rejected: 227\n", + "Round 37 / Tentative (Accepted): 133 / Tentative (Not Accepted): 101 / Rejected: 227\n", + "Round 38 / Tentative (Accepted): 133 / Tentative (Not Accepted): 101 / Rejected: 227\n", + "Round 39 / Tentative (Accepted): 133 / Tentative (Not Accepted): 101 / Rejected: 227\n", + "Round 40 / Tentative (Accepted): 133 / Tentative (Not Accepted): 101 / Rejected: 227\n", + "Final Feature Set Contains 260 Features.\n", + "Control (Positive) 1.0 1.0 938\n", + "Control (Negative) 0.25 0.4666666666666667 938\n", + "ANOVA Base 1.0 1.0 205\n", + "Mutual Information (10) Base 1.0 1.0 10\n", + "RFE (10) Base 1.0 1.0 10\n", + "MultiSURF (10) 1.0 0.95 10\n", + "Mutual Information (20) Base 1.0 1.0 20\n", + "RFE (20) Base 1.0 1.0 20\n", + "MultiSURF (20) 1.0 1.0 20\n", + "Mutual Information (40) Base 1.0 1.0 40\n", + "RFE (40) Base 1.0 1.0 40\n", + "MultiSURF (40) 1.0 1.0 40\n", + "Mutual Information (60) Base 0.95 1.0 60\n", + "RFE (60) Base 1.0 1.0 60\n", + "MultiSURF (60) 1.0 1.0 60\n", + "Mutual Information (80) Base 0.95 0.9166666666666667 80\n", + "RFE (80) Base 1.0 1.0 80\n", + "MultiSURF (80) 1.0 1.0 80\n", + "Mutual Information (100) Base 0.95 1.0 100\n", + "RFE (100) Base 1.0 1.0 100\n", + "MultiSURF (100) 1.0 1.0 100\n", + "RFECV Base 1.0 1.0 18\n", + "Boruta Base 1.0 1.0 43\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:13:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:13:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.33892245876403093, Global best: 0.33892245876403093, Runtime: 13.37423 seconds\n", + "2023/10/15 12:13:44 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.33892245876403093, Global best: 0.33892245876403093, Runtime: 13.37196 seconds\n", + "2023/10/15 12:13:58 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3478281526702568, Global best: 0.33892245876403093, Runtime: 13.90071 seconds\n", + "2023/10/15 12:14:12 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3478281526702568, Global best: 0.33892245876403093, Runtime: 14.03899 seconds\n", + "2023/10/15 12:14:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.35054600548406645, Global best: 0.33892245876403093, Runtime: 14.80478 seconds\n", + "2023/10/15 12:14:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.34523122610986834, Global best: 0.33892245876403093, Runtime: 14.56858 seconds\n", + "2023/10/15 12:14:57 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3401921224017692, Global best: 0.33892245876403093, Runtime: 14.99623 seconds\n", + "2023/10/15 12:15:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3401921224017692, Global best: 0.33892245876403093, Runtime: 13.31266 seconds\n", + "2023/10/15 12:15:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3401921224017692, Global best: 0.33892245876403093, Runtime: 14.48223 seconds\n", + "2023/10/15 12:15:40 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.34389915139400906, Global best: 0.33892245876403093, Runtime: 15.01862 seconds\n", + "2023/10/15 12:15:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.34389915139400906, Global best: 0.33892245876403093, Runtime: 14.71766 seconds\n", + "2023/10/15 12:16:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.34389915139400906, Global best: 0.33892245876403093, Runtime: 13.65461 seconds\n", + "2023/10/15 12:16:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.34389915139400906, Global best: 0.33892245876403093, Runtime: 13.77530 seconds\n", + "2023/10/15 12:16:37 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.34207710135213076, Global best: 0.33892245876403093, Runtime: 15.67104 seconds\n", + "2023/10/15 12:16:51 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.34207710135213076, Global best: 0.33892245876403093, Runtime: 14.09967 seconds\n", + "2023/10/15 12:17:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.34207710135213076, Global best: 0.33892245876403093, Runtime: 14.24426 seconds\n", + "2023/10/15 12:17:20 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.34786411448828697, Global best: 0.33892245876403093, Runtime: 14.74628 seconds\n", + "2023/10/15 12:17:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.34786411448828697, Global best: 0.33892245876403093, Runtime: 13.87992 seconds\n", + "2023/10/15 12:17:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.348054308987076, Global best: 0.33892245876403093, Runtime: 14.12807 seconds\n", + "2023/10/15 12:18:03 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.348054308987076, Global best: 0.33892245876403093, Runtime: 14.68485 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 1.0 1.0 560\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:18:07 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:18:21 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.34561260398523214, Global best: 0.34561260398523214, Runtime: 6.73216 seconds\n", + "2023/10/15 12:18:28 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.34561260398523214, Global best: 0.34561260398523214, Runtime: 6.76271 seconds\n", + "2023/10/15 12:18:35 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.34491510426126676, Global best: 0.34491510426126676, Runtime: 6.76987 seconds\n", + "2023/10/15 12:18:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3407724948394762, Global best: 0.3407724948394762, Runtime: 6.78759 seconds\n", + "2023/10/15 12:18:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.33740273973328183, Global best: 0.33740273973328183, Runtime: 6.73660 seconds\n", + "2023/10/15 12:18:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.33591978561114694, Global best: 0.33591978561114694, Runtime: 6.76650 seconds\n", + "2023/10/15 12:19:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.33591978561114694, Global best: 0.33591978561114694, Runtime: 6.79015 seconds\n", + "2023/10/15 12:19:08 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.33591978561114694, Global best: 0.33591978561114694, Runtime: 6.76703 seconds\n", + "2023/10/15 12:19:15 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.33591978561114694, Global best: 0.33591978561114694, Runtime: 6.75531 seconds\n", + "2023/10/15 12:19:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3354021141555448, Global best: 0.3354021141555448, Runtime: 6.78355 seconds\n", + "2023/10/15 12:19:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3354021141555448, Global best: 0.3354021141555448, Runtime: 6.77657 seconds\n", + "2023/10/15 12:19:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3354021141555448, Global best: 0.3354021141555448, Runtime: 6.76520 seconds\n", + "2023/10/15 12:19:42 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3354021141555448, Global best: 0.3354021141555448, Runtime: 6.74803 seconds\n", + "2023/10/15 12:19:49 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3335243651461895, Global best: 0.3335243651461895, Runtime: 6.71092 seconds\n", + "2023/10/15 12:19:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3335243651461895, Global best: 0.3335243651461895, Runtime: 6.73732 seconds\n", + "2023/10/15 12:20:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.33234411525260465, Global best: 0.33234411525260465, Runtime: 6.72229 seconds\n", + "2023/10/15 12:20:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.33234411525260465, Global best: 0.33234411525260465, Runtime: 6.68802 seconds\n", + "2023/10/15 12:20:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.33234411525260465, Global best: 0.33234411525260465, Runtime: 6.74911 seconds\n", + "2023/10/15 12:20:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.33234411525260465, Global best: 0.33234411525260465, Runtime: 6.72866 seconds\n", + "2023/10/15 12:20:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.33234411525260465, Global best: 0.33234411525260465, Runtime: 7.15820 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 1.0 1.0 524\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:20:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:20:48 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.74497 seconds\n", + "2023/10/15 12:20:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.66268 seconds\n", + "2023/10/15 12:21:01 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.69400 seconds\n", + "2023/10/15 12:21:08 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.73035 seconds\n", + "2023/10/15 12:21:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.75157 seconds\n", + "2023/10/15 12:21:21 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.70853 seconds\n", + "2023/10/15 12:21:28 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.73673 seconds\n", + "2023/10/15 12:21:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.66451 seconds\n", + "2023/10/15 12:21:41 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.69155 seconds\n", + "2023/10/15 12:21:48 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.66079 seconds\n", + "2023/10/15 12:21:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.69015 seconds\n", + "2023/10/15 12:22:01 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.71072 seconds\n", + "2023/10/15 12:22:08 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.65421 seconds\n", + "2023/10/15 12:22:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.68803 seconds\n", + "2023/10/15 12:22:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.74799 seconds\n", + "2023/10/15 12:22:28 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.70800 seconds\n", + "2023/10/15 12:22:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.74654 seconds\n", + "2023/10/15 12:22:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.69004 seconds\n", + "2023/10/15 12:22:48 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.75238 seconds\n", + "2023/10/15 12:22:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.33846698052118573, Global best: 0.33846698052118573, Runtime: 6.66313 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 1.0 1.0 541\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:22:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:23:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3340691826003665, Global best: 0.3340691826003665, Runtime: 6.63430 seconds\n", + "2023/10/15 12:23:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3284318568398278, Global best: 0.3284318568398278, Runtime: 6.66593 seconds\n", + "2023/10/15 12:23:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3284318568398278, Global best: 0.3284318568398278, Runtime: 6.63596 seconds\n", + "2023/10/15 12:23:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.3250655308094255, Global best: 0.3250655308094255, Runtime: 6.61770 seconds\n", + "2023/10/15 12:23:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.32455473795933365, Global best: 0.32455473795933365, Runtime: 7.00502 seconds\n", + "2023/10/15 12:23:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.31534747999198465, Global best: 0.31534747999198465, Runtime: 6.60051 seconds\n", + "2023/10/15 12:23:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.31534747999198465, Global best: 0.31534747999198465, Runtime: 6.63873 seconds\n", + "2023/10/15 12:24:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.31534747999198465, Global best: 0.31534747999198465, Runtime: 6.61913 seconds\n", + "2023/10/15 12:24:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3140964944897061, Global best: 0.3140964944897061, Runtime: 6.61432 seconds\n", + "2023/10/15 12:24:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.63673 seconds\n", + "2023/10/15 12:24:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.59106 seconds\n", + "2023/10/15 12:24:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.60555 seconds\n", + "2023/10/15 12:24:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.61979 seconds\n", + "2023/10/15 12:24:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.68420 seconds\n", + "2023/10/15 12:24:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.66191 seconds\n", + "2023/10/15 12:24:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.62046 seconds\n", + "2023/10/15 12:24:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.64239 seconds\n", + "2023/10/15 12:25:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.63264 seconds\n", + "2023/10/15 12:25:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.62349 seconds\n", + "2023/10/15 12:25:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.3070989524740715, Global best: 0.3070989524740715, Runtime: 6.65581 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 1.0 1.0 505\n", + "Triglav Stage 1 Base 1.0 1.0 260\n", + "Triglav MultiSURF 10 1.0 0.8 10\n", + "Triglav MultiSURF 20 1.0 0.85 20\n", + "Triglav MultiSURF 40 1.0 1.0 40\n", + "Triglav MultiSURF 60 1.0 1.0 60\n", + "Triglav MultiSURF 80 1.0 1.0 80\n", + "Triglav MultiSURF 100 1.0 1.0 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:25:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:26:05 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3255604059145205, Global best: 0.3255604059145205, Runtime: 12.94160 seconds\n", + "2023/10/15 12:26:18 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3255604059145205, Global best: 0.3255604059145205, Runtime: 12.97609 seconds\n", + "2023/10/15 12:26:32 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3255604059145205, Global best: 0.3255604059145205, Runtime: 13.25481 seconds\n", + "2023/10/15 12:26:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.32077841833087056, Global best: 0.32077841833087056, Runtime: 13.81062 seconds\n", + "2023/10/15 12:26:59 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.32077841833087056, Global best: 0.32077841833087056, Runtime: 13.69766 seconds\n", + "2023/10/15 12:27:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.332439566058877, Global best: 0.32077841833087056, Runtime: 13.63375 seconds\n", + "2023/10/15 12:27:26 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.332439566058877, Global best: 0.32077841833087056, Runtime: 13.29098 seconds\n", + "2023/10/15 12:27:40 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.332439566058877, Global best: 0.32077841833087056, Runtime: 14.05233 seconds\n", + "2023/10/15 12:27:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.332439566058877, Global best: 0.32077841833087056, Runtime: 13.64511 seconds\n", + "2023/10/15 12:28:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.332439566058877, Global best: 0.32077841833087056, Runtime: 13.87676 seconds\n", + "2023/10/15 12:28:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3365740829604109, Global best: 0.32077841833087056, Runtime: 13.85188 seconds\n", + "2023/10/15 12:28:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.33067789718090823, Global best: 0.32077841833087056, Runtime: 13.66891 seconds\n", + "2023/10/15 12:28:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.33067789718090823, Global best: 0.32077841833087056, Runtime: 13.45737 seconds\n", + "2023/10/15 12:29:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.33067789718090823, Global best: 0.32077841833087056, Runtime: 13.85600 seconds\n", + "2023/10/15 12:29:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3314578965250687, Global best: 0.32077841833087056, Runtime: 13.65133 seconds\n", + "2023/10/15 12:29:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.32640558330029035, Global best: 0.32077841833087056, Runtime: 14.28202 seconds\n", + "2023/10/15 12:29:44 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.32251496800115736, Global best: 0.32077841833087056, Runtime: 13.69339 seconds\n", + "2023/10/15 12:29:57 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.32251496800115736, Global best: 0.32077841833087056, Runtime: 13.43801 seconds\n", + "2023/10/15 12:30:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.32251496800115736, Global best: 0.32077841833087056, Runtime: 12.92861 seconds\n", + "2023/10/15 12:30:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.32251496800115736, Global best: 0.32077841833087056, Runtime: 13.44113 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 1.0 1.0 146\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:30:28 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:30:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3347796340527412, Global best: 0.3347796340527412, Runtime: 6.48312 seconds\n", + "2023/10/15 12:30:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.46940 seconds\n", + "2023/10/15 12:30:54 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.52743 seconds\n", + "2023/10/15 12:31:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.45811 seconds\n", + "2023/10/15 12:31:07 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.49484 seconds\n", + "2023/10/15 12:31:14 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.50168 seconds\n", + "2023/10/15 12:31:20 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.52722 seconds\n", + "2023/10/15 12:31:27 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.49163 seconds\n", + "2023/10/15 12:31:33 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.51193 seconds\n", + "2023/10/15 12:31:40 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.52430 seconds\n", + "2023/10/15 12:31:46 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3175871134251524, Global best: 0.3175871134251524, Runtime: 6.48281 seconds\n", + "2023/10/15 12:31:53 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3174029161299011, Global best: 0.3174029161299011, Runtime: 6.46699 seconds\n", + "2023/10/15 12:32:00 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3174029161299011, Global best: 0.3174029161299011, Runtime: 6.98161 seconds\n", + "2023/10/15 12:32:06 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3174029161299011, Global best: 0.3174029161299011, Runtime: 6.49850 seconds\n", + "2023/10/15 12:32:13 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.31569392638166505, Global best: 0.31569392638166505, Runtime: 6.51263 seconds\n", + "2023/10/15 12:32:19 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.31569392638166505, Global best: 0.31569392638166505, Runtime: 6.49145 seconds\n", + "2023/10/15 12:32:26 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.31569392638166505, Global best: 0.31569392638166505, Runtime: 6.50359 seconds\n", + "2023/10/15 12:32:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.29726319743215374, Global best: 0.29726319743215374, Runtime: 6.52918 seconds\n", + "2023/10/15 12:32:39 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.29726319743215374, Global best: 0.29726319743215374, Runtime: 6.50897 seconds\n", + "2023/10/15 12:32:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.29726319743215374, Global best: 0.29726319743215374, Runtime: 6.49575 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 1.0 1.0 125\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:32:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:33:03 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3250938816846905, Global best: 0.3250938816846905, Runtime: 6.52160 seconds\n", + "2023/10/15 12:33:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.32477076991095927, Global best: 0.32477076991095927, Runtime: 6.47503 seconds\n", + "2023/10/15 12:33:16 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.323283261289749, Global best: 0.323283261289749, Runtime: 6.44973 seconds\n", + "2023/10/15 12:33:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.31569513907557356, Global best: 0.31569513907557356, Runtime: 6.50553 seconds\n", + "2023/10/15 12:33:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.30768825345089473, Global best: 0.30768825345089473, Runtime: 6.49937 seconds\n", + "2023/10/15 12:33:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.30597466087395064, Global best: 0.30597466087395064, Runtime: 6.49869 seconds\n", + "2023/10/15 12:33:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.2994764826595476, Global best: 0.2994764826595476, Runtime: 6.49399 seconds\n", + "2023/10/15 12:33:48 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.2960575517708253, Global best: 0.2960575517708253, Runtime: 6.51258 seconds\n", + "2023/10/15 12:33:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.29314856380087995, Global best: 0.29314856380087995, Runtime: 6.47775 seconds\n", + "2023/10/15 12:34:01 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2929665957890078, Global best: 0.2929665957890078, Runtime: 6.46861 seconds\n", + "2023/10/15 12:34:08 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.28750475228655487, Global best: 0.28750475228655487, Runtime: 6.50677 seconds\n", + "2023/10/15 12:34:14 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.2849752873814808, Global best: 0.2849752873814808, Runtime: 6.46761 seconds\n", + "2023/10/15 12:34:21 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2846571415365633, Global best: 0.2846571415365633, Runtime: 6.96863 seconds\n", + "2023/10/15 12:34:28 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.27886049387666695, Global best: 0.27886049387666695, Runtime: 6.52078 seconds\n", + "2023/10/15 12:34:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.27886049387666695, Global best: 0.27886049387666695, Runtime: 6.49388 seconds\n", + "2023/10/15 12:34:41 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2741558263764331, Global best: 0.2741558263764331, Runtime: 6.53525 seconds\n", + "2023/10/15 12:34:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.27283510541174344, Global best: 0.27283510541174344, Runtime: 6.47363 seconds\n", + "2023/10/15 12:34:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.27076052017423463, Global best: 0.27076052017423463, Runtime: 6.47797 seconds\n", + "2023/10/15 12:35:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.27076052017423463, Global best: 0.27076052017423463, Runtime: 6.54593 seconds\n", + "2023/10/15 12:35:07 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.26893706603909556, Global best: 0.26893706603909556, Runtime: 6.51150 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 1.0 1.0 108\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:35:10 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:35:24 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.30711387388995853, Global best: 0.30711387388995853, Runtime: 6.50430 seconds\n", + "2023/10/15 12:35:30 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.28984097485923355, Global best: 0.28984097485923355, Runtime: 6.47653 seconds\n", + "2023/10/15 12:35:37 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2872992619380797, Global best: 0.2872992619380797, Runtime: 6.48896 seconds\n", + "2023/10/15 12:35:43 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.28513688214896016, Global best: 0.28513688214896016, Runtime: 6.51246 seconds\n", + "2023/10/15 12:35:50 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2850662544392665, Global best: 0.2850662544392665, Runtime: 6.48633 seconds\n", + "2023/10/15 12:35:56 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.28227366937052867, Global best: 0.28227366937052867, Runtime: 6.48876 seconds\n", + "2023/10/15 12:36:03 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.27542266381140157, Global best: 0.27542266381140157, Runtime: 6.51960 seconds\n", + "2023/10/15 12:36:09 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.27542266381140157, Global best: 0.27542266381140157, Runtime: 6.44980 seconds\n", + "2023/10/15 12:36:16 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.27542266381140157, Global best: 0.27542266381140157, Runtime: 6.50230 seconds\n", + "2023/10/15 12:36:22 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.27542266381140157, Global best: 0.27542266381140157, Runtime: 6.49372 seconds\n", + "2023/10/15 12:36:29 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.27542266381140157, Global best: 0.27542266381140157, Runtime: 6.48515 seconds\n", + "2023/10/15 12:36:35 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.27542266381140157, Global best: 0.27542266381140157, Runtime: 6.50743 seconds\n", + "2023/10/15 12:36:42 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.27542266381140157, Global best: 0.27542266381140157, Runtime: 6.50019 seconds\n", + "2023/10/15 12:36:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.27542266381140157, Global best: 0.27542266381140157, Runtime: 6.51142 seconds\n", + "2023/10/15 12:36:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.27542266381140157, Global best: 0.27542266381140157, Runtime: 6.51168 seconds\n", + "2023/10/15 12:37:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2718877991397153, Global best: 0.2718877991397153, Runtime: 6.44310 seconds\n", + "2023/10/15 12:37:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2718877991397153, Global best: 0.2718877991397153, Runtime: 6.43457 seconds\n", + "2023/10/15 12:37:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2662328387969443, Global best: 0.2662328387969443, Runtime: 6.46157 seconds\n", + "2023/10/15 12:37:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2662328387969443, Global best: 0.2662328387969443, Runtime: 6.93400 seconds\n", + "2023/10/15 12:37:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2662328387969443, Global best: 0.2662328387969443, Runtime: 6.52308 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 1.0 1.0 109\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 248\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 248\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 248\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 248\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 248\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 248\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 248\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 248\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 248\n", + "Round 26 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 27 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 28 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 29 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 30 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 31 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 32 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 33 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 34 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 35 / Tentative (Accepted): 131 / Tentative (Not Accepted): 89 / Rejected: 248\n", + "Round 36 / Tentative (Accepted): 136 / Tentative (Not Accepted): 84 / Rejected: 248\n", + "Round 37 / Tentative (Accepted): 136 / Tentative (Not Accepted): 84 / Rejected: 248\n", + "Round 38 / Tentative (Accepted): 136 / Tentative (Not Accepted): 84 / Rejected: 248\n", + "Round 39 / Tentative (Accepted): 136 / Tentative (Not Accepted): 84 / Rejected: 248\n", + "Round 40 / Tentative (Accepted): 136 / Tentative (Not Accepted): 84 / Rejected: 248\n", + "Final Feature Set Contains 262 Features.\n", + "Control (Positive) 0.8125 0.875 938\n", + "Control (Negative) 0.875 0.8125 938\n", + "ANOVA Base 0.9375 0.875 269\n", + "Mutual Information (10) Base 0.875 0.6875 10\n", + "RFE (10) Base 0.8125 0.875 10\n", + "MultiSURF (10) 0.875 0.875 10\n", + "Mutual Information (20) Base 0.8125 0.75 20\n", + "RFE (20) Base 0.875 0.875 20\n", + "MultiSURF (20) 0.875 0.875 20\n", + "Mutual Information (40) Base 0.8125 0.8125 40\n", + "RFE (40) Base 0.875 0.75 40\n", + "MultiSURF (40) 0.875 0.875 40\n", + "Mutual Information (60) Base 0.875 0.8125 60\n", + "RFE (60) Base 0.875 0.875 60\n", + "MultiSURF (60) 0.875 0.875 60\n", + "Mutual Information (80) Base 0.8125 0.875 80\n", + "RFE (80) Base 0.875 0.875 80\n", + "MultiSURF (80) 0.875 0.875 80\n", + "Mutual Information (100) Base 0.8125 0.875 100\n", + "RFE (100) Base 0.875 0.875 100\n", + "MultiSURF (100) 0.875 0.875 100\n", + "RFECV Base 0.875 0.875 64\n", + "Boruta Base 0.875 0.875 46\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:46:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:46:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.31756761728553184, Global best: 0.31756761728553184, Runtime: 13.60738 seconds\n", + "2023/10/15 12:46:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.31756761728553184, Global best: 0.31756761728553184, Runtime: 13.58436 seconds\n", + "2023/10/15 12:47:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3244966524221079, Global best: 0.31756761728553184, Runtime: 13.76317 seconds\n", + "2023/10/15 12:47:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3244966524221079, Global best: 0.31756761728553184, Runtime: 14.57218 seconds\n", + "2023/10/15 12:47:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33071578671152824, Global best: 0.31756761728553184, Runtime: 14.34147 seconds\n", + "2023/10/15 12:47:46 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.33071578671152824, Global best: 0.31756761728553184, Runtime: 15.30519 seconds\n", + "2023/10/15 12:48:00 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.33071578671152824, Global best: 0.31756761728553184, Runtime: 14.31878 seconds\n", + "2023/10/15 12:48:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3323358194123189, Global best: 0.31756761728553184, Runtime: 14.59156 seconds\n", + "2023/10/15 12:48:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3277863219137845, Global best: 0.31756761728553184, Runtime: 14.60032 seconds\n", + "2023/10/15 12:48:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3277863219137845, Global best: 0.31756761728553184, Runtime: 15.13870 seconds\n", + "2023/10/15 12:48:59 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3277863219137845, Global best: 0.31756761728553184, Runtime: 14.19308 seconds\n", + "2023/10/15 12:49:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3277863219137845, Global best: 0.31756761728553184, Runtime: 14.57850 seconds\n", + "2023/10/15 12:49:28 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3277863219137845, Global best: 0.31756761728553184, Runtime: 14.13263 seconds\n", + "2023/10/15 12:49:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3277863219137845, Global best: 0.31756761728553184, Runtime: 14.76056 seconds\n", + "2023/10/15 12:49:57 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.32972622988587963, Global best: 0.31756761728553184, Runtime: 14.58400 seconds\n", + "2023/10/15 12:50:11 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.32972622988587963, Global best: 0.31756761728553184, Runtime: 14.34879 seconds\n", + "2023/10/15 12:50:26 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3260659527264893, Global best: 0.31756761728553184, Runtime: 14.82873 seconds\n", + "2023/10/15 12:50:40 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3260659527264893, Global best: 0.31756761728553184, Runtime: 14.36926 seconds\n", + "2023/10/15 12:50:55 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3260659527264893, Global best: 0.31756761728553184, Runtime: 14.76497 seconds\n", + "2023/10/15 12:51:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3260659527264893, Global best: 0.31756761728553184, Runtime: 14.30442 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.8125 0.875 522\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:51:13 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:51:27 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3302141830845421, Global best: 0.3302141830845421, Runtime: 6.72949 seconds\n", + "2023/10/15 12:51:34 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3302141830845421, Global best: 0.3302141830845421, Runtime: 6.70707 seconds\n", + "2023/10/15 12:51:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3302141830845421, Global best: 0.3302141830845421, Runtime: 6.70662 seconds\n", + "2023/10/15 12:51:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3272320048417949, Global best: 0.3272320048417949, Runtime: 7.18199 seconds\n", + "2023/10/15 12:51:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3272320048417949, Global best: 0.3272320048417949, Runtime: 6.69282 seconds\n", + "2023/10/15 12:52:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3272320048417949, Global best: 0.3272320048417949, Runtime: 6.71925 seconds\n", + "2023/10/15 12:52:08 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3272320048417949, Global best: 0.3272320048417949, Runtime: 6.72771 seconds\n", + "2023/10/15 12:52:15 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3272320048417949, Global best: 0.3272320048417949, Runtime: 6.72353 seconds\n", + "2023/10/15 12:52:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.32256127778691635, Global best: 0.32256127778691635, Runtime: 6.68636 seconds\n", + "2023/10/15 12:52:28 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.32256127778691635, Global best: 0.32256127778691635, Runtime: 6.71466 seconds\n", + "2023/10/15 12:52:35 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.32256127778691635, Global best: 0.32256127778691635, Runtime: 6.71111 seconds\n", + "2023/10/15 12:52:42 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.32256127778691635, Global best: 0.32256127778691635, Runtime: 6.71770 seconds\n", + "2023/10/15 12:52:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.32256127778691635, Global best: 0.32256127778691635, Runtime: 6.73640 seconds\n", + "2023/10/15 12:52:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3107059021882408, Global best: 0.3107059021882408, Runtime: 6.77929 seconds\n", + "2023/10/15 12:53:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3107059021882408, Global best: 0.3107059021882408, Runtime: 6.71566 seconds\n", + "2023/10/15 12:53:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3107059021882408, Global best: 0.3107059021882408, Runtime: 6.69208 seconds\n", + "2023/10/15 12:53:15 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3107059021882408, Global best: 0.3107059021882408, Runtime: 6.72093 seconds\n", + "2023/10/15 12:53:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3102459019546015, Global best: 0.3102459019546015, Runtime: 6.70695 seconds\n", + "2023/10/15 12:53:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3102459019546015, Global best: 0.3102459019546015, Runtime: 6.79073 seconds\n", + "2023/10/15 12:53:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3102459019546015, Global best: 0.3102459019546015, Runtime: 6.78552 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.8125 0.875 543\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:53:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:53:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3232925833448854, Global best: 0.3232925833448854, Runtime: 6.67698 seconds\n", + "2023/10/15 12:54:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3232925833448854, Global best: 0.3232925833448854, Runtime: 6.70643 seconds\n", + "2023/10/15 12:54:07 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3232925833448854, Global best: 0.3232925833448854, Runtime: 6.81588 seconds\n", + "2023/10/15 12:54:14 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3174580977423247, Global best: 0.3174580977423247, Runtime: 6.69948 seconds\n", + "2023/10/15 12:54:21 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3174580977423247, Global best: 0.3174580977423247, Runtime: 6.70612 seconds\n", + "2023/10/15 12:54:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.31578989226622906, Global best: 0.31578989226622906, Runtime: 6.70969 seconds\n", + "2023/10/15 12:54:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.31578989226622906, Global best: 0.31578989226622906, Runtime: 6.66981 seconds\n", + "2023/10/15 12:54:41 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.31578989226622906, Global best: 0.31578989226622906, Runtime: 6.68864 seconds\n", + "2023/10/15 12:54:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.31578989226622906, Global best: 0.31578989226622906, Runtime: 6.74708 seconds\n", + "2023/10/15 12:54:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.31578989226622906, Global best: 0.31578989226622906, Runtime: 6.71672 seconds\n", + "2023/10/15 12:55:01 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.31578989226622906, Global best: 0.31578989226622906, Runtime: 7.14835 seconds\n", + "2023/10/15 12:55:08 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.31578989226622906, Global best: 0.31578989226622906, Runtime: 6.73743 seconds\n", + "2023/10/15 12:55:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.31578989226622906, Global best: 0.31578989226622906, Runtime: 6.73034 seconds\n", + "2023/10/15 12:55:21 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.31578989226622906, Global best: 0.31578989226622906, Runtime: 6.68382 seconds\n", + "2023/10/15 12:55:28 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.31421482514426957, Global best: 0.31421482514426957, Runtime: 6.71651 seconds\n", + "2023/10/15 12:55:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3134587110491528, Global best: 0.3134587110491528, Runtime: 6.76314 seconds\n", + "2023/10/15 12:55:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3134587110491528, Global best: 0.3134587110491528, Runtime: 6.72969 seconds\n", + "2023/10/15 12:55:48 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3134587110491528, Global best: 0.3134587110491528, Runtime: 6.70479 seconds\n", + "2023/10/15 12:55:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3134587110491528, Global best: 0.3134587110491528, Runtime: 6.63509 seconds\n", + "2023/10/15 12:56:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3134587110491528, Global best: 0.3134587110491528, Runtime: 6.71982 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.8125 0.875 534\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:56:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:56:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3241619158125324, Global best: 0.3241619158125324, Runtime: 6.66319 seconds\n", + "2023/10/15 12:56:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3241619158125324, Global best: 0.3241619158125324, Runtime: 6.67623 seconds\n", + "2023/10/15 12:56:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3172489217024467, Global best: 0.3172489217024467, Runtime: 6.72240 seconds\n", + "2023/10/15 12:56:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.3167820086749434, Global best: 0.3167820086749434, Runtime: 6.66899 seconds\n", + "2023/10/15 12:56:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.31120129114345496, Global best: 0.31120129114345496, Runtime: 6.64621 seconds\n", + "2023/10/15 12:56:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3111926089132678, Global best: 0.3111926089132678, Runtime: 6.67577 seconds\n", + "2023/10/15 12:56:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3088113362441929, Global best: 0.3088113362441929, Runtime: 6.61981 seconds\n", + "2023/10/15 12:57:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3033272436347039, Global best: 0.3033272436347039, Runtime: 6.65464 seconds\n", + "2023/10/15 12:57:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.29620409633525135, Global best: 0.29620409633525135, Runtime: 6.68349 seconds\n", + "2023/10/15 12:57:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.29620409633525135, Global best: 0.29620409633525135, Runtime: 6.61764 seconds\n", + "2023/10/15 12:57:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.29620409633525135, Global best: 0.29620409633525135, Runtime: 6.63531 seconds\n", + "2023/10/15 12:57:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.29620409633525135, Global best: 0.29620409633525135, Runtime: 6.67685 seconds\n", + "2023/10/15 12:57:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.29620409633525135, Global best: 0.29620409633525135, Runtime: 6.65749 seconds\n", + "2023/10/15 12:57:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.29620409633525135, Global best: 0.29620409633525135, Runtime: 6.66268 seconds\n", + "2023/10/15 12:57:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.29620409633525135, Global best: 0.29620409633525135, Runtime: 6.65042 seconds\n", + "2023/10/15 12:57:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2927999762564489, Global best: 0.2927999762564489, Runtime: 6.61548 seconds\n", + "2023/10/15 12:58:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2927999762564489, Global best: 0.2927999762564489, Runtime: 7.08966 seconds\n", + "2023/10/15 12:58:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2927999762564489, Global best: 0.2927999762564489, Runtime: 6.69608 seconds\n", + "2023/10/15 12:58:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2927999762564489, Global best: 0.2927999762564489, Runtime: 6.64432 seconds\n", + "2023/10/15 12:58:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2927999762564489, Global best: 0.2927999762564489, Runtime: 6.68341 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.8125 0.875 504\n", + "Triglav Stage 1 Base 0.9375 0.875 262\n", + "Triglav MultiSURF 10 0.875 0.875 10\n", + "Triglav MultiSURF 20 0.875 0.8125 20\n", + "Triglav MultiSURF 40 0.875 0.875 40\n", + "Triglav MultiSURF 60 1.0 0.9375 60\n", + "Triglav MultiSURF 80 0.9375 0.9375 80\n", + "Triglav MultiSURF 100 0.875 0.875 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 12:58:52 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 12:59:12 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.31440866219132546, Global best: 0.31440866219132546, Runtime: 13.08657 seconds\n", + "2023/10/15 12:59:26 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.31440866219132546, Global best: 0.31440866219132546, Runtime: 13.18697 seconds\n", + "2023/10/15 12:59:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.30423138316663695, Global best: 0.30423138316663695, Runtime: 13.47996 seconds\n", + "2023/10/15 12:59:52 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.30423138316663695, Global best: 0.30423138316663695, Runtime: 13.01091 seconds\n", + "2023/10/15 01:00:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.30423138316663695, Global best: 0.30423138316663695, Runtime: 14.11152 seconds\n", + "2023/10/15 01:00:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3168415984317167, Global best: 0.30423138316663695, Runtime: 14.29641 seconds\n", + "2023/10/15 01:00:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3168415984317167, Global best: 0.30423138316663695, Runtime: 13.35766 seconds\n", + "2023/10/15 01:00:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.31660117748868855, Global best: 0.30423138316663695, Runtime: 13.89483 seconds\n", + "2023/10/15 01:01:03 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3163310679588616, Global best: 0.30423138316663695, Runtime: 14.78357 seconds\n", + "2023/10/15 01:01:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3163310679588616, Global best: 0.30423138316663695, Runtime: 13.10781 seconds\n", + "2023/10/15 01:01:29 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.31007902679050925, Global best: 0.30423138316663695, Runtime: 13.47759 seconds\n", + "2023/10/15 01:01:43 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.31007902679050925, Global best: 0.30423138316663695, Runtime: 13.69464 seconds\n", + "2023/10/15 01:01:57 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.31007902679050925, Global best: 0.30423138316663695, Runtime: 13.91397 seconds\n", + "2023/10/15 01:02:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3090712164089405, Global best: 0.30423138316663695, Runtime: 13.65150 seconds\n", + "2023/10/15 01:02:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3090712164089405, Global best: 0.30423138316663695, Runtime: 13.84147 seconds\n", + "2023/10/15 01:02:38 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3037722681827938, Global best: 0.3037722681827938, Runtime: 13.49263 seconds\n", + "2023/10/15 01:02:52 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3037722681827938, Global best: 0.3037722681827938, Runtime: 14.44875 seconds\n", + "2023/10/15 01:03:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3037722681827938, Global best: 0.3037722681827938, Runtime: 13.52897 seconds\n", + "2023/10/15 01:03:20 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3142309218438494, Global best: 0.3037722681827938, Runtime: 13.92840 seconds\n", + "2023/10/15 01:03:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.31381416002004325, Global best: 0.3037722681827938, Runtime: 13.92467 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.8125 0.875 141\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:03:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:03:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3148013766803833, Global best: 0.3148013766803833, Runtime: 6.59625 seconds\n", + "2023/10/15 01:03:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.31140086641682796, Global best: 0.31140086641682796, Runtime: 6.59426 seconds\n", + "2023/10/15 01:04:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.31140086641682796, Global best: 0.31140086641682796, Runtime: 6.56287 seconds\n", + "2023/10/15 01:04:11 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.31140086641682796, Global best: 0.31140086641682796, Runtime: 6.61309 seconds\n", + "2023/10/15 01:04:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.31140086641682796, Global best: 0.31140086641682796, Runtime: 6.58382 seconds\n", + "2023/10/15 01:04:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3088454924035058, Global best: 0.3088454924035058, Runtime: 6.53326 seconds\n", + "2023/10/15 01:04:31 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3088454924035058, Global best: 0.3088454924035058, Runtime: 6.58169 seconds\n", + "2023/10/15 01:04:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3086187159117615, Global best: 0.3086187159117615, Runtime: 6.55002 seconds\n", + "2023/10/15 01:04:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.66291 seconds\n", + "2023/10/15 01:04:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.74808 seconds\n", + "2023/10/15 01:04:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.55477 seconds\n", + "2023/10/15 01:05:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.60119 seconds\n", + "2023/10/15 01:05:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.56797 seconds\n", + "2023/10/15 01:05:17 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.55276 seconds\n", + "2023/10/15 01:05:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.61302 seconds\n", + "2023/10/15 01:05:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.64766 seconds\n", + "2023/10/15 01:05:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.63785 seconds\n", + "2023/10/15 01:05:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.30307676120592986, Global best: 0.30307676120592986, Runtime: 6.86634 seconds\n", + "2023/10/15 01:05:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3012068293659683, Global best: 0.3012068293659683, Runtime: 6.72691 seconds\n", + "2023/10/15 01:05:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3012068293659683, Global best: 0.3012068293659683, Runtime: 6.52630 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 1.0 0.875 140\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:06:01 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:06:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.29939762749923965, Global best: 0.29939762749923965, Runtime: 6.58823 seconds\n", + "2023/10/15 01:06:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.29832287641657673, Global best: 0.29832287641657673, Runtime: 6.63456 seconds\n", + "2023/10/15 01:06:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.28829563720257223, Global best: 0.28829563720257223, Runtime: 6.56269 seconds\n", + "2023/10/15 01:06:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.28829563720257223, Global best: 0.28829563720257223, Runtime: 6.62036 seconds\n", + "2023/10/15 01:06:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.27552804899429734, Global best: 0.27552804899429734, Runtime: 7.08719 seconds\n", + "2023/10/15 01:06:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.27552804899429734, Global best: 0.27552804899429734, Runtime: 6.83570 seconds\n", + "2023/10/15 01:06:56 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.27552804899429734, Global best: 0.27552804899429734, Runtime: 6.56399 seconds\n", + "2023/10/15 01:07:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.26768237357905783, Global best: 0.26768237357905783, Runtime: 6.70484 seconds\n", + "2023/10/15 01:07:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.26768237357905783, Global best: 0.26768237357905783, Runtime: 6.72455 seconds\n", + "2023/10/15 01:07:16 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2645995647129797, Global best: 0.2645995647129797, Runtime: 6.63289 seconds\n", + "2023/10/15 01:07:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.2609108767251884, Global best: 0.2609108767251884, Runtime: 6.57752 seconds\n", + "2023/10/15 01:07:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.2574919748004087, Global best: 0.2574919748004087, Runtime: 6.66574 seconds\n", + "2023/10/15 01:07:36 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.25355537183847776, Global best: 0.25355537183847776, Runtime: 6.65979 seconds\n", + "2023/10/15 01:07:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2529834750900698, Global best: 0.2529834750900698, Runtime: 6.62248 seconds\n", + "2023/10/15 01:07:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.25042232237613865, Global best: 0.25042232237613865, Runtime: 6.61946 seconds\n", + "2023/10/15 01:07:56 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2490298781475106, Global best: 0.2490298781475106, Runtime: 6.69631 seconds\n", + "2023/10/15 01:08:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2480792567850623, Global best: 0.2480792567850623, Runtime: 6.58970 seconds\n", + "2023/10/15 01:08:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.24657551980672118, Global best: 0.24657551980672118, Runtime: 6.57020 seconds\n", + "2023/10/15 01:08:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.24491143626265927, Global best: 0.24491143626265927, Runtime: 6.53348 seconds\n", + "2023/10/15 01:08:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.24441156406887427, Global best: 0.24441156406887427, Runtime: 6.54114 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.8125 0.875 103\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:08:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:08:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3062332148324087, Global best: 0.3062332148324087, Runtime: 6.72303 seconds\n", + "2023/10/15 01:08:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.30079593657104087, Global best: 0.30079593657104087, Runtime: 6.66233 seconds\n", + "2023/10/15 01:08:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2896352577268044, Global best: 0.2896352577268044, Runtime: 6.79052 seconds\n", + "2023/10/15 01:09:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2896352577268044, Global best: 0.2896352577268044, Runtime: 6.79700 seconds\n", + "2023/10/15 01:09:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2857359280702806, Global best: 0.2857359280702806, Runtime: 6.63338 seconds\n", + "2023/10/15 01:09:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.28557780103653774, Global best: 0.28557780103653774, Runtime: 6.70349 seconds\n", + "2023/10/15 01:09:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.28557780103653774, Global best: 0.28557780103653774, Runtime: 6.62750 seconds\n", + "2023/10/15 01:09:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.28448805938496646, Global best: 0.28448805938496646, Runtime: 6.67891 seconds\n", + "2023/10/15 01:09:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.27312250891166373, Global best: 0.27312250891166373, Runtime: 6.59147 seconds\n", + "2023/10/15 01:09:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.27312250891166373, Global best: 0.27312250891166373, Runtime: 6.57542 seconds\n", + "2023/10/15 01:09:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2729443230125217, Global best: 0.2729443230125217, Runtime: 7.40086 seconds\n", + "2023/10/15 01:09:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2729443230125217, Global best: 0.2729443230125217, Runtime: 6.65946 seconds\n", + "2023/10/15 01:10:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2729443230125217, Global best: 0.2729443230125217, Runtime: 6.63617 seconds\n", + "2023/10/15 01:10:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2694647186547364, Global best: 0.2694647186547364, Runtime: 6.63957 seconds\n", + "2023/10/15 01:10:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.26559342485152654, Global best: 0.26559342485152654, Runtime: 6.63759 seconds\n", + "2023/10/15 01:10:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.25993191759410345, Global best: 0.25993191759410345, Runtime: 6.73446 seconds\n", + "2023/10/15 01:10:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.25993191759410345, Global best: 0.25993191759410345, Runtime: 6.66378 seconds\n", + "2023/10/15 01:10:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2587560736978619, Global best: 0.2587560736978619, Runtime: 6.63466 seconds\n", + "2023/10/15 01:10:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.25459808000557593, Global best: 0.25459808000557593, Runtime: 6.60288 seconds\n", + "2023/10/15 01:10:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.25459808000557593, Global best: 0.25459808000557593, Runtime: 6.64034 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 1.0 0.875 110\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 434 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 234 / Rejected: 200\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 234 / Rejected: 200\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 234 / Rejected: 200\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 234 / Rejected: 200\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 234 / Rejected: 200\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 234 / Rejected: 200\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 234 / Rejected: 200\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 234 / Rejected: 200\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 225 / Rejected: 209\n", + "Round 26 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 27 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 28 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 29 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 30 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 31 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 32 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 33 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 34 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 35 / Tentative (Accepted): 137 / Tentative (Not Accepted): 88 / Rejected: 209\n", + "Round 36 / Tentative (Accepted): 141 / Tentative (Not Accepted): 84 / Rejected: 209\n", + "Round 37 / Tentative (Accepted): 141 / Tentative (Not Accepted): 84 / Rejected: 209\n", + "Round 38 / Tentative (Accepted): 141 / Tentative (Not Accepted): 84 / Rejected: 209\n", + "Round 39 / Tentative (Accepted): 141 / Tentative (Not Accepted): 84 / Rejected: 209\n", + "Round 40 / Tentative (Accepted): 141 / Tentative (Not Accepted): 84 / Rejected: 209\n", + "Final Feature Set Contains 263 Features.\n", + "Control (Positive) 0.5 0.625 938\n", + "Control (Negative) 0.2916666666666667 0.375 938\n", + "ANOVA Base 0.5 0.5 302\n", + "Mutual Information (10) Base 0.6666666666666667 0.5 10\n", + "RFE (10) Base 0.7083333333333333 0.75 10\n", + "MultiSURF (10) 0.75 0.625 10\n", + "Mutual Information (20) Base 0.625 0.75 20\n", + "RFE (20) Base 0.5 0.625 20\n", + "MultiSURF (20) 0.5 0.75 20\n", + "Mutual Information (40) Base 0.5 0.625 40\n", + "RFE (40) Base 0.5 0.75 40\n", + "MultiSURF (40) 0.5 0.625 40\n", + "Mutual Information (60) Base 0.5 0.5 60\n", + "RFE (60) Base 0.5 0.75 60\n", + "MultiSURF (60) 0.5 0.625 60\n", + "Mutual Information (80) Base 0.5 0.5 80\n", + "RFE (80) Base 0.5 0.625 80\n", + "MultiSURF (80) 0.5 0.75 80\n", + "Mutual Information (100) Base 0.5 0.5 100\n", + "RFE (100) Base 0.5 0.75 100\n", + "MultiSURF (100) 0.5 0.625 100\n", + "RFECV Base 0.5 0.75 64\n", + "Boruta Base 0.5 0.75 57\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:20:18 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:20:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.342193210659101, Global best: 0.342193210659101, Runtime: 13.54809 seconds\n", + "2023/10/15 01:20:52 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.342193210659101, Global best: 0.342193210659101, Runtime: 13.46469 seconds\n", + "2023/10/15 01:21:07 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3436554458317688, Global best: 0.342193210659101, Runtime: 14.82594 seconds\n", + "2023/10/15 01:21:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.34839585763830067, Global best: 0.342193210659101, Runtime: 14.34957 seconds\n", + "2023/10/15 01:21:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.34445481024829605, Global best: 0.342193210659101, Runtime: 15.00645 seconds\n", + "2023/10/15 01:21:51 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.34445481024829605, Global best: 0.342193210659101, Runtime: 14.41371 seconds\n", + "2023/10/15 01:22:05 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3432306877170578, Global best: 0.342193210659101, Runtime: 14.31746 seconds\n", + "2023/10/15 01:22:20 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3432306877170578, Global best: 0.342193210659101, Runtime: 14.39982 seconds\n", + "2023/10/15 01:22:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3432306877170578, Global best: 0.342193210659101, Runtime: 14.53530 seconds\n", + "2023/10/15 01:22:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.34573393462061786, Global best: 0.342193210659101, Runtime: 14.52235 seconds\n", + "2023/10/15 01:23:04 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3408203609533649, Global best: 0.3408203609533649, Runtime: 15.28129 seconds\n", + "2023/10/15 01:23:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3408203609533649, Global best: 0.3408203609533649, Runtime: 14.96446 seconds\n", + "2023/10/15 01:23:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3408203609533649, Global best: 0.3408203609533649, Runtime: 14.15054 seconds\n", + "2023/10/15 01:23:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3408203609533649, Global best: 0.3408203609533649, Runtime: 16.10930 seconds\n", + "2023/10/15 01:24:04 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.33793235263633203, Global best: 0.33793235263633203, Runtime: 14.98035 seconds\n", + "2023/10/15 01:24:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.33793235263633203, Global best: 0.33793235263633203, Runtime: 14.69651 seconds\n", + "2023/10/15 01:24:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.33793235263633203, Global best: 0.33793235263633203, Runtime: 14.91704 seconds\n", + "2023/10/15 01:24:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.33793235263633203, Global best: 0.33793235263633203, Runtime: 15.49535 seconds\n", + "2023/10/15 01:25:04 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.33908547672786643, Global best: 0.33793235263633203, Runtime: 14.75058 seconds\n", + "2023/10/15 01:25:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.33908547672786643, Global best: 0.33793235263633203, Runtime: 14.88533 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.5 0.75 581\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:25:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:25:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3401652489282636, Global best: 0.3401652489282636, Runtime: 6.92283 seconds\n", + "2023/10/15 01:25:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3401652489282636, Global best: 0.3401652489282636, Runtime: 7.00021 seconds\n", + "2023/10/15 01:25:52 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3401652489282636, Global best: 0.3401652489282636, Runtime: 6.82994 seconds\n", + "2023/10/15 01:25:59 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3401652489282636, Global best: 0.3401652489282636, Runtime: 7.01936 seconds\n", + "2023/10/15 01:26:06 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3401652489282636, Global best: 0.3401652489282636, Runtime: 6.91290 seconds\n", + "2023/10/15 01:26:13 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3401652489282636, Global best: 0.3401652489282636, Runtime: 6.89710 seconds\n", + "2023/10/15 01:26:20 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3401652489282636, Global best: 0.3401652489282636, Runtime: 7.01625 seconds\n", + "2023/10/15 01:26:27 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3401652489282636, Global best: 0.3401652489282636, Runtime: 7.02920 seconds\n", + "2023/10/15 01:26:34 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3397784500348167, Global best: 0.3397784500348167, Runtime: 6.96098 seconds\n", + "2023/10/15 01:26:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3299065719315639, Global best: 0.3299065719315639, Runtime: 7.38142 seconds\n", + "2023/10/15 01:26:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.32202131119567406, Global best: 0.32202131119567406, Runtime: 6.97162 seconds\n", + "2023/10/15 01:26:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3120371372244457, Global best: 0.3120371372244457, Runtime: 6.90594 seconds\n", + "2023/10/15 01:27:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3120371372244457, Global best: 0.3120371372244457, Runtime: 6.88326 seconds\n", + "2023/10/15 01:27:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3120371372244457, Global best: 0.3120371372244457, Runtime: 6.79876 seconds\n", + "2023/10/15 01:27:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3120371372244457, Global best: 0.3120371372244457, Runtime: 6.95935 seconds\n", + "2023/10/15 01:27:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3120371372244457, Global best: 0.3120371372244457, Runtime: 6.89633 seconds\n", + "2023/10/15 01:27:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3120371372244457, Global best: 0.3120371372244457, Runtime: 6.86361 seconds\n", + "2023/10/15 01:27:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3120371372244457, Global best: 0.3120371372244457, Runtime: 6.92209 seconds\n", + "2023/10/15 01:27:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3120371372244457, Global best: 0.3120371372244457, Runtime: 6.84965 seconds\n", + "2023/10/15 01:27:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3120371372244457, Global best: 0.3120371372244457, Runtime: 6.90989 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.5 0.75 519\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:27:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:28:08 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3364113865607652, Global best: 0.3364113865607652, Runtime: 6.83930 seconds\n", + "2023/10/15 01:28:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.87688 seconds\n", + "2023/10/15 01:28:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 7.11788 seconds\n", + "2023/10/15 01:28:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.97584 seconds\n", + "2023/10/15 01:28:36 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.66255 seconds\n", + "2023/10/15 01:28:43 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.65211 seconds\n", + "2023/10/15 01:28:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.62893 seconds\n", + "2023/10/15 01:28:56 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.68319 seconds\n", + "2023/10/15 01:29:03 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.63854 seconds\n", + "2023/10/15 01:29:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.60653 seconds\n", + "2023/10/15 01:29:16 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.68614 seconds\n", + "2023/10/15 01:29:23 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 7.12898 seconds\n", + "2023/10/15 01:29:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.72732 seconds\n", + "2023/10/15 01:29:37 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.72368 seconds\n", + "2023/10/15 01:29:43 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.69403 seconds\n", + "2023/10/15 01:29:50 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.69146 seconds\n", + "2023/10/15 01:29:57 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.72486 seconds\n", + "2023/10/15 01:30:03 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.68730 seconds\n", + "2023/10/15 01:30:10 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.66385 seconds\n", + "2023/10/15 01:30:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3271841342159078, Global best: 0.3271841342159078, Runtime: 6.68772 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.5 0.625 534\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:30:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:30:35 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3394963299488549, Global best: 0.3394963299488549, Runtime: 6.67446 seconds\n", + "2023/10/15 01:30:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3394963299488549, Global best: 0.3394963299488549, Runtime: 6.64143 seconds\n", + "2023/10/15 01:30:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.33879188880210065, Global best: 0.33879188880210065, Runtime: 6.72631 seconds\n", + "2023/10/15 01:30:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.33084396138442396, Global best: 0.33084396138442396, Runtime: 6.65776 seconds\n", + "2023/10/15 01:31:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3306903132066714, Global best: 0.3306903132066714, Runtime: 6.62967 seconds\n", + "2023/10/15 01:31:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3244224313145488, Global best: 0.3244224313145488, Runtime: 6.69642 seconds\n", + "2023/10/15 01:31:15 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3244224313145488, Global best: 0.3244224313145488, Runtime: 6.70551 seconds\n", + "2023/10/15 01:31:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3244224313145488, Global best: 0.3244224313145488, Runtime: 6.68826 seconds\n", + "2023/10/15 01:31:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3244224313145488, Global best: 0.3244224313145488, Runtime: 6.68726 seconds\n", + "2023/10/15 01:31:35 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3244224313145488, Global best: 0.3244224313145488, Runtime: 6.66199 seconds\n", + "2023/10/15 01:31:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3181471804286914, Global best: 0.3181471804286914, Runtime: 6.63283 seconds\n", + "2023/10/15 01:31:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3181471804286914, Global best: 0.3181471804286914, Runtime: 6.63885 seconds\n", + "2023/10/15 01:31:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.311409062058393, Global best: 0.311409062058393, Runtime: 6.65890 seconds\n", + "2023/10/15 01:32:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.311409062058393, Global best: 0.311409062058393, Runtime: 6.64486 seconds\n", + "2023/10/15 01:32:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.311409062058393, Global best: 0.311409062058393, Runtime: 6.67983 seconds\n", + "2023/10/15 01:32:15 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.311409062058393, Global best: 0.311409062058393, Runtime: 6.66062 seconds\n", + "2023/10/15 01:32:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.311409062058393, Global best: 0.311409062058393, Runtime: 6.69690 seconds\n", + "2023/10/15 01:32:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.311409062058393, Global best: 0.311409062058393, Runtime: 6.63910 seconds\n", + "2023/10/15 01:32:35 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.311409062058393, Global best: 0.311409062058393, Runtime: 6.65290 seconds\n", + "2023/10/15 01:32:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.311409062058393, Global best: 0.311409062058393, Runtime: 6.67792 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.625 0.5 518\n", + "Triglav Stage 1 Base 0.5 0.5 263\n", + "Triglav MultiSURF 10 0.4583333333333333 0.5 10\n", + "Triglav MultiSURF 20 0.625 0.625 20\n", + "Triglav MultiSURF 40 0.625 0.625 40\n", + "Triglav MultiSURF 60 0.5 0.75 60\n", + "Triglav MultiSURF 80 0.5 0.5 80\n", + "Triglav MultiSURF 100 0.5 0.5 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:33:07 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:33:28 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.28692747669233143, Global best: 0.28692747669233143, Runtime: 13.07187 seconds\n", + "2023/10/15 01:33:41 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.28692747669233143, Global best: 0.28692747669233143, Runtime: 13.04889 seconds\n", + "2023/10/15 01:33:55 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.2978447636743208, Global best: 0.28692747669233143, Runtime: 13.42824 seconds\n", + "2023/10/15 01:34:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.29120486913750715, Global best: 0.28692747669233143, Runtime: 13.74958 seconds\n", + "2023/10/15 01:34:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.28587977042778173, Global best: 0.28587977042778173, Runtime: 13.41632 seconds\n", + "2023/10/15 01:34:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.28587977042778173, Global best: 0.28587977042778173, Runtime: 13.91210 seconds\n", + "2023/10/15 01:34:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.28587977042778173, Global best: 0.28587977042778173, Runtime: 13.26063 seconds\n", + "2023/10/15 01:35:04 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.2967740207767887, Global best: 0.28587977042778173, Runtime: 14.57788 seconds\n", + "2023/10/15 01:35:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.29617443322986303, Global best: 0.28587977042778173, Runtime: 13.72167 seconds\n", + "2023/10/15 01:35:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.2874457196804552, Global best: 0.28587977042778173, Runtime: 14.15873 seconds\n", + "2023/10/15 01:35:46 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.2740021594157945, Global best: 0.2740021594157945, Runtime: 14.18689 seconds\n", + "2023/10/15 01:35:59 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.2740021594157945, Global best: 0.2740021594157945, Runtime: 13.26312 seconds\n", + "2023/10/15 01:36:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.2740021594157945, Global best: 0.2740021594157945, Runtime: 13.70879 seconds\n", + "2023/10/15 01:36:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.29348149013195124, Global best: 0.2740021594157945, Runtime: 13.93219 seconds\n", + "2023/10/15 01:36:40 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.29348149013195124, Global best: 0.2740021594157945, Runtime: 13.87824 seconds\n", + "2023/10/15 01:36:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.28951740961736033, Global best: 0.2740021594157945, Runtime: 13.93367 seconds\n", + "2023/10/15 01:37:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.28951740961736033, Global best: 0.2740021594157945, Runtime: 14.13572 seconds\n", + "2023/10/15 01:37:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.2841907524775893, Global best: 0.2740021594157945, Runtime: 13.03372 seconds\n", + "2023/10/15 01:37:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.27845529963475546, Global best: 0.2740021594157945, Runtime: 13.21667 seconds\n", + "2023/10/15 01:37:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.27032343910892326, Global best: 0.27032343910892326, Runtime: 13.89176 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.5 0.5 143\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:37:52 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:38:06 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.29051126127248406, Global best: 0.29051126127248406, Runtime: 6.48027 seconds\n", + "2023/10/15 01:38:13 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.29051126127248406, Global best: 0.29051126127248406, Runtime: 6.98544 seconds\n", + "2023/10/15 01:38:19 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.29051126127248406, Global best: 0.29051126127248406, Runtime: 6.44648 seconds\n", + "2023/10/15 01:38:26 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.29051126127248406, Global best: 0.29051126127248406, Runtime: 6.47519 seconds\n", + "2023/10/15 01:38:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.29051126127248406, Global best: 0.29051126127248406, Runtime: 6.49748 seconds\n", + "2023/10/15 01:38:39 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.29051126127248406, Global best: 0.29051126127248406, Runtime: 6.50042 seconds\n", + "2023/10/15 01:38:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.28848180798214207, Global best: 0.28848180798214207, Runtime: 6.45282 seconds\n", + "2023/10/15 01:38:52 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.28848180798214207, Global best: 0.28848180798214207, Runtime: 6.48370 seconds\n", + "2023/10/15 01:38:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.28848180798214207, Global best: 0.28848180798214207, Runtime: 6.54356 seconds\n", + "2023/10/15 01:39:05 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.28848180798214207, Global best: 0.28848180798214207, Runtime: 6.46935 seconds\n", + "2023/10/15 01:39:11 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.28848180798214207, Global best: 0.28848180798214207, Runtime: 6.52735 seconds\n", + "2023/10/15 01:39:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.28848180798214207, Global best: 0.28848180798214207, Runtime: 6.49423 seconds\n", + "2023/10/15 01:39:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.28848180798214207, Global best: 0.28848180798214207, Runtime: 6.52076 seconds\n", + "2023/10/15 01:39:31 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.28848180798214207, Global best: 0.28848180798214207, Runtime: 6.46537 seconds\n", + "2023/10/15 01:39:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2762410976062473, Global best: 0.2762410976062473, Runtime: 6.47154 seconds\n", + "2023/10/15 01:39:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2762410976062473, Global best: 0.2762410976062473, Runtime: 6.47197 seconds\n", + "2023/10/15 01:39:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2762410976062473, Global best: 0.2762410976062473, Runtime: 6.50022 seconds\n", + "2023/10/15 01:39:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2762410976062473, Global best: 0.2762410976062473, Runtime: 6.50763 seconds\n", + "2023/10/15 01:40:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2762410976062473, Global best: 0.2762410976062473, Runtime: 6.49823 seconds\n", + "2023/10/15 01:40:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2762410976062473, Global best: 0.2762410976062473, Runtime: 6.43824 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.5 0.5 137\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:40:14 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:40:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.28750864054087794, Global best: 0.28750864054087794, Runtime: 6.47129 seconds\n", + "2023/10/15 01:40:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.28334456843891265, Global best: 0.28334456843891265, Runtime: 6.46737 seconds\n", + "2023/10/15 01:40:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.27738382030176795, Global best: 0.27738382030176795, Runtime: 6.41218 seconds\n", + "2023/10/15 01:40:46 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.27496102432073033, Global best: 0.27496102432073033, Runtime: 6.45708 seconds\n", + "2023/10/15 01:40:53 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.2694286282866559, Global best: 0.2694286282866559, Runtime: 6.93079 seconds\n", + "2023/10/15 01:41:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.26919280445451743, Global best: 0.26919280445451743, Runtime: 6.45551 seconds\n", + "2023/10/15 01:41:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.26832274105532006, Global best: 0.26832274105532006, Runtime: 6.47273 seconds\n", + "2023/10/15 01:41:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.26541908238843454, Global best: 0.26541908238843454, Runtime: 6.45021 seconds\n", + "2023/10/15 01:41:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.26541908238843454, Global best: 0.26541908238843454, Runtime: 6.45740 seconds\n", + "2023/10/15 01:41:26 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2585299855572662, Global best: 0.2585299855572662, Runtime: 6.45030 seconds\n", + "2023/10/15 01:41:32 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.24725657790148411, Global best: 0.24725657790148411, Runtime: 6.49906 seconds\n", + "2023/10/15 01:41:39 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.24725657790148411, Global best: 0.24725657790148411, Runtime: 6.43093 seconds\n", + "2023/10/15 01:41:45 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.24725657790148411, Global best: 0.24725657790148411, Runtime: 6.50202 seconds\n", + "2023/10/15 01:41:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.24725657790148411, Global best: 0.24725657790148411, Runtime: 6.45878 seconds\n", + "2023/10/15 01:41:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.24334894988081068, Global best: 0.24334894988081068, Runtime: 6.45192 seconds\n", + "2023/10/15 01:42:05 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.24334894988081068, Global best: 0.24334894988081068, Runtime: 6.50380 seconds\n", + "2023/10/15 01:42:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.24334894988081068, Global best: 0.24334894988081068, Runtime: 6.45604 seconds\n", + "2023/10/15 01:42:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.24225937825974506, Global best: 0.24225937825974506, Runtime: 6.47596 seconds\n", + "2023/10/15 01:42:24 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.2367929602709195, Global best: 0.2367929602709195, Runtime: 6.42446 seconds\n", + "2023/10/15 01:42:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.2367929602709195, Global best: 0.2367929602709195, Runtime: 6.47318 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.5 0.75 122\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:42:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:42:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2788781395668548, Global best: 0.2788781395668548, Runtime: 6.54276 seconds\n", + "2023/10/15 01:42:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.27123430364710915, Global best: 0.27123430364710915, Runtime: 6.48607 seconds\n", + "2023/10/15 01:43:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2677648449305408, Global best: 0.2677648449305408, Runtime: 6.50007 seconds\n", + "2023/10/15 01:43:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2558447596999395, Global best: 0.2558447596999395, Runtime: 6.53362 seconds\n", + "2023/10/15 01:43:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.253242780757312, Global best: 0.253242780757312, Runtime: 6.46422 seconds\n", + "2023/10/15 01:43:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.25304922499369203, Global best: 0.25304922499369203, Runtime: 6.44379 seconds\n", + "2023/10/15 01:43:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.25229220299456523, Global best: 0.25229220299456523, Runtime: 6.46035 seconds\n", + "2023/10/15 01:43:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.24581553234576714, Global best: 0.24581553234576714, Runtime: 6.49275 seconds\n", + "2023/10/15 01:43:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.24455272007751783, Global best: 0.24455272007751783, Runtime: 6.92295 seconds\n", + "2023/10/15 01:43:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.24442563676499038, Global best: 0.24442563676499038, Runtime: 6.48254 seconds\n", + "2023/10/15 01:43:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.235170898058145, Global best: 0.235170898058145, Runtime: 6.60667 seconds\n", + "2023/10/15 01:44:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.235170898058145, Global best: 0.235170898058145, Runtime: 6.47254 seconds\n", + "2023/10/15 01:44:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.23128517899886397, Global best: 0.23128517899886397, Runtime: 6.50468 seconds\n", + "2023/10/15 01:44:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.23128517899886397, Global best: 0.23128517899886397, Runtime: 6.51743 seconds\n", + "2023/10/15 01:44:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2290193706673299, Global best: 0.2290193706673299, Runtime: 6.49302 seconds\n", + "2023/10/15 01:44:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2290193706673299, Global best: 0.2290193706673299, Runtime: 6.44978 seconds\n", + "2023/10/15 01:44:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.22859541550064386, Global best: 0.22859541550064386, Runtime: 6.52971 seconds\n", + "2023/10/15 01:44:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.22200280282008286, Global best: 0.22200280282008286, Runtime: 6.48656 seconds\n", + "2023/10/15 01:44:45 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.22200280282008286, Global best: 0.22200280282008286, Runtime: 6.49008 seconds\n", + "2023/10/15 01:44:52 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.22200280282008286, Global best: 0.22200280282008286, Runtime: 6.42888 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.5 0.75 106\n", + "3\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 211\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 211\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 211\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 211\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 211\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 211\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 211\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 211\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 257 / Rejected: 211\n", + "Round 26 / Tentative (Accepted): 149 / Tentative (Not Accepted): 108 / Rejected: 211\n", + "Round 27 / Tentative (Accepted): 149 / Tentative (Not Accepted): 105 / Rejected: 214\n", + "Round 28 / Tentative (Accepted): 149 / Tentative (Not Accepted): 105 / Rejected: 214\n", + "Round 29 / Tentative (Accepted): 149 / Tentative (Not Accepted): 105 / Rejected: 214\n", + "Round 30 / Tentative (Accepted): 149 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 31 / Tentative (Accepted): 149 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 32 / Tentative (Accepted): 149 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 33 / Tentative (Accepted): 149 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 34 / Tentative (Accepted): 149 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 35 / Tentative (Accepted): 149 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 36 / Tentative (Accepted): 149 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 37 / Tentative (Accepted): 149 / Tentative (Not Accepted): 100 / Rejected: 219\n", + "Round 38 / Tentative (Accepted): 150 / Tentative (Not Accepted): 99 / Rejected: 219\n", + "Round 39 / Tentative (Accepted): 150 / Tentative (Not Accepted): 99 / Rejected: 219\n", + "Round 40 / Tentative (Accepted): 150 / Tentative (Not Accepted): 98 / Rejected: 220\n", + "Final Feature Set Contains 284 Features.\n", + "Control (Positive) 0.95 0.9 938\n", + "Control (Negative) 0.7833333333333333 0.75 938\n", + "ANOVA Base 0.9 0.9 266\n", + "Mutual Information (10) Base 0.65 0.85 10\n", + "RFE (10) Base 0.9 0.95 10\n", + "MultiSURF (10) 0.9 0.9 10\n", + "Mutual Information (20) Base 0.65 0.85 20\n", + "RFE (20) Base 0.85 0.9 20\n", + "MultiSURF (20) 0.9 0.95 20\n", + "Mutual Information (40) Base 0.95 0.95 40\n", + "RFE (40) Base 0.9 0.9 40\n", + "MultiSURF (40) 0.85 0.9 40\n", + "Mutual Information (60) Base 0.95 0.95 60\n", + "RFE (60) Base 0.9 0.9 60\n", + "MultiSURF (60) 0.9 0.9 60\n", + "Mutual Information (80) Base 0.95 0.9 80\n", + "RFE (80) Base 0.9 0.9 80\n", + "MultiSURF (80) 0.9 0.9 80\n", + "Mutual Information (100) Base 0.95 0.95 100\n", + "RFE (100) Base 0.9 0.9 100\n", + "MultiSURF (100) 0.95 0.9 100\n", + "RFECV Base 0.9 0.9 110\n", + "Boruta Base 0.9 0.9 42\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:53:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:53:55 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.33331917777956444, Global best: 0.33331917777956444, Runtime: 13.50528 seconds\n", + "2023/10/15 01:54:09 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3329043269777965, Global best: 0.3329043269777965, Runtime: 13.46104 seconds\n", + "2023/10/15 01:54:23 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.33055561189037796, Global best: 0.33055561189037796, Runtime: 14.33676 seconds\n", + "2023/10/15 01:54:37 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.33055561189037796, Global best: 0.33055561189037796, Runtime: 13.92293 seconds\n", + "2023/10/15 01:54:52 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33055561189037796, Global best: 0.33055561189037796, Runtime: 14.61742 seconds\n", + "2023/10/15 01:55:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3311718735288633, Global best: 0.33055561189037796, Runtime: 14.43619 seconds\n", + "2023/10/15 01:55:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3311718735288633, Global best: 0.33055561189037796, Runtime: 14.34433 seconds\n", + "2023/10/15 01:55:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3240977887920469, Global best: 0.3240977887920469, Runtime: 14.53346 seconds\n", + "2023/10/15 01:55:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.32868127582430373, Global best: 0.3240977887920469, Runtime: 13.86658 seconds\n", + "2023/10/15 01:56:04 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.32868127582430373, Global best: 0.3240977887920469, Runtime: 14.82657 seconds\n", + "2023/10/15 01:56:18 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.32868127582430373, Global best: 0.3240977887920469, Runtime: 14.46271 seconds\n", + "2023/10/15 01:56:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.32868127582430373, Global best: 0.3240977887920469, Runtime: 15.03107 seconds\n", + "2023/10/15 01:56:47 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.32868127582430373, Global best: 0.3240977887920469, Runtime: 14.13344 seconds\n", + "2023/10/15 01:57:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3311706658724633, Global best: 0.3240977887920469, Runtime: 14.62145 seconds\n", + "2023/10/15 01:57:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3208739474095784, Global best: 0.3208739474095784, Runtime: 15.11544 seconds\n", + "2023/10/15 01:57:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3208739474095784, Global best: 0.3208739474095784, Runtime: 14.13796 seconds\n", + "2023/10/15 01:57:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3311592750206132, Global best: 0.3208739474095784, Runtime: 14.13839 seconds\n", + "2023/10/15 01:58:00 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3314962376413225, Global best: 0.3208739474095784, Runtime: 14.36659 seconds\n", + "2023/10/15 01:58:14 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3314962376413225, Global best: 0.3208739474095784, Runtime: 14.13828 seconds\n", + "2023/10/15 01:58:28 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.337677505988057, Global best: 0.3208739474095784, Runtime: 14.33790 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.95 0.9 555\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 01:58:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 01:58:46 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.73499 seconds\n", + "2023/10/15 01:58:53 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.73369 seconds\n", + "2023/10/15 01:59:00 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.77628 seconds\n", + "2023/10/15 01:59:06 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.72285 seconds\n", + "2023/10/15 01:59:13 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.69642 seconds\n", + "2023/10/15 01:59:20 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.76385 seconds\n", + "2023/10/15 01:59:27 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.71323 seconds\n", + "2023/10/15 01:59:33 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.72623 seconds\n", + "2023/10/15 01:59:40 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.64497 seconds\n", + "2023/10/15 01:59:47 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 7.19815 seconds\n", + "2023/10/15 01:59:54 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.68132 seconds\n", + "2023/10/15 02:00:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3250508985126029, Global best: 0.3250508985126029, Runtime: 6.74082 seconds\n", + "2023/10/15 02:00:07 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.30780276958681885, Global best: 0.30780276958681885, Runtime: 6.69232 seconds\n", + "2023/10/15 02:00:14 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.30780276958681885, Global best: 0.30780276958681885, Runtime: 6.66878 seconds\n", + "2023/10/15 02:00:21 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.30780276958681885, Global best: 0.30780276958681885, Runtime: 6.70291 seconds\n", + "2023/10/15 02:00:27 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.30780276958681885, Global best: 0.30780276958681885, Runtime: 6.72917 seconds\n", + "2023/10/15 02:00:34 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.30780276958681885, Global best: 0.30780276958681885, Runtime: 6.75669 seconds\n", + "2023/10/15 02:00:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.30780276958681885, Global best: 0.30780276958681885, Runtime: 6.68991 seconds\n", + "2023/10/15 02:00:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.30780276958681885, Global best: 0.30780276958681885, Runtime: 6.71199 seconds\n", + "2023/10/15 02:00:54 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.30780276958681885, Global best: 0.30780276958681885, Runtime: 6.73835 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.95 0.85 497\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:00:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:01:12 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.326469263537244, Global best: 0.326469263537244, Runtime: 6.73585 seconds\n", + "2023/10/15 02:01:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.326469263537244, Global best: 0.326469263537244, Runtime: 6.70561 seconds\n", + "2023/10/15 02:01:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.326469263537244, Global best: 0.326469263537244, Runtime: 6.70481 seconds\n", + "2023/10/15 02:01:32 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.326469263537244, Global best: 0.326469263537244, Runtime: 6.69627 seconds\n", + "2023/10/15 02:01:39 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.326469263537244, Global best: 0.326469263537244, Runtime: 6.64441 seconds\n", + "2023/10/15 02:01:46 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.326469263537244, Global best: 0.326469263537244, Runtime: 6.67177 seconds\n", + "2023/10/15 02:01:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3227270328683508, Global best: 0.3227270328683508, Runtime: 6.64215 seconds\n", + "2023/10/15 02:01:59 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3227270328683508, Global best: 0.3227270328683508, Runtime: 6.72219 seconds\n", + "2023/10/15 02:02:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3227270328683508, Global best: 0.3227270328683508, Runtime: 6.68466 seconds\n", + "2023/10/15 02:02:12 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3227270328683508, Global best: 0.3227270328683508, Runtime: 6.56941 seconds\n", + "2023/10/15 02:02:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 6.65957 seconds\n", + "2023/10/15 02:02:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 6.65346 seconds\n", + "2023/10/15 02:02:32 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 6.70033 seconds\n", + "2023/10/15 02:02:39 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 6.65445 seconds\n", + "2023/10/15 02:02:45 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 6.66418 seconds\n", + "2023/10/15 02:02:53 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 7.15162 seconds\n", + "2023/10/15 02:02:59 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 6.68701 seconds\n", + "2023/10/15 02:03:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 6.74507 seconds\n", + "2023/10/15 02:03:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 6.74756 seconds\n", + "2023/10/15 02:03:20 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3157825313650993, Global best: 0.3157825313650993, Runtime: 6.69017 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.95 0.9 562\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:03:23 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:03:37 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3217706054300754, Global best: 0.3217706054300754, Runtime: 6.69545 seconds\n", + "2023/10/15 02:03:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3104147230715452, Global best: 0.3104147230715452, Runtime: 6.72132 seconds\n", + "2023/10/15 02:03:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.30716945876558377, Global best: 0.30716945876558377, Runtime: 6.67499 seconds\n", + "2023/10/15 02:03:57 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.30716945876558377, Global best: 0.30716945876558377, Runtime: 6.65937 seconds\n", + "2023/10/15 02:04:04 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.30716945876558377, Global best: 0.30716945876558377, Runtime: 6.67712 seconds\n", + "2023/10/15 02:04:11 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3054827982131098, Global best: 0.3054827982131098, Runtime: 6.67740 seconds\n", + "2023/10/15 02:04:17 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3054827982131098, Global best: 0.3054827982131098, Runtime: 6.66001 seconds\n", + "2023/10/15 02:04:24 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3054827982131098, Global best: 0.3054827982131098, Runtime: 6.68809 seconds\n", + "2023/10/15 02:04:31 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2987743888889988, Global best: 0.2987743888889988, Runtime: 6.63456 seconds\n", + "2023/10/15 02:04:37 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2987743888889988, Global best: 0.2987743888889988, Runtime: 6.66402 seconds\n", + "2023/10/15 02:04:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2987743888889988, Global best: 0.2987743888889988, Runtime: 6.66390 seconds\n", + "2023/10/15 02:04:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2987743888889988, Global best: 0.2987743888889988, Runtime: 6.65012 seconds\n", + "2023/10/15 02:04:57 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2987743888889988, Global best: 0.2987743888889988, Runtime: 6.63522 seconds\n", + "2023/10/15 02:05:04 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2987743888889988, Global best: 0.2987743888889988, Runtime: 6.78101 seconds\n", + "2023/10/15 02:05:11 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2971276393990238, Global best: 0.2971276393990238, Runtime: 6.73237 seconds\n", + "2023/10/15 02:05:18 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2971276393990238, Global best: 0.2971276393990238, Runtime: 7.17670 seconds\n", + "2023/10/15 02:05:25 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2971276393990238, Global best: 0.2971276393990238, Runtime: 6.69695 seconds\n", + "2023/10/15 02:05:31 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2971276393990238, Global best: 0.2971276393990238, Runtime: 6.63068 seconds\n", + "2023/10/15 02:05:38 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2971276393990238, Global best: 0.2971276393990238, Runtime: 6.68750 seconds\n", + "2023/10/15 02:05:45 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2971276393990238, Global best: 0.2971276393990238, Runtime: 6.75345 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.95 0.9 515\n", + "Triglav Stage 1 Base 0.8166666666666667 0.9 284\n", + "Triglav MultiSURF 10 0.8666666666666667 0.7666666666666666 10\n", + "Triglav MultiSURF 20 0.8666666666666667 0.9166666666666667 20\n", + "Triglav MultiSURF 40 0.8666666666666667 0.95 40\n", + "Triglav MultiSURF 60 0.8666666666666667 0.95 60\n", + "Triglav MultiSURF 80 0.8666666666666667 0.95 80\n", + "Triglav MultiSURF 100 0.8666666666666667 0.95 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:06:11 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:06:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.31071663377959763, Global best: 0.31071663377959763, Runtime: 13.04336 seconds\n", + "2023/10/15 02:06:44 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.30883708569370527, Global best: 0.30883708569370527, Runtime: 13.01393 seconds\n", + "2023/10/15 02:06:57 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.30883708569370527, Global best: 0.30883708569370527, Runtime: 13.21411 seconds\n", + "2023/10/15 02:07:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.30883708569370527, Global best: 0.30883708569370527, Runtime: 13.23429 seconds\n", + "2023/10/15 02:07:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.31071663377959763, Global best: 0.30883708569370527, Runtime: 14.09188 seconds\n", + "2023/10/15 02:07:38 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.31071663377959763, Global best: 0.30883708569370527, Runtime: 14.07451 seconds\n", + "2023/10/15 02:07:52 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.31257499639860675, Global best: 0.30883708569370527, Runtime: 13.58050 seconds\n", + "2023/10/15 02:08:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.31123429728149155, Global best: 0.30883708569370527, Runtime: 13.66575 seconds\n", + "2023/10/15 02:08:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.31123429728149155, Global best: 0.30883708569370527, Runtime: 13.74340 seconds\n", + "2023/10/15 02:08:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.30455670102393645, Global best: 0.30455670102393645, Runtime: 14.06071 seconds\n", + "2023/10/15 02:08:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.30455670102393645, Global best: 0.30455670102393645, Runtime: 14.20236 seconds\n", + "2023/10/15 02:09:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.30455670102393645, Global best: 0.30455670102393645, Runtime: 14.30555 seconds\n", + "2023/10/15 02:09:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.30455670102393645, Global best: 0.30455670102393645, Runtime: 13.45988 seconds\n", + "2023/10/15 02:09:29 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.30539452232368675, Global best: 0.30455670102393645, Runtime: 14.04282 seconds\n", + "2023/10/15 02:09:43 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.30409499007636587, Global best: 0.30409499007636587, Runtime: 13.62000 seconds\n", + "2023/10/15 02:09:57 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.30409499007636587, Global best: 0.30409499007636587, Runtime: 13.62288 seconds\n", + "2023/10/15 02:10:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.30409499007636587, Global best: 0.30409499007636587, Runtime: 13.41733 seconds\n", + "2023/10/15 02:10:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.30527948934455196, Global best: 0.30409499007636587, Runtime: 13.63031 seconds\n", + "2023/10/15 02:10:38 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.31039619465702334, Global best: 0.30409499007636587, Runtime: 14.08811 seconds\n", + "2023/10/15 02:10:51 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3075077446551985, Global best: 0.30409499007636587, Runtime: 13.40955 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.8166666666666667 0.9 163\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:10:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:11:12 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.48463 seconds\n", + "2023/10/15 02:11:19 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.95312 seconds\n", + "2023/10/15 02:11:25 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.48303 seconds\n", + "2023/10/15 02:11:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.45756 seconds\n", + "2023/10/15 02:11:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.50706 seconds\n", + "2023/10/15 02:11:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.47458 seconds\n", + "2023/10/15 02:11:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.46008 seconds\n", + "2023/10/15 02:11:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.46031 seconds\n", + "2023/10/15 02:12:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.43058 seconds\n", + "2023/10/15 02:12:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.29668680784355006, Global best: 0.29668680784355006, Runtime: 6.51235 seconds\n", + "2023/10/15 02:12:17 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.29151532911220945, Global best: 0.29151532911220945, Runtime: 6.45207 seconds\n", + "2023/10/15 02:12:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.29151532911220945, Global best: 0.29151532911220945, Runtime: 6.43754 seconds\n", + "2023/10/15 02:12:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.29151532911220945, Global best: 0.29151532911220945, Runtime: 6.47219 seconds\n", + "2023/10/15 02:12:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.29151532911220945, Global best: 0.29151532911220945, Runtime: 6.47590 seconds\n", + "2023/10/15 02:12:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2909504227113766, Global best: 0.2909504227113766, Runtime: 6.46558 seconds\n", + "2023/10/15 02:12:49 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2909504227113766, Global best: 0.2909504227113766, Runtime: 6.50612 seconds\n", + "2023/10/15 02:12:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2909504227113766, Global best: 0.2909504227113766, Runtime: 6.56147 seconds\n", + "2023/10/15 02:13:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2909504227113766, Global best: 0.2909504227113766, Runtime: 6.43490 seconds\n", + "2023/10/15 02:13:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2909504227113766, Global best: 0.2909504227113766, Runtime: 6.48621 seconds\n", + "2023/10/15 02:13:15 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2909504227113766, Global best: 0.2909504227113766, Runtime: 6.44497 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.8166666666666667 0.9 153\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:13:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:13:33 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.29716248542849294, Global best: 0.29716248542849294, Runtime: 6.91398 seconds\n", + "2023/10/15 02:13:39 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.29716248542849294, Global best: 0.29716248542849294, Runtime: 6.44581 seconds\n", + "2023/10/15 02:13:46 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.29716248542849294, Global best: 0.29716248542849294, Runtime: 6.42888 seconds\n", + "2023/10/15 02:13:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.28695311216452685, Global best: 0.28695311216452685, Runtime: 6.50316 seconds\n", + "2023/10/15 02:13:59 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.28062299767877474, Global best: 0.28062299767877474, Runtime: 6.46948 seconds\n", + "2023/10/15 02:14:05 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.27417660154001283, Global best: 0.27417660154001283, Runtime: 6.51752 seconds\n", + "2023/10/15 02:14:12 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.273491038830858, Global best: 0.273491038830858, Runtime: 6.48081 seconds\n", + "2023/10/15 02:14:18 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.2672684492195675, Global best: 0.2672684492195675, Runtime: 6.48046 seconds\n", + "2023/10/15 02:14:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.25906757716958473, Global best: 0.25906757716958473, Runtime: 6.50724 seconds\n", + "2023/10/15 02:14:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.25906757716958473, Global best: 0.25906757716958473, Runtime: 6.52372 seconds\n", + "2023/10/15 02:14:38 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.25812014116220766, Global best: 0.25812014116220766, Runtime: 6.51604 seconds\n", + "2023/10/15 02:14:44 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.25812014116220766, Global best: 0.25812014116220766, Runtime: 6.52064 seconds\n", + "2023/10/15 02:14:51 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.25709844464384723, Global best: 0.25709844464384723, Runtime: 6.47741 seconds\n", + "2023/10/15 02:14:57 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2540090312283485, Global best: 0.2540090312283485, Runtime: 6.46231 seconds\n", + "2023/10/15 02:15:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.25338350528712933, Global best: 0.25338350528712933, Runtime: 6.46084 seconds\n", + "2023/10/15 02:15:10 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2522604400075291, Global best: 0.2522604400075291, Runtime: 6.43090 seconds\n", + "2023/10/15 02:15:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2466307412951545, Global best: 0.2466307412951545, Runtime: 6.46227 seconds\n", + "2023/10/15 02:15:23 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.24409329494933624, Global best: 0.24409329494933624, Runtime: 6.50336 seconds\n", + "2023/10/15 02:15:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.24409329494933624, Global best: 0.24409329494933624, Runtime: 6.47714 seconds\n", + "2023/10/15 02:15:36 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.24409329494933624, Global best: 0.24409329494933624, Runtime: 6.51227 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.8666666666666667 0.9 120\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:15:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:15:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2860636228820956, Global best: 0.2860636228820956, Runtime: 6.48354 seconds\n", + "2023/10/15 02:16:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.2860636228820956, Global best: 0.2860636228820956, Runtime: 6.54463 seconds\n", + "2023/10/15 02:16:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2860636228820956, Global best: 0.2860636228820956, Runtime: 6.53319 seconds\n", + "2023/10/15 02:16:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2848269601335155, Global best: 0.2848269601335155, Runtime: 6.95170 seconds\n", + "2023/10/15 02:16:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2834751058547889, Global best: 0.2834751058547889, Runtime: 6.54531 seconds\n", + "2023/10/15 02:16:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.2615589591615424, Global best: 0.2615589591615424, Runtime: 6.51188 seconds\n", + "2023/10/15 02:16:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2615589591615424, Global best: 0.2615589591615424, Runtime: 6.54454 seconds\n", + "2023/10/15 02:16:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.26056576965114603, Global best: 0.26056576965114603, Runtime: 6.50919 seconds\n", + "2023/10/15 02:16:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.26056576965114603, Global best: 0.26056576965114603, Runtime: 6.48873 seconds\n", + "2023/10/15 02:16:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.26040500330457206, Global best: 0.26040500330457206, Runtime: 6.45922 seconds\n", + "2023/10/15 02:16:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.26040500330457206, Global best: 0.26040500330457206, Runtime: 6.49867 seconds\n", + "2023/10/15 02:17:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.25659030084252915, Global best: 0.25659030084252915, Runtime: 6.51241 seconds\n", + "2023/10/15 02:17:12 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.25297276990911627, Global best: 0.25297276990911627, Runtime: 6.49210 seconds\n", + "2023/10/15 02:17:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.24828518998151491, Global best: 0.24828518998151491, Runtime: 6.45820 seconds\n", + "2023/10/15 02:17:25 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.24828518998151491, Global best: 0.24828518998151491, Runtime: 6.52909 seconds\n", + "2023/10/15 02:17:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.24828518998151491, Global best: 0.24828518998151491, Runtime: 6.44320 seconds\n", + "2023/10/15 02:17:38 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.24828518998151491, Global best: 0.24828518998151491, Runtime: 6.48882 seconds\n", + "2023/10/15 02:17:45 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.24828518998151491, Global best: 0.24828518998151491, Runtime: 6.51727 seconds\n", + "2023/10/15 02:17:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.24828518998151491, Global best: 0.24828518998151491, Runtime: 6.54059 seconds\n", + "2023/10/15 02:17:58 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.24752235075099155, Global best: 0.24752235075099155, Runtime: 6.49934 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.8666666666666667 0.85 123\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 245 / Rejected: 216\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 245 / Rejected: 216\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 245 / Rejected: 216\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 245 / Rejected: 216\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 245 / Rejected: 216\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 245 / Rejected: 216\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 245 / Rejected: 216\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 245 / Rejected: 216\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 245 / Rejected: 216\n", + "Round 26 / Tentative (Accepted): 141 / Tentative (Not Accepted): 104 / Rejected: 216\n", + "Round 27 / Tentative (Accepted): 141 / Tentative (Not Accepted): 100 / Rejected: 220\n", + "Round 28 / Tentative (Accepted): 141 / Tentative (Not Accepted): 100 / Rejected: 220\n", + "Round 29 / Tentative (Accepted): 141 / Tentative (Not Accepted): 100 / Rejected: 220\n", + "Round 30 / Tentative (Accepted): 141 / Tentative (Not Accepted): 100 / Rejected: 220\n", + "Round 31 / Tentative (Accepted): 141 / Tentative (Not Accepted): 100 / Rejected: 220\n", + "Round 32 / Tentative (Accepted): 141 / Tentative (Not Accepted): 100 / Rejected: 220\n", + "Round 33 / Tentative (Accepted): 141 / Tentative (Not Accepted): 100 / Rejected: 220\n", + "Round 34 / Tentative (Accepted): 141 / Tentative (Not Accepted): 100 / Rejected: 220\n", + "Round 35 / Tentative (Accepted): 141 / Tentative (Not Accepted): 100 / Rejected: 220\n", + "Round 36 / Tentative (Accepted): 150 / Tentative (Not Accepted): 91 / Rejected: 220\n", + "Round 37 / Tentative (Accepted): 150 / Tentative (Not Accepted): 91 / Rejected: 220\n", + "Round 38 / Tentative (Accepted): 150 / Tentative (Not Accepted): 91 / Rejected: 220\n", + "Round 39 / Tentative (Accepted): 150 / Tentative (Not Accepted): 91 / Rejected: 220\n", + "Round 40 / Tentative (Accepted): 150 / Tentative (Not Accepted): 90 / Rejected: 221\n", + "Final Feature Set Contains 299 Features.\n", + "Control (Positive) 0.9 0.85 938\n", + "Control (Negative) 0.7 0.65 938\n", + "ANOVA Base 0.9 0.85 248\n", + "Mutual Information (10) Base 0.75 0.75 10\n", + "RFE (10) Base 0.9 0.9 10\n", + "MultiSURF (10) 0.9 0.9 10\n", + "Mutual Information (20) Base 0.9 0.85 20\n", + "RFE (20) Base 0.9 0.85 20\n", + "MultiSURF (20) 0.9 0.85 20\n", + "Mutual Information (40) Base 0.9 0.9 40\n", + "RFE (40) Base 0.9 0.75 40\n", + "MultiSURF (40) 0.9 0.85 40\n", + "Mutual Information (60) Base 0.9 0.85 60\n", + "RFE (60) Base 0.9 0.8 60\n", + "MultiSURF (60) 0.9 0.85 60\n", + "Mutual Information (80) Base 0.85 0.8 80\n", + "RFE (80) Base 0.9 0.85 80\n", + "MultiSURF (80) 0.9 0.85 80\n", + "Mutual Information (100) Base 0.9 0.85 100\n", + "RFE (100) Base 0.9 0.85 100\n", + "MultiSURF (100) 0.9 0.85 100\n", + "RFECV Base 0.9 0.85 64\n", + "Boruta Base 0.85 0.85 52\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:26:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:27:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3293450201167625, Global best: 0.3293450201167625, Runtime: 13.39452 seconds\n", + "2023/10/15 02:27:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3293450201167625, Global best: 0.3293450201167625, Runtime: 13.37124 seconds\n", + "2023/10/15 02:27:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3293450201167625, Global best: 0.3293450201167625, Runtime: 13.89232 seconds\n", + "2023/10/15 02:27:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.33658533604969515, Global best: 0.3293450201167625, Runtime: 15.34242 seconds\n", + "2023/10/15 02:27:59 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33707094130167026, Global best: 0.3293450201167625, Runtime: 13.52942 seconds\n", + "2023/10/15 02:28:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.33749535293855615, Global best: 0.3293450201167625, Runtime: 14.10699 seconds\n", + "2023/10/15 02:28:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.33978946229769735, Global best: 0.3293450201167625, Runtime: 14.53560 seconds\n", + "2023/10/15 02:28:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3320590744389006, Global best: 0.3293450201167625, Runtime: 15.04954 seconds\n", + "2023/10/15 02:28:56 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3320590744389006, Global best: 0.3293450201167625, Runtime: 13.98393 seconds\n", + "2023/10/15 02:29:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3320590744389006, Global best: 0.3293450201167625, Runtime: 13.80988 seconds\n", + "2023/10/15 02:29:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.33432579505504467, Global best: 0.3293450201167625, Runtime: 15.34487 seconds\n", + "2023/10/15 02:29:40 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.33432579505504467, Global best: 0.3293450201167625, Runtime: 14.55501 seconds\n", + "2023/10/15 02:29:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.33432579505504467, Global best: 0.3293450201167625, Runtime: 14.27855 seconds\n", + "2023/10/15 02:30:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.33432579505504467, Global best: 0.3293450201167625, Runtime: 13.61944 seconds\n", + "2023/10/15 02:30:23 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3355668402179134, Global best: 0.3293450201167625, Runtime: 15.19955 seconds\n", + "2023/10/15 02:30:37 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3355668402179134, Global best: 0.3293450201167625, Runtime: 14.10463 seconds\n", + "2023/10/15 02:30:51 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3355668402179134, Global best: 0.3293450201167625, Runtime: 14.12514 seconds\n", + "2023/10/15 02:31:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.345106480406949, Global best: 0.3293450201167625, Runtime: 14.49677 seconds\n", + "2023/10/15 02:31:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.34149424368517445, Global best: 0.3293450201167625, Runtime: 14.73756 seconds\n", + "2023/10/15 02:31:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3378549788662366, Global best: 0.3293450201167625, Runtime: 14.84182 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.9 0.85 535\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:31:39 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:31:53 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3288892812630485, Global best: 0.3288892812630485, Runtime: 6.75226 seconds\n", + "2023/10/15 02:32:00 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3288892812630485, Global best: 0.3288892812630485, Runtime: 6.74896 seconds\n", + "2023/10/15 02:32:07 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3288892812630485, Global best: 0.3288892812630485, Runtime: 6.75805 seconds\n", + "2023/10/15 02:32:13 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3288892812630485, Global best: 0.3288892812630485, Runtime: 6.72426 seconds\n", + "2023/10/15 02:32:20 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.32629919110057537, Global best: 0.32629919110057537, Runtime: 6.75820 seconds\n", + "2023/10/15 02:32:27 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.32629919110057537, Global best: 0.32629919110057537, Runtime: 6.76170 seconds\n", + "2023/10/15 02:32:34 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.32629919110057537, Global best: 0.32629919110057537, Runtime: 6.73794 seconds\n", + "2023/10/15 02:32:40 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.32629919110057537, Global best: 0.32629919110057537, Runtime: 6.75274 seconds\n", + "2023/10/15 02:32:47 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.32629919110057537, Global best: 0.32629919110057537, Runtime: 6.73966 seconds\n", + "2023/10/15 02:32:54 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.32629919110057537, Global best: 0.32629919110057537, Runtime: 6.70934 seconds\n", + "2023/10/15 02:33:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3261777646038948, Global best: 0.3261777646038948, Runtime: 6.73458 seconds\n", + "2023/10/15 02:33:07 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3248733105840206, Global best: 0.3248733105840206, Runtime: 6.76296 seconds\n", + "2023/10/15 02:33:14 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3248733105840206, Global best: 0.3248733105840206, Runtime: 6.75659 seconds\n", + "2023/10/15 02:33:21 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3248733105840206, Global best: 0.3248733105840206, Runtime: 6.75100 seconds\n", + "2023/10/15 02:33:28 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3248733105840206, Global best: 0.3248733105840206, Runtime: 6.76898 seconds\n", + "2023/10/15 02:33:34 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3248733105840206, Global best: 0.3248733105840206, Runtime: 6.75212 seconds\n", + "2023/10/15 02:33:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3248733105840206, Global best: 0.3248733105840206, Runtime: 6.78326 seconds\n", + "2023/10/15 02:33:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3248733105840206, Global best: 0.3248733105840206, Runtime: 7.11959 seconds\n", + "2023/10/15 02:33:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3248733105840206, Global best: 0.3248733105840206, Runtime: 6.78127 seconds\n", + "2023/10/15 02:34:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3248733105840206, Global best: 0.3248733105840206, Runtime: 6.71200 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.9 0.85 524\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:34:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:34:20 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.64510 seconds\n", + "2023/10/15 02:34:26 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.67833 seconds\n", + "2023/10/15 02:34:33 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.66059 seconds\n", + "2023/10/15 02:34:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.68550 seconds\n", + "2023/10/15 02:34:46 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.64988 seconds\n", + "2023/10/15 02:34:53 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.69845 seconds\n", + "2023/10/15 02:35:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.65882 seconds\n", + "2023/10/15 02:35:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.66720 seconds\n", + "2023/10/15 02:35:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.62750 seconds\n", + "2023/10/15 02:35:20 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.64166 seconds\n", + "2023/10/15 02:35:26 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.63837 seconds\n", + "2023/10/15 02:35:33 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.66147 seconds\n", + "2023/10/15 02:35:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.67907 seconds\n", + "2023/10/15 02:35:46 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.68975 seconds\n", + "2023/10/15 02:35:53 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.61178 seconds\n", + "2023/10/15 02:36:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.72335 seconds\n", + "2023/10/15 02:36:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.66295 seconds\n", + "2023/10/15 02:36:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.65220 seconds\n", + "2023/10/15 02:36:20 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.68495 seconds\n", + "2023/10/15 02:36:26 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.33037602401993915, Global best: 0.33037602401993915, Runtime: 6.67396 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.9 0.85 530\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:36:30 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:36:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3292010650705012, Global best: 0.3292010650705012, Runtime: 6.66853 seconds\n", + "2023/10/15 02:36:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3224693888192523, Global best: 0.3224693888192523, Runtime: 6.62426 seconds\n", + "2023/10/15 02:36:57 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3224693888192523, Global best: 0.3224693888192523, Runtime: 6.63403 seconds\n", + "2023/10/15 02:37:04 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.3191772409833141, Global best: 0.3191772409833141, Runtime: 6.62482 seconds\n", + "2023/10/15 02:37:11 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.31663953681343643, Global best: 0.31663953681343643, Runtime: 6.69141 seconds\n", + "2023/10/15 02:37:17 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3163439787917114, Global best: 0.3163439787917114, Runtime: 6.70320 seconds\n", + "2023/10/15 02:37:24 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.31268647883160194, Global best: 0.31268647883160194, Runtime: 6.64756 seconds\n", + "2023/10/15 02:37:31 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3084568981045298, Global best: 0.3084568981045298, Runtime: 6.70278 seconds\n", + "2023/10/15 02:37:37 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3084568981045298, Global best: 0.3084568981045298, Runtime: 6.64512 seconds\n", + "2023/10/15 02:37:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3084568981045298, Global best: 0.3084568981045298, Runtime: 6.63718 seconds\n", + "2023/10/15 02:37:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3084568981045298, Global best: 0.3084568981045298, Runtime: 6.63822 seconds\n", + "2023/10/15 02:37:57 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3083651024996149, Global best: 0.3083651024996149, Runtime: 6.67000 seconds\n", + "2023/10/15 02:38:04 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.3056624443672037, Global best: 0.3056624443672037, Runtime: 6.61710 seconds\n", + "2023/10/15 02:38:11 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.3056624443672037, Global best: 0.3056624443672037, Runtime: 6.66821 seconds\n", + "2023/10/15 02:38:17 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.3056624443672037, Global best: 0.3056624443672037, Runtime: 6.60490 seconds\n", + "2023/10/15 02:38:24 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.30425768935718617, Global best: 0.30425768935718617, Runtime: 6.60935 seconds\n", + "2023/10/15 02:38:31 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.3036646089084435, Global best: 0.3036646089084435, Runtime: 7.08600 seconds\n", + "2023/10/15 02:38:38 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.3019412254865307, Global best: 0.3019412254865307, Runtime: 6.56298 seconds\n", + "2023/10/15 02:38:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.30039874601145056, Global best: 0.30039874601145056, Runtime: 6.64732 seconds\n", + "2023/10/15 02:38:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2997628768353541, Global best: 0.2997628768353541, Runtime: 6.69105 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.9 0.85 464\n", + "Triglav Stage 1 Base 0.9 0.85 299\n", + "Triglav MultiSURF 10 0.95 0.8666666666666667 10\n", + "Triglav MultiSURF 20 0.9 0.6666666666666667 20\n", + "Triglav MultiSURF 40 0.85 0.85 40\n", + "Triglav MultiSURF 60 0.85 0.85 60\n", + "Triglav MultiSURF 80 0.9 0.85 80\n", + "Triglav MultiSURF 100 0.9 0.85 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:39:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:39:37 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3149626975887022, Global best: 0.3149626975887022, Runtime: 13.06002 seconds\n", + "2023/10/15 02:39:50 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3149626975887022, Global best: 0.3149626975887022, Runtime: 13.02021 seconds\n", + "2023/10/15 02:40:03 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3076926000557467, Global best: 0.3076926000557467, Runtime: 13.28645 seconds\n", + "2023/10/15 02:40:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3006187312219155, Global best: 0.3006187312219155, Runtime: 13.44292 seconds\n", + "2023/10/15 02:40:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3006187312219155, Global best: 0.3006187312219155, Runtime: 13.49504 seconds\n", + "2023/10/15 02:40:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3149744823802537, Global best: 0.3006187312219155, Runtime: 14.93385 seconds\n", + "2023/10/15 02:40:59 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3149744823802537, Global best: 0.3006187312219155, Runtime: 13.92877 seconds\n", + "2023/10/15 02:41:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.31578624428944935, Global best: 0.3006187312219155, Runtime: 14.17878 seconds\n", + "2023/10/15 02:41:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.31578624428944935, Global best: 0.3006187312219155, Runtime: 13.53750 seconds\n", + "2023/10/15 02:41:41 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.31578624428944935, Global best: 0.3006187312219155, Runtime: 13.98718 seconds\n", + "2023/10/15 02:41:55 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.31146780551654063, Global best: 0.3006187312219155, Runtime: 14.15106 seconds\n", + "2023/10/15 02:42:09 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.31146780551654063, Global best: 0.3006187312219155, Runtime: 13.99700 seconds\n", + "2023/10/15 02:42:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.31146780551654063, Global best: 0.3006187312219155, Runtime: 13.46947 seconds\n", + "2023/10/15 02:42:37 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3124739573122758, Global best: 0.3006187312219155, Runtime: 14.14671 seconds\n", + "2023/10/15 02:42:51 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.30794906334413, Global best: 0.3006187312219155, Runtime: 14.02350 seconds\n", + "2023/10/15 02:43:05 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.30794906334413, Global best: 0.3006187312219155, Runtime: 14.40331 seconds\n", + "2023/10/15 02:43:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.30794906334413, Global best: 0.3006187312219155, Runtime: 13.78018 seconds\n", + "2023/10/15 02:43:32 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.30794906334413, Global best: 0.3006187312219155, Runtime: 13.28448 seconds\n", + "2023/10/15 02:43:46 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3113070371491923, Global best: 0.3006187312219155, Runtime: 14.13520 seconds\n", + "2023/10/15 02:44:00 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3113070371491923, Global best: 0.3006187312219155, Runtime: 13.72333 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.9 0.9 169\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:44:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:44:17 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.31023237172332196, Global best: 0.31023237172332196, Runtime: 6.49563 seconds\n", + "2023/10/15 02:44:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.31023237172332196, Global best: 0.31023237172332196, Runtime: 6.45674 seconds\n", + "2023/10/15 02:44:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.31023237172332196, Global best: 0.31023237172332196, Runtime: 6.49503 seconds\n", + "2023/10/15 02:44:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.31023237172332196, Global best: 0.31023237172332196, Runtime: 6.47416 seconds\n", + "2023/10/15 02:44:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.31023237172332196, Global best: 0.31023237172332196, Runtime: 6.50002 seconds\n", + "2023/10/15 02:44:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.31023237172332196, Global best: 0.31023237172332196, Runtime: 6.51547 seconds\n", + "2023/10/15 02:44:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.30964795313991217, Global best: 0.30964795313991217, Runtime: 6.48434 seconds\n", + "2023/10/15 02:45:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.30964795313991217, Global best: 0.30964795313991217, Runtime: 6.51522 seconds\n", + "2023/10/15 02:45:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.29879731350289307, Global best: 0.29879731350289307, Runtime: 6.48274 seconds\n", + "2023/10/15 02:45:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.42986 seconds\n", + "2023/10/15 02:45:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.41608 seconds\n", + "2023/10/15 02:45:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.45432 seconds\n", + "2023/10/15 02:45:35 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.47823 seconds\n", + "2023/10/15 02:45:42 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.50536 seconds\n", + "2023/10/15 02:45:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.47946 seconds\n", + "2023/10/15 02:45:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.44525 seconds\n", + "2023/10/15 02:46:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.43762 seconds\n", + "2023/10/15 02:46:08 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.94495 seconds\n", + "2023/10/15 02:46:14 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2984384321021663, Global best: 0.2984384321021663, Runtime: 6.45229 seconds\n", + "2023/10/15 02:46:21 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.29485529622020623, Global best: 0.29485529622020623, Runtime: 6.48371 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.9 0.9 155\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:46:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:46:38 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.292467796322459, Global best: 0.292467796322459, Runtime: 6.47402 seconds\n", + "2023/10/15 02:46:45 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.2863041680416184, Global best: 0.2863041680416184, Runtime: 6.47636 seconds\n", + "2023/10/15 02:46:51 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.2863041680416184, Global best: 0.2863041680416184, Runtime: 6.46402 seconds\n", + "2023/10/15 02:46:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.2819369897948794, Global best: 0.2819369897948794, Runtime: 6.51092 seconds\n", + "2023/10/15 02:47:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.27403539060522286, Global best: 0.27403539060522286, Runtime: 6.50368 seconds\n", + "2023/10/15 02:47:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.26648122803783497, Global best: 0.26648122803783497, Runtime: 6.51329 seconds\n", + "2023/10/15 02:47:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.25760409138088874, Global best: 0.25760409138088874, Runtime: 6.51124 seconds\n", + "2023/10/15 02:47:24 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.24077556305586265, Global best: 0.24077556305586265, Runtime: 6.49599 seconds\n", + "2023/10/15 02:47:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.24077556305586265, Global best: 0.24077556305586265, Runtime: 6.48866 seconds\n", + "2023/10/15 02:47:37 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.24077556305586265, Global best: 0.24077556305586265, Runtime: 6.50189 seconds\n", + "2023/10/15 02:47:43 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.24077556305586265, Global best: 0.24077556305586265, Runtime: 6.52833 seconds\n", + "2023/10/15 02:47:50 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.2388389848673464, Global best: 0.2388389848673464, Runtime: 6.54528 seconds\n", + "2023/10/15 02:47:56 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2388389848673464, Global best: 0.2388389848673464, Runtime: 6.44494 seconds\n", + "2023/10/15 02:48:03 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.23579182540918275, Global best: 0.23579182540918275, Runtime: 6.47456 seconds\n", + "2023/10/15 02:48:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.23579182540918275, Global best: 0.23579182540918275, Runtime: 6.49685 seconds\n", + "2023/10/15 02:48:16 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.23579182540918275, Global best: 0.23579182540918275, Runtime: 6.49320 seconds\n", + "2023/10/15 02:48:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.23579182540918275, Global best: 0.23579182540918275, Runtime: 6.47926 seconds\n", + "2023/10/15 02:48:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.23568016248602586, Global best: 0.23568016248602586, Runtime: 7.00125 seconds\n", + "2023/10/15 02:48:36 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.2279673878528481, Global best: 0.2279673878528481, Runtime: 6.48065 seconds\n", + "2023/10/15 02:48:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.2279673878528481, Global best: 0.2279673878528481, Runtime: 6.46801 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.95 0.9 128\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:48:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:49:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.299146506200669, Global best: 0.299146506200669, Runtime: 6.57987 seconds\n", + "2023/10/15 02:49:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.2963253123578369, Global best: 0.2963253123578369, Runtime: 6.50636 seconds\n", + "2023/10/15 02:49:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.2963253123578369, Global best: 0.2963253123578369, Runtime: 6.49777 seconds\n", + "2023/10/15 02:49:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2963253123578369, Global best: 0.2963253123578369, Runtime: 6.48452 seconds\n", + "2023/10/15 02:49:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2963253123578369, Global best: 0.2963253123578369, Runtime: 6.60463 seconds\n", + "2023/10/15 02:49:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.2796144729937967, Global best: 0.2796144729937967, Runtime: 6.54487 seconds\n", + "2023/10/15 02:49:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2796144729937967, Global best: 0.2796144729937967, Runtime: 6.49587 seconds\n", + "2023/10/15 02:49:45 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2796144729937967, Global best: 0.2796144729937967, Runtime: 6.54341 seconds\n", + "2023/10/15 02:49:52 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.27462995525218653, Global best: 0.27462995525218653, Runtime: 6.48754 seconds\n", + "2023/10/15 02:49:58 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.27462995525218653, Global best: 0.27462995525218653, Runtime: 6.52756 seconds\n", + "2023/10/15 02:50:05 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.27462995525218653, Global best: 0.27462995525218653, Runtime: 6.50108 seconds\n", + "2023/10/15 02:50:11 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.273103218853494, Global best: 0.273103218853494, Runtime: 6.49486 seconds\n", + "2023/10/15 02:50:18 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2726746371056648, Global best: 0.2726746371056648, Runtime: 6.50485 seconds\n", + "2023/10/15 02:50:24 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2726746371056648, Global best: 0.2726746371056648, Runtime: 6.48159 seconds\n", + "2023/10/15 02:50:31 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2724992834475158, Global best: 0.2724992834475158, Runtime: 6.47084 seconds\n", + "2023/10/15 02:50:37 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2724992834475158, Global best: 0.2724992834475158, Runtime: 6.49400 seconds\n", + "2023/10/15 02:50:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2698001938806982, Global best: 0.2698001938806982, Runtime: 6.49193 seconds\n", + "2023/10/15 02:50:50 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2685189000012932, Global best: 0.2685189000012932, Runtime: 6.53748 seconds\n", + "2023/10/15 02:50:57 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2662318408529622, Global best: 0.2662318408529622, Runtime: 6.53655 seconds\n", + "2023/10/15 02:51:03 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2650062206540886, Global best: 0.2650062206540886, Runtime: 6.48921 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.9 0.85 141\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 468 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 250 / Rejected: 218\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 250 / Rejected: 218\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 250 / Rejected: 218\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 250 / Rejected: 218\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 250 / Rejected: 218\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 250 / Rejected: 218\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 250 / Rejected: 218\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 250 / Rejected: 218\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 241 / Rejected: 227\n", + "Round 26 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 27 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 28 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 29 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 30 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 31 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 32 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 33 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 34 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 35 / Tentative (Accepted): 128 / Tentative (Not Accepted): 113 / Rejected: 227\n", + "Round 36 / Tentative (Accepted): 135 / Tentative (Not Accepted): 105 / Rejected: 228\n", + "Round 37 / Tentative (Accepted): 135 / Tentative (Not Accepted): 105 / Rejected: 228\n", + "Round 38 / Tentative (Accepted): 135 / Tentative (Not Accepted): 105 / Rejected: 228\n", + "Round 39 / Tentative (Accepted): 135 / Tentative (Not Accepted): 105 / Rejected: 228\n", + "Round 40 / Tentative (Accepted): 135 / Tentative (Not Accepted): 104 / Rejected: 229\n", + "Final Feature Set Contains 259 Features.\n", + "Control (Positive) 0.8333333333333333 1.0 938\n", + "Control (Negative) 0.5166666666666666 0.5333333333333333 938\n", + "ANOVA Base 0.8333333333333333 1.0 265\n", + "Mutual Information (10) Base 0.7833333333333333 0.6833333333333333 10\n", + "RFE (10) Base 0.8666666666666667 0.6 10\n", + "MultiSURF (10) 0.9166666666666667 1.0 10\n", + "Mutual Information (20) Base 0.7833333333333333 0.65 20\n", + "RFE (20) Base 0.9166666666666667 1.0 20\n", + "MultiSURF (20) 0.9166666666666667 1.0 20\n", + "Mutual Information (40) Base 0.8333333333333333 0.9166666666666667 40\n", + "RFE (40) Base 0.9166666666666667 0.9166666666666667 40\n", + "MultiSURF (40) 1.0 1.0 40\n", + "Mutual Information (60) Base 0.8333333333333333 1.0 60\n", + "RFE (60) Base 0.9166666666666667 0.9166666666666667 60\n", + "MultiSURF (60) 0.9166666666666667 1.0 60\n", + "Mutual Information (80) Base 0.7833333333333333 1.0 80\n", + "RFE (80) Base 0.9166666666666667 1.0 80\n", + "MultiSURF (80) 0.9166666666666667 1.0 80\n", + "Mutual Information (100) Base 0.8333333333333333 0.9166666666666667 100\n", + "RFE (100) Base 0.9166666666666667 1.0 100\n", + "MultiSURF (100) 0.8333333333333333 1.0 100\n", + "RFECV Base 0.8333333333333333 1.0 846\n", + "Boruta Base 0.8333333333333333 1.0 46\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 02:59:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 02:59:56 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.31982193426264655, Global best: 0.31982193426264655, Runtime: 13.84295 seconds\n", + "2023/10/15 03:00:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.31982193426264655, Global best: 0.31982193426264655, Runtime: 13.38576 seconds\n", + "2023/10/15 03:00:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.31982193426264655, Global best: 0.31982193426264655, Runtime: 13.90056 seconds\n", + "2023/10/15 03:00:38 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.31964254123052016, Global best: 0.31964254123052016, Runtime: 14.74939 seconds\n", + "2023/10/15 03:00:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.31964254123052016, Global best: 0.31964254123052016, Runtime: 15.20298 seconds\n", + "2023/10/15 03:01:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.31964254123052016, Global best: 0.31964254123052016, Runtime: 13.88752 seconds\n", + "2023/10/15 03:01:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.31964254123052016, Global best: 0.31964254123052016, Runtime: 14.51702 seconds\n", + "2023/10/15 03:01:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3275112631603986, Global best: 0.31964254123052016, Runtime: 14.04099 seconds\n", + "2023/10/15 03:01:51 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.32419593033882177, Global best: 0.31964254123052016, Runtime: 14.61189 seconds\n", + "2023/10/15 03:02:05 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.32419593033882177, Global best: 0.31964254123052016, Runtime: 14.49818 seconds\n", + "2023/10/15 03:02:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.32419593033882177, Global best: 0.31964254123052016, Runtime: 14.24629 seconds\n", + "2023/10/15 03:02:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.32419593033882177, Global best: 0.31964254123052016, Runtime: 14.87323 seconds\n", + "2023/10/15 03:02:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3275986613117523, Global best: 0.31964254123052016, Runtime: 14.31045 seconds\n", + "2023/10/15 03:03:03 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3275986613117523, Global best: 0.31964254123052016, Runtime: 14.07335 seconds\n", + "2023/10/15 03:03:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3275986613117523, Global best: 0.31964254123052016, Runtime: 13.85371 seconds\n", + "2023/10/15 03:03:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.32220609299315184, Global best: 0.31964254123052016, Runtime: 14.88926 seconds\n", + "2023/10/15 03:03:46 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.32220609299315184, Global best: 0.31964254123052016, Runtime: 14.59606 seconds\n", + "2023/10/15 03:04:00 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.32220609299315184, Global best: 0.31964254123052016, Runtime: 14.10041 seconds\n", + "2023/10/15 03:04:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3315963827412377, Global best: 0.31964254123052016, Runtime: 15.18496 seconds\n", + "2023/10/15 03:04:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.32498285570917956, Global best: 0.31964254123052016, Runtime: 14.48257 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.8333333333333333 1.0 547\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:04:34 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:04:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3230423820110281, Global best: 0.3230423820110281, Runtime: 6.82001 seconds\n", + "2023/10/15 03:04:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3169828338771523, Global best: 0.3169828338771523, Runtime: 6.77965 seconds\n", + "2023/10/15 03:05:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3169828338771523, Global best: 0.3169828338771523, Runtime: 6.72987 seconds\n", + "2023/10/15 03:05:08 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3169828338771523, Global best: 0.3169828338771523, Runtime: 6.78655 seconds\n", + "2023/10/15 03:05:15 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3153378923751486, Global best: 0.3153378923751486, Runtime: 6.76529 seconds\n", + "2023/10/15 03:05:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3153378923751486, Global best: 0.3153378923751486, Runtime: 6.80034 seconds\n", + "2023/10/15 03:05:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3153378923751486, Global best: 0.3153378923751486, Runtime: 6.78866 seconds\n", + "2023/10/15 03:05:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3153378923751486, Global best: 0.3153378923751486, Runtime: 7.23335 seconds\n", + "2023/10/15 03:05:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3153378923751486, Global best: 0.3153378923751486, Runtime: 6.72423 seconds\n", + "2023/10/15 03:05:49 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3153378923751486, Global best: 0.3153378923751486, Runtime: 6.75456 seconds\n", + "2023/10/15 03:05:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.75723 seconds\n", + "2023/10/15 03:06:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.74663 seconds\n", + "2023/10/15 03:06:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.74663 seconds\n", + "2023/10/15 03:06:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.72194 seconds\n", + "2023/10/15 03:06:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.72380 seconds\n", + "2023/10/15 03:06:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.75611 seconds\n", + "2023/10/15 03:06:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.69876 seconds\n", + "2023/10/15 03:06:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.71456 seconds\n", + "2023/10/15 03:06:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.81417 seconds\n", + "2023/10/15 03:06:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3103630129467912, Global best: 0.3103630129467912, Runtime: 6.78516 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.8333333333333333 1.0 531\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:07:01 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:07:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.71940 seconds\n", + "2023/10/15 03:07:21 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.75810 seconds\n", + "2023/10/15 03:07:28 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.74321 seconds\n", + "2023/10/15 03:07:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.70765 seconds\n", + "2023/10/15 03:07:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.72773 seconds\n", + "2023/10/15 03:07:48 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.70919 seconds\n", + "2023/10/15 03:07:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.73898 seconds\n", + "2023/10/15 03:08:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.73514 seconds\n", + "2023/10/15 03:08:08 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.72307 seconds\n", + "2023/10/15 03:08:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.69764 seconds\n", + "2023/10/15 03:08:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.76369 seconds\n", + "2023/10/15 03:08:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 7.21095 seconds\n", + "2023/10/15 03:08:36 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.76699 seconds\n", + "2023/10/15 03:08:43 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.72189 seconds\n", + "2023/10/15 03:08:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.75971 seconds\n", + "2023/10/15 03:08:56 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.72172 seconds\n", + "2023/10/15 03:09:03 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.77479 seconds\n", + "2023/10/15 03:09:10 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.74591 seconds\n", + "2023/10/15 03:09:16 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.73539 seconds\n", + "2023/10/15 03:09:23 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3254995749185787, Global best: 0.3254995749185787, Runtime: 6.76993 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.8333333333333333 1.0 561\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:09:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:09:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.31666936645822924, Global best: 0.31666936645822924, Runtime: 6.75062 seconds\n", + "2023/10/15 03:09:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3118703540927045, Global best: 0.3118703540927045, Runtime: 6.76340 seconds\n", + "2023/10/15 03:09:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.30649929225473926, Global best: 0.30649929225473926, Runtime: 6.68655 seconds\n", + "2023/10/15 03:10:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.30649929225473926, Global best: 0.30649929225473926, Runtime: 6.69176 seconds\n", + "2023/10/15 03:10:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3034929096483284, Global best: 0.3034929096483284, Runtime: 6.75549 seconds\n", + "2023/10/15 03:10:15 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.30243881950301343, Global best: 0.30243881950301343, Runtime: 6.71395 seconds\n", + "2023/10/15 03:10:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.30243881950301343, Global best: 0.30243881950301343, Runtime: 6.70807 seconds\n", + "2023/10/15 03:10:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.29661929632046896, Global best: 0.29661929632046896, Runtime: 6.73274 seconds\n", + "2023/10/15 03:10:35 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.29661929632046896, Global best: 0.29661929632046896, Runtime: 6.68621 seconds\n", + "2023/10/15 03:10:42 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2954797603803883, Global best: 0.2954797603803883, Runtime: 6.77829 seconds\n", + "2023/10/15 03:10:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.295476463175488, Global best: 0.295476463175488, Runtime: 6.71988 seconds\n", + "2023/10/15 03:10:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2934821016843424, Global best: 0.2934821016843424, Runtime: 6.70928 seconds\n", + "2023/10/15 03:11:02 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2934821016843424, Global best: 0.2934821016843424, Runtime: 6.67323 seconds\n", + "2023/10/15 03:11:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2906874081981926, Global best: 0.2906874081981926, Runtime: 6.68673 seconds\n", + "2023/10/15 03:11:15 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2906874081981926, Global best: 0.2906874081981926, Runtime: 6.66807 seconds\n", + "2023/10/15 03:11:22 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2881733989864054, Global best: 0.2881733989864054, Runtime: 6.71195 seconds\n", + "2023/10/15 03:11:29 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.28735301664277524, Global best: 0.28735301664277524, Runtime: 6.68566 seconds\n", + "2023/10/15 03:11:35 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.28735301664277524, Global best: 0.28735301664277524, Runtime: 6.65827 seconds\n", + "2023/10/15 03:11:42 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2873107475625787, Global best: 0.2873107475625787, Runtime: 6.68738 seconds\n", + "2023/10/15 03:11:49 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2871605555778543, Global best: 0.2871605555778543, Runtime: 6.66348 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.8333333333333333 1.0 470\n", + "Triglav Stage 1 Base 0.8333333333333333 1.0 259\n", + "Triglav MultiSURF 10 0.8166666666666667 0.6666666666666666 10\n", + "Triglav MultiSURF 20 0.7833333333333333 0.7833333333333333 20\n", + "Triglav MultiSURF 40 0.9166666666666667 0.9166666666666667 40\n", + "Triglav MultiSURF 60 1.0 1.0 60\n", + "Triglav MultiSURF 80 0.9166666666666667 1.0 80\n", + "Triglav MultiSURF 100 0.9166666666666667 1.0 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:12:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:12:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3135792870998607, Global best: 0.3135792870998607, Runtime: 13.57839 seconds\n", + "2023/10/15 03:12:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3135792870998607, Global best: 0.3135792870998607, Runtime: 13.02067 seconds\n", + "2023/10/15 03:13:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3135792870998607, Global best: 0.3135792870998607, Runtime: 13.27380 seconds\n", + "2023/10/15 03:13:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3135792870998607, Global best: 0.3135792870998607, Runtime: 13.58255 seconds\n", + "2023/10/15 03:13:29 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3095031465150052, Global best: 0.3095031465150052, Runtime: 14.20666 seconds\n", + "2023/10/15 03:13:44 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3095031465150052, Global best: 0.3095031465150052, Runtime: 14.53072 seconds\n", + "2023/10/15 03:13:58 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3095031465150052, Global best: 0.3095031465150052, Runtime: 14.08301 seconds\n", + "2023/10/15 03:14:11 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3095031465150052, Global best: 0.3095031465150052, Runtime: 13.43918 seconds\n", + "2023/10/15 03:14:26 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.31325853585366675, Global best: 0.3095031465150052, Runtime: 14.45358 seconds\n", + "2023/10/15 03:14:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.31325853585366675, Global best: 0.3095031465150052, Runtime: 13.60172 seconds\n", + "2023/10/15 03:14:53 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.31325853585366675, Global best: 0.3095031465150052, Runtime: 13.57983 seconds\n", + "2023/10/15 03:15:07 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3078750290134136, Global best: 0.3078750290134136, Runtime: 14.13548 seconds\n", + "2023/10/15 03:15:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3078750290134136, Global best: 0.3078750290134136, Runtime: 13.61626 seconds\n", + "2023/10/15 03:15:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3078750290134136, Global best: 0.3078750290134136, Runtime: 13.91997 seconds\n", + "2023/10/15 03:15:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3126363864191698, Global best: 0.3078750290134136, Runtime: 14.24841 seconds\n", + "2023/10/15 03:16:03 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3187396440071596, Global best: 0.3078750290134136, Runtime: 13.68928 seconds\n", + "2023/10/15 03:16:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3187396440071596, Global best: 0.3078750290134136, Runtime: 14.10683 seconds\n", + "2023/10/15 03:16:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3187396440071596, Global best: 0.3078750290134136, Runtime: 13.68000 seconds\n", + "2023/10/15 03:16:44 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3220412946259603, Global best: 0.3078750290134136, Runtime: 13.65226 seconds\n", + "2023/10/15 03:16:58 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.32437593903155426, Global best: 0.3078750290134136, Runtime: 13.57861 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.9166666666666667 1.0 130\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:17:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:17:15 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.31887937659115534, Global best: 0.31887937659115534, Runtime: 6.50272 seconds\n", + "2023/10/15 03:17:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.31887937659115534, Global best: 0.31887937659115534, Runtime: 6.48180 seconds\n", + "2023/10/15 03:17:28 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.31887937659115534, Global best: 0.31887937659115534, Runtime: 6.49640 seconds\n", + "2023/10/15 03:17:35 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.31887937659115534, Global best: 0.31887937659115534, Runtime: 6.49309 seconds\n", + "2023/10/15 03:17:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.31887937659115534, Global best: 0.31887937659115534, Runtime: 6.46535 seconds\n", + "2023/10/15 03:17:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.31887937659115534, Global best: 0.31887937659115534, Runtime: 6.47437 seconds\n", + "2023/10/15 03:17:54 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.31887937659115534, Global best: 0.31887937659115534, Runtime: 6.51607 seconds\n", + "2023/10/15 03:18:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.31887937659115534, Global best: 0.31887937659115534, Runtime: 6.94086 seconds\n", + "2023/10/15 03:18:07 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.31887937659115534, Global best: 0.31887937659115534, Runtime: 6.43609 seconds\n", + "2023/10/15 03:18:14 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.50000 seconds\n", + "2023/10/15 03:18:20 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.43754 seconds\n", + "2023/10/15 03:18:27 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.54062 seconds\n", + "2023/10/15 03:18:33 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.52626 seconds\n", + "2023/10/15 03:18:40 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.45968 seconds\n", + "2023/10/15 03:18:46 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.44040 seconds\n", + "2023/10/15 03:18:53 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.49427 seconds\n", + "2023/10/15 03:18:59 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.51171 seconds\n", + "2023/10/15 03:19:06 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.52200 seconds\n", + "2023/10/15 03:19:12 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.49678 seconds\n", + "2023/10/15 03:19:19 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2984936685084965, Global best: 0.2984936685084965, Runtime: 6.45256 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.8333333333333333 1.0 130\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:19:23 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:19:36 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.29903790991432405, Global best: 0.29903790991432405, Runtime: 6.43269 seconds\n", + "2023/10/15 03:19:43 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.29903790991432405, Global best: 0.29903790991432405, Runtime: 6.49265 seconds\n", + "2023/10/15 03:19:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.29903790991432405, Global best: 0.29903790991432405, Runtime: 6.54471 seconds\n", + "2023/10/15 03:19:56 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.29903790991432405, Global best: 0.29903790991432405, Runtime: 6.46870 seconds\n", + "2023/10/15 03:20:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.28741773827988587, Global best: 0.28741773827988587, Runtime: 6.50262 seconds\n", + "2023/10/15 03:20:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.2794909001993505, Global best: 0.2794909001993505, Runtime: 6.48997 seconds\n", + "2023/10/15 03:20:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.269105034940623, Global best: 0.269105034940623, Runtime: 6.44980 seconds\n", + "2023/10/15 03:20:21 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.269105034940623, Global best: 0.269105034940623, Runtime: 6.47129 seconds\n", + "2023/10/15 03:20:28 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.26351940325724404, Global best: 0.26351940325724404, Runtime: 6.51455 seconds\n", + "2023/10/15 03:20:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2617756627691513, Global best: 0.2617756627691513, Runtime: 6.50125 seconds\n", + "2023/10/15 03:20:41 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.25989271307009265, Global best: 0.25989271307009265, Runtime: 6.44983 seconds\n", + "2023/10/15 03:20:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.25907595384179183, Global best: 0.25907595384179183, Runtime: 6.52764 seconds\n", + "2023/10/15 03:20:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.25907595384179183, Global best: 0.25907595384179183, Runtime: 6.47860 seconds\n", + "2023/10/15 03:21:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2580973606087553, Global best: 0.2580973606087553, Runtime: 6.49494 seconds\n", + "2023/10/15 03:21:07 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.2580973606087553, Global best: 0.2580973606087553, Runtime: 6.48680 seconds\n", + "2023/10/15 03:21:14 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2543242942506613, Global best: 0.2543242942506613, Runtime: 6.98136 seconds\n", + "2023/10/15 03:21:20 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2543242942506613, Global best: 0.2543242942506613, Runtime: 6.49422 seconds\n", + "2023/10/15 03:21:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.25362079721646325, Global best: 0.25362079721646325, Runtime: 6.44574 seconds\n", + "2023/10/15 03:21:33 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.25065673420732676, Global best: 0.25065673420732676, Runtime: 6.46977 seconds\n", + "2023/10/15 03:21:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.25065673420732676, Global best: 0.25065673420732676, Runtime: 6.50218 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.8333333333333333 0.8333333333333333 111\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:21:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:21:57 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.30329011195838207, Global best: 0.30329011195838207, Runtime: 6.52806 seconds\n", + "2023/10/15 03:22:04 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.51132 seconds\n", + "2023/10/15 03:22:10 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.52307 seconds\n", + "2023/10/15 03:22:17 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.48239 seconds\n", + "2023/10/15 03:22:23 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.48618 seconds\n", + "2023/10/15 03:22:30 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.49411 seconds\n", + "2023/10/15 03:22:36 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.43623 seconds\n", + "2023/10/15 03:22:43 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.51206 seconds\n", + "2023/10/15 03:22:49 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.45045 seconds\n", + "2023/10/15 03:22:56 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.49442 seconds\n", + "2023/10/15 03:23:02 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.28664628171134754, Global best: 0.28664628171134754, Runtime: 6.47061 seconds\n", + "2023/10/15 03:23:09 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.27889507535554436, Global best: 0.27889507535554436, Runtime: 6.46168 seconds\n", + "2023/10/15 03:23:15 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.27889507535554436, Global best: 0.27889507535554436, Runtime: 6.48734 seconds\n", + "2023/10/15 03:23:22 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.27889507535554436, Global best: 0.27889507535554436, Runtime: 6.49940 seconds\n", + "2023/10/15 03:23:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.27889507535554436, Global best: 0.27889507535554436, Runtime: 6.49022 seconds\n", + "2023/10/15 03:23:35 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.27889507535554436, Global best: 0.27889507535554436, Runtime: 6.51301 seconds\n", + "2023/10/15 03:23:42 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.27889507535554436, Global best: 0.27889507535554436, Runtime: 6.96406 seconds\n", + "2023/10/15 03:23:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.27889507535554436, Global best: 0.27889507535554436, Runtime: 6.47109 seconds\n", + "2023/10/15 03:23:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.27889507535554436, Global best: 0.27889507535554436, Runtime: 6.49965 seconds\n", + "2023/10/15 03:24:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.27889507535554436, Global best: 0.27889507535554436, Runtime: 6.51318 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.75 1.0 129\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 447 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 228\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 228\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 228\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 228\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 228\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 228\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 228\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 228\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 228\n", + "Round 26 / Tentative (Accepted): 123 / Tentative (Not Accepted): 96 / Rejected: 228\n", + "Round 27 / Tentative (Accepted): 123 / Tentative (Not Accepted): 96 / Rejected: 228\n", + "Round 28 / Tentative (Accepted): 123 / Tentative (Not Accepted): 96 / Rejected: 228\n", + "Round 29 / Tentative (Accepted): 123 / Tentative (Not Accepted): 96 / Rejected: 228\n", + "Round 30 / Tentative (Accepted): 123 / Tentative (Not Accepted): 92 / Rejected: 232\n", + "Round 31 / Tentative (Accepted): 123 / Tentative (Not Accepted): 92 / Rejected: 232\n", + "Round 32 / Tentative (Accepted): 123 / Tentative (Not Accepted): 92 / Rejected: 232\n", + "Round 33 / Tentative (Accepted): 123 / Tentative (Not Accepted): 92 / Rejected: 232\n", + "Round 34 / Tentative (Accepted): 123 / Tentative (Not Accepted): 92 / Rejected: 232\n", + "Round 35 / Tentative (Accepted): 123 / Tentative (Not Accepted): 92 / Rejected: 232\n", + "Round 36 / Tentative (Accepted): 130 / Tentative (Not Accepted): 85 / Rejected: 232\n", + "Round 37 / Tentative (Accepted): 130 / Tentative (Not Accepted): 85 / Rejected: 232\n", + "Round 38 / Tentative (Accepted): 130 / Tentative (Not Accepted): 85 / Rejected: 232\n", + "Round 39 / Tentative (Accepted): 130 / Tentative (Not Accepted): 85 / Rejected: 232\n", + "Round 40 / Tentative (Accepted): 130 / Tentative (Not Accepted): 85 / Rejected: 232\n", + "Final Feature Set Contains 253 Features.\n", + "Control (Positive) 0.875 0.875 938\n", + "Control (Negative) 0.625 0.5 938\n", + "ANOVA Base 0.875 0.875 238\n", + "Mutual Information (10) Base 0.875 0.625 10\n", + "RFE (10) Base 0.875 0.875 10\n", + "MultiSURF (10) 0.875 0.875 10\n", + "Mutual Information (20) Base 0.875 0.875 20\n", + "RFE (20) Base 0.875 0.875 20\n", + "MultiSURF (20) 0.875 0.875 20\n", + "Mutual Information (40) Base 0.875 0.9375 40\n", + "RFE (40) Base 0.875 0.875 40\n", + "MultiSURF (40) 0.875 0.875 40\n", + "Mutual Information (60) Base 0.875 0.875 60\n", + "RFE (60) Base 0.875 0.875 60\n", + "MultiSURF (60) 0.875 0.875 60\n", + "Mutual Information (80) Base 0.875 0.875 80\n", + "RFE (80) Base 0.875 0.875 80\n", + "MultiSURF (80) 0.875 0.875 80\n", + "Mutual Information (100) Base 0.875 0.875 100\n", + "RFE (100) Base 0.875 0.875 100\n", + "MultiSURF (100) 0.875 0.875 100\n", + "RFECV Base 0.875 0.875 110\n", + "Boruta Base 0.875 0.875 50\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:32:46 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:33:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3184849575718822, Global best: 0.3184849575718822, Runtime: 13.34673 seconds\n", + "2023/10/15 03:33:20 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3184849575718822, Global best: 0.3184849575718822, Runtime: 13.37160 seconds\n", + "2023/10/15 03:33:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3184849575718822, Global best: 0.3184849575718822, Runtime: 13.61062 seconds\n", + "2023/10/15 03:33:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3289819762960953, Global best: 0.3184849575718822, Runtime: 14.43351 seconds\n", + "2023/10/15 03:34:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3289819762960953, Global best: 0.3184849575718822, Runtime: 14.18392 seconds\n", + "2023/10/15 03:34:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3289819762960953, Global best: 0.3184849575718822, Runtime: 13.54424 seconds\n", + "2023/10/15 03:34:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3289819762960953, Global best: 0.3184849575718822, Runtime: 14.28201 seconds\n", + "2023/10/15 03:34:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3329422610429806, Global best: 0.3184849575718822, Runtime: 14.73421 seconds\n", + "2023/10/15 03:35:00 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3329422610429806, Global best: 0.3184849575718822, Runtime: 14.90582 seconds\n", + "2023/10/15 03:35:14 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.32190215081445994, Global best: 0.3184849575718822, Runtime: 13.98101 seconds\n", + "2023/10/15 03:35:28 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.317459307247865, Global best: 0.317459307247865, Runtime: 14.44813 seconds\n", + "2023/10/15 03:35:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3153681497548342, Global best: 0.3153681497548342, Runtime: 14.26104 seconds\n", + "2023/10/15 03:35:56 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3153681497548342, Global best: 0.3153681497548342, Runtime: 14.21344 seconds\n", + "2023/10/15 03:36:11 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3153681497548342, Global best: 0.3153681497548342, Runtime: 14.05225 seconds\n", + "2023/10/15 03:36:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3249092589860784, Global best: 0.3153681497548342, Runtime: 14.01168 seconds\n", + "2023/10/15 03:36:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3272950420782409, Global best: 0.3153681497548342, Runtime: 14.52106 seconds\n", + "2023/10/15 03:36:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.339215417529046, Global best: 0.3153681497548342, Runtime: 14.52589 seconds\n", + "2023/10/15 03:37:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3380605540584543, Global best: 0.3153681497548342, Runtime: 14.30072 seconds\n", + "2023/10/15 03:37:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3380605540584543, Global best: 0.3153681497548342, Runtime: 14.17797 seconds\n", + "2023/10/15 03:37:37 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3380605540584543, Global best: 0.3153681497548342, Runtime: 15.08066 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.875 0.875 563\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:37:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:37:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.31743488544291776, Global best: 0.31743488544291776, Runtime: 6.74122 seconds\n", + "2023/10/15 03:38:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.31743488544291776, Global best: 0.31743488544291776, Runtime: 6.72245 seconds\n", + "2023/10/15 03:38:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.31743488544291776, Global best: 0.31743488544291776, Runtime: 6.76841 seconds\n", + "2023/10/15 03:38:15 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.31743488544291776, Global best: 0.31743488544291776, Runtime: 6.72110 seconds\n", + "2023/10/15 03:38:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.31743488544291776, Global best: 0.31743488544291776, Runtime: 6.71603 seconds\n", + "2023/10/15 03:38:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.31743488544291776, Global best: 0.31743488544291776, Runtime: 6.76120 seconds\n", + "2023/10/15 03:38:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.31743488544291776, Global best: 0.31743488544291776, Runtime: 6.73919 seconds\n", + "2023/10/15 03:38:42 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.31743488544291776, Global best: 0.31743488544291776, Runtime: 6.67095 seconds\n", + "2023/10/15 03:38:49 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.31743488544291776, Global best: 0.31743488544291776, Runtime: 6.76779 seconds\n", + "2023/10/15 03:38:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.30496419945845, Global best: 0.30496419945845, Runtime: 6.73879 seconds\n", + "2023/10/15 03:39:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.30496419945845, Global best: 0.30496419945845, Runtime: 6.73843 seconds\n", + "2023/10/15 03:39:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.30496419945845, Global best: 0.30496419945845, Runtime: 6.71738 seconds\n", + "2023/10/15 03:39:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.30496419945845, Global best: 0.30496419945845, Runtime: 6.74970 seconds\n", + "2023/10/15 03:39:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.30496419945845, Global best: 0.30496419945845, Runtime: 6.66505 seconds\n", + "2023/10/15 03:39:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.30496419945845, Global best: 0.30496419945845, Runtime: 6.69784 seconds\n", + "2023/10/15 03:39:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.30496419945845, Global best: 0.30496419945845, Runtime: 6.69359 seconds\n", + "2023/10/15 03:39:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.30496419945845, Global best: 0.30496419945845, Runtime: 6.67760 seconds\n", + "2023/10/15 03:39:49 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.30496419945845, Global best: 0.30496419945845, Runtime: 6.77600 seconds\n", + "2023/10/15 03:39:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.29890519218138817, Global best: 0.29890519218138817, Runtime: 6.69825 seconds\n", + "2023/10/15 03:40:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.29890519218138817, Global best: 0.29890519218138817, Runtime: 6.72063 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.875 0.875 522\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:40:07 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:40:21 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3225030355012223, Global best: 0.3225030355012223, Runtime: 6.71775 seconds\n", + "2023/10/15 03:40:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3225030355012223, Global best: 0.3225030355012223, Runtime: 6.69271 seconds\n", + "2023/10/15 03:40:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3225030355012223, Global best: 0.3225030355012223, Runtime: 6.75838 seconds\n", + "2023/10/15 03:40:41 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3225030355012223, Global best: 0.3225030355012223, Runtime: 6.74899 seconds\n", + "2023/10/15 03:40:48 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.75620 seconds\n", + "2023/10/15 03:40:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.71928 seconds\n", + "2023/10/15 03:41:01 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.72462 seconds\n", + "2023/10/15 03:41:08 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.73806 seconds\n", + "2023/10/15 03:41:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 7.24748 seconds\n", + "2023/10/15 03:41:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.71716 seconds\n", + "2023/10/15 03:41:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.68718 seconds\n", + "2023/10/15 03:41:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.67565 seconds\n", + "2023/10/15 03:41:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.74033 seconds\n", + "2023/10/15 03:41:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.71153 seconds\n", + "2023/10/15 03:41:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.75805 seconds\n", + "2023/10/15 03:42:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.72114 seconds\n", + "2023/10/15 03:42:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.68829 seconds\n", + "2023/10/15 03:42:16 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.71534 seconds\n", + "2023/10/15 03:42:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3140012390209338, Global best: 0.3140012390209338, Runtime: 6.74154 seconds\n", + "2023/10/15 03:42:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.31396871265878346, Global best: 0.31396871265878346, Runtime: 6.71837 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.875 0.875 559\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:42:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:42:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3223867710913809, Global best: 0.3223867710913809, Runtime: 6.66328 seconds\n", + "2023/10/15 03:42:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3193902635048609, Global best: 0.3193902635048609, Runtime: 6.70228 seconds\n", + "2023/10/15 03:43:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3193902635048609, Global best: 0.3193902635048609, Runtime: 6.69006 seconds\n", + "2023/10/15 03:43:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.31146581220351754, Global best: 0.31146581220351754, Runtime: 6.67843 seconds\n", + "2023/10/15 03:43:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.31146581220351754, Global best: 0.31146581220351754, Runtime: 6.64700 seconds\n", + "2023/10/15 03:43:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.31146581220351754, Global best: 0.31146581220351754, Runtime: 6.64806 seconds\n", + "2023/10/15 03:43:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.30055841510117803, Global best: 0.30055841510117803, Runtime: 7.02895 seconds\n", + "2023/10/15 03:43:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.30055841510117803, Global best: 0.30055841510117803, Runtime: 7.00855 seconds\n", + "2023/10/15 03:43:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2988477757513885, Global best: 0.2988477757513885, Runtime: 6.70435 seconds\n", + "2023/10/15 03:43:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2964719112864678, Global best: 0.2964719112864678, Runtime: 6.81881 seconds\n", + "2023/10/15 03:43:56 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2964719112864678, Global best: 0.2964719112864678, Runtime: 7.86466 seconds\n", + "2023/10/15 03:44:03 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2964719112864678, Global best: 0.2964719112864678, Runtime: 6.89539 seconds\n", + "2023/10/15 03:44:09 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2964719112864678, Global best: 0.2964719112864678, Runtime: 6.81666 seconds\n", + "2023/10/15 03:44:16 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2964719112864678, Global best: 0.2964719112864678, Runtime: 6.67604 seconds\n", + "2023/10/15 03:44:23 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.29430807944678194, Global best: 0.29430807944678194, Runtime: 6.65849 seconds\n", + "2023/10/15 03:44:29 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2915682938024802, Global best: 0.2915682938024802, Runtime: 6.63953 seconds\n", + "2023/10/15 03:44:36 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2915682938024802, Global best: 0.2915682938024802, Runtime: 6.60598 seconds\n", + "2023/10/15 03:44:43 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2895089530272666, Global best: 0.2895089530272666, Runtime: 6.67644 seconds\n", + "2023/10/15 03:44:49 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2895089530272666, Global best: 0.2895089530272666, Runtime: 6.63548 seconds\n", + "2023/10/15 03:44:56 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2895089530272666, Global best: 0.2895089530272666, Runtime: 6.64905 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.875 0.875 525\n", + "Triglav Stage 1 Base 0.875 0.875 253\n", + "Triglav MultiSURF 10 0.875 0.875 10\n", + "Triglav MultiSURF 20 0.875 0.875 20\n", + "Triglav MultiSURF 40 0.875 0.875 40\n", + "Triglav MultiSURF 60 0.875 0.875 60\n", + "Triglav MultiSURF 80 0.875 0.875 80\n", + "Triglav MultiSURF 100 0.875 0.8125 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:45:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:45:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.2834108358513782, Global best: 0.2834108358513782, Runtime: 13.55518 seconds\n", + "2023/10/15 03:45:56 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.2834108358513782, Global best: 0.2834108358513782, Runtime: 13.04970 seconds\n", + "2023/10/15 03:46:09 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.30036737346074693, Global best: 0.2834108358513782, Runtime: 13.38809 seconds\n", + "2023/10/15 03:46:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.30036737346074693, Global best: 0.2834108358513782, Runtime: 13.40836 seconds\n", + "2023/10/15 03:46:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.30036737346074693, Global best: 0.2834108358513782, Runtime: 13.19775 seconds\n", + "2023/10/15 03:46:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.30097789982193957, Global best: 0.2834108358513782, Runtime: 13.81529 seconds\n", + "2023/10/15 03:47:03 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.29743520944185564, Global best: 0.2834108358513782, Runtime: 13.65229 seconds\n", + "2023/10/15 03:47:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.2964472782014937, Global best: 0.2834108358513782, Runtime: 13.43895 seconds\n", + "2023/10/15 03:47:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.2964472782014937, Global best: 0.2834108358513782, Runtime: 14.52653 seconds\n", + "2023/10/15 03:47:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.29499532091709707, Global best: 0.2834108358513782, Runtime: 14.27353 seconds\n", + "2023/10/15 03:47:58 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.29499532091709707, Global best: 0.2834108358513782, Runtime: 12.93123 seconds\n", + "2023/10/15 03:48:12 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.29499532091709707, Global best: 0.2834108358513782, Runtime: 13.45222 seconds\n", + "2023/10/15 03:48:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.29523244913031427, Global best: 0.2834108358513782, Runtime: 13.79834 seconds\n", + "2023/10/15 03:48:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.2983720006652262, Global best: 0.2834108358513782, Runtime: 13.86918 seconds\n", + "2023/10/15 03:48:53 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.30589438724717144, Global best: 0.2834108358513782, Runtime: 14.10082 seconds\n", + "2023/10/15 03:49:07 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.30589438724717144, Global best: 0.2834108358513782, Runtime: 13.44407 seconds\n", + "2023/10/15 03:49:20 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.2935491819941478, Global best: 0.2834108358513782, Runtime: 13.39425 seconds\n", + "2023/10/15 03:49:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.2935491819941478, Global best: 0.2834108358513782, Runtime: 13.68214 seconds\n", + "2023/10/15 03:49:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.28517329409769465, Global best: 0.2834108358513782, Runtime: 13.83817 seconds\n", + "2023/10/15 03:50:01 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.28517329409769465, Global best: 0.2834108358513782, Runtime: 13.55414 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.875 0.875 135\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:50:05 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:50:19 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.30368423593585, Global best: 0.30368423593585, Runtime: 6.46013 seconds\n", + "2023/10/15 03:50:25 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.30368423593585, Global best: 0.30368423593585, Runtime: 6.50224 seconds\n", + "2023/10/15 03:50:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3035845858887635, Global best: 0.3035845858887635, Runtime: 6.50584 seconds\n", + "2023/10/15 03:50:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.30026444281928344, Global best: 0.30026444281928344, Runtime: 6.48555 seconds\n", + "2023/10/15 03:50:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.29933963103502215, Global best: 0.29933963103502215, Runtime: 6.52051 seconds\n", + "2023/10/15 03:50:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.29210283330407116, Global best: 0.29210283330407116, Runtime: 6.47452 seconds\n", + "2023/10/15 03:50:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.52403 seconds\n", + "2023/10/15 03:51:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.50567 seconds\n", + "2023/10/15 03:51:11 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.53091 seconds\n", + "2023/10/15 03:51:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 7.01693 seconds\n", + "2023/10/15 03:51:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.54871 seconds\n", + "2023/10/15 03:51:31 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.46156 seconds\n", + "2023/10/15 03:51:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.46962 seconds\n", + "2023/10/15 03:51:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.49978 seconds\n", + "2023/10/15 03:51:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.50847 seconds\n", + "2023/10/15 03:51:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.48640 seconds\n", + "2023/10/15 03:52:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.51662 seconds\n", + "2023/10/15 03:52:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.52878 seconds\n", + "2023/10/15 03:52:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2858676985351042, Global best: 0.2858676985351042, Runtime: 6.49469 seconds\n", + "2023/10/15 03:52:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2813640122990358, Global best: 0.2813640122990358, Runtime: 6.49230 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.875 0.875 129\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:52:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:52:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.30523065096057367, Global best: 0.30523065096057367, Runtime: 6.57554 seconds\n", + "2023/10/15 03:52:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.2890411598096912, Global best: 0.2890411598096912, Runtime: 6.52869 seconds\n", + "2023/10/15 03:52:53 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.2890411598096912, Global best: 0.2890411598096912, Runtime: 6.45136 seconds\n", + "2023/10/15 03:53:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.2829566641299353, Global best: 0.2829566641299353, Runtime: 6.53559 seconds\n", + "2023/10/15 03:53:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.2819367840349636, Global best: 0.2819367840349636, Runtime: 6.55812 seconds\n", + "2023/10/15 03:53:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.2819367840349636, Global best: 0.2819367840349636, Runtime: 6.49227 seconds\n", + "2023/10/15 03:53:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.26989554549041034, Global best: 0.26989554549041034, Runtime: 6.57494 seconds\n", + "2023/10/15 03:53:26 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.26989554549041034, Global best: 0.26989554549041034, Runtime: 6.52592 seconds\n", + "2023/10/15 03:53:33 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2671694847527499, Global best: 0.2671694847527499, Runtime: 6.50423 seconds\n", + "2023/10/15 03:53:39 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.25291298701884746, Global best: 0.25291298701884746, Runtime: 6.47555 seconds\n", + "2023/10/15 03:53:46 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.25291298701884746, Global best: 0.25291298701884746, Runtime: 6.95621 seconds\n", + "2023/10/15 03:53:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.24366903825061823, Global best: 0.24366903825061823, Runtime: 6.49989 seconds\n", + "2023/10/15 03:53:59 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.24004019243479904, Global best: 0.24004019243479904, Runtime: 6.52581 seconds\n", + "2023/10/15 03:54:05 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.23485061360725634, Global best: 0.23485061360725634, Runtime: 6.49821 seconds\n", + "2023/10/15 03:54:12 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.23255156197437143, Global best: 0.23255156197437143, Runtime: 6.50962 seconds\n", + "2023/10/15 03:54:18 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.22802131971529693, Global best: 0.22802131971529693, Runtime: 6.45961 seconds\n", + "2023/10/15 03:54:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2239578768278226, Global best: 0.2239578768278226, Runtime: 6.48055 seconds\n", + "2023/10/15 03:54:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.223071106311009, Global best: 0.223071106311009, Runtime: 6.46401 seconds\n", + "2023/10/15 03:54:38 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.223071106311009, Global best: 0.223071106311009, Runtime: 6.51728 seconds\n", + "2023/10/15 03:54:44 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.223071106311009, Global best: 0.223071106311009, Runtime: 6.47948 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.875 0.875 101\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 03:54:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 03:55:02 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2893970571264812, Global best: 0.2893970571264812, Runtime: 6.49684 seconds\n", + "2023/10/15 03:55:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.28726172367246755, Global best: 0.28726172367246755, Runtime: 6.48091 seconds\n", + "2023/10/15 03:55:15 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.28434445409609177, Global best: 0.28434445409609177, Runtime: 6.47548 seconds\n", + "2023/10/15 03:55:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2841937642172115, Global best: 0.2841937642172115, Runtime: 6.48342 seconds\n", + "2023/10/15 03:55:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2754806491855163, Global best: 0.2754806491855163, Runtime: 6.46727 seconds\n", + "2023/10/15 03:55:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.27309217061556373, Global best: 0.27309217061556373, Runtime: 6.49225 seconds\n", + "2023/10/15 03:55:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2673158267850524, Global best: 0.2673158267850524, Runtime: 6.54310 seconds\n", + "2023/10/15 03:55:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.26490219676545024, Global best: 0.26490219676545024, Runtime: 6.51981 seconds\n", + "2023/10/15 03:55:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2521999464562812, Global best: 0.2521999464562812, Runtime: 6.46904 seconds\n", + "2023/10/15 03:56:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.25199601081284834, Global best: 0.25199601081284834, Runtime: 6.47034 seconds\n", + "2023/10/15 03:56:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.24640958783464162, Global best: 0.24640958783464162, Runtime: 6.55685 seconds\n", + "2023/10/15 03:56:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.24640958783464162, Global best: 0.24640958783464162, Runtime: 6.47318 seconds\n", + "2023/10/15 03:56:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2455709735065561, Global best: 0.2455709735065561, Runtime: 6.55818 seconds\n", + "2023/10/15 03:56:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.23935135461647647, Global best: 0.23935135461647647, Runtime: 6.48225 seconds\n", + "2023/10/15 03:56:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.23524718154425833, Global best: 0.23524718154425833, Runtime: 6.44490 seconds\n", + "2023/10/15 03:56:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.23524718154425833, Global best: 0.23524718154425833, Runtime: 6.47842 seconds\n", + "2023/10/15 03:56:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.23524718154425833, Global best: 0.23524718154425833, Runtime: 6.44874 seconds\n", + "2023/10/15 03:56:52 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.23524718154425833, Global best: 0.23524718154425833, Runtime: 6.45339 seconds\n", + "2023/10/15 03:56:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.23524718154425833, Global best: 0.23524718154425833, Runtime: 6.49110 seconds\n", + "2023/10/15 03:57:05 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.23524718154425833, Global best: 0.23524718154425833, Runtime: 6.53681 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.875 0.875 110\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 438 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 218\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 218\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 218\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 218\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 218\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 218\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 218\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 220 / Rejected: 218\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 212 / Rejected: 226\n", + "Round 26 / Tentative (Accepted): 121 / Tentative (Not Accepted): 91 / Rejected: 226\n", + "Round 27 / Tentative (Accepted): 121 / Tentative (Not Accepted): 91 / Rejected: 226\n", + "Round 28 / Tentative (Accepted): 121 / Tentative (Not Accepted): 91 / Rejected: 226\n", + "Round 29 / Tentative (Accepted): 121 / Tentative (Not Accepted): 91 / Rejected: 226\n", + "Round 30 / Tentative (Accepted): 121 / Tentative (Not Accepted): 91 / Rejected: 226\n", + "Round 31 / Tentative (Accepted): 121 / Tentative (Not Accepted): 91 / Rejected: 226\n", + "Round 32 / Tentative (Accepted): 121 / Tentative (Not Accepted): 89 / Rejected: 228\n", + "Round 33 / Tentative (Accepted): 121 / Tentative (Not Accepted): 89 / Rejected: 228\n", + "Round 34 / Tentative (Accepted): 121 / Tentative (Not Accepted): 89 / Rejected: 228\n", + "Round 35 / Tentative (Accepted): 121 / Tentative (Not Accepted): 89 / Rejected: 228\n", + "Round 36 / Tentative (Accepted): 127 / Tentative (Not Accepted): 80 / Rejected: 231\n", + "Round 37 / Tentative (Accepted): 127 / Tentative (Not Accepted): 80 / Rejected: 231\n", + "Round 38 / Tentative (Accepted): 127 / Tentative (Not Accepted): 80 / Rejected: 231\n", + "Round 39 / Tentative (Accepted): 127 / Tentative (Not Accepted): 80 / Rejected: 231\n", + "Round 40 / Tentative (Accepted): 127 / Tentative (Not Accepted): 80 / Rejected: 231\n", + "Final Feature Set Contains 262 Features.\n", + "Control (Positive) 0.6875 0.8125 938\n", + "Control (Negative) 0.4375 0.625 938\n", + "ANOVA Base 0.75 0.75 320\n", + "Mutual Information (10) Base 0.6875 0.625 10\n", + "RFE (10) Base 0.875 0.75 10\n", + "MultiSURF (10) 0.8125 0.625 10\n", + "Mutual Information (20) Base 0.75 0.625 20\n", + "RFE (20) Base 0.8125 0.8125 20\n", + "MultiSURF (20) 0.8125 0.8125 20\n", + "Mutual Information (40) Base 0.75 0.875 40\n", + "RFE (40) Base 0.6875 0.8125 40\n", + "MultiSURF (40) 0.8125 0.875 40\n", + "Mutual Information (60) Base 0.8125 0.875 60\n", + "RFE (60) Base 0.75 0.75 60\n", + "MultiSURF (60) 0.8125 0.875 60\n", + "Mutual Information (80) Base 0.75 0.875 80\n", + "RFE (80) Base 0.75 0.75 80\n", + "MultiSURF (80) 0.75 0.75 80\n", + "Mutual Information (100) Base 0.8125 0.875 100\n", + "RFE (100) Base 0.75 0.75 100\n", + "MultiSURF (100) 0.75 0.75 100\n", + "RFECV Base 0.8125 0.75 18\n", + "Boruta Base 0.6875 0.75 51\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:05:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:06:00 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.33305903287180433, Global best: 0.33305903287180433, Runtime: 13.35213 seconds\n", + "2023/10/15 04:06:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.33305903287180433, Global best: 0.33305903287180433, Runtime: 13.26204 seconds\n", + "2023/10/15 04:06:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.33305903287180433, Global best: 0.33305903287180433, Runtime: 13.54883 seconds\n", + "2023/10/15 04:06:41 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.33305903287180433, Global best: 0.33305903287180433, Runtime: 14.24839 seconds\n", + "2023/10/15 04:06:56 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33270572310129554, Global best: 0.33270572310129554, Runtime: 15.24698 seconds\n", + "2023/10/15 04:07:11 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.33270572310129554, Global best: 0.33270572310129554, Runtime: 14.90822 seconds\n", + "2023/10/15 04:07:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.33270572310129554, Global best: 0.33270572310129554, Runtime: 13.83709 seconds\n", + "2023/10/15 04:07:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.33057024435757754, Global best: 0.33057024435757754, Runtime: 14.51730 seconds\n", + "2023/10/15 04:07:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.33057024435757754, Global best: 0.33057024435757754, Runtime: 14.78316 seconds\n", + "2023/10/15 04:08:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.33057024435757754, Global best: 0.33057024435757754, Runtime: 14.32972 seconds\n", + "2023/10/15 04:08:23 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.33608047941053587, Global best: 0.33057024435757754, Runtime: 14.99741 seconds\n", + "2023/10/15 04:08:38 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3364724036111782, Global best: 0.33057024435757754, Runtime: 14.51548 seconds\n", + "2023/10/15 04:08:52 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3364724036111782, Global best: 0.33057024435757754, Runtime: 14.09636 seconds\n", + "2023/10/15 04:09:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3364724036111782, Global best: 0.33057024435757754, Runtime: 14.29630 seconds\n", + "2023/10/15 04:09:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3277105103330519, Global best: 0.3277105103330519, Runtime: 14.26341 seconds\n", + "2023/10/15 04:09:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3277105103330519, Global best: 0.3277105103330519, Runtime: 14.50117 seconds\n", + "2023/10/15 04:09:50 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3277105103330519, Global best: 0.3277105103330519, Runtime: 14.96794 seconds\n", + "2023/10/15 04:10:05 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.33640123773292013, Global best: 0.3277105103330519, Runtime: 14.69547 seconds\n", + "2023/10/15 04:10:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.33640123773292013, Global best: 0.3277105103330519, Runtime: 13.83338 seconds\n", + "2023/10/15 04:10:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3274865774114005, Global best: 0.3274865774114005, Runtime: 14.47373 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.6875 0.75 581\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:10:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:10:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3422921534121233, Global best: 0.3422921534121233, Runtime: 6.70280 seconds\n", + "2023/10/15 04:10:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3422921534121233, Global best: 0.3422921534121233, Runtime: 6.71713 seconds\n", + "2023/10/15 04:11:05 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3422921534121233, Global best: 0.3422921534121233, Runtime: 6.69776 seconds\n", + "2023/10/15 04:11:12 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3422921534121233, Global best: 0.3422921534121233, Runtime: 6.71648 seconds\n", + "2023/10/15 04:11:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.336851223551047, Global best: 0.336851223551047, Runtime: 6.69969 seconds\n", + "2023/10/15 04:11:25 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.33136913086038466, Global best: 0.33136913086038466, Runtime: 6.68180 seconds\n", + "2023/10/15 04:11:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.33136913086038466, Global best: 0.33136913086038466, Runtime: 6.72680 seconds\n", + "2023/10/15 04:11:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3290662269620178, Global best: 0.3290662269620178, Runtime: 6.71948 seconds\n", + "2023/10/15 04:11:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3290662269620178, Global best: 0.3290662269620178, Runtime: 6.71861 seconds\n", + "2023/10/15 04:11:52 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3290650954300378, Global best: 0.3290650954300378, Runtime: 6.71137 seconds\n", + "2023/10/15 04:11:59 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3290650954300378, Global best: 0.3290650954300378, Runtime: 6.66059 seconds\n", + "2023/10/15 04:12:05 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3290650954300378, Global best: 0.3290650954300378, Runtime: 6.67193 seconds\n", + "2023/10/15 04:12:12 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3272232240723777, Global best: 0.3272232240723777, Runtime: 6.72375 seconds\n", + "2023/10/15 04:12:19 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3219433844544349, Global best: 0.3219433844544349, Runtime: 6.63077 seconds\n", + "2023/10/15 04:12:25 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3207266753018199, Global best: 0.3207266753018199, Runtime: 6.71159 seconds\n", + "2023/10/15 04:12:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3207266753018199, Global best: 0.3207266753018199, Runtime: 6.67827 seconds\n", + "2023/10/15 04:12:39 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3207266753018199, Global best: 0.3207266753018199, Runtime: 6.67847 seconds\n", + "2023/10/15 04:12:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3207266753018199, Global best: 0.3207266753018199, Runtime: 6.66780 seconds\n", + "2023/10/15 04:12:52 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3207266753018199, Global best: 0.3207266753018199, Runtime: 6.68668 seconds\n", + "2023/10/15 04:12:59 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3207266753018199, Global best: 0.3207266753018199, Runtime: 6.67765 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.625 0.8125 513\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:13:03 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:13:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3222188598455801, Global best: 0.3222188598455801, Runtime: 6.71630 seconds\n", + "2023/10/15 04:13:23 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3222188598455801, Global best: 0.3222188598455801, Runtime: 6.66030 seconds\n", + "2023/10/15 04:13:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3222188598455801, Global best: 0.3222188598455801, Runtime: 6.73920 seconds\n", + "2023/10/15 04:13:37 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3222188598455801, Global best: 0.3222188598455801, Runtime: 6.67542 seconds\n", + "2023/10/15 04:13:43 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.61634 seconds\n", + "2023/10/15 04:13:50 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.72035 seconds\n", + "2023/10/15 04:13:57 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.67433 seconds\n", + "2023/10/15 04:14:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 7.14836 seconds\n", + "2023/10/15 04:14:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.70655 seconds\n", + "2023/10/15 04:14:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.62893 seconds\n", + "2023/10/15 04:14:24 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.72043 seconds\n", + "2023/10/15 04:14:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.64235 seconds\n", + "2023/10/15 04:14:37 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.70326 seconds\n", + "2023/10/15 04:14:44 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.63798 seconds\n", + "2023/10/15 04:14:51 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.69792 seconds\n", + "2023/10/15 04:14:57 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.67266 seconds\n", + "2023/10/15 04:15:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.74081 seconds\n", + "2023/10/15 04:15:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.68520 seconds\n", + "2023/10/15 04:15:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.65080 seconds\n", + "2023/10/15 04:15:24 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3128717768859359, Global best: 0.3128717768859359, Runtime: 6.71466 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.75 0.875 531\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:15:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:15:42 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3280978305308325, Global best: 0.3280978305308325, Runtime: 6.72476 seconds\n", + "2023/10/15 04:15:49 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.32252608193708987, Global best: 0.32252608193708987, Runtime: 6.70644 seconds\n", + "2023/10/15 04:15:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.32252608193708987, Global best: 0.32252608193708987, Runtime: 6.76508 seconds\n", + "2023/10/15 04:16:02 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.32252608193708987, Global best: 0.32252608193708987, Runtime: 6.73992 seconds\n", + "2023/10/15 04:16:09 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3210083404662882, Global best: 0.3210083404662882, Runtime: 6.72039 seconds\n", + "2023/10/15 04:16:16 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3166287702404349, Global best: 0.3166287702404349, Runtime: 6.71558 seconds\n", + "2023/10/15 04:16:22 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3166287702404349, Global best: 0.3166287702404349, Runtime: 6.67236 seconds\n", + "2023/10/15 04:16:29 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3166287702404349, Global best: 0.3166287702404349, Runtime: 6.69873 seconds\n", + "2023/10/15 04:16:36 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3166287702404349, Global best: 0.3166287702404349, Runtime: 6.70318 seconds\n", + "2023/10/15 04:16:43 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3148365040986717, Global best: 0.3148365040986717, Runtime: 6.73718 seconds\n", + "2023/10/15 04:16:49 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.314330842084066, Global best: 0.314330842084066, Runtime: 6.67296 seconds\n", + "2023/10/15 04:16:56 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.314330842084066, Global best: 0.314330842084066, Runtime: 6.69230 seconds\n", + "2023/10/15 04:17:03 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.314330842084066, Global best: 0.314330842084066, Runtime: 6.69384 seconds\n", + "2023/10/15 04:17:09 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.314330842084066, Global best: 0.314330842084066, Runtime: 6.67716 seconds\n", + "2023/10/15 04:17:16 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.314330842084066, Global best: 0.314330842084066, Runtime: 6.68124 seconds\n", + "2023/10/15 04:17:23 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.314330842084066, Global best: 0.314330842084066, Runtime: 6.65854 seconds\n", + "2023/10/15 04:17:29 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.314330842084066, Global best: 0.314330842084066, Runtime: 6.69687 seconds\n", + "2023/10/15 04:17:36 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.30528976308248584, Global best: 0.30528976308248584, Runtime: 6.63880 seconds\n", + "2023/10/15 04:17:43 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.3047656865105565, Global best: 0.3047656865105565, Runtime: 6.70773 seconds\n", + "2023/10/15 04:17:50 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.3047656865105565, Global best: 0.3047656865105565, Runtime: 7.22810 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.75 0.8125 513\n", + "Triglav Stage 1 Base 0.6875 0.75 262\n", + "Triglav MultiSURF 10 0.875 0.8125 10\n", + "Triglav MultiSURF 20 0.875 0.875 20\n", + "Triglav MultiSURF 40 0.75 0.75 40\n", + "Triglav MultiSURF 60 0.75 0.8125 60\n", + "Triglav MultiSURF 80 0.6875 0.8125 80\n", + "Triglav MultiSURF 100 0.6875 0.8125 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:18:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:18:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.27437579132706386, Global best: 0.27437579132706386, Runtime: 13.11365 seconds\n", + "2023/10/15 04:18:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.26757079518505666, Global best: 0.26757079518505666, Runtime: 12.97681 seconds\n", + "2023/10/15 04:19:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.26757079518505666, Global best: 0.26757079518505666, Runtime: 13.21854 seconds\n", + "2023/10/15 04:19:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.2710704113846884, Global best: 0.26757079518505666, Runtime: 13.18816 seconds\n", + "2023/10/15 04:19:29 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.263630545501568, Global best: 0.263630545501568, Runtime: 13.87743 seconds\n", + "2023/10/15 04:19:43 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.26286653909219926, Global best: 0.26286653909219926, Runtime: 13.88936 seconds\n", + "2023/10/15 04:19:57 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.2517600943953314, Global best: 0.2517600943953314, Runtime: 13.63425 seconds\n", + "2023/10/15 04:20:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.2517600943953314, Global best: 0.2517600943953314, Runtime: 13.38652 seconds\n", + "2023/10/15 04:20:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.2517600943953314, Global best: 0.2517600943953314, Runtime: 14.13033 seconds\n", + "2023/10/15 04:20:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.2517600943953314, Global best: 0.2517600943953314, Runtime: 14.75314 seconds\n", + "2023/10/15 04:20:53 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.2718279629315345, Global best: 0.2517600943953314, Runtime: 13.90291 seconds\n", + "2023/10/15 04:21:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.2718279629315345, Global best: 0.2517600943953314, Runtime: 13.21991 seconds\n", + "2023/10/15 04:21:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.2718279629315345, Global best: 0.2517600943953314, Runtime: 13.36618 seconds\n", + "2023/10/15 04:21:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.2718279629315345, Global best: 0.2517600943953314, Runtime: 13.80849 seconds\n", + "2023/10/15 04:21:47 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.2797507745538254, Global best: 0.2517600943953314, Runtime: 13.82213 seconds\n", + "2023/10/15 04:22:01 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.27715450071447084, Global best: 0.2517600943953314, Runtime: 13.67829 seconds\n", + "2023/10/15 04:22:14 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.27387948547112556, Global best: 0.2517600943953314, Runtime: 13.42228 seconds\n", + "2023/10/15 04:22:28 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.27387948547112556, Global best: 0.2517600943953314, Runtime: 13.36108 seconds\n", + "2023/10/15 04:22:41 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.27387948547112556, Global best: 0.2517600943953314, Runtime: 13.12136 seconds\n", + "2023/10/15 04:22:55 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.27387948547112556, Global best: 0.2517600943953314, Runtime: 14.30851 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.6875 0.875 136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:22:59 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:23:12 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.28077925307456586, Global best: 0.28077925307456586, Runtime: 6.51086 seconds\n", + "2023/10/15 04:23:19 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.27153408648014843, Global best: 0.27153408648014843, Runtime: 6.49587 seconds\n", + "2023/10/15 04:23:25 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.27153408648014843, Global best: 0.27153408648014843, Runtime: 6.50832 seconds\n", + "2023/10/15 04:23:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.27153408648014843, Global best: 0.27153408648014843, Runtime: 6.46214 seconds\n", + "2023/10/15 04:23:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.27153408648014843, Global best: 0.27153408648014843, Runtime: 6.49883 seconds\n", + "2023/10/15 04:23:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.27153408648014843, Global best: 0.27153408648014843, Runtime: 6.50841 seconds\n", + "2023/10/15 04:23:52 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.27153408648014843, Global best: 0.27153408648014843, Runtime: 6.95812 seconds\n", + "2023/10/15 04:23:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.2612765814036933, Global best: 0.2612765814036933, Runtime: 6.48791 seconds\n", + "2023/10/15 04:24:05 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.2612765814036933, Global best: 0.2612765814036933, Runtime: 6.50741 seconds\n", + "2023/10/15 04:24:11 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2612765814036933, Global best: 0.2612765814036933, Runtime: 6.51249 seconds\n", + "2023/10/15 04:24:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.2612765814036933, Global best: 0.2612765814036933, Runtime: 6.46039 seconds\n", + "2023/10/15 04:24:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2612765814036933, Global best: 0.2612765814036933, Runtime: 6.48070 seconds\n", + "2023/10/15 04:24:31 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2553978122891431, Global best: 0.2553978122891431, Runtime: 6.48856 seconds\n", + "2023/10/15 04:24:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2553978122891431, Global best: 0.2553978122891431, Runtime: 6.48907 seconds\n", + "2023/10/15 04:24:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2553978122891431, Global best: 0.2553978122891431, Runtime: 6.51137 seconds\n", + "2023/10/15 04:24:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2553978122891431, Global best: 0.2553978122891431, Runtime: 6.49074 seconds\n", + "2023/10/15 04:24:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2553978122891431, Global best: 0.2553978122891431, Runtime: 6.50537 seconds\n", + "2023/10/15 04:25:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.2553978122891431, Global best: 0.2553978122891431, Runtime: 6.49727 seconds\n", + "2023/10/15 04:25:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.2553978122891431, Global best: 0.2553978122891431, Runtime: 6.49709 seconds\n", + "2023/10/15 04:25:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.2553978122891431, Global best: 0.2553978122891431, Runtime: 6.50161 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.6875 0.75 138\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:25:20 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:25:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.25999568041765014, Global best: 0.25999568041765014, Runtime: 6.45463 seconds\n", + "2023/10/15 04:25:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.25449496285179124, Global best: 0.25449496285179124, Runtime: 6.47025 seconds\n", + "2023/10/15 04:25:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.2506704909726969, Global best: 0.2506704909726969, Runtime: 6.50771 seconds\n", + "2023/10/15 04:25:53 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.24459519210465036, Global best: 0.24459519210465036, Runtime: 6.49512 seconds\n", + "2023/10/15 04:26:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.23945594266989967, Global best: 0.23945594266989967, Runtime: 6.50234 seconds\n", + "2023/10/15 04:26:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.23461142452106454, Global best: 0.23461142452106454, Runtime: 6.49259 seconds\n", + "2023/10/15 04:26:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.23015806626841134, Global best: 0.23015806626841134, Runtime: 6.48008 seconds\n", + "2023/10/15 04:26:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.22938165969350993, Global best: 0.22938165969350993, Runtime: 6.45469 seconds\n", + "2023/10/15 04:26:26 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.22306997476973933, Global best: 0.22306997476973933, Runtime: 6.49271 seconds\n", + "2023/10/15 04:26:32 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2197821234340158, Global best: 0.2197821234340158, Runtime: 6.47110 seconds\n", + "2023/10/15 04:26:39 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.21398632270499976, Global best: 0.21398632270499976, Runtime: 6.48230 seconds\n", + "2023/10/15 04:26:45 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.21068916805904211, Global best: 0.21068916805904211, Runtime: 6.43137 seconds\n", + "2023/10/15 04:26:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.20589931826804186, Global best: 0.20589931826804186, Runtime: 6.52424 seconds\n", + "2023/10/15 04:26:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2051146063932342, Global best: 0.2051146063932342, Runtime: 6.41485 seconds\n", + "2023/10/15 04:27:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.20304784825092095, Global best: 0.20304784825092095, Runtime: 6.43119 seconds\n", + "2023/10/15 04:27:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.19921375384896875, Global best: 0.19921375384896875, Runtime: 7.00361 seconds\n", + "2023/10/15 04:27:18 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.19921375384896875, Global best: 0.19921375384896875, Runtime: 6.49129 seconds\n", + "2023/10/15 04:27:24 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.19921375384896875, Global best: 0.19921375384896875, Runtime: 6.45231 seconds\n", + "2023/10/15 04:27:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.1964595263754318, Global best: 0.1964595263754318, Runtime: 6.45072 seconds\n", + "2023/10/15 04:27:37 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.19576083437339986, Global best: 0.19576083437339986, Runtime: 6.44309 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.6875 0.75 94\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:27:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:27:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2574271582278326, Global best: 0.2574271582278326, Runtime: 6.47303 seconds\n", + "2023/10/15 04:28:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.25519591414127873, Global best: 0.25519591414127873, Runtime: 6.46809 seconds\n", + "2023/10/15 04:28:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.24989341752217975, Global best: 0.24989341752217975, Runtime: 6.41650 seconds\n", + "2023/10/15 04:28:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2484317361487814, Global best: 0.2484317361487814, Runtime: 6.44616 seconds\n", + "2023/10/15 04:28:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.24438911520338957, Global best: 0.24438911520338957, Runtime: 6.44764 seconds\n", + "2023/10/15 04:28:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.2431509789880917, Global best: 0.2431509789880917, Runtime: 6.45606 seconds\n", + "2023/10/15 04:28:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.24101215471338575, Global best: 0.24101215471338575, Runtime: 6.49417 seconds\n", + "2023/10/15 04:28:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.24101215471338575, Global best: 0.24101215471338575, Runtime: 6.47220 seconds\n", + "2023/10/15 04:28:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.24001959232934536, Global best: 0.24001959232934536, Runtime: 6.43300 seconds\n", + "2023/10/15 04:28:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.23740000839567618, Global best: 0.23740000839567618, Runtime: 6.43777 seconds\n", + "2023/10/15 04:28:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2356148830287304, Global best: 0.2356148830287304, Runtime: 6.46640 seconds\n", + "2023/10/15 04:29:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.23276276533427476, Global best: 0.23276276533427476, Runtime: 6.46032 seconds\n", + "2023/10/15 04:29:12 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.22916236627480008, Global best: 0.22916236627480008, Runtime: 6.50973 seconds\n", + "2023/10/15 04:29:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.22916236627480008, Global best: 0.22916236627480008, Runtime: 6.48529 seconds\n", + "2023/10/15 04:29:25 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.22833633358257882, Global best: 0.22833633358257882, Runtime: 6.46539 seconds\n", + "2023/10/15 04:29:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2276822689307812, Global best: 0.2276822689307812, Runtime: 6.51314 seconds\n", + "2023/10/15 04:29:38 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.22613517610537917, Global best: 0.22613517610537917, Runtime: 6.50244 seconds\n", + "2023/10/15 04:29:45 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.22462892604572554, Global best: 0.22462892604572554, Runtime: 6.94854 seconds\n", + "2023/10/15 04:29:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.21815192000289296, Global best: 0.21815192000289296, Runtime: 6.45217 seconds\n", + "2023/10/15 04:29:58 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2145659333525429, Global best: 0.2145659333525429, Runtime: 6.45864 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.6875 0.75 106\n", + "4\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 255 / Rejected: 217\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 255 / Rejected: 217\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 255 / Rejected: 217\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 255 / Rejected: 217\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 255 / Rejected: 217\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 255 / Rejected: 217\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 255 / Rejected: 217\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 255 / Rejected: 217\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 255 / Rejected: 217\n", + "Round 26 / Tentative (Accepted): 148 / Tentative (Not Accepted): 107 / Rejected: 217\n", + "Round 27 / Tentative (Accepted): 148 / Tentative (Not Accepted): 107 / Rejected: 217\n", + "Round 28 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 219\n", + "Round 29 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 219\n", + "Round 30 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 219\n", + "Round 31 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 219\n", + "Round 32 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 219\n", + "Round 33 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 219\n", + "Round 34 / Tentative (Accepted): 148 / Tentative (Not Accepted): 105 / Rejected: 219\n", + "Round 35 / Tentative (Accepted): 148 / Tentative (Not Accepted): 104 / Rejected: 220\n", + "Round 36 / Tentative (Accepted): 148 / Tentative (Not Accepted): 104 / Rejected: 220\n", + "Round 37 / Tentative (Accepted): 151 / Tentative (Not Accepted): 101 / Rejected: 220\n", + "Round 38 / Tentative (Accepted): 151 / Tentative (Not Accepted): 101 / Rejected: 220\n", + "Round 39 / Tentative (Accepted): 151 / Tentative (Not Accepted): 101 / Rejected: 220\n", + "Round 40 / Tentative (Accepted): 151 / Tentative (Not Accepted): 101 / Rejected: 220\n", + "Final Feature Set Contains 280 Features.\n", + "Control (Positive) 0.9 0.9 938\n", + "Control (Negative) 0.7333333333333334 0.7 938\n", + "ANOVA Base 0.9 0.9 268\n", + "Mutual Information (10) Base 0.7833333333333333 0.7666666666666666 10\n", + "RFE (10) Base 0.9 0.95 10\n", + "MultiSURF (10) 0.9 0.8666666666666667 10\n", + "Mutual Information (20) Base 0.8166666666666667 0.6666666666666667 20\n", + "RFE (20) Base 0.9 0.95 20\n", + "MultiSURF (20) 0.85 0.95 20\n", + "Mutual Information (40) Base 0.7666666666666666 0.8166666666666667 40\n", + "RFE (40) Base 0.9 0.95 40\n", + "MultiSURF (40) 0.85 0.9 40\n", + "Mutual Information (60) Base 0.8166666666666667 0.7166666666666667 60\n", + "RFE (60) Base 0.9 0.95 60\n", + "MultiSURF (60) 0.9 0.9 60\n", + "Mutual Information (80) Base 0.8666666666666667 0.7666666666666666 80\n", + "RFE (80) Base 0.9 0.9 80\n", + "MultiSURF (80) 0.9 0.95 80\n", + "Mutual Information (100) Base 0.8666666666666667 0.8166666666666667 100\n", + "RFE (100) Base 0.9 0.9 100\n", + "MultiSURF (100) 0.9 0.9 100\n", + "RFECV Base 0.95 0.9 938\n", + "Boruta Base 0.9 0.9 46\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:38:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:38:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3259731198373002, Global best: 0.3259731198373002, Runtime: 13.53337 seconds\n", + "2023/10/15 04:39:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3259731198373002, Global best: 0.3259731198373002, Runtime: 13.41911 seconds\n", + "2023/10/15 04:39:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3259731198373002, Global best: 0.3259731198373002, Runtime: 13.80484 seconds\n", + "2023/10/15 04:39:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3396018706325105, Global best: 0.3259731198373002, Runtime: 14.14513 seconds\n", + "2023/10/15 04:39:50 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3406839099400605, Global best: 0.3259731198373002, Runtime: 14.14821 seconds\n", + "2023/10/15 04:40:04 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.31915531921037005, Global best: 0.31915531921037005, Runtime: 14.48116 seconds\n", + "2023/10/15 04:40:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.31915531921037005, Global best: 0.31915531921037005, Runtime: 14.18535 seconds\n", + "2023/10/15 04:40:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.31915531921037005, Global best: 0.31915531921037005, Runtime: 14.82412 seconds\n", + "2023/10/15 04:40:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.32030952141828395, Global best: 0.31915531921037005, Runtime: 14.27812 seconds\n", + "2023/10/15 04:41:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.32030952141828395, Global best: 0.31915531921037005, Runtime: 14.08689 seconds\n", + "2023/10/15 04:41:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.32030952141828395, Global best: 0.31915531921037005, Runtime: 13.84644 seconds\n", + "2023/10/15 04:41:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.32884423885771713, Global best: 0.31915531921037005, Runtime: 15.26391 seconds\n", + "2023/10/15 04:41:46 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.33284698012991276, Global best: 0.31915531921037005, Runtime: 14.58488 seconds\n", + "2023/10/15 04:42:00 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.33284698012991276, Global best: 0.31915531921037005, Runtime: 14.30953 seconds\n", + "2023/10/15 04:42:14 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.32609114455915356, Global best: 0.31915531921037005, Runtime: 14.08311 seconds\n", + "2023/10/15 04:42:28 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.32609114455915356, Global best: 0.31915531921037005, Runtime: 14.31232 seconds\n", + "2023/10/15 04:42:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.32609114455915356, Global best: 0.31915531921037005, Runtime: 13.90114 seconds\n", + "2023/10/15 04:42:56 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.32609114455915356, Global best: 0.31915531921037005, Runtime: 14.23383 seconds\n", + "2023/10/15 04:43:11 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.337833005230486, Global best: 0.31915531921037005, Runtime: 14.95880 seconds\n", + "2023/10/15 04:43:26 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.33293821210054025, Global best: 0.31915531921037005, Runtime: 14.62699 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.9 0.9 566\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:43:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:43:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.32664549570708834, Global best: 0.32664549570708834, Runtime: 6.77082 seconds\n", + "2023/10/15 04:43:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.32664549570708834, Global best: 0.32664549570708834, Runtime: 6.73074 seconds\n", + "2023/10/15 04:43:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.32531839191329925, Global best: 0.32531839191329925, Runtime: 6.71425 seconds\n", + "2023/10/15 04:44:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3226518023812114, Global best: 0.3226518023812114, Runtime: 6.73785 seconds\n", + "2023/10/15 04:44:11 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3226518023812114, Global best: 0.3226518023812114, Runtime: 6.74640 seconds\n", + "2023/10/15 04:44:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3226518023812114, Global best: 0.3226518023812114, Runtime: 6.75633 seconds\n", + "2023/10/15 04:44:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.32248301143305236, Global best: 0.32248301143305236, Runtime: 6.73253 seconds\n", + "2023/10/15 04:44:31 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3133216391568425, Global best: 0.3133216391568425, Runtime: 6.74476 seconds\n", + "2023/10/15 04:44:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3065820722520947, Global best: 0.3065820722520947, Runtime: 6.76083 seconds\n", + "2023/10/15 04:44:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3065820722520947, Global best: 0.3065820722520947, Runtime: 6.77554 seconds\n", + "2023/10/15 04:44:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3065820722520947, Global best: 0.3065820722520947, Runtime: 6.72384 seconds\n", + "2023/10/15 04:44:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3065820722520947, Global best: 0.3065820722520947, Runtime: 6.77946 seconds\n", + "2023/10/15 04:45:05 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3065820722520947, Global best: 0.3065820722520947, Runtime: 6.72980 seconds\n", + "2023/10/15 04:45:12 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3065820722520947, Global best: 0.3065820722520947, Runtime: 6.68167 seconds\n", + "2023/10/15 04:45:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.30344492751014623, Global best: 0.30344492751014623, Runtime: 6.71321 seconds\n", + "2023/10/15 04:45:25 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.30344492751014623, Global best: 0.30344492751014623, Runtime: 6.71751 seconds\n", + "2023/10/15 04:45:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.30344492751014623, Global best: 0.30344492751014623, Runtime: 6.70557 seconds\n", + "2023/10/15 04:45:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.30344492751014623, Global best: 0.30344492751014623, Runtime: 6.77083 seconds\n", + "2023/10/15 04:45:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.30344492751014623, Global best: 0.30344492751014623, Runtime: 6.72528 seconds\n", + "2023/10/15 04:45:52 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.30344492751014623, Global best: 0.30344492751014623, Runtime: 6.73092 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.95 0.8166666666666667 477\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:45:56 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:46:10 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3259658572972798, Global best: 0.3259658572972798, Runtime: 6.74219 seconds\n", + "2023/10/15 04:46:16 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.32317761540491435, Global best: 0.32317761540491435, Runtime: 6.70601 seconds\n", + "2023/10/15 04:46:23 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.32317761540491435, Global best: 0.32317761540491435, Runtime: 6.75837 seconds\n", + "2023/10/15 04:46:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.32317761540491435, Global best: 0.32317761540491435, Runtime: 6.73147 seconds\n", + "2023/10/15 04:46:37 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.32317761540491435, Global best: 0.32317761540491435, Runtime: 6.75186 seconds\n", + "2023/10/15 04:46:43 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.32317761540491435, Global best: 0.32317761540491435, Runtime: 6.75118 seconds\n", + "2023/10/15 04:46:50 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.32317761540491435, Global best: 0.32317761540491435, Runtime: 6.78881 seconds\n", + "2023/10/15 04:46:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 7.28524 seconds\n", + "2023/10/15 04:47:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.72607 seconds\n", + "2023/10/15 04:47:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.78527 seconds\n", + "2023/10/15 04:47:18 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.74619 seconds\n", + "2023/10/15 04:47:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.73299 seconds\n", + "2023/10/15 04:47:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.75742 seconds\n", + "2023/10/15 04:47:38 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.78853 seconds\n", + "2023/10/15 04:47:45 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.72083 seconds\n", + "2023/10/15 04:47:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.72520 seconds\n", + "2023/10/15 04:47:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.77443 seconds\n", + "2023/10/15 04:48:05 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.71184 seconds\n", + "2023/10/15 04:48:12 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.72508 seconds\n", + "2023/10/15 04:48:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3207366430284515, Global best: 0.3207366430284515, Runtime: 6.77055 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.95 0.9 555\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:48:22 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:48:36 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.31764223520205676, Global best: 0.31764223520205676, Runtime: 6.62146 seconds\n", + "2023/10/15 04:48:43 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.31764223520205676, Global best: 0.31764223520205676, Runtime: 6.57420 seconds\n", + "2023/10/15 04:48:49 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.31764223520205676, Global best: 0.31764223520205676, Runtime: 6.68619 seconds\n", + "2023/10/15 04:48:56 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.31764223520205676, Global best: 0.31764223520205676, Runtime: 6.63853 seconds\n", + "2023/10/15 04:49:03 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.31200537837080977, Global best: 0.31200537837080977, Runtime: 6.64940 seconds\n", + "2023/10/15 04:49:09 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.31200537837080977, Global best: 0.31200537837080977, Runtime: 6.63296 seconds\n", + "2023/10/15 04:49:16 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.31200537837080977, Global best: 0.31200537837080977, Runtime: 6.60429 seconds\n", + "2023/10/15 04:49:23 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.31200537837080977, Global best: 0.31200537837080977, Runtime: 6.63388 seconds\n", + "2023/10/15 04:49:29 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.31200537837080977, Global best: 0.31200537837080977, Runtime: 6.62013 seconds\n", + "2023/10/15 04:49:36 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3077168383121901, Global best: 0.3077168383121901, Runtime: 6.63135 seconds\n", + "2023/10/15 04:49:42 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3077168383121901, Global best: 0.3077168383121901, Runtime: 6.61523 seconds\n", + "2023/10/15 04:49:49 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.3077168383121901, Global best: 0.3077168383121901, Runtime: 6.61114 seconds\n", + "2023/10/15 04:49:56 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.3077168383121901, Global best: 0.3077168383121901, Runtime: 6.60721 seconds\n", + "2023/10/15 04:50:02 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.3067416695626036, Global best: 0.3067416695626036, Runtime: 6.57983 seconds\n", + "2023/10/15 04:50:09 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2907190160897601, Global best: 0.2907190160897601, Runtime: 6.64737 seconds\n", + "2023/10/15 04:50:16 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2907190160897601, Global best: 0.2907190160897601, Runtime: 6.57597 seconds\n", + "2023/10/15 04:50:22 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2863646268876896, Global best: 0.2863646268876896, Runtime: 6.62250 seconds\n", + "2023/10/15 04:50:29 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2863646268876896, Global best: 0.2863646268876896, Runtime: 6.62538 seconds\n", + "2023/10/15 04:50:35 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2863646268876896, Global best: 0.2863646268876896, Runtime: 6.60242 seconds\n", + "2023/10/15 04:50:43 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2863646268876896, Global best: 0.2863646268876896, Runtime: 7.17174 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.9 0.85 507\n", + "Triglav Stage 1 Base 0.9 0.9 280\n", + "Triglav MultiSURF 10 0.95 0.8166666666666667 10\n", + "Triglav MultiSURF 20 0.8666666666666667 0.7 20\n", + "Triglav MultiSURF 40 0.95 0.8666666666666667 40\n", + "Triglav MultiSURF 60 0.95 0.9166666666666667 60\n", + "Triglav MultiSURF 80 0.95 0.95 80\n", + "Triglav MultiSURF 100 0.85 0.9 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:51:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:51:28 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3033656526096376, Global best: 0.3033656526096376, Runtime: 12.99623 seconds\n", + "2023/10/15 04:51:41 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3033656526096376, Global best: 0.3033656526096376, Runtime: 13.00808 seconds\n", + "2023/10/15 04:51:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3033656526096376, Global best: 0.3033656526096376, Runtime: 13.01021 seconds\n", + "2023/10/15 04:52:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3069178242632695, Global best: 0.3033656526096376, Runtime: 13.10399 seconds\n", + "2023/10/15 04:52:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3069178242632695, Global best: 0.3033656526096376, Runtime: 14.55337 seconds\n", + "2023/10/15 04:52:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.30754499423333614, Global best: 0.3033656526096376, Runtime: 13.70494 seconds\n", + "2023/10/15 04:52:50 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.30754499423333614, Global best: 0.3033656526096376, Runtime: 13.89164 seconds\n", + "2023/10/15 04:53:03 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3043072435891971, Global best: 0.3033656526096376, Runtime: 13.41781 seconds\n", + "2023/10/15 04:53:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3043072435891971, Global best: 0.3033656526096376, Runtime: 13.38313 seconds\n", + "2023/10/15 04:53:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3043072435891971, Global best: 0.3033656526096376, Runtime: 14.14298 seconds\n", + "2023/10/15 04:53:44 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.31196054945846813, Global best: 0.3033656526096376, Runtime: 13.64331 seconds\n", + "2023/10/15 04:53:58 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.31196054945846813, Global best: 0.3033656526096376, Runtime: 13.51082 seconds\n", + "2023/10/15 04:54:12 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.29880387699308575, Global best: 0.29880387699308575, Runtime: 13.90771 seconds\n", + "2023/10/15 04:54:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.29880387699308575, Global best: 0.29880387699308575, Runtime: 13.68649 seconds\n", + "2023/10/15 04:54:40 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.29880387699308575, Global best: 0.29880387699308575, Runtime: 14.32795 seconds\n", + "2023/10/15 04:54:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3114100045148712, Global best: 0.29880387699308575, Runtime: 14.13762 seconds\n", + "2023/10/15 04:55:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3114100045148712, Global best: 0.29880387699308575, Runtime: 13.69478 seconds\n", + "2023/10/15 04:55:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3114100045148712, Global best: 0.29880387699308575, Runtime: 13.42424 seconds\n", + "2023/10/15 04:55:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.31049501261298584, Global best: 0.29880387699308575, Runtime: 14.07322 seconds\n", + "2023/10/15 04:55:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.31049501261298584, Global best: 0.29880387699308575, Runtime: 13.40624 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.9 0.9 150\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:55:52 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:56:06 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3123078411599449, Global best: 0.3123078411599449, Runtime: 6.46218 seconds\n", + "2023/10/15 04:56:12 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3102182640720007, Global best: 0.3102182640720007, Runtime: 6.51511 seconds\n", + "2023/10/15 04:56:19 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3102182640720007, Global best: 0.3102182640720007, Runtime: 6.46262 seconds\n", + "2023/10/15 04:56:25 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3102182640720007, Global best: 0.3102182640720007, Runtime: 6.49198 seconds\n", + "2023/10/15 04:56:32 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3102182640720007, Global best: 0.3102182640720007, Runtime: 6.50823 seconds\n", + "2023/10/15 04:56:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3102182640720007, Global best: 0.3102182640720007, Runtime: 6.55882 seconds\n", + "2023/10/15 04:56:45 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3102182640720007, Global best: 0.3102182640720007, Runtime: 6.49433 seconds\n", + "2023/10/15 04:56:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3102182640720007, Global best: 0.3102182640720007, Runtime: 6.51536 seconds\n", + "2023/10/15 04:56:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.30293925520547527, Global best: 0.30293925520547527, Runtime: 6.94773 seconds\n", + "2023/10/15 04:57:05 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.30293925520547527, Global best: 0.30293925520547527, Runtime: 6.55503 seconds\n", + "2023/10/15 04:57:11 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.30293925520547527, Global best: 0.30293925520547527, Runtime: 6.48572 seconds\n", + "2023/10/15 04:57:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.30293925520547527, Global best: 0.30293925520547527, Runtime: 6.46270 seconds\n", + "2023/10/15 04:57:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.30293925520547527, Global best: 0.30293925520547527, Runtime: 6.51602 seconds\n", + "2023/10/15 04:57:31 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.30293925520547527, Global best: 0.30293925520547527, Runtime: 6.54848 seconds\n", + "2023/10/15 04:57:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.30293925520547527, Global best: 0.30293925520547527, Runtime: 6.51195 seconds\n", + "2023/10/15 04:57:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.30293925520547527, Global best: 0.30293925520547527, Runtime: 6.52569 seconds\n", + "2023/10/15 04:57:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.30293925520547527, Global best: 0.30293925520547527, Runtime: 6.50355 seconds\n", + "2023/10/15 04:57:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.30142205657515453, Global best: 0.30142205657515453, Runtime: 6.48496 seconds\n", + "2023/10/15 04:58:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.30142205657515453, Global best: 0.30142205657515453, Runtime: 6.52383 seconds\n", + "2023/10/15 04:58:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.30142205657515453, Global best: 0.30142205657515453, Runtime: 6.50823 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.9 0.95 145\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 04:58:14 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 04:58:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3109620641344691, Global best: 0.3109620641344691, Runtime: 6.49677 seconds\n", + "2023/10/15 04:58:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3000693081139038, Global best: 0.3000693081139038, Runtime: 6.43823 seconds\n", + "2023/10/15 04:58:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3000693081139038, Global best: 0.3000693081139038, Runtime: 6.48249 seconds\n", + "2023/10/15 04:58:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3000693081139038, Global best: 0.3000693081139038, Runtime: 6.46874 seconds\n", + "2023/10/15 04:58:53 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3000693081139038, Global best: 0.3000693081139038, Runtime: 6.46400 seconds\n", + "2023/10/15 04:59:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.29004934227954154, Global best: 0.29004934227954154, Runtime: 6.46507 seconds\n", + "2023/10/15 04:59:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.28589673513894476, Global best: 0.28589673513894476, Runtime: 6.48417 seconds\n", + "2023/10/15 04:59:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.2821698836591192, Global best: 0.2821698836591192, Runtime: 6.45158 seconds\n", + "2023/10/15 04:59:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2728969509750592, Global best: 0.2728969509750592, Runtime: 6.44244 seconds\n", + "2023/10/15 04:59:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2728969509750592, Global best: 0.2728969509750592, Runtime: 6.44911 seconds\n", + "2023/10/15 04:59:32 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.2728969509750592, Global best: 0.2728969509750592, Runtime: 6.40560 seconds\n", + "2023/10/15 04:59:38 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.27109002414429667, Global best: 0.27109002414429667, Runtime: 6.51005 seconds\n", + "2023/10/15 04:59:45 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.27109002414429667, Global best: 0.27109002414429667, Runtime: 6.42856 seconds\n", + "2023/10/15 04:59:51 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.26899654762707026, Global best: 0.26899654762707026, Runtime: 6.47158 seconds\n", + "2023/10/15 04:59:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.2600185626030921, Global best: 0.2600185626030921, Runtime: 6.42190 seconds\n", + "2023/10/15 05:00:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2600185626030921, Global best: 0.2600185626030921, Runtime: 6.48070 seconds\n", + "2023/10/15 05:00:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2600185626030921, Global best: 0.2600185626030921, Runtime: 6.49033 seconds\n", + "2023/10/15 05:00:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.2600185626030921, Global best: 0.2600185626030921, Runtime: 6.46881 seconds\n", + "2023/10/15 05:00:24 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.258732155272979, Global best: 0.258732155272979, Runtime: 6.94951 seconds\n", + "2023/10/15 05:00:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.258732155272979, Global best: 0.258732155272979, Runtime: 6.46624 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.95 0.95 127\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:00:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:00:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.30444257716004786, Global best: 0.30444257716004786, Runtime: 6.55230 seconds\n", + "2023/10/15 05:00:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.302450677777944, Global best: 0.302450677777944, Runtime: 6.50308 seconds\n", + "2023/10/15 05:01:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.29238298933903095, Global best: 0.29238298933903095, Runtime: 6.49565 seconds\n", + "2023/10/15 05:01:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.29238298933903095, Global best: 0.29238298933903095, Runtime: 6.54061 seconds\n", + "2023/10/15 05:01:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.28707658404848047, Global best: 0.28707658404848047, Runtime: 6.53506 seconds\n", + "2023/10/15 05:01:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.28707658404848047, Global best: 0.28707658404848047, Runtime: 6.49223 seconds\n", + "2023/10/15 05:01:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2866496714454283, Global best: 0.2866496714454283, Runtime: 6.51553 seconds\n", + "2023/10/15 05:01:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2803942494477765, Global best: 0.2803942494477765, Runtime: 6.49307 seconds\n", + "2023/10/15 05:01:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2803942494477765, Global best: 0.2803942494477765, Runtime: 6.50527 seconds\n", + "2023/10/15 05:01:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2803942494477765, Global best: 0.2803942494477765, Runtime: 6.50570 seconds\n", + "2023/10/15 05:01:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2784648511471398, Global best: 0.2784648511471398, Runtime: 6.46068 seconds\n", + "2023/10/15 05:02:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.27206498570215054, Global best: 0.27206498570215054, Runtime: 6.50978 seconds\n", + "2023/10/15 05:02:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.27045989070614773, Global best: 0.27045989070614773, Runtime: 6.47015 seconds\n", + "2023/10/15 05:02:12 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.27023175249509634, Global best: 0.27023175249509634, Runtime: 6.44506 seconds\n", + "2023/10/15 05:02:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2693876608009223, Global best: 0.2693876608009223, Runtime: 6.45591 seconds\n", + "2023/10/15 05:02:25 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.26673048671170396, Global best: 0.26673048671170396, Runtime: 6.51880 seconds\n", + "2023/10/15 05:02:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.26337068302964517, Global best: 0.26337068302964517, Runtime: 6.50571 seconds\n", + "2023/10/15 05:02:38 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.26326933735600555, Global best: 0.26326933735600555, Runtime: 6.44355 seconds\n", + "2023/10/15 05:02:45 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.26326933735600555, Global best: 0.26326933735600555, Runtime: 6.45658 seconds\n", + "2023/10/15 05:02:52 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.26135834136123437, Global best: 0.26135834136123437, Runtime: 6.94609 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.85 0.8166666666666667 129\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 461 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 208\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 208\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 208\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 208\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 208\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 208\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 208\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 208\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 253 / Rejected: 208\n", + "Round 26 / Tentative (Accepted): 151 / Tentative (Not Accepted): 102 / Rejected: 208\n", + "Round 27 / Tentative (Accepted): 151 / Tentative (Not Accepted): 100 / Rejected: 210\n", + "Round 28 / Tentative (Accepted): 151 / Tentative (Not Accepted): 100 / Rejected: 210\n", + "Round 29 / Tentative (Accepted): 151 / Tentative (Not Accepted): 100 / Rejected: 210\n", + "Round 30 / Tentative (Accepted): 151 / Tentative (Not Accepted): 100 / Rejected: 210\n", + "Round 31 / Tentative (Accepted): 151 / Tentative (Not Accepted): 100 / Rejected: 210\n", + "Round 32 / Tentative (Accepted): 151 / Tentative (Not Accepted): 100 / Rejected: 210\n", + "Round 33 / Tentative (Accepted): 151 / Tentative (Not Accepted): 100 / Rejected: 210\n", + "Round 34 / Tentative (Accepted): 151 / Tentative (Not Accepted): 100 / Rejected: 210\n", + "Round 35 / Tentative (Accepted): 151 / Tentative (Not Accepted): 99 / Rejected: 211\n", + "Round 36 / Tentative (Accepted): 157 / Tentative (Not Accepted): 93 / Rejected: 211\n", + "Round 37 / Tentative (Accepted): 157 / Tentative (Not Accepted): 93 / Rejected: 211\n", + "Round 38 / Tentative (Accepted): 157 / Tentative (Not Accepted): 93 / Rejected: 211\n", + "Round 39 / Tentative (Accepted): 157 / Tentative (Not Accepted): 93 / Rejected: 211\n", + "Round 40 / Tentative (Accepted): 157 / Tentative (Not Accepted): 93 / Rejected: 211\n", + "Final Feature Set Contains 317 Features.\n", + "Control (Positive) 0.9166666666666667 0.875 938\n", + "Control (Negative) 0.7083333333333333 0.5833333333333333 938\n", + "ANOVA Base 0.9166666666666667 0.875 290\n", + "Mutual Information (10) Base 0.875 0.8333333333333333 10\n", + "RFE (10) Base 0.875 0.9166666666666667 10\n", + "MultiSURF (10) 0.875 0.9166666666666667 10\n", + "Mutual Information (20) Base 0.9166666666666667 0.8333333333333333 20\n", + "RFE (20) Base 0.9166666666666667 0.9166666666666667 20\n", + "MultiSURF (20) 0.875 0.7916666666666667 20\n", + "Mutual Information (40) Base 0.9166666666666667 0.9166666666666667 40\n", + "RFE (40) Base 0.9166666666666667 0.9166666666666667 40\n", + "MultiSURF (40) 0.8333333333333333 0.875 40\n", + "Mutual Information (60) Base 0.875 0.875 60\n", + "RFE (60) Base 0.9166666666666667 0.8333333333333333 60\n", + "MultiSURF (60) 0.875 0.8333333333333333 60\n", + "Mutual Information (80) Base 0.875 0.875 80\n", + "RFE (80) Base 0.9166666666666667 0.8333333333333333 80\n", + "MultiSURF (80) 0.9166666666666667 0.8333333333333333 80\n", + "Mutual Information (100) Base 0.9166666666666667 0.875 100\n", + "RFE (100) Base 0.9166666666666667 0.8333333333333333 100\n", + "MultiSURF (100) 0.9166666666666667 0.9166666666666667 100\n", + "RFECV Base 0.9166666666666667 0.8333333333333333 202\n", + "Boruta Base 0.9166666666666667 0.8333333333333333 45\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:11:37 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:11:58 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.34315905725084905, Global best: 0.34315905725084905, Runtime: 13.42284 seconds\n", + "2023/10/15 05:12:11 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.34315905725084905, Global best: 0.34315905725084905, Runtime: 13.43656 seconds\n", + "2023/10/15 05:12:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3487684909524541, Global best: 0.34315905725084905, Runtime: 13.60046 seconds\n", + "2023/10/15 05:12:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.35194494927707465, Global best: 0.34315905725084905, Runtime: 14.50157 seconds\n", + "2023/10/15 05:12:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.35135864946897244, Global best: 0.34315905725084905, Runtime: 15.11764 seconds\n", + "2023/10/15 05:13:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.35135864946897244, Global best: 0.34315905725084905, Runtime: 13.65592 seconds\n", + "2023/10/15 05:13:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.35135864946897244, Global best: 0.34315905725084905, Runtime: 13.57952 seconds\n", + "2023/10/15 05:13:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.35135864946897244, Global best: 0.34315905725084905, Runtime: 14.52424 seconds\n", + "2023/10/15 05:13:51 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3471661548346153, Global best: 0.34315905725084905, Runtime: 14.53672 seconds\n", + "2023/10/15 05:14:05 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3471661548346153, Global best: 0.34315905725084905, Runtime: 14.18211 seconds\n", + "2023/10/15 05:14:20 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3471661548346153, Global best: 0.34315905725084905, Runtime: 14.92327 seconds\n", + "2023/10/15 05:14:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3506709954405398, Global best: 0.34315905725084905, Runtime: 13.85148 seconds\n", + "2023/10/15 05:14:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3304907855616438, Global best: 0.3304907855616438, Runtime: 15.01713 seconds\n", + "2023/10/15 05:15:03 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3304907855616438, Global best: 0.3304907855616438, Runtime: 14.51892 seconds\n", + "2023/10/15 05:15:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3304907855616438, Global best: 0.3304907855616438, Runtime: 14.22744 seconds\n", + "2023/10/15 05:15:32 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.34514602373872705, Global best: 0.3304907855616438, Runtime: 14.27618 seconds\n", + "2023/10/15 05:15:46 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.34245698841104444, Global best: 0.3304907855616438, Runtime: 14.10515 seconds\n", + "2023/10/15 05:16:01 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.34245698841104444, Global best: 0.3304907855616438, Runtime: 15.01692 seconds\n", + "2023/10/15 05:16:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.34245698841104444, Global best: 0.3304907855616438, Runtime: 14.05412 seconds\n", + "2023/10/15 05:16:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.34245698841104444, Global best: 0.3304907855616438, Runtime: 15.25565 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.875 0.7916666666666667 517\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:16:34 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:16:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.72166 seconds\n", + "2023/10/15 05:16:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.75816 seconds\n", + "2023/10/15 05:17:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.70384 seconds\n", + "2023/10/15 05:17:08 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.75922 seconds\n", + "2023/10/15 05:17:15 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.70264 seconds\n", + "2023/10/15 05:17:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.71449 seconds\n", + "2023/10/15 05:17:28 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.67813 seconds\n", + "2023/10/15 05:17:35 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.74690 seconds\n", + "2023/10/15 05:17:42 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.72421 seconds\n", + "2023/10/15 05:17:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.67710 seconds\n", + "2023/10/15 05:17:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.75362 seconds\n", + "2023/10/15 05:18:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.72972 seconds\n", + "2023/10/15 05:18:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.72358 seconds\n", + "2023/10/15 05:18:15 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.76387 seconds\n", + "2023/10/15 05:18:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.65113 seconds\n", + "2023/10/15 05:18:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.34153604251767455, Global best: 0.34153604251767455, Runtime: 6.69815 seconds\n", + "2023/10/15 05:18:35 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.32829092523525916, Global best: 0.32829092523525916, Runtime: 6.70351 seconds\n", + "2023/10/15 05:18:42 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.32829092523525916, Global best: 0.32829092523525916, Runtime: 6.69244 seconds\n", + "2023/10/15 05:18:49 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.32829092523525916, Global best: 0.32829092523525916, Runtime: 6.75116 seconds\n", + "2023/10/15 05:18:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.32829092523525916, Global best: 0.32829092523525916, Runtime: 6.70903 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.9166666666666667 0.8333333333333333 486\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:18:59 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:19:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.67409 seconds\n", + "2023/10/15 05:19:20 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.70472 seconds\n", + "2023/10/15 05:19:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.69879 seconds\n", + "2023/10/15 05:19:33 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.68292 seconds\n", + "2023/10/15 05:19:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.66334 seconds\n", + "2023/10/15 05:19:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.72101 seconds\n", + "2023/10/15 05:19:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.76500 seconds\n", + "2023/10/15 05:20:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.77839 seconds\n", + "2023/10/15 05:20:07 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.71989 seconds\n", + "2023/10/15 05:20:14 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.67083 seconds\n", + "2023/10/15 05:20:20 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.65917 seconds\n", + "2023/10/15 05:20:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.69164 seconds\n", + "2023/10/15 05:20:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.64225 seconds\n", + "2023/10/15 05:20:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.68242 seconds\n", + "2023/10/15 05:20:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.66408 seconds\n", + "2023/10/15 05:20:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.66224 seconds\n", + "2023/10/15 05:21:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.69885 seconds\n", + "2023/10/15 05:21:07 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.72717 seconds\n", + "2023/10/15 05:21:14 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.81598 seconds\n", + "2023/10/15 05:21:21 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.33922785310582226, Global best: 0.33922785310582226, Runtime: 6.66373 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.9166666666666667 0.8333333333333333 559\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:21:24 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:21:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.34613238149639414, Global best: 0.34613238149639414, Runtime: 6.74890 seconds\n", + "2023/10/15 05:21:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.34613238149639414, Global best: 0.34613238149639414, Runtime: 7.18628 seconds\n", + "2023/10/15 05:21:52 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3460532014790954, Global best: 0.3460532014790954, Runtime: 6.71006 seconds\n", + "2023/10/15 05:21:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.33910255012459944, Global best: 0.33910255012459944, Runtime: 6.68859 seconds\n", + "2023/10/15 05:22:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.33910255012459944, Global best: 0.33910255012459944, Runtime: 6.72496 seconds\n", + "2023/10/15 05:22:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.33736160081411726, Global best: 0.33736160081411726, Runtime: 6.71789 seconds\n", + "2023/10/15 05:22:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3356212588463334, Global best: 0.3356212588463334, Runtime: 6.72693 seconds\n", + "2023/10/15 05:22:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3356212588463334, Global best: 0.3356212588463334, Runtime: 6.66638 seconds\n", + "2023/10/15 05:22:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.3356212588463334, Global best: 0.3356212588463334, Runtime: 6.69876 seconds\n", + "2023/10/15 05:22:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.33222207781732777, Global best: 0.33222207781732777, Runtime: 6.72886 seconds\n", + "2023/10/15 05:22:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.33222207781732777, Global best: 0.33222207781732777, Runtime: 6.74562 seconds\n", + "2023/10/15 05:22:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.33222207781732777, Global best: 0.33222207781732777, Runtime: 6.76094 seconds\n", + "2023/10/15 05:23:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.33222207781732777, Global best: 0.33222207781732777, Runtime: 6.70357 seconds\n", + "2023/10/15 05:23:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.3311385731890613, Global best: 0.3311385731890613, Runtime: 6.71283 seconds\n", + "2023/10/15 05:23:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.3311385731890613, Global best: 0.3311385731890613, Runtime: 6.73001 seconds\n", + "2023/10/15 05:23:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.3311385731890613, Global best: 0.3311385731890613, Runtime: 6.71961 seconds\n", + "2023/10/15 05:23:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.3311385731890613, Global best: 0.3311385731890613, Runtime: 6.71896 seconds\n", + "2023/10/15 05:23:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.3311385731890613, Global best: 0.3311385731890613, Runtime: 6.67605 seconds\n", + "2023/10/15 05:23:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.3311385731890613, Global best: 0.3311385731890613, Runtime: 6.73510 seconds\n", + "2023/10/15 05:23:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.3311385731890613, Global best: 0.3311385731890613, Runtime: 6.68828 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.9583333333333333 0.8333333333333333 541\n", + "Triglav Stage 1 Base 0.9166666666666667 0.8333333333333333 317\n", + "Triglav MultiSURF 10 0.875 0.9166666666666667 10\n", + "Triglav MultiSURF 20 0.8333333333333333 0.875 20\n", + "Triglav MultiSURF 40 0.8333333333333333 0.8333333333333333 40\n", + "Triglav MultiSURF 60 0.9166666666666667 0.9166666666666667 60\n", + "Triglav MultiSURF 80 0.9166666666666667 0.9166666666666667 80\n", + "Triglav MultiSURF 100 0.9166666666666667 0.9166666666666667 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:24:12 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:24:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3295240378264007, Global best: 0.3295240378264007, Runtime: 13.06785 seconds\n", + "2023/10/15 05:24:46 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3295240378264007, Global best: 0.3295240378264007, Runtime: 13.06562 seconds\n", + "2023/10/15 05:24:59 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3288338900344516, Global best: 0.3288338900344516, Runtime: 13.80163 seconds\n", + "2023/10/15 05:25:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3288338900344516, Global best: 0.3288338900344516, Runtime: 13.74572 seconds\n", + "2023/10/15 05:25:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3229896126972866, Global best: 0.3229896126972866, Runtime: 13.87350 seconds\n", + "2023/10/15 05:25:41 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3229896126972866, Global best: 0.3229896126972866, Runtime: 13.78223 seconds\n", + "2023/10/15 05:25:55 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3229896126972866, Global best: 0.3229896126972866, Runtime: 14.55509 seconds\n", + "2023/10/15 05:26:09 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3192135232803619, Global best: 0.3192135232803619, Runtime: 13.25953 seconds\n", + "2023/10/15 05:26:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3192135232803619, Global best: 0.3192135232803619, Runtime: 13.09929 seconds\n", + "2023/10/15 05:26:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.31220134568972974, Global best: 0.31220134568972974, Runtime: 14.31734 seconds\n", + "2023/10/15 05:26:50 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.31220134568972974, Global best: 0.31220134568972974, Runtime: 13.96578 seconds\n", + "2023/10/15 05:27:04 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.31220134568972974, Global best: 0.31220134568972974, Runtime: 13.71326 seconds\n", + "2023/10/15 05:27:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3275989014039129, Global best: 0.31220134568972974, Runtime: 13.48268 seconds\n", + "2023/10/15 05:27:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3275989014039129, Global best: 0.31220134568972974, Runtime: 13.69944 seconds\n", + "2023/10/15 05:27:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.32756613475034213, Global best: 0.31220134568972974, Runtime: 14.33151 seconds\n", + "2023/10/15 05:27:59 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.32756613475034213, Global best: 0.31220134568972974, Runtime: 13.92267 seconds\n", + "2023/10/15 05:28:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.32756613475034213, Global best: 0.31220134568972974, Runtime: 13.48886 seconds\n", + "2023/10/15 05:28:26 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.32756613475034213, Global best: 0.31220134568972974, Runtime: 13.51193 seconds\n", + "2023/10/15 05:28:40 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3243816565127629, Global best: 0.31220134568972974, Runtime: 13.96242 seconds\n", + "2023/10/15 05:28:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3243816565127629, Global best: 0.31220134568972974, Runtime: 14.17488 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.9583333333333333 0.875 181\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:28:58 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:29:12 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.33194312223154276, Global best: 0.33194312223154276, Runtime: 6.53230 seconds\n", + "2023/10/15 05:29:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.33194312223154276, Global best: 0.33194312223154276, Runtime: 6.49864 seconds\n", + "2023/10/15 05:29:25 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.33194312223154276, Global best: 0.33194312223154276, Runtime: 6.51765 seconds\n", + "2023/10/15 05:29:31 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.33194312223154276, Global best: 0.33194312223154276, Runtime: 6.56385 seconds\n", + "2023/10/15 05:29:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.33194312223154276, Global best: 0.33194312223154276, Runtime: 6.50995 seconds\n", + "2023/10/15 05:29:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.33194312223154276, Global best: 0.33194312223154276, Runtime: 6.54521 seconds\n", + "2023/10/15 05:29:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.33194312223154276, Global best: 0.33194312223154276, Runtime: 6.51338 seconds\n", + "2023/10/15 05:29:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.33194312223154276, Global best: 0.33194312223154276, Runtime: 6.51552 seconds\n", + "2023/10/15 05:30:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.32361743136498156, Global best: 0.32361743136498156, Runtime: 6.47645 seconds\n", + "2023/10/15 05:30:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.32254010264556, Global best: 0.32254010264556, Runtime: 6.54682 seconds\n", + "2023/10/15 05:30:17 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.32254010264556, Global best: 0.32254010264556, Runtime: 6.51761 seconds\n", + "2023/10/15 05:30:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.31520900248236633, Global best: 0.31520900248236633, Runtime: 6.50609 seconds\n", + "2023/10/15 05:30:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.31520900248236633, Global best: 0.31520900248236633, Runtime: 6.49847 seconds\n", + "2023/10/15 05:30:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.31520900248236633, Global best: 0.31520900248236633, Runtime: 6.51799 seconds\n", + "2023/10/15 05:30:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.31252820784722257, Global best: 0.31252820784722257, Runtime: 6.55406 seconds\n", + "2023/10/15 05:30:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.30533202244597574, Global best: 0.30533202244597574, Runtime: 6.52755 seconds\n", + "2023/10/15 05:30:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.30533202244597574, Global best: 0.30533202244597574, Runtime: 6.54580 seconds\n", + "2023/10/15 05:31:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.30533202244597574, Global best: 0.30533202244597574, Runtime: 6.44128 seconds\n", + "2023/10/15 05:31:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.30533202244597574, Global best: 0.30533202244597574, Runtime: 6.50533 seconds\n", + "2023/10/15 05:31:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.30533202244597574, Global best: 0.30533202244597574, Runtime: 6.54604 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.9166666666666667 0.8333333333333333 163\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:31:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:31:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3271896826656939, Global best: 0.3271896826656939, Runtime: 6.53941 seconds\n", + "2023/10/15 05:31:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3244649923410417, Global best: 0.3244649923410417, Runtime: 6.50412 seconds\n", + "2023/10/15 05:31:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3217779827881771, Global best: 0.3217779827881771, Runtime: 6.49330 seconds\n", + "2023/10/15 05:31:53 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3217779827881771, Global best: 0.3217779827881771, Runtime: 6.52042 seconds\n", + "2023/10/15 05:32:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3097924539912431, Global best: 0.3097924539912431, Runtime: 6.53182 seconds\n", + "2023/10/15 05:32:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.30086323168511, Global best: 0.30086323168511, Runtime: 6.54572 seconds\n", + "2023/10/15 05:32:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.2959195219139019, Global best: 0.2959195219139019, Runtime: 6.56760 seconds\n", + "2023/10/15 05:32:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.2959195219139019, Global best: 0.2959195219139019, Runtime: 6.50561 seconds\n", + "2023/10/15 05:32:26 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2959195219139019, Global best: 0.2959195219139019, Runtime: 6.55101 seconds\n", + "2023/10/15 05:32:32 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2959195219139019, Global best: 0.2959195219139019, Runtime: 6.49324 seconds\n", + "2023/10/15 05:32:39 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.2959195219139019, Global best: 0.2959195219139019, Runtime: 6.46242 seconds\n", + "2023/10/15 05:32:45 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.2959195219139019, Global best: 0.2959195219139019, Runtime: 6.56607 seconds\n", + "2023/10/15 05:32:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.2959195219139019, Global best: 0.2959195219139019, Runtime: 6.56842 seconds\n", + "2023/10/15 05:32:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2959195219139019, Global best: 0.2959195219139019, Runtime: 6.49128 seconds\n", + "2023/10/15 05:33:05 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.29062549997743087, Global best: 0.29062549997743087, Runtime: 6.48306 seconds\n", + "2023/10/15 05:33:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.29062549997743087, Global best: 0.29062549997743087, Runtime: 6.55555 seconds\n", + "2023/10/15 05:33:18 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.29062549997743087, Global best: 0.29062549997743087, Runtime: 6.52148 seconds\n", + "2023/10/15 05:33:24 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.29062549997743087, Global best: 0.29062549997743087, Runtime: 6.42974 seconds\n", + "2023/10/15 05:33:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.29062549997743087, Global best: 0.29062549997743087, Runtime: 6.52113 seconds\n", + "2023/10/15 05:33:38 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.29062549997743087, Global best: 0.29062549997743087, Runtime: 6.53882 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.9166666666666667 0.9166666666666667 157\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:33:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:33:55 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.31603555160452224, Global best: 0.31603555160452224, Runtime: 6.52011 seconds\n", + "2023/10/15 05:34:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3153865049517573, Global best: 0.3153865049517573, Runtime: 6.52659 seconds\n", + "2023/10/15 05:34:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.31282991181141445, Global best: 0.31282991181141445, Runtime: 6.53282 seconds\n", + "2023/10/15 05:34:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.31282991181141445, Global best: 0.31282991181141445, Runtime: 6.50932 seconds\n", + "2023/10/15 05:34:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3092906952732053, Global best: 0.3092906952732053, Runtime: 6.43807 seconds\n", + "2023/10/15 05:34:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3019646301840717, Global best: 0.3019646301840717, Runtime: 6.52104 seconds\n", + "2023/10/15 05:34:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3019646301840717, Global best: 0.3019646301840717, Runtime: 6.53937 seconds\n", + "2023/10/15 05:34:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2962374728079451, Global best: 0.2962374728079451, Runtime: 7.02630 seconds\n", + "2023/10/15 05:34:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2872553240596867, Global best: 0.2872553240596867, Runtime: 6.48211 seconds\n", + "2023/10/15 05:34:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2872553240596867, Global best: 0.2872553240596867, Runtime: 6.47556 seconds\n", + "2023/10/15 05:35:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.2800066652138006, Global best: 0.2800066652138006, Runtime: 6.51814 seconds\n", + "2023/10/15 05:35:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2800066652138006, Global best: 0.2800066652138006, Runtime: 6.51228 seconds\n", + "2023/10/15 05:35:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2800066652138006, Global best: 0.2800066652138006, Runtime: 6.56399 seconds\n", + "2023/10/15 05:35:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2800066652138006, Global best: 0.2800066652138006, Runtime: 6.55115 seconds\n", + "2023/10/15 05:35:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2800066652138006, Global best: 0.2800066652138006, Runtime: 6.53283 seconds\n", + "2023/10/15 05:35:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2800066652138006, Global best: 0.2800066652138006, Runtime: 6.55582 seconds\n", + "2023/10/15 05:35:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2800066652138006, Global best: 0.2800066652138006, Runtime: 6.53090 seconds\n", + "2023/10/15 05:35:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2800066652138006, Global best: 0.2800066652138006, Runtime: 6.52918 seconds\n", + "2023/10/15 05:35:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.26780933964361586, Global best: 0.26780933964361586, Runtime: 6.47767 seconds\n", + "2023/10/15 05:35:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.26780933964361586, Global best: 0.26780933964361586, Runtime: 6.51384 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.9166666666666667 0.9166666666666667 145\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 433 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 204\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 204\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 204\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 204\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 204\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 204\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 204\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 217 / Rejected: 216\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 217 / Rejected: 216\n", + "Round 26 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 27 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 28 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 29 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 30 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 31 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 32 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 33 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 34 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 35 / Tentative (Accepted): 128 / Tentative (Not Accepted): 89 / Rejected: 216\n", + "Round 36 / Tentative (Accepted): 135 / Tentative (Not Accepted): 82 / Rejected: 216\n", + "Round 37 / Tentative (Accepted): 135 / Tentative (Not Accepted): 82 / Rejected: 216\n", + "Round 38 / Tentative (Accepted): 135 / Tentative (Not Accepted): 82 / Rejected: 216\n", + "Round 39 / Tentative (Accepted): 135 / Tentative (Not Accepted): 81 / Rejected: 217\n", + "Round 40 / Tentative (Accepted): 135 / Tentative (Not Accepted): 81 / Rejected: 217\n", + "Final Feature Set Contains 272 Features.\n", + "Control (Positive) 0.75 0.75 938\n", + "Control (Negative) 0.125 0.3125 938\n", + "ANOVA Base 0.75 0.75 282\n", + "Mutual Information (10) Base 0.75 0.6875 10\n", + "RFE (10) Base 0.75 0.75 10\n", + "MultiSURF (10) 0.75 0.75 10\n", + "Mutual Information (20) Base 0.75 0.625 20\n", + "RFE (20) Base 0.75 0.75 20\n", + "MultiSURF (20) 0.75 0.75 20\n", + "Mutual Information (40) Base 0.75 0.75 40\n", + "RFE (40) Base 0.75 0.75 40\n", + "MultiSURF (40) 0.75 0.75 40\n", + "Mutual Information (60) Base 0.75 0.75 60\n", + "RFE (60) Base 0.75 0.75 60\n", + "MultiSURF (60) 0.75 0.75 60\n", + "Mutual Information (80) Base 0.75 0.75 80\n", + "RFE (80) Base 0.75 0.75 80\n", + "MultiSURF (80) 0.75 0.75 80\n", + "Mutual Information (100) Base 0.75 0.75 100\n", + "RFE (100) Base 0.75 0.75 100\n", + "MultiSURF (100) 0.75 0.75 100\n", + "RFECV Base 0.75 0.75 64\n", + "Boruta Base 0.75 0.75 50\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:44:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:44:54 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3021233464993269, Global best: 0.3021233464993269, Runtime: 13.38927 seconds\n", + "2023/10/15 05:45:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3021233464993269, Global best: 0.3021233464993269, Runtime: 13.38349 seconds\n", + "2023/10/15 05:45:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3021233464993269, Global best: 0.3021233464993269, Runtime: 13.83665 seconds\n", + "2023/10/15 05:45:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3021233464993269, Global best: 0.3021233464993269, Runtime: 13.69428 seconds\n", + "2023/10/15 05:45:50 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.30156331549454324, Global best: 0.30156331549454324, Runtime: 14.70647 seconds\n", + "2023/10/15 05:46:04 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.30156331549454324, Global best: 0.30156331549454324, Runtime: 14.02541 seconds\n", + "2023/10/15 05:46:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.30156331549454324, Global best: 0.30156331549454324, Runtime: 14.70926 seconds\n", + "2023/10/15 05:46:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.30156331549454324, Global best: 0.30156331549454324, Runtime: 15.23441 seconds\n", + "2023/10/15 05:46:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.30156331549454324, Global best: 0.30156331549454324, Runtime: 13.80621 seconds\n", + "2023/10/15 05:47:02 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3061597234296616, Global best: 0.30156331549454324, Runtime: 14.43147 seconds\n", + "2023/10/15 05:47:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3051170430979355, Global best: 0.30156331549454324, Runtime: 14.00993 seconds\n", + "2023/10/15 05:47:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3051170430979355, Global best: 0.30156331549454324, Runtime: 14.01896 seconds\n", + "2023/10/15 05:47:44 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3051170430979355, Global best: 0.30156331549454324, Runtime: 13.54346 seconds\n", + "2023/10/15 05:47:58 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3013454869635245, Global best: 0.3013454869635245, Runtime: 14.40907 seconds\n", + "2023/10/15 05:48:13 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3013454869635245, Global best: 0.3013454869635245, Runtime: 14.70902 seconds\n", + "2023/10/15 05:48:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3013454869635245, Global best: 0.3013454869635245, Runtime: 14.27965 seconds\n", + "2023/10/15 05:48:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.309373968643542, Global best: 0.3013454869635245, Runtime: 14.62249 seconds\n", + "2023/10/15 05:48:56 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.309373968643542, Global best: 0.3013454869635245, Runtime: 13.98136 seconds\n", + "2023/10/15 05:49:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.309373968643542, Global best: 0.3013454869635245, Runtime: 14.23144 seconds\n", + "2023/10/15 05:49:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.309373968643542, Global best: 0.3013454869635245, Runtime: 14.02188 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.75 0.75 559\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:49:28 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:49:42 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.30797876142664493, Global best: 0.30797876142664493, Runtime: 6.77187 seconds\n", + "2023/10/15 05:49:49 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.30797876142664493, Global best: 0.30797876142664493, Runtime: 6.71987 seconds\n", + "2023/10/15 05:49:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.30797876142664493, Global best: 0.30797876142664493, Runtime: 6.70516 seconds\n", + "2023/10/15 05:50:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.30797876142664493, Global best: 0.30797876142664493, Runtime: 6.75069 seconds\n", + "2023/10/15 05:50:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3026275768073827, Global best: 0.3026275768073827, Runtime: 7.21418 seconds\n", + "2023/10/15 05:50:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3026275768073827, Global best: 0.3026275768073827, Runtime: 6.72744 seconds\n", + "2023/10/15 05:50:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3026275768073827, Global best: 0.3026275768073827, Runtime: 6.70549 seconds\n", + "2023/10/15 05:50:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3026275768073827, Global best: 0.3026275768073827, Runtime: 6.73291 seconds\n", + "2023/10/15 05:50:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3026275768073827, Global best: 0.3026275768073827, Runtime: 6.72471 seconds\n", + "2023/10/15 05:50:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3026275768073827, Global best: 0.3026275768073827, Runtime: 6.76988 seconds\n", + "2023/10/15 05:50:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3026275768073827, Global best: 0.3026275768073827, Runtime: 6.76676 seconds\n", + "2023/10/15 05:50:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3026275768073827, Global best: 0.3026275768073827, Runtime: 6.74916 seconds\n", + "2023/10/15 05:51:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3026275768073827, Global best: 0.3026275768073827, Runtime: 6.71531 seconds\n", + "2023/10/15 05:51:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.29039504830956697, Global best: 0.29039504830956697, Runtime: 6.71406 seconds\n", + "2023/10/15 05:51:17 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.29039504830956697, Global best: 0.29039504830956697, Runtime: 6.76518 seconds\n", + "2023/10/15 05:51:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.29039504830956697, Global best: 0.29039504830956697, Runtime: 6.69428 seconds\n", + "2023/10/15 05:51:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.29039504830956697, Global best: 0.29039504830956697, Runtime: 6.69326 seconds\n", + "2023/10/15 05:51:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.29039504830956697, Global best: 0.29039504830956697, Runtime: 6.70873 seconds\n", + "2023/10/15 05:51:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.29039504830956697, Global best: 0.29039504830956697, Runtime: 6.67790 seconds\n", + "2023/10/15 05:51:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.29039504830956697, Global best: 0.29039504830956697, Runtime: 6.75204 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.75 0.75 534\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:51:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:52:08 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.76257 seconds\n", + "2023/10/15 05:52:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.67809 seconds\n", + "2023/10/15 05:52:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.74844 seconds\n", + "2023/10/15 05:52:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.69037 seconds\n", + "2023/10/15 05:52:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.69808 seconds\n", + "2023/10/15 05:52:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.69975 seconds\n", + "2023/10/15 05:52:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.73333 seconds\n", + "2023/10/15 05:52:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.70053 seconds\n", + "2023/10/15 05:53:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.66063 seconds\n", + "2023/10/15 05:53:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.69435 seconds\n", + "2023/10/15 05:53:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.72501 seconds\n", + "2023/10/15 05:53:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.70351 seconds\n", + "2023/10/15 05:53:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.68848 seconds\n", + "2023/10/15 05:53:36 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.69497 seconds\n", + "2023/10/15 05:53:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.68967 seconds\n", + "2023/10/15 05:53:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.67523 seconds\n", + "2023/10/15 05:53:56 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.68165 seconds\n", + "2023/10/15 05:54:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.65837 seconds\n", + "2023/10/15 05:54:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 7.23737 seconds\n", + "2023/10/15 05:54:16 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.29725176363289424, Global best: 0.29725176363289424, Runtime: 6.70428 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.75 0.75 550\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:54:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:54:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.30368490035988427, Global best: 0.30368490035988427, Runtime: 6.69526 seconds\n", + "2023/10/15 05:54:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.30368490035988427, Global best: 0.30368490035988427, Runtime: 6.71209 seconds\n", + "2023/10/15 05:54:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3024139929882677, Global best: 0.3024139929882677, Runtime: 6.72908 seconds\n", + "2023/10/15 05:54:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2952444740964618, Global best: 0.2952444740964618, Runtime: 6.72973 seconds\n", + "2023/10/15 05:55:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.2952444740964618, Global best: 0.2952444740964618, Runtime: 6.68050 seconds\n", + "2023/10/15 05:55:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.2952444740964618, Global best: 0.2952444740964618, Runtime: 6.69971 seconds\n", + "2023/10/15 05:55:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2952444740964618, Global best: 0.2952444740964618, Runtime: 6.68300 seconds\n", + "2023/10/15 05:55:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.29468961661075604, Global best: 0.29468961661075604, Runtime: 6.70729 seconds\n", + "2023/10/15 05:55:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2921148723991336, Global best: 0.2921148723991336, Runtime: 6.70068 seconds\n", + "2023/10/15 05:55:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.2921148723991336, Global best: 0.2921148723991336, Runtime: 6.71509 seconds\n", + "2023/10/15 05:55:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.28245930216358056, Global best: 0.28245930216358056, Runtime: 6.67940 seconds\n", + "2023/10/15 05:55:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2783378924837814, Global best: 0.2783378924837814, Runtime: 6.67270 seconds\n", + "2023/10/15 05:55:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2783378924837814, Global best: 0.2783378924837814, Runtime: 6.68682 seconds\n", + "2023/10/15 05:56:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2783378924837814, Global best: 0.2783378924837814, Runtime: 6.66027 seconds\n", + "2023/10/15 05:56:08 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2783378924837814, Global best: 0.2783378924837814, Runtime: 6.66633 seconds\n", + "2023/10/15 05:56:15 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2783378924837814, Global best: 0.2783378924837814, Runtime: 6.72027 seconds\n", + "2023/10/15 05:56:21 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.275901910310268, Global best: 0.275901910310268, Runtime: 6.66332 seconds\n", + "2023/10/15 05:56:28 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.275901910310268, Global best: 0.275901910310268, Runtime: 6.71851 seconds\n", + "2023/10/15 05:56:35 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.27368081660821725, Global best: 0.27368081660821725, Runtime: 6.65543 seconds\n", + "2023/10/15 05:56:41 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.27368081660821725, Global best: 0.27368081660821725, Runtime: 6.68674 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.75 0.75 497\n", + "Triglav Stage 1 Base 0.75 0.75 272\n", + "Triglav MultiSURF 10 0.75 0.6875 10\n", + "Triglav MultiSURF 20 0.75 0.75 20\n", + "Triglav MultiSURF 40 0.75 0.75 40\n", + "Triglav MultiSURF 60 0.75 0.75 60\n", + "Triglav MultiSURF 80 0.75 0.75 80\n", + "Triglav MultiSURF 100 0.75 0.75 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 05:57:07 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 05:57:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.2623325584075716, Global best: 0.2623325584075716, Runtime: 13.02028 seconds\n", + "2023/10/15 05:57:40 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.2623325584075716, Global best: 0.2623325584075716, Runtime: 12.98952 seconds\n", + "2023/10/15 05:57:53 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.2623325584075716, Global best: 0.2623325584075716, Runtime: 13.41637 seconds\n", + "2023/10/15 05:58:07 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.27479692214817597, Global best: 0.2623325584075716, Runtime: 13.60566 seconds\n", + "2023/10/15 05:58:21 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.27479692214817597, Global best: 0.2623325584075716, Runtime: 13.84973 seconds\n", + "2023/10/15 05:58:35 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.27479692214817597, Global best: 0.2623325584075716, Runtime: 13.81761 seconds\n", + "2023/10/15 05:58:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.2794865805509925, Global best: 0.2623325584075716, Runtime: 13.65711 seconds\n", + "2023/10/15 05:59:01 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.2794865805509925, Global best: 0.2623325584075716, Runtime: 13.05187 seconds\n", + "2023/10/15 05:59:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.2794865805509925, Global best: 0.2623325584075716, Runtime: 13.90358 seconds\n", + "2023/10/15 05:59:29 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.2779442751199525, Global best: 0.2623325584075716, Runtime: 13.44354 seconds\n", + "2023/10/15 05:59:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.2779442751199525, Global best: 0.2623325584075716, Runtime: 13.63390 seconds\n", + "2023/10/15 05:59:56 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.2779442751199525, Global best: 0.2623325584075716, Runtime: 13.34999 seconds\n", + "2023/10/15 06:00:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.26789750858654776, Global best: 0.2623325584075716, Runtime: 14.00154 seconds\n", + "2023/10/15 06:00:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.26789750858654776, Global best: 0.2623325584075716, Runtime: 13.82405 seconds\n", + "2023/10/15 06:00:38 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.26789750858654776, Global best: 0.2623325584075716, Runtime: 13.93967 seconds\n", + "2023/10/15 06:00:51 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.2801474766058444, Global best: 0.2623325584075716, Runtime: 13.44390 seconds\n", + "2023/10/15 06:01:05 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.2831546036159904, Global best: 0.2623325584075716, Runtime: 14.34445 seconds\n", + "2023/10/15 06:01:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.2831546036159904, Global best: 0.2623325584075716, Runtime: 13.74998 seconds\n", + "2023/10/15 06:01:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.2831546036159904, Global best: 0.2623325584075716, Runtime: 14.11649 seconds\n", + "2023/10/15 06:01:47 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.2831546036159904, Global best: 0.2623325584075716, Runtime: 13.45468 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.75 0.75 140\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:01:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:02:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.28189904412350647, Global best: 0.28189904412350647, Runtime: 6.52963 seconds\n", + "2023/10/15 06:02:11 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.28189904412350647, Global best: 0.28189904412350647, Runtime: 6.55176 seconds\n", + "2023/10/15 06:02:17 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.28189904412350647, Global best: 0.28189904412350647, Runtime: 6.49654 seconds\n", + "2023/10/15 06:02:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.28189904412350647, Global best: 0.28189904412350647, Runtime: 6.50967 seconds\n", + "2023/10/15 06:02:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.2793266768512245, Global best: 0.2793266768512245, Runtime: 6.49536 seconds\n", + "2023/10/15 06:02:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.2735091810854399, Global best: 0.2735091810854399, Runtime: 6.46478 seconds\n", + "2023/10/15 06:02:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.2735091810854399, Global best: 0.2735091810854399, Runtime: 6.47609 seconds\n", + "2023/10/15 06:02:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.2735091810854399, Global best: 0.2735091810854399, Runtime: 6.48566 seconds\n", + "2023/10/15 06:02:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.25849683386645567, Global best: 0.25849683386645567, Runtime: 6.53611 seconds\n", + "2023/10/15 06:03:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.2525762767185083, Global best: 0.2525762767185083, Runtime: 6.47146 seconds\n", + "2023/10/15 06:03:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.2525762767185083, Global best: 0.2525762767185083, Runtime: 6.48871 seconds\n", + "2023/10/15 06:03:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.2525762767185083, Global best: 0.2525762767185083, Runtime: 6.48564 seconds\n", + "2023/10/15 06:03:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.2525762767185083, Global best: 0.2525762767185083, Runtime: 6.51158 seconds\n", + "2023/10/15 06:03:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.2525762767185083, Global best: 0.2525762767185083, Runtime: 6.50699 seconds\n", + "2023/10/15 06:03:35 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.2525762767185083, Global best: 0.2525762767185083, Runtime: 6.50350 seconds\n", + "2023/10/15 06:03:42 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.2484218281030897, Global best: 0.2484218281030897, Runtime: 6.47885 seconds\n", + "2023/10/15 06:03:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.2484218281030897, Global best: 0.2484218281030897, Runtime: 6.45730 seconds\n", + "2023/10/15 06:03:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.24783588376595117, Global best: 0.24783588376595117, Runtime: 6.55169 seconds\n", + "2023/10/15 06:04:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.24783588376595117, Global best: 0.24783588376595117, Runtime: 6.48372 seconds\n", + "2023/10/15 06:04:08 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.24783588376595117, Global best: 0.24783588376595117, Runtime: 6.50503 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.75 0.75 135\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:04:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:04:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.2700692036525359, Global best: 0.2700692036525359, Runtime: 6.53391 seconds\n", + "2023/10/15 06:04:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.2700692036525359, Global best: 0.2700692036525359, Runtime: 6.44516 seconds\n", + "2023/10/15 06:04:38 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.2700692036525359, Global best: 0.2700692036525359, Runtime: 6.49667 seconds\n", + "2023/10/15 06:04:45 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.2622412350745823, Global best: 0.2622412350745823, Runtime: 7.02074 seconds\n", + "2023/10/15 06:04:51 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.2611760368782347, Global best: 0.2611760368782347, Runtime: 6.50397 seconds\n", + "2023/10/15 06:04:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.2526859143377039, Global best: 0.2526859143377039, Runtime: 6.44883 seconds\n", + "2023/10/15 06:05:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.2526859143377039, Global best: 0.2526859143377039, Runtime: 6.48748 seconds\n", + "2023/10/15 06:05:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.2452793536675973, Global best: 0.2452793536675973, Runtime: 6.47271 seconds\n", + "2023/10/15 06:05:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2452793536675973, Global best: 0.2452793536675973, Runtime: 6.48958 seconds\n", + "2023/10/15 06:05:24 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.23934028648012756, Global best: 0.23934028648012756, Runtime: 6.44384 seconds\n", + "2023/10/15 06:05:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.23934028648012756, Global best: 0.23934028648012756, Runtime: 6.51152 seconds\n", + "2023/10/15 06:05:37 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.23934028648012756, Global best: 0.23934028648012756, Runtime: 6.48216 seconds\n", + "2023/10/15 06:05:43 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.23934028648012756, Global best: 0.23934028648012756, Runtime: 6.51859 seconds\n", + "2023/10/15 06:05:50 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2308938218359674, Global best: 0.2308938218359674, Runtime: 6.52228 seconds\n", + "2023/10/15 06:05:56 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.2308938218359674, Global best: 0.2308938218359674, Runtime: 6.48319 seconds\n", + "2023/10/15 06:06:03 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2308938218359674, Global best: 0.2308938218359674, Runtime: 6.48583 seconds\n", + "2023/10/15 06:06:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2308938218359674, Global best: 0.2308938218359674, Runtime: 6.47275 seconds\n", + "2023/10/15 06:06:16 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.22732658914694728, Global best: 0.22732658914694728, Runtime: 6.43488 seconds\n", + "2023/10/15 06:06:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.22732658914694728, Global best: 0.22732658914694728, Runtime: 6.51625 seconds\n", + "2023/10/15 06:06:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.22732658914694728, Global best: 0.22732658914694728, Runtime: 6.48671 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.75 0.75 128\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:06:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:06:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2722188266995166, Global best: 0.2722188266995166, Runtime: 6.48111 seconds\n", + "2023/10/15 06:06:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.26378564089645634, Global best: 0.26378564089645634, Runtime: 6.49215 seconds\n", + "2023/10/15 06:06:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.26256172466520994, Global best: 0.26256172466520994, Runtime: 6.45210 seconds\n", + "2023/10/15 06:07:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2600422011869899, Global best: 0.2600422011869899, Runtime: 6.47269 seconds\n", + "2023/10/15 06:07:12 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.25165826723541296, Global best: 0.25165826723541296, Runtime: 6.49249 seconds\n", + "2023/10/15 06:07:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.24958653789052399, Global best: 0.24958653789052399, Runtime: 6.53389 seconds\n", + "2023/10/15 06:07:25 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.2481790052880617, Global best: 0.2481790052880617, Runtime: 6.49257 seconds\n", + "2023/10/15 06:07:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.2481790052880617, Global best: 0.2481790052880617, Runtime: 6.54670 seconds\n", + "2023/10/15 06:07:38 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.2472480711222269, Global best: 0.2472480711222269, Runtime: 6.50566 seconds\n", + "2023/10/15 06:07:45 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.23988950775827622, Global best: 0.23988950775827622, Runtime: 6.48181 seconds\n", + "2023/10/15 06:07:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.23988950775827622, Global best: 0.23988950775827622, Runtime: 6.54153 seconds\n", + "2023/10/15 06:07:58 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.2354539591257049, Global best: 0.2354539591257049, Runtime: 6.52775 seconds\n", + "2023/10/15 06:08:04 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.2354539591257049, Global best: 0.2354539591257049, Runtime: 6.45599 seconds\n", + "2023/10/15 06:08:11 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.23382444794869617, Global best: 0.23382444794869617, Runtime: 6.44000 seconds\n", + "2023/10/15 06:08:17 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.23382444794869617, Global best: 0.23382444794869617, Runtime: 6.51376 seconds\n", + "2023/10/15 06:08:24 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.23022186846029002, Global best: 0.23022186846029002, Runtime: 6.51125 seconds\n", + "2023/10/15 06:08:30 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.22819504557612005, Global best: 0.22819504557612005, Runtime: 6.48833 seconds\n", + "2023/10/15 06:08:37 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.22819504557612005, Global best: 0.22819504557612005, Runtime: 7.09294 seconds\n", + "2023/10/15 06:08:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.22819504557612005, Global best: 0.22819504557612005, Runtime: 6.51706 seconds\n", + "2023/10/15 06:08:50 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.22169017983395906, Global best: 0.22169017983395906, Runtime: 6.50998 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.75 0.75 119\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 482 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 244\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 244\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 244\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 244\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 244\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 244\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 244\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 238 / Rejected: 244\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 253\n", + "Round 26 / Tentative (Accepted): 143 / Tentative (Not Accepted): 86 / Rejected: 253\n", + "Round 27 / Tentative (Accepted): 143 / Tentative (Not Accepted): 86 / Rejected: 253\n", + "Round 28 / Tentative (Accepted): 143 / Tentative (Not Accepted): 86 / Rejected: 253\n", + "Round 29 / Tentative (Accepted): 143 / Tentative (Not Accepted): 86 / Rejected: 253\n", + "Round 30 / Tentative (Accepted): 143 / Tentative (Not Accepted): 86 / Rejected: 253\n", + "Round 31 / Tentative (Accepted): 143 / Tentative (Not Accepted): 86 / Rejected: 253\n", + "Round 32 / Tentative (Accepted): 143 / Tentative (Not Accepted): 84 / Rejected: 255\n", + "Round 33 / Tentative (Accepted): 143 / Tentative (Not Accepted): 84 / Rejected: 255\n", + "Round 34 / Tentative (Accepted): 143 / Tentative (Not Accepted): 84 / Rejected: 255\n", + "Round 35 / Tentative (Accepted): 143 / Tentative (Not Accepted): 84 / Rejected: 255\n", + "Round 36 / Tentative (Accepted): 146 / Tentative (Not Accepted): 81 / Rejected: 255\n", + "Round 37 / Tentative (Accepted): 146 / Tentative (Not Accepted): 81 / Rejected: 255\n", + "Round 38 / Tentative (Accepted): 146 / Tentative (Not Accepted): 81 / Rejected: 255\n", + "Round 39 / Tentative (Accepted): 146 / Tentative (Not Accepted): 80 / Rejected: 256\n", + "Round 40 / Tentative (Accepted): 146 / Tentative (Not Accepted): 80 / Rejected: 256\n", + "Final Feature Set Contains 275 Features.\n", + "Control (Positive) 0.9 1.0 938\n", + "Control (Negative) 0.6 0.4833333333333333 938\n", + "ANOVA Base 0.9 1.0 234\n", + "Mutual Information (10) Base 0.8166666666666667 0.9166666666666667 10\n", + "RFE (10) Base 0.95 1.0 10\n", + "MultiSURF (10) 0.9 0.8166666666666667 10\n", + "Mutual Information (20) Base 0.9 0.8666666666666667 20\n", + "RFE (20) Base 1.0 0.9166666666666667 20\n", + "MultiSURF (20) 1.0 0.8666666666666667 20\n", + "Mutual Information (40) Base 0.9 1.0 40\n", + "RFE (40) Base 1.0 0.9166666666666667 40\n", + "MultiSURF (40) 1.0 0.8666666666666667 40\n", + "Mutual Information (60) Base 0.85 1.0 60\n", + "RFE (60) Base 0.95 0.9166666666666667 60\n", + "MultiSURF (60) 0.9 0.8166666666666667 60\n", + "Mutual Information (80) Base 0.85 0.9 80\n", + "RFE (80) Base 1.0 1.0 80\n", + "MultiSURF (80) 0.9 0.9166666666666667 80\n", + "Mutual Information (100) Base 0.85 0.9 100\n", + "RFE (100) Base 0.95 0.9166666666666667 100\n", + "MultiSURF (100) 0.9 0.9166666666666667 100\n", + "RFECV Base 0.9 1.0 64\n", + "Boruta Base 0.95 0.9166666666666667 51\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:17:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:17:51 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.33551396650447446, Global best: 0.33551396650447446, Runtime: 13.35225 seconds\n", + "2023/10/15 06:18:04 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.33551396650447446, Global best: 0.33551396650447446, Runtime: 13.36528 seconds\n", + "2023/10/15 06:18:17 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.33551396650447446, Global best: 0.33551396650447446, Runtime: 13.47439 seconds\n", + "2023/10/15 06:18:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.33551396650447446, Global best: 0.33551396650447446, Runtime: 13.81006 seconds\n", + "2023/10/15 06:18:47 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.3299275903610643, Global best: 0.3299275903610643, Runtime: 15.41866 seconds\n", + "2023/10/15 06:19:00 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3299275903610643, Global best: 0.3299275903610643, Runtime: 13.59561 seconds\n", + "2023/10/15 06:19:14 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3299275903610643, Global best: 0.3299275903610643, Runtime: 14.19460 seconds\n", + "2023/10/15 06:19:30 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.32715215152375765, Global best: 0.32715215152375765, Runtime: 15.46337 seconds\n", + "2023/10/15 06:19:44 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.32715215152375765, Global best: 0.32715215152375765, Runtime: 14.03317 seconds\n", + "2023/10/15 06:19:58 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.31959047476637226, Global best: 0.31959047476637226, Runtime: 14.12303 seconds\n", + "2023/10/15 06:20:12 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.31959047476637226, Global best: 0.31959047476637226, Runtime: 14.11103 seconds\n", + "2023/10/15 06:20:26 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.31959047476637226, Global best: 0.31959047476637226, Runtime: 13.99293 seconds\n", + "2023/10/15 06:20:40 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.336116069698642, Global best: 0.31959047476637226, Runtime: 14.07308 seconds\n", + "2023/10/15 06:20:55 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.336116069698642, Global best: 0.31959047476637226, Runtime: 14.70301 seconds\n", + "2023/10/15 06:21:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3394787752529049, Global best: 0.31959047476637226, Runtime: 14.95750 seconds\n", + "2023/10/15 06:21:24 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3400753128068698, Global best: 0.31959047476637226, Runtime: 13.84570 seconds\n", + "2023/10/15 06:21:38 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.33863481750247093, Global best: 0.31959047476637226, Runtime: 14.11380 seconds\n", + "2023/10/15 06:21:53 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3283257467030141, Global best: 0.31959047476637226, Runtime: 15.18152 seconds\n", + "2023/10/15 06:22:08 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.3283257467030141, Global best: 0.31959047476637226, Runtime: 14.58072 seconds\n", + "2023/10/15 06:22:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.3283257467030141, Global best: 0.31959047476637226, Runtime: 14.54063 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.9 1.0 542\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:22:26 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:22:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3359097762239006, Global best: 0.3359097762239006, Runtime: 6.69657 seconds\n", + "2023/10/15 06:22:47 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.66311 seconds\n", + "2023/10/15 06:22:54 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.65859 seconds\n", + "2023/10/15 06:23:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.70107 seconds\n", + "2023/10/15 06:23:07 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.68384 seconds\n", + "2023/10/15 06:23:14 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.66076 seconds\n", + "2023/10/15 06:23:21 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.71541 seconds\n", + "2023/10/15 06:23:27 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.68655 seconds\n", + "2023/10/15 06:23:34 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.73670 seconds\n", + "2023/10/15 06:23:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.69910 seconds\n", + "2023/10/15 06:23:47 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.72042 seconds\n", + "2023/10/15 06:23:54 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.71197 seconds\n", + "2023/10/15 06:24:01 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.70187 seconds\n", + "2023/10/15 06:24:08 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.71675 seconds\n", + "2023/10/15 06:24:14 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.65951 seconds\n", + "2023/10/15 06:24:21 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.70311 seconds\n", + "2023/10/15 06:24:28 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.70866 seconds\n", + "2023/10/15 06:24:34 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.71762 seconds\n", + "2023/10/15 06:24:41 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.71038 seconds\n", + "2023/10/15 06:24:48 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.31940562817545487, Global best: 0.31940562817545487, Runtime: 6.71446 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.9 1.0 541\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:24:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:25:06 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.71913 seconds\n", + "2023/10/15 06:25:12 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.74074 seconds\n", + "2023/10/15 06:25:19 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.67709 seconds\n", + "2023/10/15 06:25:26 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.81965 seconds\n", + "2023/10/15 06:25:33 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.70329 seconds\n", + "2023/10/15 06:25:39 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.71209 seconds\n", + "2023/10/15 06:25:46 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.73253 seconds\n", + "2023/10/15 06:25:53 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.73674 seconds\n", + "2023/10/15 06:26:00 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.70961 seconds\n", + "2023/10/15 06:26:07 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 7.29995 seconds\n", + "2023/10/15 06:26:14 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.71859 seconds\n", + "2023/10/15 06:26:20 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.75690 seconds\n", + "2023/10/15 06:26:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.71876 seconds\n", + "2023/10/15 06:26:34 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.68637 seconds\n", + "2023/10/15 06:26:41 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.74494 seconds\n", + "2023/10/15 06:26:47 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.66814 seconds\n", + "2023/10/15 06:26:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.77331 seconds\n", + "2023/10/15 06:27:01 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.71307 seconds\n", + "2023/10/15 06:27:07 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.69328 seconds\n", + "2023/10/15 06:27:14 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3270402936662188, Global best: 0.3270402936662188, Runtime: 6.71537 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.85 0.95 529\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:27:18 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:27:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.32560022783968345, Global best: 0.32560022783968345, Runtime: 6.74012 seconds\n", + "2023/10/15 06:27:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.324638349066925, Global best: 0.324638349066925, Runtime: 6.73008 seconds\n", + "2023/10/15 06:27:45 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.31599121750139925, Global best: 0.31599121750139925, Runtime: 6.71832 seconds\n", + "2023/10/15 06:27:52 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.31260809140423257, Global best: 0.31260809140423257, Runtime: 6.71497 seconds\n", + "2023/10/15 06:27:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.31260809140423257, Global best: 0.31260809140423257, Runtime: 6.71808 seconds\n", + "2023/10/15 06:28:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3122740374431218, Global best: 0.3122740374431218, Runtime: 6.67998 seconds\n", + "2023/10/15 06:28:12 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.31146549900268083, Global best: 0.31146549900268083, Runtime: 6.64582 seconds\n", + "2023/10/15 06:28:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.3044557022868187, Global best: 0.3044557022868187, Runtime: 6.76137 seconds\n", + "2023/10/15 06:28:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.30414683738201065, Global best: 0.30414683738201065, Runtime: 6.70082 seconds\n", + "2023/10/15 06:28:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.30414683738201065, Global best: 0.30414683738201065, Runtime: 6.66140 seconds\n", + "2023/10/15 06:28:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.30076008324457415, Global best: 0.30076008324457415, Runtime: 6.71105 seconds\n", + "2023/10/15 06:28:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.30076008324457415, Global best: 0.30076008324457415, Runtime: 6.69155 seconds\n", + "2023/10/15 06:28:52 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.30076008324457415, Global best: 0.30076008324457415, Runtime: 6.71712 seconds\n", + "2023/10/15 06:28:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2996142201810765, Global best: 0.2996142201810765, Runtime: 6.70585 seconds\n", + "2023/10/15 06:29:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2996142201810765, Global best: 0.2996142201810765, Runtime: 6.77333 seconds\n", + "2023/10/15 06:29:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.2996142201810765, Global best: 0.2996142201810765, Runtime: 6.70976 seconds\n", + "2023/10/15 06:29:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2988041596575457, Global best: 0.2988041596575457, Runtime: 6.73324 seconds\n", + "2023/10/15 06:29:26 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2988041596575457, Global best: 0.2988041596575457, Runtime: 6.72686 seconds\n", + "2023/10/15 06:29:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2987451481445167, Global best: 0.2987451481445167, Runtime: 6.63342 seconds\n", + "2023/10/15 06:29:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2987451481445167, Global best: 0.2987451481445167, Runtime: 6.66976 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.9 0.9166666666666667 491\n", + "Triglav Stage 1 Base 0.95 1.0 275\n", + "Triglav MultiSURF 10 0.85 0.75 10\n", + "Triglav MultiSURF 20 0.9 0.8 20\n", + "Triglav MultiSURF 40 1.0 0.95 40\n", + "Triglav MultiSURF 60 1.0 1.0 60\n", + "Triglav MultiSURF 80 0.95 0.95 80\n", + "Triglav MultiSURF 100 0.95 1.0 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:30:05 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:30:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.31980498648865624, Global best: 0.31980498648865624, Runtime: 13.00919 seconds\n", + "2023/10/15 06:30:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.31980498648865624, Global best: 0.31980498648865624, Runtime: 13.82259 seconds\n", + "2023/10/15 06:30:52 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.31980498648865624, Global best: 0.31980498648865624, Runtime: 13.16588 seconds\n", + "2023/10/15 06:31:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.32457350318850114, Global best: 0.31980498648865624, Runtime: 13.46767 seconds\n", + "2023/10/15 06:31:20 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33449195087969935, Global best: 0.31980498648865624, Runtime: 14.22565 seconds\n", + "2023/10/15 06:31:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.3324278482588646, Global best: 0.31980498648865624, Runtime: 14.07519 seconds\n", + "2023/10/15 06:31:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.3217136148353791, Global best: 0.31980498648865624, Runtime: 13.90446 seconds\n", + "2023/10/15 06:32:01 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.316666273727273, Global best: 0.316666273727273, Runtime: 13.10410 seconds\n", + "2023/10/15 06:32:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.316666273727273, Global best: 0.316666273727273, Runtime: 13.64769 seconds\n", + "2023/10/15 06:32:29 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.316666273727273, Global best: 0.316666273727273, Runtime: 13.83685 seconds\n", + "2023/10/15 06:32:42 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.316666273727273, Global best: 0.316666273727273, Runtime: 13.64834 seconds\n", + "2023/10/15 06:32:56 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3193671944446949, Global best: 0.316666273727273, Runtime: 13.68810 seconds\n", + "2023/10/15 06:33:11 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3193671944446949, Global best: 0.316666273727273, Runtime: 15.13527 seconds\n", + "2023/10/15 06:33:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3193671944446949, Global best: 0.316666273727273, Runtime: 13.64788 seconds\n", + "2023/10/15 06:33:38 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.3193671944446949, Global best: 0.316666273727273, Runtime: 13.25924 seconds\n", + "2023/10/15 06:33:52 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.3282135664234907, Global best: 0.316666273727273, Runtime: 13.64204 seconds\n", + "2023/10/15 06:34:05 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.3282135664234907, Global best: 0.316666273727273, Runtime: 13.64957 seconds\n", + "2023/10/15 06:34:19 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3282135664234907, Global best: 0.316666273727273, Runtime: 13.77989 seconds\n", + "2023/10/15 06:34:33 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.32168738857005735, Global best: 0.316666273727273, Runtime: 13.48567 seconds\n", + "2023/10/15 06:34:47 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.32168738857005735, Global best: 0.316666273727273, Runtime: 14.49512 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.95 1.0 152\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:34:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:35:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.32516881231878586, Global best: 0.32516881231878586, Runtime: 6.53384 seconds\n", + "2023/10/15 06:35:11 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.31989388983810807, Global best: 0.31989388983810807, Runtime: 6.52919 seconds\n", + "2023/10/15 06:35:17 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.31989388983810807, Global best: 0.31989388983810807, Runtime: 6.49913 seconds\n", + "2023/10/15 06:35:24 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.31989388983810807, Global best: 0.31989388983810807, Runtime: 6.47316 seconds\n", + "2023/10/15 06:35:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3196711547944364, Global best: 0.3196711547944364, Runtime: 6.43358 seconds\n", + "2023/10/15 06:35:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.31167040244533606, Global best: 0.31167040244533606, Runtime: 6.51865 seconds\n", + "2023/10/15 06:35:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.48105 seconds\n", + "2023/10/15 06:35:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.46237 seconds\n", + "2023/10/15 06:35:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.46855 seconds\n", + "2023/10/15 06:36:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.53532 seconds\n", + "2023/10/15 06:36:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.48339 seconds\n", + "2023/10/15 06:36:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.48400 seconds\n", + "2023/10/15 06:36:22 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.48141 seconds\n", + "2023/10/15 06:36:29 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.45166 seconds\n", + "2023/10/15 06:36:35 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.47491 seconds\n", + "2023/10/15 06:36:42 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.47541 seconds\n", + "2023/10/15 06:36:49 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 7.04537 seconds\n", + "2023/10/15 06:36:55 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.46673 seconds\n", + "2023/10/15 06:37:02 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.47954 seconds\n", + "2023/10/15 06:37:08 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.30705043860225534, Global best: 0.30705043860225534, Runtime: 6.48959 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.9 1.0 135\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:37:12 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:37:26 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3178350172529197, Global best: 0.3178350172529197, Runtime: 6.57274 seconds\n", + "2023/10/15 06:37:32 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3178350172529197, Global best: 0.3178350172529197, Runtime: 6.49529 seconds\n", + "2023/10/15 06:37:39 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3178350172529197, Global best: 0.3178350172529197, Runtime: 6.55828 seconds\n", + "2023/10/15 06:37:45 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3178350172529197, Global best: 0.3178350172529197, Runtime: 6.44964 seconds\n", + "2023/10/15 06:37:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.2976445808729208, Global best: 0.2976445808729208, Runtime: 6.57243 seconds\n", + "2023/10/15 06:37:58 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.2976445808729208, Global best: 0.2976445808729208, Runtime: 6.48821 seconds\n", + "2023/10/15 06:38:05 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.2934442789351468, Global best: 0.2934442789351468, Runtime: 6.53135 seconds\n", + "2023/10/15 06:38:11 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.29146468957814625, Global best: 0.29146468957814625, Runtime: 6.54252 seconds\n", + "2023/10/15 06:38:18 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.28123211128744546, Global best: 0.28123211128744546, Runtime: 6.45342 seconds\n", + "2023/10/15 06:38:24 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.280835145974961, Global best: 0.280835145974961, Runtime: 6.56944 seconds\n", + "2023/10/15 06:38:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.27698193367539975, Global best: 0.27698193367539975, Runtime: 6.49887 seconds\n", + "2023/10/15 06:38:37 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.27092853366510183, Global best: 0.27092853366510183, Runtime: 6.54576 seconds\n", + "2023/10/15 06:38:44 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.27092853366510183, Global best: 0.27092853366510183, Runtime: 6.54877 seconds\n", + "2023/10/15 06:38:51 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.26931581875277183, Global best: 0.26931581875277183, Runtime: 6.58734 seconds\n", + "2023/10/15 06:38:57 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.2691884531757059, Global best: 0.2691884531757059, Runtime: 6.46931 seconds\n", + "2023/10/15 06:39:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.265597779712286, Global best: 0.265597779712286, Runtime: 6.49925 seconds\n", + "2023/10/15 06:39:10 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2633934438021806, Global best: 0.2633934438021806, Runtime: 6.55623 seconds\n", + "2023/10/15 06:39:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.26053194851684214, Global best: 0.26053194851684214, Runtime: 6.51144 seconds\n", + "2023/10/15 06:39:23 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.25812778591498176, Global best: 0.25812778591498176, Runtime: 6.52586 seconds\n", + "2023/10/15 06:39:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.25812778591498176, Global best: 0.25812778591498176, Runtime: 6.44976 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.95 1.0 114\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:39:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:39:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.31409636681933617, Global best: 0.31409636681933617, Runtime: 6.56353 seconds\n", + "2023/10/15 06:39:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3103873889990565, Global best: 0.3103873889990565, Runtime: 6.49645 seconds\n", + "2023/10/15 06:40:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3088060200391009, Global best: 0.3088060200391009, Runtime: 6.57688 seconds\n", + "2023/10/15 06:40:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.30687936310783415, Global best: 0.30687936310783415, Runtime: 6.51627 seconds\n", + "2023/10/15 06:40:13 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3067989469215342, Global best: 0.3067989469215342, Runtime: 6.47757 seconds\n", + "2023/10/15 06:40:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3067989469215342, Global best: 0.3067989469215342, Runtime: 6.51074 seconds\n", + "2023/10/15 06:40:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.30431774555332497, Global best: 0.30431774555332497, Runtime: 7.04604 seconds\n", + "2023/10/15 06:40:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.30221411164405776, Global best: 0.30221411164405776, Runtime: 6.54043 seconds\n", + "2023/10/15 06:40:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.30065060037264724, Global best: 0.30065060037264724, Runtime: 6.53067 seconds\n", + "2023/10/15 06:40:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.29670678123524297, Global best: 0.29670678123524297, Runtime: 6.48248 seconds\n", + "2023/10/15 06:40:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.29670678123524297, Global best: 0.29670678123524297, Runtime: 6.51842 seconds\n", + "2023/10/15 06:40:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.28560976530523924, Global best: 0.28560976530523924, Runtime: 6.52836 seconds\n", + "2023/10/15 06:41:06 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.28560976530523924, Global best: 0.28560976530523924, Runtime: 6.46423 seconds\n", + "2023/10/15 06:41:12 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.28389294795637837, Global best: 0.28389294795637837, Runtime: 6.53842 seconds\n", + "2023/10/15 06:41:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.28389294795637837, Global best: 0.28389294795637837, Runtime: 6.46639 seconds\n", + "2023/10/15 06:41:25 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.28389294795637837, Global best: 0.28389294795637837, Runtime: 6.49581 seconds\n", + "2023/10/15 06:41:32 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.28389294795637837, Global best: 0.28389294795637837, Runtime: 6.45650 seconds\n", + "2023/10/15 06:41:38 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.2811879340227873, Global best: 0.2811879340227873, Runtime: 6.48557 seconds\n", + "2023/10/15 06:41:45 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.27828677318081524, Global best: 0.27828677318081524, Runtime: 6.49552 seconds\n", + "2023/10/15 06:41:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.27828677318081524, Global best: 0.27828677318081524, Runtime: 6.46067 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.9 1.0 126\n", + "Stage One: Identifying an initial set of tentative features...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 455 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 226 / Rejected: 229\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 226 / Rejected: 229\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 226 / Rejected: 229\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 226 / Rejected: 229\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 226 / Rejected: 229\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 226 / Rejected: 229\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 226 / Rejected: 229\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 226 / Rejected: 229\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 226 / Rejected: 229\n", + "Round 26 / Tentative (Accepted): 123 / Tentative (Not Accepted): 103 / Rejected: 229\n", + "Round 27 / Tentative (Accepted): 123 / Tentative (Not Accepted): 103 / Rejected: 229\n", + "Round 28 / Tentative (Accepted): 123 / Tentative (Not Accepted): 103 / Rejected: 229\n", + "Round 29 / Tentative (Accepted): 123 / Tentative (Not Accepted): 103 / Rejected: 229\n", + "Round 30 / Tentative (Accepted): 123 / Tentative (Not Accepted): 103 / Rejected: 229\n", + "Round 31 / Tentative (Accepted): 123 / Tentative (Not Accepted): 103 / Rejected: 229\n", + "Round 32 / Tentative (Accepted): 123 / Tentative (Not Accepted): 103 / Rejected: 229\n", + "Round 33 / Tentative (Accepted): 123 / Tentative (Not Accepted): 103 / Rejected: 229\n", + "Round 34 / Tentative (Accepted): 123 / Tentative (Not Accepted): 103 / Rejected: 229\n", + "Round 35 / Tentative (Accepted): 123 / Tentative (Not Accepted): 102 / Rejected: 230\n", + "Round 36 / Tentative (Accepted): 129 / Tentative (Not Accepted): 96 / Rejected: 230\n", + "Round 37 / Tentative (Accepted): 129 / Tentative (Not Accepted): 94 / Rejected: 232\n", + "Round 38 / Tentative (Accepted): 129 / Tentative (Not Accepted): 94 / Rejected: 232\n", + "Round 39 / Tentative (Accepted): 129 / Tentative (Not Accepted): 94 / Rejected: 232\n", + "Round 40 / Tentative (Accepted): 129 / Tentative (Not Accepted): 94 / Rejected: 232\n", + "Final Feature Set Contains 247 Features.\n", + "Control (Positive) 0.7833333333333333 0.9166666666666667 938\n", + "Control (Negative) 0.6166666666666667 0.5 938\n", + "ANOVA Base 0.8333333333333333 0.8333333333333333 261\n", + "Mutual Information (10) Base 0.8166666666666667 0.75 10\n", + "RFE (10) Base 0.9 1.0 10\n", + "MultiSURF (10) 0.8333333333333333 0.8333333333333333 10\n", + "Mutual Information (20) Base 0.8666666666666667 0.8666666666666667 20\n", + "RFE (20) Base 1.0 0.9166666666666667 20\n", + "MultiSURF (20) 0.9166666666666667 0.9166666666666667 20\n", + "Mutual Information (40) Base 0.95 0.9 40\n", + "RFE (40) Base 0.8333333333333333 0.8333333333333333 40\n", + "MultiSURF (40) 0.7833333333333333 0.8666666666666667 40\n", + "Mutual Information (60) Base 0.8666666666666667 0.95 60\n", + "RFE (60) Base 0.8333333333333333 0.8333333333333333 60\n", + "MultiSURF (60) 0.7833333333333333 0.9166666666666667 60\n", + "Mutual Information (80) Base 0.8666666666666667 0.9166666666666667 80\n", + "RFE (80) Base 0.8333333333333333 0.8333333333333333 80\n", + "MultiSURF (80) 0.7833333333333333 0.9166666666666667 80\n", + "Mutual Information (100) Base 0.7833333333333333 0.95 100\n", + "RFE (100) Base 0.8333333333333333 1.0 100\n", + "MultiSURF (100) 0.8333333333333333 0.8333333333333333 100\n", + "RFECV Base 0.8333333333333333 1.0 202\n", + "Boruta Base 0.9166666666666667 0.8333333333333333 49\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:50:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:50:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3389526340836528, Global best: 0.3389526340836528, Runtime: 13.49850 seconds\n", + "2023/10/15 06:51:01 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.3389526340836528, Global best: 0.3389526340836528, Runtime: 13.41750 seconds\n", + "2023/10/15 06:51:15 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.3389526340836528, Global best: 0.3389526340836528, Runtime: 13.63056 seconds\n", + "2023/10/15 06:51:29 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.3410222176191904, Global best: 0.3389526340836528, Runtime: 14.47457 seconds\n", + "2023/10/15 06:51:45 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.33802808852057387, Global best: 0.33802808852057387, Runtime: 15.49220 seconds\n", + "2023/10/15 06:51:59 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.33802808852057387, Global best: 0.33802808852057387, Runtime: 14.78410 seconds\n", + "2023/10/15 06:52:14 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.33802808852057387, Global best: 0.33802808852057387, Runtime: 14.95219 seconds\n", + "2023/10/15 06:52:29 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3437691775861003, Global best: 0.33802808852057387, Runtime: 14.57382 seconds\n", + "2023/10/15 06:52:43 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3467112006702563, Global best: 0.33802808852057387, Runtime: 13.85757 seconds\n", + "2023/10/15 06:52:57 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.3467112006702563, Global best: 0.33802808852057387, Runtime: 14.50031 seconds\n", + "2023/10/15 06:53:12 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3470432890325869, Global best: 0.33802808852057387, Runtime: 14.73856 seconds\n", + "2023/10/15 06:53:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.33929922244166005, Global best: 0.33802808852057387, Runtime: 14.93880 seconds\n", + "2023/10/15 06:53:41 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.33929922244166005, Global best: 0.33802808852057387, Runtime: 14.50446 seconds\n", + "2023/10/15 06:53:55 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.33929922244166005, Global best: 0.33802808852057387, Runtime: 13.66750 seconds\n", + "2023/10/15 06:54:11 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.33856639585457615, Global best: 0.33802808852057387, Runtime: 16.25982 seconds\n", + "2023/10/15 06:54:27 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.33856639585457615, Global best: 0.33802808852057387, Runtime: 15.48877 seconds\n", + "2023/10/15 06:54:41 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.33856639585457615, Global best: 0.33802808852057387, Runtime: 14.14138 seconds\n", + "2023/10/15 06:54:55 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.3426817029620728, Global best: 0.33802808852057387, Runtime: 14.09846 seconds\n", + "2023/10/15 06:55:10 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.34079333674639495, Global best: 0.33802808852057387, Runtime: 14.77108 seconds\n", + "2023/10/15 06:55:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.34079333674639495, Global best: 0.33802808852057387, Runtime: 14.72818 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Artificial Bee Colony Base 0.7833333333333333 0.9166666666666667 538\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:55:28 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:55:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.72607 seconds\n", + "2023/10/15 06:55:49 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.71111 seconds\n", + "2023/10/15 06:55:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.70950 seconds\n", + "2023/10/15 06:56:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.71303 seconds\n", + "2023/10/15 06:56:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.74649 seconds\n", + "2023/10/15 06:56:16 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.73720 seconds\n", + "2023/10/15 06:56:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.73722 seconds\n", + "2023/10/15 06:56:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.75508 seconds\n", + "2023/10/15 06:56:36 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.67734 seconds\n", + "2023/10/15 06:56:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.3294945583756895, Global best: 0.3294945583756895, Runtime: 6.64262 seconds\n", + "2023/10/15 06:56:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.69126 seconds\n", + "2023/10/15 06:56:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.74708 seconds\n", + "2023/10/15 06:57:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.75820 seconds\n", + "2023/10/15 06:57:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.70753 seconds\n", + "2023/10/15 06:57:17 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.72047 seconds\n", + "2023/10/15 06:57:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.73935 seconds\n", + "2023/10/15 06:57:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.73613 seconds\n", + "2023/10/15 06:57:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.71866 seconds\n", + "2023/10/15 06:57:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.77967 seconds\n", + "2023/10/15 06:57:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.3236694000003368, Global best: 0.3236694000003368, Runtime: 6.68259 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Particle Swarm Optimization Base 0.7833333333333333 0.8333333333333333 502\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 06:57:54 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 06:58:08 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.3410114913843576, Global best: 0.3410114913843576, Runtime: 6.71052 seconds\n", + "2023/10/15 06:58:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.3410114913843576, Global best: 0.3410114913843576, Runtime: 6.68647 seconds\n", + "2023/10/15 06:58:21 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.3410114913843576, Global best: 0.3410114913843576, Runtime: 6.67586 seconds\n", + "2023/10/15 06:58:28 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.3410114913843576, Global best: 0.3410114913843576, Runtime: 6.60511 seconds\n", + "2023/10/15 06:58:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.33266685521294725, Global best: 0.33266685521294725, Runtime: 6.68731 seconds\n", + "2023/10/15 06:58:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.33266685521294725, Global best: 0.33266685521294725, Runtime: 7.20455 seconds\n", + "2023/10/15 06:58:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.3315992194836719, Global best: 0.3315992194836719, Runtime: 6.62975 seconds\n", + "2023/10/15 06:58:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.3315992194836719, Global best: 0.3315992194836719, Runtime: 6.69236 seconds\n", + "2023/10/15 06:59:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.3315992194836719, Global best: 0.3315992194836719, Runtime: 6.78958 seconds\n", + "2023/10/15 06:59:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.3315992194836719, Global best: 0.3315992194836719, Runtime: 6.70172 seconds\n", + "2023/10/15 06:59:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.32974666686869086, Global best: 0.32974666686869086, Runtime: 6.68275 seconds\n", + "2023/10/15 06:59:22 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.32974666686869086, Global best: 0.32974666686869086, Runtime: 6.66925 seconds\n", + "2023/10/15 06:59:29 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.32974666686869086, Global best: 0.32974666686869086, Runtime: 6.61783 seconds\n", + "2023/10/15 06:59:35 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.32974666686869086, Global best: 0.32974666686869086, Runtime: 6.62740 seconds\n", + "2023/10/15 06:59:42 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.32607588106664076, Global best: 0.32607588106664076, Runtime: 6.63379 seconds\n", + "2023/10/15 06:59:49 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.32607588106664076, Global best: 0.32607588106664076, Runtime: 6.66274 seconds\n", + "2023/10/15 06:59:55 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.32607588106664076, Global best: 0.32607588106664076, Runtime: 6.68758 seconds\n", + "2023/10/15 07:00:02 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.32607588106664076, Global best: 0.32607588106664076, Runtime: 6.64736 seconds\n", + "2023/10/15 07:00:09 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.3227897062533711, Global best: 0.3227897062533711, Runtime: 6.68706 seconds\n", + "2023/10/15 07:00:15 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.3227897062533711, Global best: 0.3227897062533711, Runtime: 6.64731 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gray Wolf - Whale Optimization Algorithm Base 0.7833333333333333 0.9166666666666667 496\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 07:00:19 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 07:00:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.3332281516268069, Global best: 0.3332281516268069, Runtime: 6.74909 seconds\n", + "2023/10/15 07:00:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.3236754867708144, Global best: 0.3236754867708144, Runtime: 6.68270 seconds\n", + "2023/10/15 07:00:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.3222793624493723, Global best: 0.3222793624493723, Runtime: 6.66512 seconds\n", + "2023/10/15 07:00:53 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.32050851818406206, Global best: 0.32050851818406206, Runtime: 6.67728 seconds\n", + "2023/10/15 07:01:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.3199627541259925, Global best: 0.3199627541259925, Runtime: 6.71714 seconds\n", + "2023/10/15 07:01:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.3185242480581315, Global best: 0.3185242480581315, Runtime: 6.76517 seconds\n", + "2023/10/15 07:01:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.3178990838196321, Global best: 0.3178990838196321, Runtime: 6.68224 seconds\n", + "2023/10/15 07:01:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.31538623057832954, Global best: 0.31538623057832954, Runtime: 6.72644 seconds\n", + "2023/10/15 07:01:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.31538623057832954, Global best: 0.31538623057832954, Runtime: 6.69579 seconds\n", + "2023/10/15 07:01:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.3144284456119828, Global best: 0.3144284456119828, Runtime: 6.71845 seconds\n", + "2023/10/15 07:01:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.3144284456119828, Global best: 0.3144284456119828, Runtime: 6.68312 seconds\n", + "2023/10/15 07:01:47 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.31253758175064295, Global best: 0.31253758175064295, Runtime: 6.70495 seconds\n", + "2023/10/15 07:01:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.31253758175064295, Global best: 0.31253758175064295, Runtime: 6.66642 seconds\n", + "2023/10/15 07:02:00 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.3113136102752215, Global best: 0.3113136102752215, Runtime: 6.66383 seconds\n", + "2023/10/15 07:02:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.30761707535309324, Global best: 0.30761707535309324, Runtime: 6.70636 seconds\n", + "2023/10/15 07:02:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.30761707535309324, Global best: 0.30761707535309324, Runtime: 6.62142 seconds\n", + "2023/10/15 07:02:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.3060544400864754, Global best: 0.3060544400864754, Runtime: 6.70450 seconds\n", + "2023/10/15 07:02:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.3056082107137675, Global best: 0.3056082107137675, Runtime: 6.70727 seconds\n", + "2023/10/15 07:02:34 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.3056082107137675, Global best: 0.3056082107137675, Runtime: 6.63106 seconds\n", + "2023/10/15 07:02:40 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.3056082107137675, Global best: 0.3056082107137675, Runtime: 6.60995 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naked Mole Rat Algorithm Base 0.7833333333333333 1.0 457\n", + "Triglav Stage 1 Base 0.7833333333333333 0.9166666666666667 247\n", + "Triglav MultiSURF 10 1.0 0.9166666666666667 10\n", + "Triglav MultiSURF 20 0.9166666666666667 1.0 20\n", + "Triglav MultiSURF 40 0.7833333333333333 1.0 40\n", + "Triglav MultiSURF 60 0.7833333333333333 0.95 60\n", + "Triglav MultiSURF 80 0.7833333333333333 1.0 80\n", + "Triglav MultiSURF 100 0.7833333333333333 1.0 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 07:03:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 07:03:26 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 1, Current best: 0.3122963653156943, Global best: 0.3122963653156943, Runtime: 13.09914 seconds\n", + "2023/10/15 07:03:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 2, Current best: 0.30996237996382686, Global best: 0.30996237996382686, Runtime: 13.10455 seconds\n", + "2023/10/15 07:03:53 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 3, Current best: 0.30996237996382686, Global best: 0.30996237996382686, Runtime: 13.72370 seconds\n", + "2023/10/15 07:04:07 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 4, Current best: 0.30996237996382686, Global best: 0.30996237996382686, Runtime: 14.22849 seconds\n", + "2023/10/15 07:04:22 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 5, Current best: 0.31451259627927697, Global best: 0.30996237996382686, Runtime: 14.40053 seconds\n", + "2023/10/15 07:04:36 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 6, Current best: 0.31451259627927697, Global best: 0.30996237996382686, Runtime: 13.71348 seconds\n", + "2023/10/15 07:04:49 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 7, Current best: 0.31451259627927697, Global best: 0.30996237996382686, Runtime: 13.51448 seconds\n", + "2023/10/15 07:05:03 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 8, Current best: 0.3138058482624424, Global best: 0.30996237996382686, Runtime: 13.64988 seconds\n", + "2023/10/15 07:05:16 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 9, Current best: 0.3138058482624424, Global best: 0.30996237996382686, Runtime: 13.70334 seconds\n", + "2023/10/15 07:05:31 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 10, Current best: 0.30703969865983954, Global best: 0.30703969865983954, Runtime: 14.10888 seconds\n", + "2023/10/15 07:05:44 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 11, Current best: 0.3046967292168643, Global best: 0.3046967292168643, Runtime: 13.54504 seconds\n", + "2023/10/15 07:05:58 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 12, Current best: 0.3046967292168643, Global best: 0.3046967292168643, Runtime: 13.54323 seconds\n", + "2023/10/15 07:06:12 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 13, Current best: 0.3094251133566019, Global best: 0.3046967292168643, Runtime: 14.09472 seconds\n", + "2023/10/15 07:06:25 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 14, Current best: 0.3094251133566019, Global best: 0.3046967292168643, Runtime: 13.05815 seconds\n", + "2023/10/15 07:06:39 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 15, Current best: 0.31535358248721235, Global best: 0.3046967292168643, Runtime: 13.93294 seconds\n", + "2023/10/15 07:06:53 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 16, Current best: 0.31436036942907, Global best: 0.3046967292168643, Runtime: 13.79536 seconds\n", + "2023/10/15 07:07:06 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 17, Current best: 0.31082247508975686, Global best: 0.3046967292168643, Runtime: 13.52862 seconds\n", + "2023/10/15 07:07:20 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 18, Current best: 0.30841109986142545, Global best: 0.3046967292168643, Runtime: 14.36544 seconds\n", + "2023/10/15 07:07:34 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 19, Current best: 0.30841109986142545, Global best: 0.3046967292168643, Runtime: 13.52519 seconds\n", + "2023/10/15 07:07:48 AM, INFO, mealpy.swarm_based.ABC.OriginalABC: >Problem: FS, Epoch: 20, Current best: 0.30841109986142545, Global best: 0.3046967292168643, Runtime: 13.67025 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Artificial Bee Colony 0.7833333333333333 1.0 136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 07:07:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 07:08:05 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 1, Current best: 0.3069513423561424, Global best: 0.3069513423561424, Runtime: 6.55537 seconds\n", + "2023/10/15 07:08:12 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 2, Current best: 0.3069513423561424, Global best: 0.3069513423561424, Runtime: 6.55726 seconds\n", + "2023/10/15 07:08:18 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 3, Current best: 0.3069513423561424, Global best: 0.3069513423561424, Runtime: 6.47240 seconds\n", + "2023/10/15 07:08:25 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 4, Current best: 0.30530675699966653, Global best: 0.30530675699966653, Runtime: 6.49551 seconds\n", + "2023/10/15 07:08:31 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 5, Current best: 0.30530675699966653, Global best: 0.30530675699966653, Runtime: 6.53566 seconds\n", + "2023/10/15 07:08:38 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 6, Current best: 0.30530675699966653, Global best: 0.30530675699966653, Runtime: 6.52185 seconds\n", + "2023/10/15 07:08:44 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 7, Current best: 0.30251218023016774, Global best: 0.30251218023016774, Runtime: 6.52320 seconds\n", + "2023/10/15 07:08:51 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 8, Current best: 0.30251218023016774, Global best: 0.30251218023016774, Runtime: 6.53952 seconds\n", + "2023/10/15 07:08:57 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 9, Current best: 0.30251218023016774, Global best: 0.30251218023016774, Runtime: 6.47115 seconds\n", + "2023/10/15 07:09:04 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 10, Current best: 0.30251218023016774, Global best: 0.30251218023016774, Runtime: 6.50436 seconds\n", + "2023/10/15 07:09:10 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 11, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 6.49697 seconds\n", + "2023/10/15 07:09:17 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 12, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 6.49943 seconds\n", + "2023/10/15 07:09:23 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 13, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 6.52788 seconds\n", + "2023/10/15 07:09:30 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 14, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 6.49752 seconds\n", + "2023/10/15 07:09:37 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 15, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 7.03533 seconds\n", + "2023/10/15 07:09:43 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 16, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 6.50970 seconds\n", + "2023/10/15 07:09:50 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 17, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 6.48508 seconds\n", + "2023/10/15 07:09:56 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 18, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 6.47973 seconds\n", + "2023/10/15 07:10:03 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 19, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 6.47530 seconds\n", + "2023/10/15 07:10:09 AM, INFO, mealpy.swarm_based.PSO.OriginalPSO: >Problem: FS, Epoch: 20, Current best: 0.28683955166854447, Global best: 0.28683955166854447, Runtime: 6.50294 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav - Particle Swarm Optimization 0.7833333333333333 0.75 120\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 07:10:13 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 07:10:27 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 1, Current best: 0.31557832115963175, Global best: 0.31557832115963175, Runtime: 6.46460 seconds\n", + "2023/10/15 07:10:33 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 2, Current best: 0.31557832115963175, Global best: 0.31557832115963175, Runtime: 6.43924 seconds\n", + "2023/10/15 07:10:40 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 3, Current best: 0.30781821723091907, Global best: 0.30781821723091907, Runtime: 6.49826 seconds\n", + "2023/10/15 07:10:46 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 4, Current best: 0.30781821723091907, Global best: 0.30781821723091907, Runtime: 6.50785 seconds\n", + "2023/10/15 07:10:52 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 5, Current best: 0.30072771466513415, Global best: 0.30072771466513415, Runtime: 6.45059 seconds\n", + "2023/10/15 07:10:59 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 6, Current best: 0.2962215957237492, Global best: 0.2962215957237492, Runtime: 6.52168 seconds\n", + "2023/10/15 07:11:05 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 7, Current best: 0.2878468072523469, Global best: 0.2878468072523469, Runtime: 6.46297 seconds\n", + "2023/10/15 07:11:12 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 8, Current best: 0.2839409543521411, Global best: 0.2839409543521411, Runtime: 6.40484 seconds\n", + "2023/10/15 07:11:18 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 9, Current best: 0.2776392180324865, Global best: 0.2776392180324865, Runtime: 6.49237 seconds\n", + "2023/10/15 07:11:25 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 10, Current best: 0.2762744137022943, Global best: 0.2762744137022943, Runtime: 6.49759 seconds\n", + "2023/10/15 07:11:31 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 11, Current best: 0.27515589031892473, Global best: 0.27515589031892473, Runtime: 6.48706 seconds\n", + "2023/10/15 07:11:38 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 12, Current best: 0.26349470800344, Global best: 0.26349470800344, Runtime: 6.45626 seconds\n", + "2023/10/15 07:11:44 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 13, Current best: 0.26349470800344, Global best: 0.26349470800344, Runtime: 6.52348 seconds\n", + "2023/10/15 07:11:51 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 14, Current best: 0.2633835644273406, Global best: 0.2633835644273406, Runtime: 6.45747 seconds\n", + "2023/10/15 07:11:57 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 15, Current best: 0.25897134140466294, Global best: 0.25897134140466294, Runtime: 6.50757 seconds\n", + "2023/10/15 07:12:04 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 16, Current best: 0.2574089837272103, Global best: 0.2574089837272103, Runtime: 6.45731 seconds\n", + "2023/10/15 07:12:10 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 17, Current best: 0.2544121043969919, Global best: 0.2544121043969919, Runtime: 6.43374 seconds\n", + "2023/10/15 07:12:17 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 18, Current best: 0.25250454746467044, Global best: 0.25250454746467044, Runtime: 6.44756 seconds\n", + "2023/10/15 07:12:23 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 19, Current best: 0.24557439480430238, Global best: 0.24557439480430238, Runtime: 6.45334 seconds\n", + "2023/10/15 07:12:30 AM, INFO, mealpy.swarm_based.GWO.GWO_WOA: >Problem: FS, Epoch: 20, Current best: 0.24557439480430238, Global best: 0.24557439480430238, Runtime: 6.53754 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Triglav Gray Wolf/Whale Optimization Algorithm 0.7833333333333333 0.9166666666666667 104\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023/10/15 07:12:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: Solving 2-objective optimization problem with weights: [0.6 0.4].\n", + "2023/10/15 07:12:48 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 1, Current best: 0.2994166181472473, Global best: 0.2994166181472473, Runtime: 6.51810 seconds\n", + "2023/10/15 07:12:54 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 2, Current best: 0.29607809543940755, Global best: 0.29607809543940755, Runtime: 6.47133 seconds\n", + "2023/10/15 07:13:01 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 3, Current best: 0.29607809543940755, Global best: 0.29607809543940755, Runtime: 6.52100 seconds\n", + "2023/10/15 07:13:07 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 4, Current best: 0.2926669285825708, Global best: 0.2926669285825708, Runtime: 6.49834 seconds\n", + "2023/10/15 07:13:14 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 5, Current best: 0.29123466372346546, Global best: 0.29123466372346546, Runtime: 6.48726 seconds\n", + "2023/10/15 07:13:20 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 6, Current best: 0.28839886156729183, Global best: 0.28839886156729183, Runtime: 6.49925 seconds\n", + "2023/10/15 07:13:27 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 7, Current best: 0.28616537924066276, Global best: 0.28616537924066276, Runtime: 6.47755 seconds\n", + "2023/10/15 07:13:33 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 8, Current best: 0.28432788344228604, Global best: 0.28432788344228604, Runtime: 6.45685 seconds\n", + "2023/10/15 07:13:39 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 9, Current best: 0.28432788344228604, Global best: 0.28432788344228604, Runtime: 6.47980 seconds\n", + "2023/10/15 07:13:46 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 10, Current best: 0.28432788344228604, Global best: 0.28432788344228604, Runtime: 6.46809 seconds\n", + "2023/10/15 07:13:52 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 11, Current best: 0.28432788344228604, Global best: 0.28432788344228604, Runtime: 6.48518 seconds\n", + "2023/10/15 07:13:59 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 12, Current best: 0.28432788344228604, Global best: 0.28432788344228604, Runtime: 6.50547 seconds\n", + "2023/10/15 07:14:05 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 13, Current best: 0.28432788344228604, Global best: 0.28432788344228604, Runtime: 6.47110 seconds\n", + "2023/10/15 07:14:12 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 14, Current best: 0.2836465619618761, Global best: 0.2836465619618761, Runtime: 6.48265 seconds\n", + "2023/10/15 07:14:18 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 15, Current best: 0.2825403280824868, Global best: 0.2825403280824868, Runtime: 6.47617 seconds\n", + "2023/10/15 07:14:25 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 16, Current best: 0.28180176904532434, Global best: 0.28180176904532434, Runtime: 6.47002 seconds\n", + "2023/10/15 07:14:31 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 17, Current best: 0.2741876474089357, Global best: 0.2741876474089357, Runtime: 6.45128 seconds\n", + "2023/10/15 07:14:38 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 18, Current best: 0.26993732848315277, Global best: 0.26993732848315277, Runtime: 6.46412 seconds\n", + "2023/10/15 07:14:44 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 19, Current best: 0.2640828407473948, Global best: 0.2640828407473948, Runtime: 6.46501 seconds\n", + "2023/10/15 07:14:51 AM, INFO, mealpy.swarm_based.NMRA.ImprovedNMRA: >Problem: FS, Epoch: 20, Current best: 0.2640828407473948, Global best: 0.2640828407473948, Runtime: 6.50152 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "triglav - Naked Mole Rat Algorithm 0.7833333333333333 1.0 110\n" + ] + } + ], + "source": [ + " def map_back_to_orig(idx_original, best_features_1, best_features_2, stage_2 = False):\n", + " \n", + " # Get final size of feature selection vector\n", + " final_vec = np.zeros(shape = (idx_original.shape[0]), dtype = np.int8)\n", + " \n", + " # Subset indicies of each feature by the first set of selected features\n", + " sel = idx_original[best_features_1]\n", + " \n", + " # Subset indicies of the subset by the second set of selected features (if applicable)\n", + " if stage_2:\n", + " sel = sel[best_features_2]\n", + " \n", + " # Loop through each remaining index and update the feature selection vector (1 if selected)\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " \n", + " return final_vec\n", + " \n", + " # Import other FS algorithms\n", + " from sklearn.feature_selection import SelectKBest, SelectFdr, RFE, RFECV, mutual_info_classif, f_classif\n", + " from boruta import BorutaPy\n", + " \n", + " tmp_base = []\n", + "\n", + " idx_original_vec = np.asarray([i for i in range(X_removed.shape[1])])\n", + " \n", + " # Test population size\n", + " for i in range(5):\n", + " print(i)\n", + " \n", + " splitter = StratifiedGroupKFold(n_splits = 5, random_state = i, shuffle = True)\n", + " \n", + " for train, test in splitter.split(X_removed, y, groups):\n", + " \n", + " X_train = X_removed[train]\n", + " y_train = y[train]\n", + " \n", + " X_test = X_removed[test]\n", + " y_test = y[test]\n", + " \n", + " tg_model = Triglav(n_jobs = 15,\n", + " estimator = ExtraTreesClassifier(512, max_depth = 10, bootstrap = True), # Bootstrap is set to true to increase randomization\n", + " verbose = 3,\n", + " n_iter_fwer = 5, # A lower value will result in a more conservative selection of clusters\n", + " p_1 = 0.7, # A higher value will result in a more conservative selection of clusters\n", + " p_2 = 0.4, # A higher value will result in more clusters being rejected\n", + " metric = \"correlation\",\n", + " linkage = \"complete\",\n", + " transformer = CLRTransformer(),\n", + " run_stage_2 = False, \n", + " alpha = 0.05, # A lower value will result in a more conservative selection of clusters\n", + " thresh = 0.5) # This value will control the number of clusters.\n", + "\n", + " tg_model.fit(X_train, y_train)\n", + " \n", + " # Create a subset of the training data using Triglav selected features\n", + " X_train_tr = CLRTransformer().fit_transform(X_train[:, tg_model.selected_])\n", + " X_test_tr = CLRTransformer().fit_transform(X_test[:, tg_model.selected_])\n", + " \n", + " # CLR transform training data\n", + " X_train = CLRTransformer().fit_transform(X_train)\n", + " X_test = CLRTransformer().fit_transform(X_test)\n", + " \n", + " # Control (Positive) - No Feature Selection\n", + " clf = ExtraTreesClassifier(512).fit(X_train, y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train, y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test))\n", + " \n", + " print(\"Control (Positive)\", ba, ba2, X_train.shape[1])\n", + " \n", + " tmp_base.append((\"Control (Positive)\",\n", + " ba, ba2,\n", + " \"NA\", \n", + " X_train.shape[1]))\n", + " \n", + " # Control (Negative) - No Feature Selection\n", + " random_y_idx = np.random.permutation(y_train.shape[0])\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train, y_train[random_y_idx])\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train, y_train[random_y_idx])\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test))\n", + " \n", + " print(\"Control (Negative)\", ba, ba2, X_train.shape[1])\n", + " \n", + " tmp_base.append((\"Control (Negative)\",\n", + " ba, ba2,\n", + " \"NA\", \n", + " X_train.shape[1])) \n", + " \n", + " # ANOVA\n", + " anova_model = SelectFdr(alpha = 0.05).fit(X_train, y_train)\n", + " f_sel = anova_model.get_support()\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(anova_model.transform(X_train), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(anova_model.transform(X_test)))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(anova_model.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(anova_model.transform(X_test)))\n", + " \n", + " print(\"ANOVA\", \"Base\", ba, ba2, f_sel.sum())\n", + " \n", + " tmp_base.append((\"ANOVA\",\n", + " ba, ba2,\n", + " f_sel, \n", + " f_sel.sum())) \n", + " \n", + " # MI\n", + " for n_select in [10, 20, 40, 60, 80, 100]:\n", + " mi_model = SelectKBest(score_func = mutual_info_classif, k = n_select).fit(X_train, y_train)\n", + " f_sel = mi_model.get_support()\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(mi_model.transform(X_train), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(mi_model.transform(X_test)))\n", + "\n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(mi_model.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(mi_model.transform(X_test)))\n", + "\n", + " print(\"Mutual Information (%d)\" %n_select, \"Base\", ba, ba2, f_sel.sum())\n", + "\n", + " tmp_base.append((\"Mutual Information (%d)\" %n_select,\n", + " ba, ba2,\n", + " f_sel, \n", + " f_sel.sum())) \n", + " \n", + " # RFE\n", + " rfe_model = RFE(estimator = ExtraTreesClassifier(512),\n", + " n_features_to_select = n_select,\n", + " step = 0.05).fit(X_train, y_train)\n", + "\n", + " f_sel = rfe_model.get_support()\n", + "\n", + " ba = balanced_accuracy_score(y_test, rfe_model.predict(X_test))\n", + "\n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(rfe_model.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(rfe_model.transform(X_test)))\n", + "\n", + " print(\"RFE (%d)\" %n_select, \"Base\", ba, ba2, f_sel.sum())\n", + "\n", + " tmp_base.append((\"RFE (%d)\" %n_select,\n", + " ba, ba2,\n", + " f_sel, \n", + " f_sel.sum()))\n", + " \n", + " # MultiSURF\n", + " f_selector = MultiSURF(n_features_to_select = n_select,\n", + " n_jobs = 4).fit(X_train.astype(float), \n", + " y_train)\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(f_selector.transform(X_train), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(f_selector.transform(X_test)))\n", + "\n", + " best_features = f_selector.transform(np.asarray([idx_original_vec]))[0]\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, best_features, None, stage_2 = False)\n", + "\n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(f_selector.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(f_selector.transform(X_test)))\n", + "\n", + " print(\"MultiSURF (%d)\" %n_select, ba, ba2, f_sel.sum())\n", + " tmp_base.append((\"MultiSURF (%d)\" %n_select,\n", + " ba, ba2,\n", + " f_sel, \n", + " f_sel.sum()))\n", + " \n", + " # RFECV\n", + " rfe_model = RFECV(estimator = ExtraTreesClassifier(512),\n", + " step = 0.05,\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = 5\n", + " ).fit(X_train, y_train)\n", + " \n", + " f_sel = rfe_model.get_support()\n", + " \n", + " ba = balanced_accuracy_score(y_test, rfe_model.predict(X_test))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train[:, f_sel], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test[:, f_sel]))\n", + " \n", + " print(\"RFECV\", \"Base\", ba, ba2, f_sel.sum())\n", + " tmp_base.append((\"RFECV\",\n", + " ba, ba2,\n", + " f_sel, \n", + " f_sel.sum()))\n", + " \n", + " # Boruta\n", + " boruta_model = BorutaPy(ExtraTreesClassifier(), n_estimators = 128, verbose = 0)\n", + " boruta_model.fit(X_train, y_train)\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(boruta_model.transform(X_train), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(boruta_model.transform(X_test)))\n", + " \n", + " best_features = boruta_model.transform(np.asarray([idx_original_vec]))[0]\n", + " \n", + " f_sel = map_back_to_orig(idx_original_vec, best_features, None, stage_2 = False)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(boruta_model.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(boruta_model.transform(X_test)))\n", + " \n", + " print(\"Boruta\", \"Base\", ba, ba2, f_sel.sum())\n", + " tmp_base.append((\"Boruta\",\n", + " ba, ba2,\n", + " f_sel, \n", + " f_sel.sum())) \n", + " \n", + " # ABC\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train, \n", + " y= y_train)\n", + "\n", + " model = ABC.OriginalABC(epoch = 20, n_limits = 10, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test[:, best_features]))\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, best_features, None, stage_2 = False)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test[:, best_features]))\n", + " \n", + " print(\"Artificial Bee Colony\", \"Base\", ba, ba2, best_features.sum())\n", + " tmp_base.append((\"Artificial Bee Colony\",\n", + " ba, ba2,\n", + " f_sel, \n", + " best_features.sum()))\n", + "\n", + " # PSO\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train, \n", + " y= y_train)\n", + "\n", + " model = PSO.OriginalPSO(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(X_train[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test[:, best_features]))\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, best_features, None, stage_2 = False)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test[:, best_features]))\n", + " \n", + " print(\"Particle Swarm Optimization\", \"Base\", ba, ba2, best_features.sum())\n", + " tmp_base.append((\"Particle Swarm Optimization\",\n", + " ba, ba2,\n", + " f_sel,\n", + " best_features.sum()))\n", + " \n", + " # GWO-WOA\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train, \n", + " y= y_train)\n", + " \n", + " model = GWO_WOA(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test[:, best_features]))\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, best_features, None, stage_2 = False)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test[:, best_features]))\n", + " \n", + " print(\"Gray Wolf - Whale Optimization Algorithm\", \"Base\", ba, ba2, best_features.sum())\n", + " \n", + " tmp_base.append((\"Gray Wolf - Whale Optimization Algorithm\",\n", + " ba, ba2,\n", + " f_sel,\n", + " best_features.sum()))\n", + " \n", + " # Naked Mole Rat Algorithm\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train, \n", + " y= y_train)\n", + " \n", + " model = ImprovedNMRA(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test[:, best_features]))\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, best_features, None, stage_2 = False)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test[:, best_features]))\n", + " \n", + " print(\"Naked Mole Rat Algorithm\", \"Base\", ba, ba2, best_features.sum())\n", + " \n", + " tmp_base.append((\"Naked Mole Rat Algorithm\",\n", + " ba, ba2,\n", + " f_sel,\n", + " best_features.sum()))\n", + " \n", + " # Triglav Stage 1\n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr, y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr))\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, tg_model.selected_, None, stage_2 = False)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr, y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr))\n", + " \n", + " print(\"Triglav Stage 1\", \"Base\", ba, ba2, tg_model.selected_.sum())\n", + " \n", + " tmp_base.append((\"Triglav Stage 1\",\n", + " ba, ba2,\n", + " f_sel, \n", + " tg_model.selected_.sum())) \n", + " \n", + " # Triglav Stage 2 - MultiSURF Only\n", + " for n_select in [10, 20, 40, 60, 80, 100]:\n", + " f_selector = MultiSURF(n_features_to_select = n_select,\n", + " n_jobs = 4).fit(X_train_tr.astype(float), \n", + " y_train)\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(f_selector.transform(X_train_tr), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(f_selector.transform(X_test_tr)))\n", + "\n", + " best_features = f_selector.transform(np.asarray([idx_original_vec]))[0]\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, tg_model.selected_, best_features, True)\n", + "\n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(f_selector.transform(X_train_tr), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(f_selector.transform(X_test_tr)))\n", + "\n", + " print(\"Triglav MultiSURF %d\" %n_select, ba, ba2, f_sel.sum())\n", + "\n", + " tmp_base.append((\"Triglav MultiSURF %d\" %n_select,\n", + " ba, ba2,\n", + " f_sel, \n", + " f_sel.sum())) \n", + " \n", + " # Triglav Stage 2 - ABC\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train_tr.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train_tr.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train_tr, \n", + " y= y_train)\n", + "\n", + " model = ABC.OriginalABC(epoch = 20, pop_size = 30, n_limits = 10)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr[:, best_features]))\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, tg_model.selected_, best_features, True)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr[:, best_features]))\n", + " \n", + " print(\"Triglav - Artificial Bee Colony\", ba, ba2, best_features.sum())\n", + " \n", + " tmp_base.append((\"Triglav - Artificial Bee Colony\",\n", + " ba, ba2,\n", + " f_sel, \n", + " best_features.sum()))\n", + "\n", + " # Triglav Stage 2 - PSO\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train_tr.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train_tr.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train_tr, \n", + " y= y_train)\n", + "\n", + " model = PSO.OriginalPSO(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr[:, best_features]))\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, tg_model.selected_, best_features, True)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr[:, best_features]))\n", + " \n", + " print(\"Triglav - Particle Swarm Optimization\", ba, ba2, best_features.sum())\n", + " \n", + " tmp_base.append((\"Triglav - Particle Swarm Optimization\",\n", + " ba, ba2,\n", + " f_sel,\n", + " best_features.sum()))\n", + " \n", + " # Triglav GWO-WOA\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train_tr.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train_tr.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train_tr, \n", + " y= y_train)\n", + " \n", + " model = GWO_WOA(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr[:, best_features]))\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, tg_model.selected_, best_features, stage_2 = True)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr[:, best_features]))\n", + " \n", + " print(\"Triglav Gray Wolf/Whale Optimization Algorithm\", ba, ba2, best_features.sum())\n", + " \n", + " tmp_base.append((\"Triglav - Gray Wolf/Whale Optimization Algorithm\",\n", + " ba, ba2,\n", + " f_sel,\n", + " best_features.sum()))\n", + " \n", + " # Triglav Naked Mole Rat Algorithm\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train_tr.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train_tr.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train_tr, \n", + " y= y_train)\n", + " \n", + " model = ImprovedNMRA(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr[:, best_features]))\n", + "\n", + " f_sel = map_back_to_orig(idx_original_vec, tg_model.selected_, best_features, stage_2 = True)\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr[:, best_features]))\n", + " \n", + " print(\"triglav - Naked Mole Rat Algorithm\", ba, ba2, best_features.sum())\n", + " \n", + " tmp_base.append((\"Triglav = Naked Mole Rat Algorithm\",\n", + " ba, ba2,\n", + " f_sel,\n", + " best_features.sum()))\n" + ] + }, + { + "cell_type": "markdown", + "id": "515fccc8", + "metadata": {}, + "source": [ + "#### Perform statistical tests on feature selection stability and generalization performance" + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "id": "a1e8516e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + } + ], + "source": [ + " from baycomp import two_on_single\n", + " from stability import hypothesisTestT, getStability, confidenceIntervals\n", + " \n", + " stability_df = []\n", + " \n", + " exp_types = set()\n", + " for row in tmp_base:\n", + " exp_types.add(row[0])\n", + "\n", + " exp_types = {x: [] for x in exp_types}\n", + " exp_ba_et = {x: [] for x in exp_types}\n", + " exp_ba_lc = {x: [] for x in exp_types}\n", + "\n", + " # Features selected by each model\n", + " for row in tmp_base:\n", + " exp_types[row[0]].append(row[3])\n", + " \n", + " exp_ba_et[row[0]].append(row[1])\n", + " \n", + " exp_ba_lc[row[0]].append(row[2])\n", + " \n", + " exp_names = list(exp_types.keys())\n", + " \n", + " pass_set = {\"Control (Negative)\", \"Control (Positive)\"}\n", + " \n", + " for i in range(len(exp_names)):\n", + " for j in range(i+1, len(exp_names)-1):\n", + " model_a = exp_names[i]\n", + " model_b = exp_names[j]\n", + "\n", + " model_a = exp_names[i]\n", + " model_b = exp_names[j]\n", + "\n", + " if \"NA\" in exp_types[model_a] or \"NA\" in exp_types[model_b]:\n", + " pass\n", + " \n", + " else:\n", + " arr_a = np.asarray(exp_types[model_a]).astype(int)\n", + " arr_b = np.asarray(exp_types[model_b]).astype(int)\n", + "\n", + " res = hypothesisTestT(arr_a, arr_b)\n", + " a_conf = confidenceIntervals(arr_a)\n", + " b_conf = confidenceIntervals(arr_b) \n", + " \n", + " left_same_et, rope_same_et, right_same_et = two_on_single(np.asarray(exp_ba_et[model_a]),\n", + " np.asarray(exp_ba_et[model_b]),\n", + " rope = 0.05,\n", + " runs = 5)\n", + " \n", + " mu_et_a = np.mean(np.asarray(exp_ba_et[model_a]))\n", + " std_et_a = np.std(np.asarray(exp_ba_et[model_a]), ddof = 1)\n", + " \n", + " mu_et_b = np.mean(np.asarray(exp_ba_et[model_b]))\n", + " std_et_b = np.std(np.asarray(exp_ba_et[model_b]), ddof = 1)\n", + " \n", + " left_same_lc, rope_same_lc, right_same_lc = two_on_single(np.asarray(exp_ba_lc[model_a]),\n", + " np.asarray(exp_ba_lc[model_b]),\n", + " rope = 0.05,\n", + " runs = 5)\n", + " \n", + " mu_lc_a = np.mean(np.asarray(exp_ba_lc[model_a]))\n", + " std_lc_a = np.std(np.asarray(exp_ba_lc[model_a]), ddof = 1)\n", + " \n", + " mu_lc_b = np.mean(np.asarray(exp_ba_lc[model_b]))\n", + " std_lc_b = np.std(np.asarray(exp_ba_lc[model_b]), ddof = 1)\n", + " \n", + " stability_df.append((model_a, model_b, res[\"T\"], res[\"p-value\"], \n", + " a_conf[\"lower\"], a_conf[\"stability\"], a_conf[\"upper\"], \n", + " b_conf[\"lower\"], b_conf[\"stability\"], b_conf[\"upper\"],\n", + " left_same_et, rope_same_et, right_same_et, mu_et_a, std_et_a, mu_et_b, std_et_b,\n", + " left_same_lc, rope_same_lc, right_same_lc, mu_lc_a, std_lc_a, mu_lc_b, std_lc_b))\n", + " \n", + " stability_df = pd.DataFrame(stability_df, columns = [\"Model A\", \"Model B\", \n", + " \"T (Stability)\", \"p-value (Stability)\",\n", + " \"CI A (Lower)\", \"Stability A\", \"CI A (Upper)\",\n", + " \"CI B (Lower)\", \"Stability B\", \"CI B (Upper)\",\n", + " \"P(A > B) (ETC)\", \"P (A = B) (ETC)\", \"P (A < B) (ETC)\", \n", + " \"Mean ETC (A)\", \"Standard Deviation ETC (A)\", \n", + " \"Mean ETC (B)\", \"Standard Deviation ETC (B)\",\n", + " \"P(A > B) (LSVC)\", \"P (A = B) (LSVC)\", \"P (A < B) (LSVC)\",\n", + " \"Mean LSVC (A)\", \"Standard Deviation LSVC (A)\",\n", + " \"Mean LSVC (B)\", \"Standard Deviation LSVC (B)\"])\n", + " \n", + " p_corr = multipletests(stability_df[\"p-value (Stability)\"].values, method = \"fdr_bh\")\n", + " \n", + " stability_df[\"Corrected p-values (Stability)\"] = p_corr[1]\n", + " stability_df[\"Rejected (Stability)\"] = p_corr[0]\n", + " stability_df.to_csv(\"stability_df_pso.csv\")\n", + " \n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "id": "d778887e", + "metadata": {}, + "outputs": [], + "source": [ + " from baycomp import two_on_single\n", + " \n", + " comp_df = []\n", + " \n", + " for i in range(len(exp_names)):\n", + " model_a = exp_names[i]\n", + " \n", + " arr_a = np.asarray(exp_ba_et[model_a]).astype(float)\n", + " arr_b = np.asarray(exp_ba_lc[model_a]).astype(float)\n", + " \n", + " left, rope, right = two_on_single(arr_a, arr_b, rope = 0.05, runs = 5)\n", + " \n", + " mu_a = np.mean(arr_a)\n", + " std_a = np.std(arr_a, ddof = 1)\n", + " \n", + " mu_b = np.mean(arr_b)\n", + " std_b = np.std(arr_b, ddof = 1)\n", + " \n", + " comp_df.append((model_a, model_a, \n", + " mu_a, std_a, \n", + " mu_b, std_b,\n", + " left, rope, right))\n", + " \n", + " comp_df = pd.DataFrame(comp_df,\n", + " columns = [\"Model A (ETC)\", \"Model B (LSVC)\",\n", + " \"Mean A\", \"Standard Deviation A\", \n", + " \"Mean B\", \"Standard Deviation B\",\n", + " \"P (A > B)\", \"P (A = B)\", \"P (A < B)\"])\n", + " \n", + " comp_df.to_csv(\"comp_df_pso.csv\")" + ] + }, + { + "cell_type": "markdown", + "id": "da39a7aa", + "metadata": {}, + "source": [ + "#### Graph results" + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "id": "6b428cb7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([['Control (Positive)', 0.8333333333333333, 0.6833333333333333,\n", + " nan, 938, 9.873444112515376],\n", + " ['Control (Negative)', 0.5166666666666666, 0.3666666666666667,\n", + " nan, 938, 9.873444112515376],\n", + " ['ANOVA', 0.8333333333333333, 0.7333333333333334,\n", + " '[False False False True False False False False False False True False\\n True False False False False True True True False False True True\\n False False False True False True True False False False False False\\n False False False False False False True False True False False True\\n True True False False True False False True True False False True\\n False True False False False False True True False False False True\\n True False True True True True False True False False False True\\n True False False False False True False False False True True False\\n False False True False False False True False True False True True\\n True True True False False False False False True False False False\\n True True True False False True False True False False True True\\n True True False False True False False False True False True True\\n False True False True False False False True False False False False\\n True False False True True False False False True False False False\\n False False False False False False True True True False True False\\n False True True False False False True True False False True True\\n True False True False True False False False False False True True\\n False True False False True True False True False True True False\\n False True True False False True True False False True False True\\n True False True False False False False True True False False False\\n True False False True False False True False False False False True\\n True True True True False True True False False True True True\\n True False True False True True True False True False True False\\n False True True True True False True True False True False True\\n True True True False False True True True True True True False\\n True False True False False True False True False False False True\\n False False False False True True True True False True True False\\n False False False True False False True False False False False False\\n False False True True False True True True True False True True\\n True False False True False True True False False True True False\\n True False True False False True False True True False True True\\n False False False False True False True True False False False True\\n False False False True False False False True False True True False\\n False True True False False False True False False True False True\\n True True True False False False False False True True True False\\n False True True True False True False True False False False False\\n True True False False False False False True True True True False\\n True True False True False False False True True False False False\\n False False False False True True True False True False False False\\n True False False True True False True True True False False False\\n False False False False True True True False False True True False\\n True False False True False False True False True False True False\\n True False False True False True False False True True False False\\n False False False False False False False True True False True False\\n True False False False False False True False True True False False\\n False False True False False False False False False False False False\\n False False False False False False False True False False False False\\n True True False False False False False False False True True True\\n False False True True False False False True False False True False\\n False False True False False False False False True True False False\\n True False True True False False False False False False False False\\n False True True True False False True True True False False False\\n False False True True True False True False True True False False\\n False True False False True False True False False False False True\\n False False False False False False True False True False False False\\n True False False False False False False False False False False False\\n False True False False True False True True False False True False\\n False False False False False False True False False False False True\\n False False False False True False False False False False True False\\n False True False False True False True True False False False True\\n False False True False True False True True False False False False\\n False False False True False False False False True False False True\\n False False True False False True False False False False False True\\n False True False False False False False False False True False False\\n True False False True False False False False False True True False\\n True False False False False False False False True False True False\\n False False True False False False False False False True False False\\n False False False False False True False False False False False False\\n False False False True False False False False False False True False\\n False False False False False False False False False False False False\\n False False False False False True False False False False False False\\n False True False False False False False False True True False False\\n True False False False False False False False False False True True\\n False True False False False True False False True True False True\\n False False True False False False False False False False True True\\n False False True True False False False False False False False True\\n True False False True True False False False True True False False\\n True True False False False False True True False True False False\\n False False]',\n", + " 335, 8.388017285345136],\n", + " ...,\n", + " ['Triglav - Particle Swarm Optimization', 0.7833333333333333,\n", + " 0.75,\n", + " '[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0\\n 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0\\n 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0\\n 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0\\n 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0\\n 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1\\n 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0\\n 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0\\n 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0\\n 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0\\n 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0\\n 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0\\n 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0\\n 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1\\n 0 0 0 0 0 0 0 0 0 0 0 0 0]',\n", + " 120, 6.906890595608519],\n", + " ['Triglav - Gray Wolf/Whale Optimization Algorithm',\n", + " 0.7833333333333333, 0.9166666666666669,\n", + " '[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\\n 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0\\n 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0\\n 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\\n 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1\\n 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0\\n 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1\\n 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0\\n 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0\\n 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0\\n 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0\\n 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1\\n 0 0 0 0 0 0 0 0 1 0 0 0 0]',\n", + " 104, 6.700439718141092],\n", + " ['Triglav = Naked Mole Rat Algorithm', 0.7833333333333333, 1.0,\n", + " '[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0\\n 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0\\n 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0\\n 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1\\n 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1\\n 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1\\n 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0\\n 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0\\n 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0\\n 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1\\n 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0\\n 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\\n 0 0 0 0 0 0 0 0 0 0 0 0 1]',\n", + " 110, 6.78135971352466]], dtype=object)" + ] + }, + "execution_count": 217, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "arr_final = pd.read_csv(\"exp_arr.csv\").values[:, 1:]\n", + "arr_final" + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "id": "ab7b0743", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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/Pjxql+/vrKystSoUSN5eXkZHc8mJCREw4YN03PPPac6deooOztbTZs21bBhw9SkSRMlJCQYHRG3ma+vr5KTkxUZGVlp9/nSpUuVkpKizz//3K55KHYATOn48eNavHixkpOTVVpaqj179uiee+4xOla18tOF6FarVRaL5brT3GZ7qXpOTo46deqkunXr6tixYzpw4IACAgL00ksvKS8vT8nJyUZHtKldu7b27Nkjf39/NWjQQGlpaWrdurX27dun6OhonTx50uiIuM3uuece7d27V76+vvL29tbKlSsVFham3NxctW7dWoWFhXbNY/8jkQHgFvy0iJipdFQnubm5tlcz5ebm6ujRo8rNza3y6+jRowYnreyFF15QbGysDh06JGdnZ9v17t2769///reByapyc3OzHSPj5eVle+F7QUGBLl68aGQ02ElAQIDtmKbmzZtrxYoVkqRVq1apXr16ds9DsQNgGpcvX1ZKSoo6d+6s4OBg7dq1S0lJScrLy2O07lfw8/OzTWEfP35cXl5e8vPzq/TLy8tLx48fNzhpZVu3btWwYcOqXPfy8tKpU6cMSHRjHTp00Nq1ayVJ/fv31+jRozV06FA99dRT6tixo8HpYA9xcXHKzs6WJE2aNEnz58+Xs7Ozxo4dq/Hjx9s9D1OxAEzhT3/6k5YvXy4fHx/Fx8crJiZGDRs2NDqWw3ByctLJkyernA929uxZeXh4mGpU1MPDQ2vWrFFoaKht3VpAQIDWrl2r+Ph4nThxwuiINvn5+SouLpanp6fKy8s1Y8YMbdy4UUFBQXrppZfk5uZmdETY2fHjx7V9+3YFBgYasnaVYgfAFKxWq3x9fRUaGnrTjRIcH/HrWK1WnT592jY1e83Bgwf14IMP6vz58wYlq+rZZ5/V2bNntWLFCtWvX185OTlycnLS448/rg4dOpj61H/AaBx3AsAUBg8ezM7X2+CJJ56QdHWDRGxsrGrVqmW7V1ZWppycHLVr186oeNc1a9Ys9evXTx4eHrp06ZIiIiJ06tQpPfLII5o+fbrR8QBJuuVNPIMHD77NSSpjxA4AHFhcXJwkacmSJfr9738vFxcX272aNWvK399fQ4cONeW0d0ZGhnJyclRYWKi2bduqU6dORkeyuba552YsFotKS0vtlAj2drNpdovFoqKiIpWWltp9mQPFDgAcXEVFheLj4zVv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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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9NJLSk5O1sSJExUZGalevXpp7ty5Wrp0qSorKxvzIwPwYNeZDgAAJrVv316DBg3S4sWL5XQ6NWjQILVr1851/4svvlB1dbV+9rOfua41a9ZMsbGx2rt3ryRp7969+ulPf+r2fe+++263rwsLC1VUVKT33nvPdc3pdMrhcKikpESdO3e+Gh8PwDWGYgfgmpeWluaaEp0/f/5V+Rnl5eUaO3asxo8fX+ceGzUA/FgodgCueQMGDFBVVZVsNpv69+/vdq9Tp05q3ry5CgoKFBoaKkmqrq7W5s2bNXHiRElS586dlZOT4/bnPv/8c7eve/bsqT179igiIuLqfRAA1zzW2AG45nl7e2vv3r3as2ePvL293e61bNlSjz/+uJ599lmtXr1ae/bs0ZgxY3T27FmNHj1akjRu3DgdOHBAzz77rPbt26dly5Zp8eLFbt/n+eef1/r16/XEE09ox44dOnDggD766CM2TwD4UVHsAEBS69at1bp160vee/nll/XAAw/o4YcfVs+ePXXw4EGtWbNGfn5+ki5MpX744Yf6y1/+oh49eujNN99UZmam2/fo3r278vLytH//fsXFxSkmJkZTp05VQEDAVf9sAK4dNqfT6TQdAgAAAP9/jNgBAAB4CIodAACAh6DYAQAAeAiKHQAAgIeg2AEAAHgIih0AAICHoNgBAAB4CIodAACAh6DYAQAAeAiKHQAAgIeg2AEAAHiI/wOR47fWuMj5pwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + " #arr_final = np.asarray(tmp_base)\n", + " arr_final = pd.read_csv(\"exp_arr.csv\").values[:, 1:-1]\n", + " model_subset = [\"Control (Positive)\", \"Control (Negative)\", \n", + " \"Mutual Information (100)\", \"ANOVA\",\n", + " \"RFE (10)\", \"RFECV\",\n", + " \"Particle Swarm Optimization\", \"Artificial Bee Colony Optimizaton\", \"Gray Wolf - Whale Optimization Algorithm\", \"Naked Mole Rat Algorithm\",\n", + " \"MultiSURF (20)\", \"Triglav Stage 1\", \"Triglav MultiSURF 80\", \"Triglav = Naked Mole Rat Algorithm\"]\n", + " \n", + " model_ss = [True if x[0] in model_subset else False for x in arr_final]\n", + " \n", + " arr_final = arr_final[model_ss]\n", + " \n", + " exp_arr = pd.DataFrame(np.asarray(tmp_base), columns = [\"Model\", \"Generalization Performance (ETC)\", \n", + " \"Generalization Performance (LSVC)\", \n", + " \"Features\", \"Number of Selected Features\"], dtype = \"object\")\n", + " \n", + " exp_arr[\"Log Base 2 (Number of Selected Features)\"] = np.log2(exp_arr[\"Number of Selected Features\"].values.astype(int))\n", + " \n", + " #exp_arr.to_csv(\"exp_arr.csv\")\n", + " \n", + " exp_arr = pd.DataFrame(arr_final, columns = [\"Model\", \"Generalization Performance (ETC)\", \n", + " \"Generalization Performance (LSVC)\", \n", + " \"Features\", \"Number of Selected Features\"], dtype = \"object\")\n", + " \n", + " exp_arr[\"Log Base 2 (Number of Selected Features)\"] = np.log2(exp_arr[\"Number of Selected Features\"].values.astype(int))\n", + " \n", + " exp_arr.to_csv(\"exp_arr_ss.csv\")\n", + " \n", + " exp_arr[\"Model\"] = np.where(exp_arr[\"Model\"].values == \"Triglav = Naked Mole Rat Algorithm\", \n", + " \"Triglav - Naked Mole Rat Algorithm\",\n", + " exp_arr[\"Model\"].values)\n", + " \n", + " exp_arr[\"Model\"] = np.where(exp_arr[\"Model\"].values == \"Triglav MultiSURF 80\", \n", + " \"Triglav - MultiSURF (80)\",\n", + " exp_arr[\"Model\"].values)\n", + " \n", + " ax = sns.boxplot(x = \"Model\", y = \"Generalization Performance (ETC)\", hue = \"Model\", \n", + " data = exp_arr, dodge = False)\n", + " legend = ax.legend()\n", + " legend.remove()\n", + " plt.xticks(rotation = 90)\n", + " plt.tight_layout()\n", + " plt.show()\n", + " plt.close()\n", + " \n", + " ax = sns.boxplot(x = \"Model\", y = \"Generalization Performance (LSVC)\", hue = \"Model\", \n", + " data = exp_arr, dodge = False)\n", + " legend = ax.legend()\n", + " legend.remove()\n", + " plt.xticks(rotation = 90)\n", + " plt.tight_layout()\n", + " plt.show()\n", + " plt.close()\n", + " \n", + " ax = sns.boxplot(x = \"Model\", y = \"Log Base 2 (Number of Selected Features)\", hue = \"Model\", \n", + " data = exp_arr, dodge = False)\n", + " legend = ax.legend()\n", + " legend.remove()\n", + " plt.xticks(rotation = 90)\n", + " plt.tight_layout()\n", + " plt.show()\n", + " plt.close()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65d73360", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/Diseased-Gut-Analysis/16S_Test_PSO_PA.ipynb b/notebooks/Diseased-Gut-Analysis/16S_Test_PSO_PA.ipynb new file mode 100644 index 0000000..ac3b3d5 --- /dev/null +++ b/notebooks/Diseased-Gut-Analysis/16S_Test_PSO_PA.ipynb @@ -0,0 +1,2443 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9c54f025", + "metadata": {}, + "source": [ + "## In a previous notebook, we demonstrated how Triglav can be used to calculate feature stability scores. We showed that Triglav will produce a set of stable features. In this notebook, we will run a simple analysis of the gut microbiomes of patients suffering from Crohn's Disease and compare that to healthy controls. We will select a set of non-redundant (one feature per cluster) features using Triglav's first and second stage. Finally, we will demonstrate how Triglav can be used with other tools to analyze which features are important and how these features can explain a sample's location in a projected space. ASVs and taxonomic assignments were created using FASTQ files analyzed with the MetaWorks pipeline (available here: https://github.com/terrimporter/MetaWorks)" + ] + }, + { + "cell_type": "markdown", + "id": "ab0d0a4a", + "metadata": {}, + "source": [ + "#### Import required packages" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "adb6999f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:34: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:53: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:62: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:68: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:76: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:4: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @numba.jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:9: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @numba.jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:14: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @numba.jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:19: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @numba.jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:362: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit # we can't use this when using a custom link function...\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:384: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:427: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:438: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_tabular.py:185: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_tabular.py:196: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_image.py:174: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\explainers\\_partition.py:675: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + " @jit\n", + "\u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", + "\u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import StratifiedGroupKFold, GridSearchCV\n", + "from sklearn.ensemble import ExtraTreesClassifier\n", + "from sklearn.metrics import balanced_accuracy_score\n", + "from sklearn.svm import LinearSVC\n", + "\n", + "from TreeOrdination import TreeOrdination\n", + "\n", + "from stability import hypothesisTestT, getStability, confidenceIntervals\n", + "\n", + "from triglav import Triglav, ETCProx\n", + "\n", + "import shap as sh\n", + "\n", + "import sage as sg\n", + "\n", + "import numpy as np\n", + "\n", + "import pandas as pd\n", + "\n", + "from random import shuffle\n", + "\n", + "import seaborn as sns\n", + "\n", + "from matplotlib import pyplot as plt\n", + "\n", + "from skbio.stats.composition import clr, multiplicative_replacement, closure\n", + "from skbio.stats import subsample_counts\n", + "\n", + "from statsmodels.stats.multitest import multipletests" + ] + }, + { + "cell_type": "markdown", + "id": "f8e7d2fd", + "metadata": {}, + "source": [ + "#### Read in taxonomic data and select high-confidence ASVs" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4b57a4dd", + "metadata": {}, + "outputs": [], + "source": [ + "# Function for rarefaction\n", + "# https://stackoverflow.com/questions/15507993/quickly-rarefy-a-matrix-in-numpy-python\n", + "from numpy.random import RandomState\n", + "\n", + "def rarefaction(M, y1, M2, y2, D, seed=0):\n", + " prng = RandomState(seed) # reproducible results\n", + "\n", + " n_occur = M.sum(axis=1)\n", + " rem = np.where(n_occur < D, False, True)\n", + " M_ss = M[rem]\n", + " n_occur = n_occur[rem]\n", + " nvar = M.shape[1] # number of variables\n", + "\n", + " # Do training data\n", + " Mrarefied = np.empty_like(M_ss)\n", + " for i in range(M_ss.shape[0]): # for each sample\n", + " p = M_ss[i] / float(n_occur[i]) # relative frequency / probability\n", + " choice = prng.choice(nvar, D, p=p)\n", + " Mrarefied[i] = np.bincount(choice, minlength=nvar)\n", + "\n", + " # Do testing data\n", + " n_occur2 = M2.sum(axis=1)\n", + " rem2 = np.where(n_occur2 < D, False, True)\n", + " M_ss2 = M2[rem2]\n", + " n_occur2 = n_occur2[rem2]\n", + " nvar = M2.shape[1] # number of variables\n", + "\n", + " Mrarefied2 = np.empty_like(M_ss2)\n", + " for i in range(M_ss2.shape[0]): # for each sample\n", + " p = M_ss2[i] / float(n_occur2[i]) # relative frequency / probability\n", + " choice = prng.choice(nvar, D, p=p)\n", + " Mrarefied2[i] = np.bincount(choice, minlength=nvar)\n", + "\n", + " return Mrarefied, y1[rem], Mrarefied2, y2[rem2]\n", + "\n", + "if __name__ == \"__main__\":\n", + "\n", + " #Read in ASV table\n", + " X = pd.read_csv(\"Diseased Gut/ESV.table\", index_col=0, sep=\"\\t\")\n", + " X_features = X.index.values #Get features\n", + " X_index = [s_name.split(\"_\")[0] for s_name in X.columns.values] #Get the right index\n", + " X_original = X.transpose()\n", + " X_original.index = X_index #Fix the index so it can be ordered\n", + " \n", + " # Read in taxa data\n", + " taxa_tab = pd.read_csv(\n", + " \"Diseased Gut/rdp.out.tmp\", delimiter=\"\\t\", header=None\n", + " ).values\n", + "\n", + " #Convert taxa tab into a dictionary for quick searching\n", + " taxa_dict = {t[0]: np.asarray(t)[1:] for t in taxa_tab}\n", + " \n", + " # Keep all ASVs assigned to Bacteria and Archaea, remove Cyanobacteria and Chloroplasts\n", + " idx = np.where(\n", + " ((taxa_tab[:, 2] == \"Bacteria\") | (taxa_tab[:, 2] == \"Archaea\")), True, False\n", + " )\n", + " taxa_tab = taxa_tab[idx]\n", + " idx = np.where(taxa_tab[:, 5] != \"Cyanobacteria/Chloroplast\", True, False)\n", + " taxa_tab = taxa_tab[idx]\n", + " X_selected = set([x[0] for x in taxa_tab])\n", + " taxa_tab_ss = {x[0]: x for x in taxa_tab}\n", + "\n", + " # Get names of high confidence features\n", + " n_list = [4, 7, 10, 13, 16, 19]\n", + " asv_name = []\n", + "\n", + " for entry in X_features:\n", + " if entry in taxa_dict:\n", + " if float(taxa_dict[entry][-1]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-3], entry))\n", + "\n", + " elif float(taxa_dict[entry][-4]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-6], entry))\n", + "\n", + " elif float(taxa_dict[entry][-7]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-9], entry))\n", + "\n", + " elif float(taxa_dict[entry][-10]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-12], entry))\n", + "\n", + " elif float(taxa_dict[entry][-13]) > 0.8:\n", + " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-15], entry))\n", + "\n", + " else:\n", + " asv_name.append(\"Unclassified-%s\" % entry)\n", + " \n", + " asv_name = np.asarray(asv_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6cef0596", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(3318,)\n", + "(3318,)\n", + "(214, 3318)\n", + "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", + "SRR8534033 926 1 0 0 0 0 0 \\\n", + "SRR8534034 38586 14 1 0 0 0 0 \n", + "SRR8534035 49718 1069 1 0 2 0 0 \n", + "SRR8534036 1016 236 0 0 0 0 0 \n", + "SRR8534037 4247 3416 0 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534250 5231 2880 0 0 1 0 0 \n", + "SRR8534251 636 145 0 0 0 0 0 \n", + "SRR8534252 3026 347 332 0 0 0 0 \n", + "SRR8534253 111 163 0 0 0 0 0 \n", + "SRR8534254 12386 2485 0 0 0 0 0 \n", + "\n", + "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", + "SRR8534033 0 0 0 ... 0 0 0 \\\n", + "SRR8534034 0 0 0 ... 0 0 0 \n", + "SRR8534035 0 0 0 ... 0 0 0 \n", + "SRR8534036 0 0 0 ... 0 0 0 \n", + "SRR8534037 0 0 0 ... 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534250 0 0 0 ... 0 0 0 \n", + "SRR8534251 0 0 0 ... 0 0 0 \n", + "SRR8534252 0 0 0 ... 0 0 69 \n", + "SRR8534253 0 0 0 ... 0 0 0 \n", + "SRR8534254 0 0 0 ... 0 0 0 \n", + "\n", + "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", + "SRR8534033 0 0 0 0 0 0 0 \n", + "SRR8534034 0 0 0 0 4 0 0 \n", + "SRR8534035 0 0 0 0 0 0 0 \n", + "SRR8534036 0 0 0 0 0 0 0 \n", + "SRR8534037 0 0 0 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534250 0 0 0 0 0 0 0 \n", + "SRR8534251 0 0 0 0 0 1 0 \n", + "SRR8534252 0 0 0 0 0 0 0 \n", + "SRR8534253 0 0 0 0 0 0 0 \n", + "SRR8534254 0 0 0 0 0 0 0 \n", + "\n", + "[214 rows x 3318 columns]\n", + "['Blautia-Zotu1' 'Anaerostipes-Zotu10' 'Blautia-Zotu100' ...\n", + " 'Lachnospiraceae-Zotu997' 'Clostridiales-Zotu998' 'Clostridia-Zotu999']\n" + ] + } + ], + "source": [ + " print(asv_name.shape)\n", + " print(X_features.shape)\n", + " print(X_original.shape)\n", + " print(X_original)\n", + " print(asv_name)" + ] + }, + { + "cell_type": "markdown", + "id": "6facf0ed", + "metadata": {}, + "source": [ + "#### Read in metadata and order X" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "898fd152", + "metadata": {}, + "outputs": [], + "source": [ + " # Read in metadata\n", + " meta = pd.read_csv(\"Diseased Gut/metadata.csv\", index_col=0)\n", + " meta = meta[[\"Sample Name\", \"Host_disease\", \"Timepoint\"]]\n", + "\n", + " # Correct locations so they are more informative\n", + " meta[\"Host_disease\"] = np.where(\n", + " meta[\"Host_disease\"] == \"CD\", \"Crohn's Disease\", meta[\"Host_disease\"]\n", + " )\n", + " meta[\"Host_disease\"] = np.where(\n", + " meta[\"Host_disease\"] == \"RA\", \"Rheumatoid Arthritis\", meta[\"Host_disease\"]\n", + " )\n", + " meta[\"Host_diseaes\"] = np.where(\n", + " meta[\"Host_disease\"] == \"MS\", \"Multiple Sclerosis\", meta[\"Host_disease\"]\n", + " )\n", + " meta[\"Host_disease\"] = np.where(\n", + " meta[\"Host_disease\"] == \"US\", \"Ulcerative Colitis\", meta[\"Host_disease\"]\n", + " )\n", + " meta[\"Host_disease\"] = np.where(\n", + " meta[\"Host_disease\"] == \"HC\", \"Healthy Control\", meta[\"Host_disease\"]\n", + " )\n", + " \n", + " #Order samples according to the metadata\n", + " X_original = X_original.loc[meta.index]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "11c5c2c9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Sample Name Host_disease Timepoint Host_diseaes\n", + "SRR8534151 1003.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", + "SRR8534152 1003.2 Rheumatoid Arthritis 2 Rheumatoid Arthritis\n", + "SRR8534149 1021.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", + "SRR8534083 1021.2 Rheumatoid Arthritis 2 Rheumatoid Arthritis\n", + "SRR8534155 1024.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", + "... ... ... ... ...\n", + "SRR8534199 8399.2 UC 2 UC\n", + "SRR8534200 8407.1 Crohn's Disease 1 Crohn's Disease\n", + "SRR8534125 8407.2 Crohn's Disease 2 Crohn's Disease\n", + "SRR8534128 8702.1 UC 1 UC\n", + "SRR8534126 8702.2 UC 2 UC\n", + "\n", + "[198 rows x 4 columns]\n", + "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", + "SRR8534151 776 23 0 0 0 0 0 \\\n", + "SRR8534152 30315 1134 2 0 0 0 0 \n", + "SRR8534149 443 23 54 0 0 0 0 \n", + "SRR8534083 6206 2328 226 0 1 0 2 \n", + "SRR8534155 33147 271 0 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534199 17255 5 0 0 0 0 0 \n", + "SRR8534200 295 82 0 0 0 0 0 \n", + "SRR8534125 6785 823 5 0 0 0 0 \n", + "SRR8534128 5802 451 3 0 0 0 0 \n", + "SRR8534126 717 512 0 0 0 0 0 \n", + "\n", + "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", + "SRR8534151 0 0 0 ... 0 0 0 \\\n", + "SRR8534152 0 0 0 ... 0 0 0 \n", + "SRR8534149 0 0 0 ... 0 0 0 \n", + "SRR8534083 0 0 0 ... 0 0 0 \n", + "SRR8534155 0 0 0 ... 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534199 0 0 0 ... 0 0 0 \n", + "SRR8534200 0 0 0 ... 0 0 0 \n", + "SRR8534125 1 0 0 ... 0 0 0 \n", + "SRR8534128 1 0 0 ... 0 0 0 \n", + "SRR8534126 2 0 0 ... 0 0 0 \n", + "\n", + "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", + "SRR8534151 0 0 0 0 0 0 0 \n", + "SRR8534152 0 0 1 10 0 0 1 \n", + "SRR8534149 0 0 0 0 0 0 0 \n", + "SRR8534083 0 0 0 0 0 1 4 \n", + "SRR8534155 0 0 3 0 0 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534199 0 0 0 0 0 0 0 \n", + "SRR8534200 0 0 0 0 0 0 0 \n", + "SRR8534125 0 0 0 0 0 1 0 \n", + "SRR8534128 0 0 0 0 0 0 0 \n", + "SRR8534126 0 0 0 0 0 0 0 \n", + "\n", + "[198 rows x 3318 columns]\n" + ] + } + ], + "source": [ + " print(meta)\n", + " print(X_original)" + ] + }, + { + "cell_type": "markdown", + "id": "e4ed25e3", + "metadata": {}, + "source": [ + "#### Get the group metadata (Sample Name)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e8fa6086", + "metadata": {}, + "outputs": [], + "source": [ + " # Get groups\n", + " groups = meta[\"Sample Name\"].astype(str).values\n", + " groups = np.asarray([x.split(\".\")[0] for x in groups])\n", + " \n", + " # List of phenotypes/datasets to test\n", + " pheno = \"Crohn's Disease-Healthy Control\"\n", + "\n", + " pheno_a, pheno_b = pheno.split(\"-\")\n", + "\n", + " idx = np.where(\n", + " ((meta[\"Host_disease\"] == pheno_a) | (meta[\"Host_disease\"] == pheno_b)),\n", + " True,\n", + " False,\n", + " )\n", + "\n", + " y = meta[idx][\"Host_disease\"]\n", + " y = y.values\n", + " \n", + " X_signal = X_original[idx]\n", + " \n", + " groups = groups[idx]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "83ee9304", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " \"Crohn's Disease\" \"Crohn's Disease\" 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", + " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", + " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"]\n", + "['2001' '2001' '2006' '2006' '2008' '2008' '2011' '2011' '2012' '2012'\n", + " '2013' '2013' '2014' '2014' '2015' '2015' '2018' '2018' '2019' '2019'\n", + " '2020' '2020' '2021' '2021' '2022' '2022' '2023' '2023' '2026' '2026'\n", + " '2030' '2030' '2031' '2031' '2037' '2037' '2043' '2043' '2046' '2046'\n", + " '2048' '2048' '2049' '2049' '2057' '2057' '2061' '2061' '2062' '2062'\n", + " '2063' '2063' '2064' '2064' '2084' '2084' '2093' '2093' '2101' '2101'\n", + " '2196' '2196' '2201' '2201' '8101' '8101' '8102' '8102' '8114' '8114'\n", + " '8124' '8124' '8160' '8160' '8170' '8170' '8182' '8182' '8407' '8407']\n", + "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", + "SRR8534047 253 277 0 0 0 0 0 \\\n", + "SRR8534050 4319 2289 0 0 0 1 1 \n", + "SRR8534049 673 216 8 0 0 0 1 \n", + "SRR8534045 6891 1434 56 0 3 0 0 \n", + "SRR8534044 10664 3777 305 0 0 1 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534236 8629 397 1 0 0 0 0 \n", + "SRR8534229 591 81 0 0 0 0 0 \n", + "SRR8534230 361 40 0 0 0 0 0 \n", + "SRR8534200 295 82 0 0 0 0 0 \n", + "SRR8534125 6785 823 5 0 0 0 0 \n", + "\n", + "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", + "SRR8534047 0 0 0 ... 0 0 0 \\\n", + "SRR8534050 0 0 0 ... 0 0 0 \n", + "SRR8534049 0 0 0 ... 0 0 0 \n", + "SRR8534045 0 0 0 ... 0 0 0 \n", + "SRR8534044 0 0 0 ... 0 0 3 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534236 0 0 0 ... 0 0 0 \n", + "SRR8534229 0 0 0 ... 0 0 0 \n", + "SRR8534230 0 0 0 ... 0 0 0 \n", + "SRR8534200 0 0 0 ... 0 0 0 \n", + "SRR8534125 1 0 0 ... 0 0 0 \n", + "\n", + "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", + "SRR8534047 0 0 0 0 0 0 0 \n", + "SRR8534050 0 0 0 0 0 0 0 \n", + "SRR8534049 0 0 0 0 0 0 0 \n", + "SRR8534045 0 0 0 0 0 0 0 \n", + "SRR8534044 0 0 0 0 1 0 0 \n", + "... ... ... ... ... ... ... ... \n", + "SRR8534236 0 0 2 15 0 0 0 \n", + "SRR8534229 0 0 0 0 0 0 0 \n", + "SRR8534230 0 0 0 0 0 0 0 \n", + "SRR8534200 0 0 0 0 0 0 0 \n", + "SRR8534125 0 0 0 0 0 1 0 \n", + "\n", + "[80 rows x 3318 columns]\n" + ] + } + ], + "source": [ + " print(y)\n", + " print(groups)\n", + " print(X_signal)" + ] + }, + { + "cell_type": "markdown", + "id": "35a197a9", + "metadata": {}, + "source": [ + "#### Remove useless features" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "3f589ae7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All Features: 3318\n", + "Reduced Features: 938\n" + ] + } + ], + "source": [ + " # Remove very rare ASVs (<= 4 occurances)\n", + " X_removed = np.where(X_signal.values > 0, True, False)\n", + " occ = np.where(X_removed.sum(axis = 0) > 4, True, False)\n", + " X_removed = X_signal.values[:, occ]\n", + " reduced_features = asv_name[occ]\n", + " \n", + " print(\"All Features: \", X_signal.shape[1])\n", + " print(\"Reduced Features: \", X_removed.shape[1])\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "230a2c1f", + "metadata": {}, + "source": [ + "#### Prepare the nature-based solutions to be tested" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "249f2adf", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + " from mealpy.swarm_based import PSO, ABC\n", + " from mealpy.swarm_based.NMRA import ImprovedNMRA\n", + " from mealpy.swarm_based.GWO import GWO_WOA\n", + " from mealpy.utils.logger import Logger\n", + " from mealpy.utils.problem import Problem\n", + " \n", + " from sklearn.svm import LinearSVC\n", + " from sklearn.linear_model import LogisticRegressionCV\n", + " from sklearn.model_selection import GridSearchCV, cross_val_score, cross_val_predict, cross_validate\n", + " from sklearn.metrics import make_scorer, pairwise_distances\n", + " from sklearn.ensemble import StackingClassifier\n", + " \n", + " from skrebate import MultiSURF\n", + " \n", + " from skbio.stats.distance._cutils import permanova_f_stat_sW_cy\n", + " from skbio.stats.distance._base import _preprocess_input_sng\n", + " from skbio.stats.ordination import pcoa\n", + " from skbio import DistanceMatrix\n", + " \n", + " import warnings\n", + " from sklearn.exceptions import ConvergenceWarning\n", + " warnings.filterwarnings('ignore', category=ConvergenceWarning)\n", + " \n", + " def f_stat(X, y):\n", + " \n", + " D = DistanceMatrix(pairwise_distances(X, metric = \"euclidean\").astype(np.float32))\n", + " \n", + " SST = D[:] ** 2\n", + " SST = SST.sum() / X.shape[0]\n", + " SST = SST / 2.0\n", + " \n", + " n_groups, grouping = _preprocess_input_sng(D.ids, X.shape[0], y, None)\n", + " \n", + " grouping = np.asarray(grouping)\n", + " \n", + " group_sizes = np.bincount(grouping)\n", + " \n", + " SSW = permanova_f_stat_sW_cy(DistanceMatrix(D).data,\n", + " group_sizes, \n", + " grouping)\n", + " \n", + " SSA = SST - SSW\n", + " \n", + " return (SSW / (X.shape[0] - n_groups)) / (SSA / (n_groups - 1)) # To turn this into a minimization problem\n", + " \n", + " \n", + " from sklearn.utils import resample\n", + " from sklearn.neighbors import KNeighborsClassifier\n", + " from sklearn.metrics import log_loss\n", + " class DSFSProblem(Problem):\n", + "\n", + " SUPPORTED_ARRAY = (list, tuple, np.ndarray)\n", + "\n", + " def __init__(self, lb=None, ub=None, minmax=\"min\", X=None, y=None, **kwargs):\n", + " r\"\"\"Initialize Problem.\n", + "\n", + " Args:\n", + " lb (numpy.ndarray, list, tuple): Lower bounds of the problem.\n", + " ub (numpy.ndarray, list, tuple): Upper bounds of the problem.\n", + " minmax (str): Minimization or maximization problem (min, max)\n", + " name (str): Name for this particular problem\n", + " \"\"\"\n", + " self.name, self.log_to, self.log_file = \"P\", \"console\", \"history.txt\"\n", + " self.n_objs, self.obj_is_list, self.multi_objs = 1, False, False\n", + " self.n_dims, self.lb, self.ub, self.save_population = None, None, None, False\n", + " self.X, self.y = X, y\n", + " self.obj_weights = [0.6, 0.4]\n", + "\n", + " self.__set_keyword_arguments(kwargs)\n", + " self.__set_domain_range(lb, ub)\n", + " self.__set_functions(kwargs)\n", + " self.logger = Logger(self.log_to, log_file=self.log_file).create_logger(name=f\"{__name__}.{__class__.__name__}\",\n", + " format_str='%(asctime)s, %(levelname)s, %(name)s [line: %(lineno)d]: %(message)s')\n", + " self.minmax = minmax\n", + "\n", + " def __set_keyword_arguments(self, kwargs):\n", + " for key, value in kwargs.items():\n", + " setattr(self, key, value)\n", + "\n", + " def __set_domain_range(self, lb, ub):\n", + " if type(lb) in self.SUPPORTED_ARRAY and type(ub) in self.SUPPORTED_ARRAY:\n", + " self.lb = np.array(lb).flatten()\n", + " self.ub = np.array(ub).flatten()\n", + " if len(self.lb) == len(self.ub):\n", + " self.n_dims = len(self.lb)\n", + " if len(self.lb) < 1:\n", + " raise ValueError(f'Dimensions do not qualify. Length(lb) = {len(self.lb)} < 1.')\n", + " else:\n", + " raise ValueError(f\"Length of lb and ub do not match. {len(self.lb)} != {len(self.ub)}.\")\n", + " else:\n", + " raise ValueError(f\"lb and ub need to be a list, tuple or np.array.\")\n", + "\n", + " def __set_functions(self, kwargs):\n", + " tested_solution = self.generate_position(self.lb, self.ub)\n", + " if \"amend_position\" in kwargs:\n", + " if not callable(self.amend_position):\n", + " raise ValueError(f\"Use default 'amend_position()' or passed a callable function. {type(self.amend_position)} != function\")\n", + " else:\n", + " tested_solution = self.amend_position(tested_solution, self.lb, self.ub)\n", + " result = self.fit_func(tested_solution)\n", + " if type(result) in self.SUPPORTED_ARRAY:\n", + " result = np.array(result).flatten()\n", + " self.n_objs = len(result)\n", + " self.obj_is_list = True\n", + " if self.n_objs > 1:\n", + " self.multi_objs = True\n", + " if type(self.obj_weights) in self.SUPPORTED_ARRAY:\n", + " self.obj_weights = np.array(self.obj_weights).flatten()\n", + " if self.n_objs != len(self.obj_weights):\n", + " raise ValueError(f\"{self.n_objs}-objective problem, but N weights = {len(self.obj_weights)}.\")\n", + " self.msg = f\"Solving {self.n_objs}-objective optimization problem with weights: {self.obj_weights}.\"\n", + " else:\n", + " raise ValueError(f\"Solving {self.n_objs}-objective optimization, need to set obj_weights list with length: {self.n_objs}\")\n", + " elif self.n_objs == 1:\n", + " self.multi_objs = False\n", + " self.obj_weights = np.ones(1)\n", + " self.msg = f\"Solving single objective optimization problem.\"\n", + " else:\n", + " raise ValueError(f\"fit_func needs to return a single value or a list of values list\")\n", + " elif type(result) in (int, float) or isinstance(result, np.floating) or isinstance(result, np.integer):\n", + " self.multi_objs = False\n", + " self.obj_is_list = False\n", + " self.obj_weights = np.ones(1)\n", + " self.msg = f\"Solving single objective optimization problem.\"\n", + " else:\n", + " raise ValueError(f\"fit_func needs to return a single value or a list of values list\")\n", + "\n", + " def fit_func(self, x):\n", + " \"\"\"Fitness function\n", + "\n", + " Args:\n", + " x (numpy.ndarray): Solution.\n", + "\n", + " Returns:\n", + " float: Function value of `x`.\n", + " \"\"\"\n", + " selected = x > 0\n", + " \n", + " num_selected = selected.sum()\n", + " if num_selected == 0:\n", + " return 1.0 \n", + " \n", + " # Subset\n", + " x_train = self.X[:, selected].astype(float)\n", + " \n", + " # Train\n", + " c1 = cross_validate(ExtraTreesClassifier(128, max_depth = 3), \n", + " x_train, self.y, \n", + " cv = 3, \n", + " scoring = \"balanced_accuracy\",\n", + " return_estimator = True,\n", + " return_indices = True,\n", + " n_jobs = 5)\n", + " \n", + " test_ind = [inds for inds in c1[\"indices\"][\"test\"]]\n", + " log_losses_1 = [log_loss(self.y[test_ind[i]], c1[\"estimator\"][i].predict_proba(x_train[test_ind[i]])) for i in range(3)]\n", + " log_losses_1 = np.asarray(log_losses_1).mean()\n", + " \n", + " # Score\n", + " s_1 = 1 - c1[\"test_score\"].mean()\n", + " s_2 = np.asarray(log_losses_1).mean()\n", + " s_3 = f_stat(x_train, self.y)\n", + "\n", + " num_features = self.X.shape[1] \n", + " f_frac = num_selected / num_features\n", + "\n", + " o_1 = (0.85 * s_1) + (0.10 * s_2) + (0.05 * s_3)\n", + " o_4 = f_frac\n", + " \n", + " return o_1, o_4\n", + "\n", + " def get_name(self):\n", + " \"\"\"\n", + " Returns:\n", + " string: The name of the problem\n", + " \"\"\"\n", + " return self.name\n", + "\n", + " def get_class_name(self):\n", + " \"\"\"Get class name.\"\"\"\n", + " return self.__class__.__name__\n", + "\n", + " def generate_position(self, lb=None, ub=None):\n", + " \"\"\"\n", + " Generate the position depends on the problem. For discrete problem such as permutation, this method can be override.\n", + "\n", + " Args:\n", + " lb: list of lower bound values\n", + " ub: list of upper bound values\n", + "\n", + " Returns:\n", + " np.array: the position (the solution for the problem)\n", + " \"\"\"\n", + " pos = np.random.uniform(lb, ub)\n", + " pos = np.where(pos > 0.4, 1, 0)\n", + " \n", + " return pos\n", + "\n", + " def amend_position(self, position=None, lb=None, ub=None):\n", + " \"\"\"\n", + " The goal is to transform the solution into the right format corresponding to the problem.\n", + " For example, with discrete problems, floating-point numbers must be converted to integers\n", + " to ensure the solution is in the correct format.\n", + "\n", + " Args:\n", + " position: vector position (location) of the solution.\n", + " lb: list of lower bound values\n", + " ub: list of upper bound values\n", + "\n", + " Returns:\n", + " Amended position (make the right format of the solution)\n", + " \"\"\"\n", + " position_clipped = np.where(position > 0.4, 1, 0)\n", + " \n", + " return position_clipped\n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "26ccc1ed", + "metadata": {}, + "source": [ + "#### Identify best number of clusters parameter for feature stability in Triglav" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9bfd80a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10 1 - Remaining Features = 732\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 34 / Tentative (Accepted): 4 / Tentative (Not Accepted): 2 / Rejected: 4\n", + "Round 35 / Tentative (Accepted): 4 / Tentative (Not Accepted): 2 / Rejected: 4\n", + "Round 36 / Tentative (Accepted): 4 / Tentative (Not Accepted): 2 / Rejected: 4\n", + "Round 37 / Tentative (Accepted): 4 / Tentative (Not Accepted): 2 / Rejected: 4\n", + "Round 38 / Tentative (Accepted): 4 / Tentative (Not Accepted): 2 / Rejected: 4\n", + "Round 39 / Tentative (Accepted): 4 / Tentative (Not Accepted): 2 / Rejected: 4\n", + "Round 40 / Tentative (Accepted): 4 / Tentative (Not Accepted): 2 / Rejected: 4\n", + "Final Feature Set Contains 420 Features.\n", + "10 2 - Remaining Features = 736\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 7 / Rejected: 3\n", + "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 7 / Rejected: 3\n", + "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 7 / Rejected: 3\n", + "Round 34 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 35 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 36 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 37 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 38 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 39 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 40 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Final Feature Set Contains 243 Features.\n", + "10 3 - Remaining Features = 751\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 7 / Rejected: 3\n", + "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 7 / Rejected: 3\n", + "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 7 / Rejected: 3\n", + "Round 34 / Tentative (Accepted): 2 / Tentative (Not Accepted): 5 / Rejected: 3\n", + "Round 35 / Tentative (Accepted): 2 / Tentative (Not Accepted): 5 / Rejected: 3\n", + "Round 36 / Tentative (Accepted): 2 / Tentative (Not Accepted): 5 / Rejected: 3\n", + "Round 37 / Tentative (Accepted): 2 / Tentative (Not Accepted): 5 / Rejected: 3\n", + "Round 38 / Tentative (Accepted): 2 / Tentative (Not Accepted): 5 / Rejected: 3\n", + "Round 39 / Tentative (Accepted): 2 / Tentative (Not Accepted): 5 / Rejected: 3\n", + "Round 40 / Tentative (Accepted): 2 / Tentative (Not Accepted): 5 / Rejected: 3\n", + "Final Feature Set Contains 128 Features.\n", + "10 4 - Remaining Features = 803\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 8 / Rejected: 2\n", + "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 7 / Rejected: 3\n", + "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 7 / Rejected: 3\n", + "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 7 / Rejected: 3\n", + "Round 34 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 35 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 36 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 37 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 38 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 39 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Round 40 / Tentative (Accepted): 3 / Tentative (Not Accepted): 4 / Rejected: 3\n", + "Final Feature Set Contains 311 Features.\n", + "10 5 - Remaining Features = 752\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 10 / Rejected: 0\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 6 / Rejected: 4\n", + "Round 34 / Tentative (Accepted): 1 / Tentative (Not Accepted): 5 / Rejected: 4\n", + "Round 35 / Tentative (Accepted): 1 / Tentative (Not Accepted): 5 / Rejected: 4\n", + "Round 36 / Tentative (Accepted): 1 / Tentative (Not Accepted): 5 / Rejected: 4\n", + "Round 37 / Tentative (Accepted): 1 / Tentative (Not Accepted): 5 / Rejected: 4\n", + "Round 38 / Tentative (Accepted): 1 / Tentative (Not Accepted): 5 / Rejected: 4\n", + "Round 39 / Tentative (Accepted): 1 / Tentative (Not Accepted): 5 / Rejected: 4\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 40 / Tentative (Accepted): 1 / Tentative (Not Accepted): 5 / Rejected: 4\n", + "Final Feature Set Contains 129 Features.\n", + "50 1 - Remaining Features = 724\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 34 / Tentative (Accepted): 18 / Tentative (Not Accepted): 14 / Rejected: 18\n", + "Round 35 / Tentative (Accepted): 18 / Tentative (Not Accepted): 14 / Rejected: 18\n", + "Round 36 / Tentative (Accepted): 18 / Tentative (Not Accepted): 14 / Rejected: 18\n", + "Round 37 / Tentative (Accepted): 18 / Tentative (Not Accepted): 14 / Rejected: 18\n", + "Round 38 / Tentative (Accepted): 18 / Tentative (Not Accepted): 14 / Rejected: 18\n", + "Round 39 / Tentative (Accepted): 18 / Tentative (Not Accepted): 14 / Rejected: 18\n", + "Round 40 / Tentative (Accepted): 18 / Tentative (Not Accepted): 14 / Rejected: 18\n", + "Final Feature Set Contains 274 Features.\n", + "50 2 - Remaining Features = 737\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 34 / Tentative (Accepted): 15 / Tentative (Not Accepted): 13 / Rejected: 22\n", + "Round 35 / Tentative (Accepted): 15 / Tentative (Not Accepted): 13 / Rejected: 22\n", + "Round 36 / Tentative (Accepted): 15 / Tentative (Not Accepted): 13 / Rejected: 22\n", + "Round 37 / Tentative (Accepted): 15 / Tentative (Not Accepted): 13 / Rejected: 22\n", + "Round 38 / Tentative (Accepted): 15 / Tentative (Not Accepted): 13 / Rejected: 22\n", + "Round 39 / Tentative (Accepted): 15 / Tentative (Not Accepted): 13 / Rejected: 22\n", + "Round 40 / Tentative (Accepted): 15 / Tentative (Not Accepted): 13 / Rejected: 22\n", + "Final Feature Set Contains 209 Features.\n", + "50 3 - Remaining Features = 761\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 32 / Rejected: 18\n", + "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 30 / Rejected: 20\n", + "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 30 / Rejected: 20\n", + "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 30 / Rejected: 20\n", + "Round 34 / Tentative (Accepted): 16 / Tentative (Not Accepted): 14 / Rejected: 20\n", + "Round 35 / Tentative (Accepted): 16 / Tentative (Not Accepted): 14 / Rejected: 20\n", + "Round 36 / Tentative (Accepted): 16 / Tentative (Not Accepted): 14 / Rejected: 20\n", + "Round 37 / Tentative (Accepted): 16 / Tentative (Not Accepted): 14 / Rejected: 20\n", + "Round 38 / Tentative (Accepted): 16 / Tentative (Not Accepted): 14 / Rejected: 20\n", + "Round 39 / Tentative (Accepted): 16 / Tentative (Not Accepted): 14 / Rejected: 20\n", + "Round 40 / Tentative (Accepted): 16 / Tentative (Not Accepted): 14 / Rejected: 20\n", + "Final Feature Set Contains 213 Features.\n", + "50 4 - Remaining Features = 765\n", + "Stage One: Identifying an initial set of tentative features...\n", + "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 50 / Rejected: 0\n", + "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 28 / Rejected: 22\n", + "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 26 / Rejected: 24\n", + "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 26 / Rejected: 24\n", + "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 26 / Rejected: 24\n", + "Round 34 / Tentative (Accepted): 12 / Tentative (Not Accepted): 14 / Rejected: 24\n", + "Round 35 / Tentative (Accepted): 12 / Tentative (Not Accepted): 14 / Rejected: 24\n", + "Round 36 / Tentative (Accepted): 12 / Tentative (Not Accepted): 14 / Rejected: 24\n", + "Round 37 / Tentative (Accepted): 12 / Tentative (Not Accepted): 14 / Rejected: 24\n", + "Round 38 / Tentative (Accepted): 12 / Tentative (Not Accepted): 14 / Rejected: 24\n", + "Round 39 / Tentative (Accepted): 12 / Tentative (Not Accepted): 14 / Rejected: 24\n", + "Round 40 / Tentative (Accepted): 12 / Tentative (Not Accepted): 14 / Rejected: 24\n", + "Final Feature Set Contains 185 Features.\n", + "50 5 - Remaining Features = 729\n" + ] + } + ], + "source": [ + " tmp_base = {}\n", + "\n", + " idx_original_vec = np.asarray([i for i in range(X_removed.shape[1])])\n", + " \n", + " for n_clusters in [10, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650]:\n", + " counter = 0\n", + " \n", + " selected_features = []\n", + " \n", + " splitter = StratifiedGroupKFold(n_splits = 5, random_state = n_clusters, shuffle = True)\n", + " \n", + " for train, test in splitter.split(X_removed, y, groups):\n", + " counter += 1\n", + " \n", + " X_train = X_removed[train]\n", + " y_train = y[train]\n", + " \n", + " X_test = X_removed[test]\n", + " y_test = y[test]\n", + " \n", + " D = int(np.percentile(X_train.sum(axis = 1), 15))\n", + "\n", + " X_train, y_train, X_test, y_test = rarefaction(X_train, y_train, X_test, y_test, D)\n", + "\n", + " X_train = np.where(X_train > 0, 1, 0)\n", + " X_test = np.where(X_test > 0, 1, 0)\n", + " \n", + " X_rem = np.where(X_train.sum(axis = 0) == 0, False, True)\n", + " X_train = X_train[:, X_rem]\n", + " X_test = X_test[:, X_rem]\n", + " \n", + " print(\"%d %d - Remaining Features = %d\" %(n_clusters, counter, X_rem.sum()))\n", + " \n", + " tg_model = Triglav(n_jobs = 15,\n", + " estimator = ExtraTreesClassifier(512, max_depth = 2, bootstrap = True), # Bootstrap is set to true to increase randomization\n", + " verbose = 3,\n", + " n_iter_fwer = 5, # A lower value will result in a more conservative selection of clusters\n", + " p_1 = 0.7, # A higher value will result in a more conservative selection of clusters\n", + " p_2 = 0.4, # A higher value will result in more clusters being rejected\n", + " metric = \"euclidean\",\n", + " linkage = \"ward\",\n", + " criterion = \"maxclust\",\n", + " run_stage_2 = False, \n", + " alpha = 0.01, # A lower value will result in a more conservative selection of clusters\n", + " thresh = n_clusters) # This value will control the number of clusters.\n", + " \n", + " tg_model.fit(X_train, y_train)\n", + " \n", + " select_vec = np.zeros(shape = (X_removed.shape[1]), dtype = int)\n", + " \n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[tg_model.selected_]\n", + " for idx in sel:\n", + " select_vec[idx] = 1\n", + " \n", + " selected_features.append(select_vec)\n", + " \n", + " tmp_base[n_clusters] = selected_features " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92c2e6af", + "metadata": {}, + "outputs": [], + "source": [ + " for n_clusters, selection_vecs in tmp_base.items():\n", + " \n", + " conf = confidenceIntervals(selection_vecs)\n", + " \n", + " print(\"%s: \" %n_clusters, conf[\"stability\"], \"CI: \", conf[\"lower\"], \"-\", conf[\"upper\"])\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "b31aa09a", + "metadata": {}, + "source": [ + "#### Identify the best distance metric for feature clustering" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ccfce1fb", + "metadata": {}, + "outputs": [], + "source": [ + " tmp_base = {}\n", + "\n", + " idx_original_vec = np.asarray([i for i in range(X_removed.shape[1])])\n", + " \n", + " for metric in [\"cityblock\", \"correlation\", \n", + " \"cosine\", \"mahalanobis\", \"euclidean\"]:\n", + " for linkage in [\"complete\", \"average\", \"single\"]:\n", + " counter = 0\n", + "\n", + " selected_features = []\n", + "\n", + " splitter = StratifiedGroupKFold(n_splits = 5, random_state = counter, shuffle = True)\n", + "\n", + " for train, test in splitter.split(X_removed, y, groups):\n", + " counter += 1\n", + "\n", + " X_train = X_removed[train]\n", + " y_train = y[train]\n", + "\n", + " X_test = X_removed[test]\n", + " y_test = y[test]\n", + "\n", + " D = int(np.percentile(X_train.sum(axis = 1), 15))\n", + "\n", + " X_train, y_train, X_test, y_test = rarefaction(X_train, y_train, X_test, y_test, D)\n", + "\n", + " X_train = np.where(X_train > 0, 1, 0)\n", + " X_test = np.where(X_test > 0, 1, 0)\n", + "\n", + " X_rem = np.where(X_train.sum(axis = 0) == 0, False, True)\n", + " X_train = X_train[:, X_rem]\n", + " X_test = X_test[:, X_rem]\n", + "\n", + " print(\"%s-%s %d - Remaining Features = %d\" %(metric, linkage, counter, X_rem.sum()))\n", + "\n", + " tg_model = Triglav(n_jobs = 10,\n", + " estimator = ExtraTreesClassifier(512, max_depth = 2, bootstrap = True), # Bootstrap is set to true to increase randomization\n", + " verbose = 3,\n", + " n_iter_fwer = 5, # A lower value will result in a more conservative selection of clusters\n", + " p_1 = 0.7, # A higher value will result in a more conservative selection of clusters\n", + " p_2 = 0.4, # A higher value will result in more clusters being rejected\n", + " metric = n_clusters,\n", + " linkage = linkage,\n", + " criterion = \"maxclust\",\n", + " run_stage_2 = False, \n", + " alpha = 0.01, # A lower value will result in a more conservative selection of clusters\n", + " thresh = 650) # This value will control the number of clusters.\n", + "\n", + " tg_model.fit(X_train, y_train)\n", + "\n", + " select_vec = np.zeros(shape = (X_removed.shape[1]), dtype = int)\n", + "\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[tg_model.selected_]\n", + " for idx in sel:\n", + " select_vec[idx] = 1\n", + "\n", + " selected_features.append(select_vec)\n", + "\n", + " tmp_base[\"%s-%s\" %(metric, linkage)] = selected_features " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4eeec61d", + "metadata": {}, + "outputs": [], + "source": [ + " for n_clusters, selection_vecs in tmp_base.items():\n", + " \n", + " conf = confidenceIntervals(selection_vecs)\n", + " \n", + " print(\"%s: \" %n_clusters, conf[\"stability\"], \"CI: \", conf[\"lower\"], \"-\", conf[\"upper\"])\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "bcb3d8d0", + "metadata": {}, + "source": [ + "#### Identify the best model to use" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4baa70ba", + "metadata": {}, + "outputs": [], + "source": [ + " from sklearn.svm import LinearSVC\n", + " from sklearn.linear_model import RidgeClassifierCV, LogisticRegressionCV\n", + " \n", + " tmp_base = {}\n", + "\n", + " idx_original_vec = np.asarray([i for i in range(X_removed.shape[1])])\n", + " \n", + " est_names = [\"LinearSVC\", \"Logistic Regression\", \"Ridge Classifier\", \"ETC 512/2\", \"ETC 512/3\",\n", + " \"ETC 512/5\", \"ETC 512/10\", \"ETC 512\", \"ETC 512/3/B\", \"ETC 512/2/B\"]\n", + " \n", + " for i, estimator in enumerate([LinearSVC(dual = \"auto\", max_iter = 3000), LogisticRegressionCV(multi_class = \"multinomial\", max_iter = 3000), RidgeClassifierCV(),\n", + " ExtraTreesClassifier(512, max_depth = 2), ExtraTreesClassifier(512, max_depth = 3),\n", + " ExtraTreesClassifier(512, max_depth = 5), ExtraTreesClassifier(512, max_depth = 10),\n", + " ExtraTreesClassifier(512), ExtraTreesClassifier(512, max_depth = 3, bootstrap = True),\n", + " ExtraTreesClassifier(512, max_depth = 2, bootstrap = True)]):\n", + " \n", + " estimator_name = est_names[i]\n", + " \n", + " counter = 0\n", + " \n", + " selected_features = []\n", + " \n", + " splitter = StratifiedGroupKFold(n_splits = 5, random_state = n_clusters, shuffle = True)\n", + " \n", + " for train, test in splitter.split(X_removed, y, groups):\n", + " counter += 1\n", + " \n", + " X_train = X_removed[train]\n", + " y_train = y[train]\n", + " \n", + " X_test = X_removed[test]\n", + " y_test = y[test]\n", + " \n", + " D = int(np.percentile(X_train.sum(axis = 1), 15))\n", + "\n", + " X_train, y_train, X_test, y_test = rarefaction(X_train, y_train, X_test, y_test, D)\n", + "\n", + " X_train = np.where(X_train > 0, 1, 0)\n", + " X_test = np.where(X_test > 0, 1, 0)\n", + " \n", + " X_rem = np.where(X_train.sum(axis = 0) == 0, False, True)\n", + " X_train = X_train[:, X_rem]\n", + " X_test = X_test[:, X_rem]\n", + " \n", + " print(\"%s %d - Remaining Features = %d\" %(estimator_name, counter, X_rem.sum()))\n", + " \n", + " tg_model = Triglav(n_jobs = 10,\n", + " estimator = estimator, # Bootstrap is set to true to increase randomization\n", + " verbose = 3,\n", + " n_iter_fwer = 5, # A lower value will result in a more conservative selection of clusters\n", + " p_1 = 0.7, # A higher value will result in a more conservative selection of clusters\n", + " p_2 = 0.4, # A higher value will result in more clusters being rejected\n", + " metric = \"mahalanobis\",\n", + " linkage = \"complete\",\n", + " criterion = \"maxclust\",\n", + " run_stage_2 = False, \n", + " alpha = 0.01, # A lower value will result in a more conservative selection of clusters\n", + " thresh = 650) # This value will control the number of clusters.\n", + " \n", + " tg_model.fit(X_train, y_train)\n", + " \n", + " select_vec = np.zeros(shape = (X_removed.shape[1]), dtype = int)\n", + " \n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[tg_model.selected_]\n", + " for idx in sel:\n", + " select_vec[idx] = 1\n", + " \n", + " selected_features.append(select_vec)\n", + " \n", + " tmp_base[estimator_name] = selected_features " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90564f16", + "metadata": {}, + "outputs": [], + "source": [ + " for n_clusters, selection_vecs in tmp_base.items():\n", + " \n", + " conf = confidenceIntervals(selection_vecs)\n", + " \n", + " print(\"%s: \" %n_clusters, conf[\"stability\"], \"CI: \", conf[\"lower\"], \"-\", conf[\"upper\"])" + ] + }, + { + "cell_type": "markdown", + "id": "8780268c", + "metadata": {}, + "source": [ + "#### Test to see if there are differences between algorithms" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83de1e2a", + "metadata": {}, + "outputs": [], + "source": [ + " # Import other FS algorithms\n", + " from sklearn.feature_selection import SelectKBest, SelectFdr, RFE, RFECV, mutual_info_classif, f_classif\n", + " from boruta import BorutaPy\n", + " \n", + " from functools import partial\n", + " mi_partial = partial(mutual_info_classif, discrete_features = True)\n", + " \n", + " tmp_base = []\n", + "\n", + " idx_original_vec = np.asarray([i for i in range(X_removed.shape[1])])\n", + " \n", + " # Test population size\n", + " overlaps = {}\n", + " \n", + " for i in range(5):\n", + " print(i)\n", + " \n", + " splitter = StratifiedGroupKFold(n_splits = 5, random_state = i, shuffle = True)\n", + " \n", + " for train, test in splitter.split(X_removed, y, groups):\n", + " \n", + " type_names = []\n", + " sel_vector = []\n", + " \n", + " X_train = X_removed[train]\n", + " y_train = y[train]\n", + " \n", + " X_test = X_removed[test]\n", + " y_test = y[test]\n", + " \n", + " D = int(np.percentile(X_train.sum(axis = 1), 15))\n", + "\n", + " X_train, y_train, X_test, y_test = rarefaction(X_train, y_train, X_test, y_test, D)\n", + "\n", + " X_train = np.where(X_train > 0, 1, 0)\n", + " X_test = np.where(X_test > 0, 1, 0)\n", + " \n", + " X_rem = np.where(X_train.sum(axis = 0) == 0, False, True)\n", + " X_train = X_train[:, X_rem]\n", + " X_test = X_test[:, X_rem]\n", + " \n", + " print(\"%d - Remaining Features = %d\" %(i, X_rem.sum()))\n", + " \n", + " tg_model = Triglav(n_jobs = 10,\n", + " estimator = ExtraTreesClassifier(512, max_depth = 2, bootstrap = True), # Bootstrap is set to true to increase randomization\n", + " verbose = 3,\n", + " n_iter_fwer = 5, # A lower value will result in a more conservative selection of clusters\n", + " p_1 = 0.7, # A higher value will result in a more conservative selection of clusters\n", + " p_2 = 0.4, # A higher value will result in more clusters being rejected\n", + " metric = \"mahalanobis\",\n", + " linkage = \"complete\",\n", + " criterion = \"maxclust\",\n", + " run_stage_2 = False, \n", + " alpha = 0.01, # A lower value will result in a more conservative selection of clusters\n", + " thresh = 650) # This value will control the number of clusters.\n", + " \n", + " tg_model.fit(X_train, y_train)\n", + " \n", + " # Create a subset of the training data using Triglav selected features\n", + " X_train_tr = X_train[:, tg_model.selected_]\n", + " X_test_tr = X_test[:, tg_model.selected_]\n", + " \n", + " # Control (Positive) - No Feature Selection\n", + " clf = ExtraTreesClassifier(512).fit(X_train, y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train, y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test))\n", + " \n", + " print(\"Control (Positive)\", ba, ba2, X_train.shape[1])\n", + " \n", + " tmp_base.append((\"Control (Positive)\",\n", + " ba, ba2,\n", + " \"NA\", \n", + " X_train.shape[1]))\n", + " \n", + " # Control (Negative) - No Feature Selection\n", + " random_y_idx = np.random.permutation(y_train.shape[0])\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train, y_train[random_y_idx])\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train, y_train[random_y_idx])\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test))\n", + " \n", + " print(\"Control (Negative)\", ba, ba2, X_train.shape[1])\n", + " \n", + " tmp_base.append((\"Control (Negative)\",\n", + " ba, ba2,\n", + " \"NA\", \n", + " X_train.shape[1])) \n", + " \n", + " # ANOVA\n", + " anova_model = SelectFdr(alpha = 0.05).fit(X_train, y_train)\n", + " best_features = anova_model.get_support()\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(anova_model.transform(X_train), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(anova_model.transform(X_test)))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(anova_model.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(anova_model.transform(X_test)))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"ANOVA\", \"Base\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"ANOVA\",\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum())) \n", + " \n", + " # MI\n", + " for n_select in [10, 20, 40, 60, 80, 100]:\n", + " mi_model = SelectKBest(score_func = mi_partial, k = n_select).fit(X_train, y_train)\n", + " best_features = mi_model.get_support()\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(mi_model.transform(X_train), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(mi_model.transform(X_test)))\n", + "\n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(mi_model.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(mi_model.transform(X_test)))\n", + "\n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Mutual Information (%d)\" %n_select, \"Base\", ba, ba2, final_vec.sum())\n", + "\n", + " tmp_base.append((\"Mutual Information (%d)\" %n_select,\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum())) \n", + " \n", + " # RFE\n", + " rfe_model = RFE(estimator = ExtraTreesClassifier(512),\n", + " n_features_to_select = n_select,\n", + " step = 0.05).fit(X_train, y_train)\n", + "\n", + " best_features = rfe_model.get_support()\n", + "\n", + " ba = balanced_accuracy_score(y_test, rfe_model.predict(X_test))\n", + "\n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(rfe_model.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(rfe_model.transform(X_test)))\n", + "\n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"RFE (%d)\" %n_select, \"Base\", ba, ba2, final_vec.sum())\n", + "\n", + " tmp_base.append((\"RFE (%d)\" %n_select,\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum()))\n", + " \n", + " # MultiSURF\n", + " f_selector = MultiSURF(n_features_to_select = n_select,\n", + " n_jobs = 4).fit(X_train.astype(float), \n", + " y_train)\n", + " \n", + " best_features = f_selector.transform(np.asarray([idx_original_vec[X_rem]]))[0]\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(f_selector.transform(X_train), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(f_selector.transform(X_test)))\n", + "\n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(f_selector.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(f_selector.transform(X_test)))\n", + "\n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " for idx in best_features:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"MultiSURF (%d)\" %n_select, ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"MultiSURF (%d)\" %n_select,\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum()))\n", + " \n", + " # RFECV\n", + " rfe_model = RFECV(estimator = ExtraTreesClassifier(512),\n", + " step = 0.05,\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = 5\n", + " ).fit(X_train, y_train)\n", + " \n", + " best_features = rfe_model.get_support()\n", + " \n", + " ba = balanced_accuracy_score(y_test, rfe_model.predict(X_test))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(rfe_model.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(rfe_model.transform(X_test)))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"RFECV\", \"Base\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"RFECV\",\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum()))\n", + " \n", + " # Boruta\n", + " boruta_model = BorutaPy(ExtraTreesClassifier(), n_estimators = 128, verbose = 0)\n", + " boruta_model.fit(X_train, y_train)\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(boruta_model.transform(X_train), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(boruta_model.transform(X_test)))\n", + " \n", + " best_features = boruta_model.support_\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(boruta_model.transform(X_train), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(boruta_model.transform(X_test)))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Boruta\", \"Base\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Boruta\",\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum())) \n", + " \n", + " # ABC\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train, \n", + " y= y_train)\n", + "\n", + " model = ABC.OriginalABC(epoch = 20, n_limits = 10, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test[:, best_features]))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test[:, best_features]))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Artificial Bee Colony\", \"Base\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Artificial Bee Colony\",\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum()))\n", + "\n", + " # PSO\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train, \n", + " y= y_train)\n", + "\n", + " model = PSO.OriginalPSO(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(X_train[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test[:, best_features]))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test[:, best_features]))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Particle Swarm Optimization\", \"Base\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Particle Swarm Optimization\",\n", + " ba, ba2,\n", + " f_sel,\n", + " final_vec.sum()))\n", + " \n", + " # GWO-WOA\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train, \n", + " y= y_train)\n", + " \n", + " model = GWO_WOA(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test[:, best_features]))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test[:, best_features]))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Gray Wolf - Whale Optimization Algorithm\", \"Base\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Gray Wolf - Whale Optimization Algorithm\",\n", + " ba, ba2,\n", + " f_sel,\n", + " final_vec.sum()))\n", + " \n", + " # Naked Mole Rat Algorithm\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train, \n", + " y= y_train)\n", + " \n", + " model = ImprovedNMRA(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test[:, best_features]))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test[:, best_features]))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Naked Mole Rat Algorithm\", \"Base\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Naked Mole Rat Algorithm\",\n", + " ba, ba2,\n", + " f_sel,\n", + " final_vec.sum()))\n", + " \n", + " # Triglav Stage 1\n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr, y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr, y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[tg_model.selected_]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Triglav Stage 1\", \"Base\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Triglav Stage 1\",\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum())) \n", + " \n", + " # Triglav Stage 2 - MultiSURF Only\n", + " for n_select in [10, 20, 40, 60, 80, 100]:\n", + " f_selector = MultiSURF(n_features_to_select = n_select,\n", + " n_jobs = 4).fit(X_train_tr.astype(float), \n", + " y_train)\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(f_selector.transform(X_train_tr), y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(f_selector.transform(X_test_tr)))\n", + "\n", + " best_features = f_selector.transform(np.asarray([idx_original_vec[X_rem][tg_model.selected_]]))[0]\n", + "\n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(f_selector.transform(X_train_tr), y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(f_selector.transform(X_test_tr)))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " for idx in best_features:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + "\n", + " print(\"Triglav MultiSURF %d\" %n_select, ba, ba2, final_vec.sum())\n", + "\n", + " tmp_base.append((\"Triglav MultiSURF (%d)\" %n_select,\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum())) \n", + " \n", + " # Triglav Stage 2 - ABC\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train_tr.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train_tr.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train_tr, \n", + " y= y_train)\n", + "\n", + " model = ABC.OriginalABC(epoch = 20, pop_size = 30, n_limits = 10)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr[:, best_features]))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr[:, best_features]))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[tg_model.selected_]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Triglav - Artificial Bee Colony\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Triglav - Artificial Bee Colony\",\n", + " ba, ba2,\n", + " f_sel, \n", + " final_vec.sum()))\n", + "\n", + " # Triglav Stage 2 - PSO\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train_tr.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train_tr.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train_tr, \n", + " y= y_train)\n", + "\n", + " model = PSO.OriginalPSO(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + "\n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr[:, best_features]))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr[:, best_features]))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[tg_model.selected_]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Triglav - Particle Swarm Optimization\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Triglav - Particle Swarm Optimization\",\n", + " ba, ba2,\n", + " f_sel,\n", + " final_vec.sum()))\n", + " \n", + " # Triglav GWO-WOA\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train_tr.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train_tr.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train_tr, \n", + " y= y_train)\n", + " \n", + " model = GWO_WOA(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr[:, best_features]))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr[:, best_features]))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[tg_model.selected_]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"Triglav Gray Wolf/Whale Optimization Algorithm\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Triglav - Gray Wolf/Whale Optimization Algorithm\",\n", + " ba, ba2,\n", + " f_sel,\n", + " final_vec.sum()))\n", + " \n", + " # Triglav Naked Mole Rat Algorithm\n", + " FS_problem = DSFSProblem(lb = np.zeros(shape = (X_train_tr.shape[1]), dtype = int),\n", + " ub = np.ones(shape = (X_train_tr.shape[1]), dtype = int),\n", + " name = \"FS\",\n", + " minmax = \"min\",\n", + " X = X_train_tr, \n", + " y= y_train)\n", + " \n", + " model = ImprovedNMRA(epoch = 20, pop_size = 30)\n", + " best_features, best_score = model.solve(problem = FS_problem, n_workers = 10)\n", + " best_features = best_features > 0.4\n", + " \n", + " clf = ExtraTreesClassifier(512).fit(X_train_tr[:, best_features], y_train)\n", + " ba = balanced_accuracy_score(y_test, clf.predict(X_test_tr[:, best_features]))\n", + " \n", + " clf2 = GridSearchCV(estimator = LinearSVC(max_iter = 3000,\n", + " dual = \"auto\"),\n", + " param_grid = {\"C\": [0.001, 0.01, 1, 10, 100]},\n", + " cv = 5,\n", + " scoring = make_scorer(balanced_accuracy_score),\n", + " n_jobs = -1).fit(X_train_tr[:, best_features], y_train)\n", + " ba2 = balanced_accuracy_score(y_test, clf2.predict(X_test_tr[:, best_features]))\n", + " \n", + " # Create the subset of fetures\n", + " final_vec = np.zeros(shape = (idx_original_vec.shape[0]), dtype = np.int8)\n", + " sel = idx_original_vec[X_rem]\n", + " sel = sel[tg_model.selected_]\n", + " sel = sel[best_features]\n", + " for idx in sel:\n", + " final_vec[idx] = 1\n", + " f_sel = \"-\".join([str(loc) for loc in final_vec])\n", + " \n", + " print(\"triglav - Naked Mole Rat Algorithm\", ba, ba2, final_vec.sum())\n", + " \n", + " tmp_base.append((\"Triglav - Naked Mole Rat Algorithm\",\n", + " ba, ba2,\n", + " f_sel,\n", + " final_vec.sum()))\n" + ] + }, + { + "cell_type": "markdown", + "id": "515fccc8", + "metadata": {}, + "source": [ + "#### Perform statistical tests on feature selection stability and generalization performance" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "a1e8516e", + "metadata": {}, + "outputs": [], + "source": [ + " from baycomp import two_on_single\n", + " from stability import hypothesisTestT, getStability, confidenceIntervals\n", + " \n", + " stability_df = []\n", + " \n", + " exp_types = set()\n", + " for row in tmp_base:\n", + " exp_types.add(row[0])\n", + "\n", + " exp_types = {x: [] for x in exp_types}\n", + " exp_ba_et = {x: [] for x in exp_types}\n", + " exp_ba_lc = {x: [] for x in exp_types}\n", + "\n", + " # Features selected by each model\n", + " for row in tmp_base:\n", + " exp_types[row[0]].append(row[3])\n", + " \n", + " exp_ba_et[row[0]].append(row[1])\n", + " \n", + " exp_ba_lc[row[0]].append(row[2])\n", + " \n", + " exp_names = list(exp_types.keys())\n", + " \n", + " pass_set = {\"Control (Negative)\", \"Control (Positive)\"}\n", + " \n", + " for i in range(len(exp_names)):\n", + " for j in range(i+1, len(exp_names)-1):\n", + " model_a = exp_names[i]\n", + " model_b = exp_names[j]\n", + "\n", + " model_a = exp_names[i]\n", + " model_b = exp_names[j]\n", + "\n", + " if model_a in pass_set or model_b in pass_set:\n", + " pass\n", + " \n", + " else:\n", + " arr_a = np.asarray([[int(y) for y in x.split(\"-\")] for x in exp_types[model_a]]).astype(int)\n", + " arr_b = np.asarray([[int(y) for y in x.split(\"-\")] for x in exp_types[model_b]]).astype(int)\n", + " \n", + " res = hypothesisTestT(arr_a, arr_b)\n", + " a_conf = confidenceIntervals(arr_a)\n", + " b_conf = confidenceIntervals(arr_b) \n", + " \n", + " left_same_et, rope_same_et, right_same_et = two_on_single(np.asarray(exp_ba_et[model_a]),\n", + " np.asarray(exp_ba_et[model_b]),\n", + " rope = 0.05,\n", + " #runs = 4\n", + " )\n", + "\n", + " mu_et_a = np.mean(np.asarray(exp_ba_et[model_a]))\n", + " std_et_a = np.std(np.asarray(exp_ba_et[model_a]), ddof = 1)\n", + "\n", + " mu_et_b = np.mean(np.asarray(exp_ba_et[model_b]))\n", + " std_et_b = np.std(np.asarray(exp_ba_et[model_b]), ddof = 1)\n", + "\n", + " left_same_lc, rope_same_lc, right_same_lc = two_on_single(np.asarray(exp_ba_lc[model_a]),\n", + " np.asarray(exp_ba_lc[model_b]),\n", + " rope = 0.05,\n", + " #runs = 4\n", + " )\n", + "\n", + " mu_lc_a = np.mean(np.asarray(exp_ba_lc[model_a]))\n", + " std_lc_a = np.std(np.asarray(exp_ba_lc[model_a]), ddof = 1)\n", + "\n", + " mu_lc_b = np.mean(np.asarray(exp_ba_lc[model_b]))\n", + " std_lc_b = np.std(np.asarray(exp_ba_lc[model_b]), ddof = 1)\n", + "\n", + " stability_df.append((model_a, model_b, res[\"T\"], res[\"p-value\"], \n", + " a_conf[\"lower\"], a_conf[\"stability\"], a_conf[\"upper\"], \n", + " b_conf[\"lower\"], b_conf[\"stability\"], b_conf[\"upper\"],\n", + " left_same_et, rope_same_et, right_same_et, mu_et_a, std_et_a, mu_et_b, std_et_b,\n", + " left_same_lc, rope_same_lc, right_same_lc, mu_lc_a, std_lc_a, mu_lc_b, std_lc_b))\n", + " \n", + " stability_df = pd.DataFrame(stability_df, columns = [\"Model A\", \"Model B\", \n", + " \"T (Stability)\", \"p-value (Stability)\",\n", + " \"CI A (Lower)\", \"Stability A\", \"CI A (Upper)\",\n", + " \"CI B (Lower)\", \"Stability B\", \"CI B (Upper)\",\n", + " \"P(A > B) (ETC)\", \"P (A = B) (ETC)\", \"P (A < B) (ETC)\", \n", + " \"Mean ETC (A)\", \"Standard Deviation ETC (A)\", \n", + " \"Mean ETC (B)\", \"Standard Deviation ETC (B)\",\n", + " \"P(A > B) (LSVC)\", \"P (A = B) (LSVC)\", \"P (A < B) (LSVC)\",\n", + " \"Mean LSVC (A)\", \"Standard Deviation LSVC (A)\",\n", + " \"Mean LSVC (B)\", \"Standard Deviation LSVC (B)\"])\n", + " \n", + " p_corr = multipletests(stability_df[\"p-value (Stability)\"].values, method = \"fdr_bh\")\n", + " \n", + " stability_df[\"Corrected p-values (Stability)\"] = p_corr[1]\n", + " stability_df[\"Rejected (Stability)\"] = p_corr[0]\n", + " stability_df.to_csv(\"stability_df_pso_pa.csv\")\n", + " \n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "d778887e", + "metadata": {}, + "outputs": [], + "source": [ + " from baycomp import two_on_single\n", + " \n", + " comp_df = []\n", + " \n", + " for i in range(len(exp_names)):\n", + " model_a = exp_names[i]\n", + " \n", + " arr_a = np.asarray(exp_ba_et[model_a]).astype(float)\n", + " arr_b = np.asarray(exp_ba_lc[model_a]).astype(float)\n", + " \n", + " left, rope, right = two_on_single(arr_a, arr_b, \n", + " rope = 0.05, \n", + " #runs = 5\n", + " )\n", + " \n", + " mu_a = np.mean(arr_a)\n", + " std_a = np.std(arr_a, ddof = 1)\n", + " \n", + " mu_b = np.mean(arr_b)\n", + " std_b = np.std(arr_b, ddof = 1)\n", + " \n", + " comp_df.append((model_a, model_a, \n", + " mu_a, std_a, \n", + " mu_b, std_b,\n", + " left, rope, right))\n", + " \n", + " comp_df = pd.DataFrame(comp_df,\n", + " columns = [\"Model A (ETC)\", \"Model B (LSVC)\",\n", + " \"Mean A\", \"Standard Deviation A\", \n", + " \"Mean B\", \"Standard Deviation B\",\n", + " \"P (A > B)\", \"P (A = B)\", \"P (A < B)\"])\n", + " \n", + " comp_df.to_csv(\"comp_df_pso_pa.csv\")" + ] + }, + { + "cell_type": "markdown", + "id": "da39a7aa", + "metadata": {}, + "source": [ + "#### Graph results" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "ab7b0743", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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8RWydetWLFiwAL/99luJAkZPnjy5zJqKYvjw4Xj9+jXGjh0LU1NTufd0FjYzmnZeRBFct48L+vXrB19fX+jr66Nfv35FbksjMX1euD6eqq5XXMBoZvjJRmBgIP78809ERkYCAOrXr4+ZM2dymudVVbh69SpOnTqFZs2agc/no0aNGujSpQv09fWxZs0aZvjJCDP8ZOTatWuc6nXu3BkPHz5EcHAw/P39cfDgQcTExODnz58wNjaGo6MjRowYAXd3d7nlL+SKmzdvIjg4WK6zthRpqHDRPq4xMDAQGyT6+vqcGrNcH09V15s1axZ69eqFHTt2wMDAAHfv3oW6ujqGDRuGGTNmcFIHVeF///sfZsyYgQEDBoiP3d27d9GjRw/8+eefmDJlioJrqFykpaXBxMQEAGBkZITPnz+jTp06sLe3p5YFpSKlL2SGn4y0b99eIbq//PILfvnlF4Voc0W9evWoJ6POjyINFS7axzX79u0T/9/X15dTba6Pp6rrPX78GDt37gSfz4dAIEBGRgZsbW2xfv16jBw5stgPJcZ/rF69Gn/++SemTp0qLps+fTratGmD1atXM8NPRurWrYsXL17A2toajRs3xs6dO2FtbY0dO3bA3Nycioarq6s4raSrqyun74bY2FhYWlpKaRJC8O7dO1hZWdEVpD5dpILx9etXsmHDBjJ27FgyduxY4u3trZJZNbjg/v37pFOnTiQoKIh8+fKFpKSkSCzKjqq3r2PHjuTr169S5SkpKaRjx47U9bg+nqquZ2xsTF6+fEkIIaR27drisBaRkZFER0eHup4qo6urS169eiVV/vLlS6KrqysXzStXrhAPDw8yduxYMnr0aImFNlzf6wcOHBCnUnv48CExNjYmfD6faGlpkSNHjlDX4xo+n08SEhKkyr98+SKXWdKsx68MPHz4EC4uLtDW1kaLFi0AAN7e3li1ahUuXbpEfWaTqmNoaIjU1FR06tRJopxQ9JnMS6dOnXDixAkYGhpKlKempqJPnz64evUqVT2u28c1QUFBUhMCACA9PR03b96krsf18VR1PVUNMK4IevfujZMnT2LevHkS5adOnULPnj2p63l5eWH58uVo1qwZzM3N5d5bxfW9PmzYMPH/mzZtipiYGDx//hxWVlZymTlta2uLBw8eSARzBnIzrzRp0gRv3ryhqkcKid7x/ft3aGlp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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + " arr_final = np.asarray(tmp_base)\n", + " \n", + " model_subset = [\"Control (Positive)\", \"Control (Negative)\", \n", + " \"Mutual Information (40)\", \"ANOVA\",\n", + " \"RFE (20)\", \"RFECV\", \"Boruta\", \"Mutual Information (80)\", \"Mutual Information (60)\", \"Mutual Information (100)\",\n", + " \"Particle Swarm Optimization\", \"Artificial Bee Colony Optimizaton\", \"Gray Wolf - Whale Optimization Algorithm\", \"Naked Mole Rat Algorithm\",\n", + " \"MultiSURF (20)\", \"Triglav Stage 1\", \"Triglav - Naked Mole Rat Algorithm\", \"Triglav MultiSURF (80)\",\n", + " \"Mutual Information (10)\", \"Mutual Information (20)\", \"MultiSURF (10)\"]\n", + " \n", + " model_ss = [True if x[0] in model_subset else False for x in arr_final]\n", + " \n", + " arr_final = arr_final[model_ss]\n", + " \n", + " exp_arr = pd.DataFrame(np.asarray(tmp_base), columns = [\"Model\", \"Generalization Performance (ETC)\", \n", + " \"Generalization Performance (LSVC)\", \n", + " \"Features\", \"Number of Selected Features\"], dtype = \"object\")\n", + " \n", + " exp_arr[\"Log Base 2 (Number of Selected Features)\"] = np.log2(exp_arr[\"Number of Selected Features\"].values.astype(int))\n", + " \n", + " exp_arr.to_csv(\"exp_arr_pa.csv\")\n", + " \n", + " exp_arr = pd.DataFrame(arr_final, columns = [\"Model\", \"Generalization Performance (ETC)\", \n", + " \"Generalization Performance (LSVC)\", \n", + " \"Features\", \"Number of Selected Features\"], dtype = \"object\")\n", + " \n", + " exp_arr[\"Log Base 2 (Number of Selected Features)\"] = np.log2(exp_arr[\"Number of Selected Features\"].values.astype(int))\n", + " \n", + " exp_arr.to_csv(\"exp_arr_ss_pa.csv\")\n", + " \n", + " exp_arr[\"Generalization Performance (ETC)\"] = exp_arr[\"Generalization Performance (ETC)\"].astype(float)\n", + " exp_arr[\"Generalization Performance (LSVC)\"] = exp_arr[\"Generalization Performance (LSVC)\"].astype(float)\n", + " \n", + " ax = sns.boxplot(x = \"Model\", y = \"Generalization Performance (ETC)\", hue = \"Model\", \n", + " data = exp_arr, dodge = False)\n", + " legend = ax.legend()\n", + " legend.remove()\n", + " plt.xticks(rotation = 90)\n", + " plt.tight_layout()\n", + " plt.show()\n", + " plt.close()\n", + " \n", + " ax = sns.boxplot(x = \"Model\", y = \"Generalization Performance (LSVC)\", hue = \"Model\", \n", + " data = exp_arr, dodge = False)\n", + " legend = ax.legend()\n", + " legend.remove()\n", + " plt.xticks(rotation = 90)\n", + " plt.tight_layout()\n", + " plt.show()\n", + " plt.close()\n", + " \n", + " ax = sns.boxplot(x = \"Model\", y = \"Log Base 2 (Number of Selected Features)\", hue = \"Model\", \n", + " data = exp_arr, dodge = False)\n", + " legend = ax.legend()\n", + " legend.remove()\n", + " plt.xticks(rotation = 90)\n", + " plt.tight_layout()\n", + " plt.show()\n", + " plt.close()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c457dad4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/Diseased-Gut-Analysis/16S_end_to_end.ipynb b/notebooks/Diseased-Gut-Analysis/16S_end_to_end.ipynb deleted file mode 100644 index dfb46a7..0000000 --- a/notebooks/Diseased-Gut-Analysis/16S_end_to_end.ipynb +++ /dev/null @@ -1,1260 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "9c54f025", - "metadata": {}, - "source": [ - "## In a previous notebook, we demonstrated how Triglav can be used to calculate feature stability scores. We showed that Triglav will produce a set of stable features. In this notebook, we will run a simple analysis of the gut microbiomes of patients suffering from Crohn's Disease and compare that to healthy controls. We will select a set of non-redundant (one feature per cluster) features using Triglav's first and second stage. Finally, we will demonstrate how Triglav can be used with other tools to analyze which features are important and how these features can explain a sample's location in a projected space. ASVs and taxonomic assignments were created using FASTQ files analyzed with the MetaWorks pipeline (available here: https://github.com/terrimporter/MetaWorks)" - ] - }, - { - "cell_type": "markdown", - "id": "ab0d0a4a", - "metadata": {}, - "source": [ - "#### Import required packages" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "adb6999f", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\umap\\distances.py:1063: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit()\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\umap\\distances.py:1071: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit()\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\umap\\distances.py:1086: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit()\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\umap\\umap_.py:660: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit()\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING:tensorflow:Mixed precision compatibility check (mixed_float16): WARNING\n", - "The dtype policy mixed_float16 may run slowly because this machine does not have a GPU. Only Nvidia GPUs with compute capability of at least 7.0 run quickly with mixed_float16.\n", - "If you will use compatible GPU(s) not attached to this host, e.g. by running a multi-worker model, you can ignore this warning. This message will only be logged once\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\tensorflow_addons\\utils\\tfa_eol_msg.py:23: UserWarning: \n", - "\n", - "TensorFlow Addons (TFA) has ended development and introduction of new features.\n", - "TFA has entered a minimal maintenance and release mode until a planned end of life in May 2024.\n", - "Please modify downstream libraries to take dependencies from other repositories in our TensorFlow community (e.g. Keras, Keras-CV, and Keras-NLP). \n", - "\n", - "For more information see: https://github.com/tensorflow/addons/issues/2807 \n", - "\n", - " warnings.warn(\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:34: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:53: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:62: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:68: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_clustering.py:76: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:4: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:9: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:14: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\links.py:19: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @numba.jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:362: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit # we can't use this when using a custom link function...\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:384: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:427: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\utils\\_masked_model.py:438: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_tabular.py:185: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_tabular.py:196: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\maskers\\_image.py:174: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n", - "d:\\miniconda3\\envs\\testLM\\Lib\\site-packages\\shap\\explainers\\_partition.py:675: NumbaDeprecationWarning: \u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - " @jit\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n", - "\u001b[1mThe 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.\u001b[0m\n" - ] - } - ], - "source": [ - "from sklearn.model_selection import StratifiedGroupKFold, GridSearchCV\n", - "from sklearn.ensemble import ExtraTreesClassifier\n", - "from sklearn.metrics import balanced_accuracy_score\n", - "\n", - "from TreeOrdination import TreeOrdination\n", - "\n", - "from triglav import Triglav, CLRTransformer\n", - "\n", - "import shap as sh\n", - "\n", - "import sage as sg\n", - "\n", - "import numpy as np\n", - "\n", - "import pandas as pd\n", - "\n", - "from random import shuffle\n", - "\n", - "import seaborn as sns\n", - "\n", - "from matplotlib import pyplot as plt\n", - "\n", - "from skbio.stats.composition import clr, multiplicative_replacement, closure" - ] - }, - { - "cell_type": "markdown", - "id": "f8e7d2fd", - "metadata": {}, - "source": [ - "#### Read in taxonomic data and select high-confidence ASVs" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "4b57a4dd", - "metadata": {}, - "outputs": [], - "source": [ - "if __name__ == \"__main__\":\n", - "\n", - " #Read in ASV table\n", - " X = pd.read_csv(\"Diseased Gut/ESV.table\", index_col=0, sep=\"\\t\")\n", - " X_features = X.index.values #Get features\n", - " X_index = [s_name.split(\"_\")[0] for s_name in X.columns.values] #Get the right index\n", - " X_original = X.transpose()\n", - " X_original.index = X_index #Fix the index so it can be ordered\n", - " \n", - " # Read in taxa data\n", - " taxa_tab = pd.read_csv(\n", - " \"Diseased Gut/rdp.out.tmp\", delimiter=\"\\t\", header=None\n", - " ).values\n", - "\n", - " #Convert taxa tab into a dictionary for quick searching\n", - " taxa_dict = {t[0]: np.asarray(t)[1:] for t in taxa_tab}\n", - " \n", - " # Keep all ASVs assigned to Bacteria and Archaea, remove Cyanobacteria and Chloroplasts\n", - " idx = np.where(\n", - " ((taxa_tab[:, 2] == \"Bacteria\") | (taxa_tab[:, 2] == \"Archaea\")), True, False\n", - " )\n", - " taxa_tab = taxa_tab[idx]\n", - " idx = np.where(taxa_tab[:, 5] != \"Cyanobacteria/Chloroplast\", True, False)\n", - " taxa_tab = taxa_tab[idx]\n", - " X_selected = set([x[0] for x in taxa_tab])\n", - " taxa_tab_ss = {x[0]: x for x in taxa_tab}\n", - "\n", - " # Get names of high confidence features\n", - " n_list = [4, 7, 10, 13, 16, 19]\n", - " asv_name = []\n", - "\n", - " for entry in X_features:\n", - " if entry in taxa_dict:\n", - " if float(taxa_dict[entry][-1]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-3], entry))\n", - "\n", - " elif float(taxa_dict[entry][-4]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-6], entry))\n", - "\n", - " elif float(taxa_dict[entry][-7]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-9], entry))\n", - "\n", - " elif float(taxa_dict[entry][-10]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-12], entry))\n", - "\n", - " elif float(taxa_dict[entry][-13]) > 0.8:\n", - " asv_name.append(\"%s-%s\" % (taxa_dict[entry][-15], entry))\n", - "\n", - " else:\n", - " asv_name.append(\"Unclassified-%s\" % entry)\n", - " \n", - " asv_name = np.asarray(asv_name)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "6cef0596", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3318,)\n", - "(3318,)\n", - "(214, 3318)\n", - "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", - "SRR8534033 926 1 0 0 0 0 0 \\\n", - "SRR8534034 38586 14 1 0 0 0 0 \n", - "SRR8534035 49718 1069 1 0 2 0 0 \n", - "SRR8534036 1016 236 0 0 0 0 0 \n", - "SRR8534037 4247 3416 0 0 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534250 5231 2880 0 0 1 0 0 \n", - "SRR8534251 636 145 0 0 0 0 0 \n", - "SRR8534252 3026 347 332 0 0 0 0 \n", - "SRR8534253 111 163 0 0 0 0 0 \n", - "SRR8534254 12386 2485 0 0 0 0 0 \n", - "\n", - "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", - "SRR8534033 0 0 0 ... 0 0 0 \\\n", - "SRR8534034 0 0 0 ... 0 0 0 \n", - "SRR8534035 0 0 0 ... 0 0 0 \n", - "SRR8534036 0 0 0 ... 0 0 0 \n", - "SRR8534037 0 0 0 ... 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534250 0 0 0 ... 0 0 0 \n", - "SRR8534251 0 0 0 ... 0 0 0 \n", - "SRR8534252 0 0 0 ... 0 0 69 \n", - "SRR8534253 0 0 0 ... 0 0 0 \n", - "SRR8534254 0 0 0 ... 0 0 0 \n", - "\n", - "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", - "SRR8534033 0 0 0 0 0 0 0 \n", - "SRR8534034 0 0 0 0 4 0 0 \n", - "SRR8534035 0 0 0 0 0 0 0 \n", - "SRR8534036 0 0 0 0 0 0 0 \n", - "SRR8534037 0 0 0 0 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534250 0 0 0 0 0 0 0 \n", - "SRR8534251 0 0 0 0 0 1 0 \n", - "SRR8534252 0 0 0 0 0 0 0 \n", - "SRR8534253 0 0 0 0 0 0 0 \n", - "SRR8534254 0 0 0 0 0 0 0 \n", - "\n", - "[214 rows x 3318 columns]\n", - "['Blautia-Zotu1' 'Anaerostipes-Zotu10' 'Blautia-Zotu100' ...\n", - " 'Lachnospiraceae-Zotu997' 'Clostridiales-Zotu998' 'Clostridia-Zotu999']\n" - ] - } - ], - "source": [ - " print(asv_name.shape)\n", - " print(X_features.shape)\n", - " print(X_original.shape)\n", - " print(X_original)\n", - " print(asv_name)" - ] - }, - { - "cell_type": "markdown", - "id": "6facf0ed", - "metadata": {}, - "source": [ - "#### Read in metadata and order X" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "898fd152", - "metadata": {}, - "outputs": [], - "source": [ - " # Read in metadata\n", - " meta = pd.read_csv(\"Diseased Gut/metadata.csv\", index_col=0)\n", - " meta = meta[[\"Sample Name\", \"Host_disease\", \"Timepoint\"]]\n", - "\n", - " # Correct locations so they are more informative\n", - " meta[\"Host_disease\"] = np.where(\n", - " meta[\"Host_disease\"] == \"CD\", \"Crohn's Disease\", meta[\"Host_disease\"]\n", - " )\n", - " meta[\"Host_disease\"] = np.where(\n", - " meta[\"Host_disease\"] == \"RA\", \"Rheumatoid Arthritis\", meta[\"Host_disease\"]\n", - " )\n", - " meta[\"Host_diseaes\"] = np.where(\n", - " meta[\"Host_disease\"] == \"MS\", \"Multiple Sclerosis\", meta[\"Host_disease\"]\n", - " )\n", - " meta[\"Host_disease\"] = np.where(\n", - " meta[\"Host_disease\"] == \"US\", \"Ulcerative Colitis\", meta[\"Host_disease\"]\n", - " )\n", - " meta[\"Host_disease\"] = np.where(\n", - " meta[\"Host_disease\"] == \"HC\", \"Healthy Control\", meta[\"Host_disease\"]\n", - " )\n", - " \n", - " #Order samples according to the metadata\n", - " X_original = X_original.loc[meta.index]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "11c5c2c9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Sample Name Host_disease Timepoint Host_diseaes\n", - "SRR8534151 1003.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", - "SRR8534152 1003.2 Rheumatoid Arthritis 2 Rheumatoid Arthritis\n", - "SRR8534149 1021.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", - "SRR8534083 1021.2 Rheumatoid Arthritis 2 Rheumatoid Arthritis\n", - "SRR8534155 1024.1 Rheumatoid Arthritis 1 Rheumatoid Arthritis\n", - "... ... ... ... ...\n", - "SRR8534199 8399.2 UC 2 UC\n", - "SRR8534200 8407.1 Crohn's Disease 1 Crohn's Disease\n", - "SRR8534125 8407.2 Crohn's Disease 2 Crohn's Disease\n", - "SRR8534128 8702.1 UC 1 UC\n", - "SRR8534126 8702.2 UC 2 UC\n", - "\n", - "[198 rows x 4 columns]\n", - "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", - "SRR8534151 776 23 0 0 0 0 0 \\\n", - "SRR8534152 30315 1134 2 0 0 0 0 \n", - "SRR8534149 443 23 54 0 0 0 0 \n", - "SRR8534083 6206 2328 226 0 1 0 2 \n", - "SRR8534155 33147 271 0 0 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534199 17255 5 0 0 0 0 0 \n", - "SRR8534200 295 82 0 0 0 0 0 \n", - "SRR8534125 6785 823 5 0 0 0 0 \n", - "SRR8534128 5802 451 3 0 0 0 0 \n", - "SRR8534126 717 512 0 0 0 0 0 \n", - "\n", - "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", - "SRR8534151 0 0 0 ... 0 0 0 \\\n", - "SRR8534152 0 0 0 ... 0 0 0 \n", - "SRR8534149 0 0 0 ... 0 0 0 \n", - "SRR8534083 0 0 0 ... 0 0 0 \n", - "SRR8534155 0 0 0 ... 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534199 0 0 0 ... 0 0 0 \n", - "SRR8534200 0 0 0 ... 0 0 0 \n", - "SRR8534125 1 0 0 ... 0 0 0 \n", - "SRR8534128 1 0 0 ... 0 0 0 \n", - "SRR8534126 2 0 0 ... 0 0 0 \n", - "\n", - "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", - "SRR8534151 0 0 0 0 0 0 0 \n", - "SRR8534152 0 0 1 10 0 0 1 \n", - "SRR8534149 0 0 0 0 0 0 0 \n", - "SRR8534083 0 0 0 0 0 1 4 \n", - "SRR8534155 0 0 3 0 0 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534199 0 0 0 0 0 0 0 \n", - "SRR8534200 0 0 0 0 0 0 0 \n", - "SRR8534125 0 0 0 0 0 1 0 \n", - "SRR8534128 0 0 0 0 0 0 0 \n", - "SRR8534126 0 0 0 0 0 0 0 \n", - "\n", - "[198 rows x 3318 columns]\n" - ] - } - ], - "source": [ - " print(meta)\n", - " print(X_original)" - ] - }, - { - "cell_type": "markdown", - "id": "e4ed25e3", - "metadata": {}, - "source": [ - "#### Get the group metadata (Sample Name)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "e8fa6086", - "metadata": {}, - "outputs": [], - "source": [ - " # Get groups\n", - " groups = meta[\"Sample Name\"].astype(str).values\n", - " groups = np.asarray([x.split(\".\")[0] for x in groups])\n", - " \n", - " # List of phenotypes/datasets to test\n", - " pheno = \"Crohn's Disease-Healthy Control\"\n", - "\n", - " pheno_a, pheno_b = pheno.split(\"-\")\n", - "\n", - " idx = np.where(\n", - " ((meta[\"Host_disease\"] == pheno_a) | (meta[\"Host_disease\"] == pheno_b)),\n", - " True,\n", - " False,\n", - " )\n", - "\n", - " y = meta[idx][\"Host_disease\"]\n", - " y = y.values\n", - " \n", - " X_signal = X_original[idx]\n", - " \n", - " groups = groups[idx]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "83ee9304", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " \"Crohn's Disease\" \"Crohn's Disease\" 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' 'Healthy Control' 'Healthy Control'\n", - " 'Healthy Control' 'Healthy Control' \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"\n", - " \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\" \"Crohn's Disease\"]\n", - "['2001' '2001' '2006' '2006' '2008' '2008' '2011' '2011' '2012' '2012'\n", - " '2013' '2013' '2014' '2014' '2015' '2015' '2018' '2018' '2019' '2019'\n", - " '2020' '2020' '2021' '2021' '2022' '2022' '2023' '2023' '2026' '2026'\n", - " '2030' '2030' '2031' '2031' '2037' '2037' '2043' '2043' '2046' '2046'\n", - " '2048' '2048' '2049' '2049' '2057' '2057' '2061' '2061' '2062' '2062'\n", - " '2063' '2063' '2064' '2064' '2084' '2084' '2093' '2093' '2101' '2101'\n", - " '2196' '2196' '2201' '2201' '8101' '8101' '8102' '8102' '8114' '8114'\n", - " '8124' '8124' '8160' '8160' '8170' '8170' '8182' '8182' '8407' '8407']\n", - "#OTU ID Zotu1 Zotu10 Zotu100 Zotu1000 Zotu1001 Zotu1002 Zotu1003 \n", - "SRR8534047 253 277 0 0 0 0 0 \\\n", - "SRR8534050 4319 2289 0 0 0 1 1 \n", - "SRR8534049 673 216 8 0 0 0 1 \n", - "SRR8534045 6891 1434 56 0 3 0 0 \n", - "SRR8534044 10664 3777 305 0 0 1 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534236 8629 397 1 0 0 0 0 \n", - "SRR8534229 591 81 0 0 0 0 0 \n", - "SRR8534230 361 40 0 0 0 0 0 \n", - "SRR8534200 295 82 0 0 0 0 0 \n", - "SRR8534125 6785 823 5 0 0 0 0 \n", - "\n", - "#OTU ID Zotu1004 Zotu1005 Zotu1006 ... Zotu990 Zotu991 Zotu992 \n", - "SRR8534047 0 0 0 ... 0 0 0 \\\n", - "SRR8534050 0 0 0 ... 0 0 0 \n", - "SRR8534049 0 0 0 ... 0 0 0 \n", - "SRR8534045 0 0 0 ... 0 0 0 \n", - "SRR8534044 0 0 0 ... 0 0 3 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534236 0 0 0 ... 0 0 0 \n", - "SRR8534229 0 0 0 ... 0 0 0 \n", - "SRR8534230 0 0 0 ... 0 0 0 \n", - "SRR8534200 0 0 0 ... 0 0 0 \n", - "SRR8534125 1 0 0 ... 0 0 0 \n", - "\n", - "#OTU ID Zotu993 Zotu994 Zotu995 Zotu996 Zotu997 Zotu998 Zotu999 \n", - "SRR8534047 0 0 0 0 0 0 0 \n", - "SRR8534050 0 0 0 0 0 0 0 \n", - "SRR8534049 0 0 0 0 0 0 0 \n", - "SRR8534045 0 0 0 0 0 0 0 \n", - "SRR8534044 0 0 0 0 1 0 0 \n", - "... ... ... ... ... ... ... ... \n", - "SRR8534236 0 0 2 15 0 0 0 \n", - "SRR8534229 0 0 0 0 0 0 0 \n", - "SRR8534230 0 0 0 0 0 0 0 \n", - "SRR8534200 0 0 0 0 0 0 0 \n", - "SRR8534125 0 0 0 0 0 1 0 \n", - "\n", - "[80 rows x 3318 columns]\n" - ] - } - ], - "source": [ - " print(y)\n", - " print(groups)\n", - " print(X_signal)" - ] - }, - { - "cell_type": "markdown", - "id": "35a197a9", - "metadata": {}, - "source": [ - "#### We want to identify a good depth for trees. This is because identifying the most predictive features is likely to occur at shallow depths. A max depth of 7 seems OK" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "3f589ae7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All Features: 3318\n", - "Reduced Features: 938\n", - "{'max_depth': 12} 0.8128205128205128\n", - "{'max_depth': 7} 0.8397435897435898\n", - "{'max_depth': None} 0.826923076923077\n", - "{'max_depth': None} 0.8897435897435898\n", - "{'max_depth': 6} 0.8615384615384615\n" - ] - } - ], - "source": [ - " # Remove very rare ASVs (<= 4 occurances)\n", - " X_removed = np.where(X_signal.values > 0, True, False)\n", - " occ = np.where(X_removed.sum(axis = 0) > 4, True, False)\n", - " X_removed = X_signal.values[:, occ]\n", - " reduced_features = asv_name[occ]\n", - " \n", - " print(\"All Features: \", X_signal.shape[1])\n", - " print(\"Reduced Features: \", X_removed.shape[1])\n", - " \n", - " # Split samples based on disease status and patient number\n", - " splitter = StratifiedGroupKFold(n_splits = 5, random_state = 0, shuffle = True) \n", - " for train, test in splitter.split(X_signal.values, y, groups):\n", - " \n", - " X_train = X_signal.values[train]\n", - " y_train = y[train]\n", - " \n", - " X_test = X_signal.values[test]\n", - " y_test = y[test]\n", - " \n", - " # Determine the best tree-depth. \n", - " # We want a shallow depth to avoid poorly discrimative features\n", - " clf = GridSearchCV(estimator = ExtraTreesClassifier(512),\n", - " param_grid = {\"max_depth\": [None, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},\n", - " n_jobs = 5).fit(clr(multiplicative_replacement(closure(X_train))), y_train)\n", - " \n", - " print(clf.best_params_, clf.best_score_)\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "id": "f10e62ca", - "metadata": {}, - "source": [ - "#### Visualize dendrogram to get a sense of how many clusters or what the threshold should be for flat clustering. Here we are picking a threshold of 0.5." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "59c444c2", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - " tg_model = Triglav(n_jobs = 10, \n", - " verbose = 0,\n", - " n_iter_fwer = 5,\n", - " p_1 = 0.70,\n", - " p_2 = 0.4,\n", - " transformer = CLRTransformer(),\n", - " run_stage_2 = True, \n", - " alpha = 0.01,\n", - " metric = \"correlation\", \n", - " linkage = \"complete\")\n", - " \n", - " fig = tg_model.visualize_hclust(X_removed, y)\n", - " plt.show()\n", - " plt.close()" - ] - }, - { - "cell_type": "markdown", - "id": "99d85cdd", - "metadata": {}, - "source": [ - "#### Fit a Triglav Model using the threshold and save features belonging to the best scoring model" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "4b850b81", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Stage One: Identifying an initial set of tentative features...\n", - "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 451 / Rejected: 0\n", - "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 232\n", - "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 232\n", - "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 232\n", - "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 232\n", - "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 232\n", - "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 232\n", - "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 232\n", - "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 232\n", - "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 219 / Rejected: 232\n", - "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 238\n", - "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 213 / Rejected: 238\n", - "Round 34 / Tentative (Accepted): 106 / Tentative (Not Accepted): 107 / Rejected: 238\n", - "Round 35 / Tentative (Accepted): 106 / Tentative (Not Accepted): 107 / Rejected: 238\n", - "Round 36 / Tentative (Accepted): 106 / Tentative (Not Accepted): 107 / Rejected: 238\n", - "Round 37 / Tentative (Accepted): 106 / Tentative (Not Accepted): 107 / Rejected: 238\n", - "Round 38 / Tentative (Accepted): 106 / Tentative (Not Accepted): 107 / Rejected: 238\n", - "Round 39 / Tentative (Accepted): 106 / Tentative (Not Accepted): 107 / Rejected: 238\n", - "Round 40 / Tentative (Accepted): 106 / Tentative (Not Accepted): 107 / Rejected: 238\n", - "Stage Two: Identifying best features from each cluster...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████████████| 1.0/1 [08:46<00:00, 526.20s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Final Feature Set Contains 227 Features.\n", - "Final Set of Best Features Contains 106 Features.\n", - "The BAcc Score is: 0.8333333333333333\n", - "Stage One: Identifying an initial set of tentative features...\n", - "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 475 / Rejected: 0\n", - "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 233 / Rejected: 242\n", - "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 246\n", - "Round 34 / Tentative (Accepted): 133 / Tentative (Not Accepted): 96 / Rejected: 246\n", - "Round 35 / Tentative (Accepted): 133 / Tentative (Not Accepted): 96 / Rejected: 246\n", - "Round 36 / Tentative (Accepted): 133 / Tentative (Not Accepted): 96 / Rejected: 246\n", - "Round 37 / Tentative (Accepted): 133 / Tentative (Not Accepted): 96 / Rejected: 246\n", - "Round 38 / Tentative (Accepted): 133 / Tentative (Not Accepted): 96 / Rejected: 246\n", - "Round 39 / Tentative (Accepted): 133 / Tentative (Not Accepted): 96 / Rejected: 246\n", - "Round 40 / Tentative (Accepted): 133 / Tentative (Not Accepted): 96 / Rejected: 246\n", - "Stage Two: Identifying best features from each cluster...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████████████| 1.0/1 [12:25<00:00, 745.34s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Final Feature Set Contains 242 Features.\n", - "Final Set of Best Features Contains 133 Features.\n", - "The BAcc Score is: 0.95\n", - "Stage One: Identifying an initial set of tentative features...\n", - "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 472 / Rejected: 0\n", - "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 231 / Rejected: 241\n", - "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 231 / Rejected: 241\n", - "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 231 / Rejected: 241\n", - "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 231 / Rejected: 241\n", - "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 231 / Rejected: 241\n", - "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 231 / Rejected: 241\n", - "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 231 / Rejected: 241\n", - "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 231 / Rejected: 241\n", - "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 221 / Rejected: 251\n", - "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 221 / Rejected: 251\n", - "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 221 / Rejected: 251\n", - "Round 34 / Tentative (Accepted): 120 / Tentative (Not Accepted): 101 / Rejected: 251\n", - "Round 35 / Tentative (Accepted): 120 / Tentative (Not Accepted): 101 / Rejected: 251\n", - "Round 36 / Tentative (Accepted): 120 / Tentative (Not Accepted): 101 / Rejected: 251\n", - "Round 37 / Tentative (Accepted): 120 / Tentative (Not Accepted): 98 / Rejected: 254\n", - "Round 38 / Tentative (Accepted): 120 / Tentative (Not Accepted): 98 / Rejected: 254\n", - "Round 39 / Tentative (Accepted): 120 / Tentative (Not Accepted): 98 / Rejected: 254\n", - "Round 40 / Tentative (Accepted): 120 / Tentative (Not Accepted): 98 / Rejected: 254\n", - "Stage Two: Identifying best features from each cluster...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████████████| 1.0/1 [11:40<00:00, 700.96s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Final Feature Set Contains 245 Features.\n", - "Final Set of Best Features Contains 120 Features.\n", - "The BAcc Score is: 0.9\n", - "Stage One: Identifying an initial set of tentative features...\n", - "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 464 / Rejected: 0\n", - "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 187 / Rejected: 277\n", - "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 187 / Rejected: 277\n", - "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 187 / Rejected: 277\n", - "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 187 / Rejected: 277\n", - "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 187 / Rejected: 277\n", - "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 187 / Rejected: 277\n", - "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 187 / Rejected: 277\n", - "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 187 / Rejected: 277\n", - "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 181 / Rejected: 283\n", - "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 181 / Rejected: 283\n", - "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 181 / Rejected: 283\n", - "Round 34 / Tentative (Accepted): 96 / Tentative (Not Accepted): 85 / Rejected: 283\n", - "Round 35 / Tentative (Accepted): 96 / Tentative (Not Accepted): 85 / Rejected: 283\n", - "Round 36 / Tentative (Accepted): 96 / Tentative (Not Accepted): 85 / Rejected: 283\n", - "Round 37 / Tentative (Accepted): 96 / Tentative (Not Accepted): 85 / Rejected: 283\n", - "Round 38 / Tentative (Accepted): 96 / Tentative (Not Accepted): 85 / Rejected: 283\n", - "Round 39 / Tentative (Accepted): 96 / Tentative (Not Accepted): 85 / Rejected: 283\n", - "Round 40 / Tentative (Accepted): 96 / Tentative (Not Accepted): 85 / Rejected: 283\n", - "Stage Two: Identifying best features from each cluster...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████████████| 1.0/1 [09:19<00:00, 559.32s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Final Feature Set Contains 191 Features.\n", - "Final Set of Best Features Contains 96 Features.\n", - "The BAcc Score is: 0.85\n", - "Stage One: Identifying an initial set of tentative features...\n", - "Round 1 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 2 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 3 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 4 / Tentative (Accepted): 0 / Tentative (Not Accepted): 0 / Rejected: 0\n", - "Round 5 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 6 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 7 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 8 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 9 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 10 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 11 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 12 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 13 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 14 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 15 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 16 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 17 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 18 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 19 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 20 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 21 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 22 / Tentative (Accepted): 0 / Tentative (Not Accepted): 435 / Rejected: 0\n", - "Round 23 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 24 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 25 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 26 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 27 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 28 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 29 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 30 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 31 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 32 / Tentative (Accepted): 0 / Tentative (Not Accepted): 229 / Rejected: 206\n", - "Round 33 / Tentative (Accepted): 0 / Tentative (Not Accepted): 224 / Rejected: 211\n", - "Round 34 / Tentative (Accepted): 126 / Tentative (Not Accepted): 98 / Rejected: 211\n", - "Round 35 / Tentative (Accepted): 126 / Tentative (Not Accepted): 98 / Rejected: 211\n", - "Round 36 / Tentative (Accepted): 126 / Tentative (Not Accepted): 98 / Rejected: 211\n", - "Round 37 / Tentative (Accepted): 126 / Tentative (Not Accepted): 95 / Rejected: 214\n", - "Round 38 / Tentative (Accepted): 126 / Tentative (Not Accepted): 95 / Rejected: 214\n", - "Round 39 / Tentative (Accepted): 126 / Tentative (Not Accepted): 95 / Rejected: 214\n", - "Round 40 / Tentative (Accepted): 126 / Tentative (Not Accepted): 95 / Rejected: 214\n", - "Stage Two: Identifying best features from each cluster...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████████████| 1.0/1 [12:47<00:00, 767.06s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Final Feature Set Contains 253 Features.\n", - "Final Set of Best Features Contains 126 Features.\n", - "The BAcc Score is: 0.75\n" - ] - } - ], - "source": [ - " best_features = None\n", - " best_score = -1000\n", - " best_model_sage = None\n", - " best_feature_names = None\n", - " \n", - " splitter = StratifiedGroupKFold(n_splits = 5, random_state = 0, shuffle = True)\n", - " for train, test in splitter.split(X_removed, y, groups):\n", - " \n", - " X_train = X_removed[train]\n", - " y_train = y[train]\n", - " \n", - " X_test = X_removed[test]\n", - " y_test = y[test]\n", - " \n", - " tg_model = Triglav(n_jobs = 15,\n", - " estimator = ExtraTreesClassifier(512, max_depth = 7, bootstrap = True),\n", - " verbose = 3,\n", - " n_iter_fwer = 5, # A lower value will result in a more conservative selection of clusters\n", - " p_1 = 0.70, # A higher value will result in a more conservative selection of clusters\n", - " p_2 = 0.4, # A higher value will result in more clusters being rejected\n", - " transformer = CLRTransformer(),\n", - " run_stage_2 = True, \n", - " alpha = 0.01, # A lower value will result in a more conservative selection of clusters\n", - " metric = \"correlation\", \n", - " linkage = \"complete\",\n", - " thresh = 0.5) # This value will control the number of clusters.\n", - " \n", - " tg_model.fit(X_train, y_train)\n", - " \n", - " X_train_trf = clr(multiplicative_replacement(closure(X_train)))[:, tg_model.selected_]\n", - " X_test_trf = clr(multiplicative_replacement(closure(X_test)))[:, tg_model.selected_]\n", - " \n", - " clf = ExtraTreesClassifier(512).fit(X_train_trf, y_train)\n", - " score = balanced_accuracy_score(y_test, clf.predict(X_test_trf))\n", - " \n", - " print(\"The BAcc Score is: \", score)\n", - " \n", - " if score > best_score:\n", - " best_score = score\n", - " best_feature_names = reduced_features[tg_model.selected_]\n", - " best_features = np.copy(tg_model.selected_best_, \"C\")\n", - " best_model_sage = tg_model.sage_values_" - ] - }, - { - "cell_type": "markdown", - "id": "35ae76a2", - "metadata": {}, - "source": [ - "#### Visualize SAGE scores to get a sense of which ASVs are predictive" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "f0fde156", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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F6qbk5NDp06dUEoRHR39wH5HjRpFWlqadj3q30QIIYQQQojniax4i8fG0tISLy8vABYtWoS/vz8LFy6kdu3aD23bsmVLfvvtN3788Uc2b95M06ZN6d+/P1OnTiUjI4OaNWuybNmyQu2cnJxKHJ+RkZF2OneBnJycIu/jQT777DNmzpzJjBkztNO9hwwZom17b9OmDa+++qpWv1y5ctq/P/30U3744QcSEhK0rfT/hJLe28MMGzaMkSNH8vbbbwPg5+fHb7/9RlRUFCEhIQZ9d+rUid9++42tW7c+cLUb7r3/X9x75UIIIYQQQrxoZOItnggjIyM++ugjhg4dyunTpzE1NSUhIQEPDw/g3sRt//79DBkyRGvj5ORESEgIISEhvP766wwbNoypU6fyyiuv8O233+Ls7PzACd7hw4e5c+cO5ubmAOzZswcrKyvc3d21/v/8TnR6ejpnz5595HtLSEggODiYbt26AZCfn8+pU6eoUqUKANbW1lhbWxdq99NPP/Hxxx+zfPly/P39i+zb19eXhISEQuNVqlQJY2Nj4N6W+vtXv52cnLh06RJKKW07fmJi4iPfW2ZmZqFt+cbGxuTn52vpgkl3cnIy8fHxODo6PvI4QgghhBBCvMhkq7l4Yjp27IixsTHR0dH07duXYcOGsXHjRk6cOEGvXr3IzMwkLCwMgLFjx/L9999z+vRpjh8/zvr16/H19QWga9eulC5dmuDgYHbs2MHZs2fZtm0bgwYN4sKFC9p42dnZhIWFceLECX788UciIiIYMGCANpFs0qQJS5cuZceOHRw9epSQkBBtMvsovL292bx5M7t27SIpKYn333+fP/7444FtkpOTeeedd3jvvfd4/fXXuXTpksFVcMjchx9+SFxcHBMmTODUqVMsXryYWbNmGbxT7unpyf/+9z8uXrzI1atXgXunnV+5coUpU6Zw5swZZs+ezU8//WQQQ3Z2NomJiSQmJpKdnc3FixdJTEzk9OnTWp3WrVszceJENmzYQEpKCmvXrmX69Om0a9cOuDfp7tChAwcOHGDZsmXk5eVp9/Dng+6EEEIIIYT4V1NCPAYhISEqODi4UH5UVJRycnJSGRkZauDAgap06dJKr9ergIAAtW/fPq3ehAkTlK+vrzI3N1cODg4qODhY/frrr1p5amqq6t69u9a+QoUKqlevXiotLc1g/LFj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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - " best_model_sage.plot_sign(feature_names=best_feature_names, max_features = 30, tick_size = 10, label_size = 10)\n", - " \n", - " plt.savefig(\"triglav_sage.svg\")" - ] - }, - { - "cell_type": "markdown", - "id": "ad290005", - "metadata": {}, - "source": [ - "#### It is important to note that SAGE scores only give us an understanding of which ASVs are important for classification on a global level. They do not (currently) help us understand how samples are placed on a local level or which features contribute to the variation along each axis. To understand this a TreeOrdination analysis would be useful. This analysis will produce an projection of the high-dimensional data and we can use this to plot analogues to loading scores for each of the projected axes." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "638fb5bc", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Iteration 0...\n", - "Iteration 1...\n", - "Iteration 2...\n", - "Iteration 3...\n", - "Iteration 4...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "gradient function is not yet implemented for hamming distance metric; inverse_transform will be unavailable\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABAEAAAHACAYAAADTD3GuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACJjElEQVR4nOzdd3zT1f7H8Vc6ks6klG4oe+8lU5agRbwo6nWiCAoo6lXEifde1Ov1Oq76Q+/1uhVQueICN4ooouxh2SB7dkBLm+6R5PdHL8HaprSlTdrk/Xw88oCc8/0m79C09PvJGQaHw+FARERERERERLyen6cDiIiIiIiIiIh7qAggIiIiIiIi4iNUBBARERERERHxESoCiIiIiIiIiPgIFQFEREREREREfISKACIiIiIiIiI+QkUAERERERERER+hIoCIiIiIiIiIjwjwdICGzm63c/z4ccLDwzEYDJ6OIyIiIiIiHuJwOMjJySEhIQE/P32eKo2TigBncfz4cRITEz0dQ0REREREGogjR47QvHlzT8cQqRUVAc4iPDwcKPtGN5vNHk4jIiIiIiKeYrVaSUxMdF4jiDRGKgKcxekpAGazWUUAERERERHRNGFp1DSRRURERERERMRHqAggIiIiIiIi4iNUBBARERERERHxESoCiIiIiIiIiPgIFQFEREREREREfISKACIiIiIiIiI+otEUAZ588knOO+88wsPDiYmJYfz48ezevfus53344Yd06tSJoKAgunfvzldffeWGtCIiIiIiIiINT6MpAvz444/ccccdrFmzhqVLl1JSUsJFF11EXl6ey3NWrVrFddddxy233MIvv/zC+PHjGT9+PNu2bXNjchEREREREZGGweBwOByeDlEbJ06cICYmhh9//JFhw4ZVesw111xDXl4eX3zxhbNt4MCB9OrVi1deeaVaz2O1WrFYLGRnZ2M2m+sku4iIiIiIND66NhBv0GhGAvxednY2AJGRkS6PWb16NaNHjy7XlpSUxOrVq12eU1RUhNVqLXcTERERERER8QYBng5QG3a7nRkzZjBkyBC6devm8rjU1FRiY2PLtcXGxpKamurynCeffJLHHnuszrI2BqnZBexIsbJ6XwbNI0MY0SGaOHMQpkB/T0cTERERERGROtQoiwB33HEH27Zt4+eff67zx541axYzZ8503rdarSQmJtb58zQURzLzuf6NNRzJLHC2BfgZeOOmfgxu2xRjgAoBIiIiIiIi3qLRTQe48847+eKLL/jhhx9o3rx5lcfGxcWRlpZWri0tLY24uDiX55hMJsxmc7mbt8otLOXxL3aUKwAAlNod3PrORtKsRR5KJiIiIiIiIvWh0RQBHA4Hd955J4sWLeL777+ndevWZz1n0KBBLFu2rFzb0qVLGTRoUH3FbFQy84r4bmdapX1FpXa2H892cyIRERERERGpT41mOsAdd9zBggUL+PTTTwkPD3fO67dYLAQHBwMwceJEmjVrxpNPPgnA3XffzfDhw3nuuee45JJLeP/999mwYQOvvfaax15HQ1JYasdexd4Qp/JL3BdGRERERERE6l2jGQnw8ssvk52dzYgRI4iPj3feFi5c6Dzm8OHDpKSkOO8PHjyYBQsW8Nprr9GzZ08++ugjFi9eXOVigr7EZrfTLCLYZX/PxAj3hREREREREZF6Z3A4HFV8FizeuhdoRm4Rsz/dxvnto5n1ydYK/SM7RvPc1T2JDDV5IJ2IiIiISMPjrdcG4lsazUgAqVuFJTa+3JpK8pEsnr+6Jx1jwwGwBAcydWgbbh/ZTgUAERERERERL9No1gSQuuXv50dESCAL1x9h7f4Mru3fghaRIRQU2/g0+RjNmwRzXqtIT8cUERERERGROqQigI+KDjcx5fzWPPvtrxzMyOepr3c5+wL8DDw+XusmiIiIiIiIeBtNB/BR/n4Gru6XyIWdY8q1mwL8eOOmfsSZgzyUTEREREREROqLFgY8C29f/CMzr5h0ayFbjmYTERJI53gzsWYTxgB/T0cTEREREWlQvP3aQHyDpgP4uMhQI5GhRjrF64eYiIiIiIiIt9N0ABEREREREREfoSKAiIiIiIiIiI9QEUBERERERETER6gIICIiIiIiIuIjVAQQERERERER8REqAoiIiIiIiIj4CBUBRERERERERHyEigAiIiIiIiIiPkJFABEREREREREfoSKAiIiIiIiIiI9QEUBERERERETERwR4OoB4Tl5RKSdzi8guKCHEGEDTMCNNQoyejiUiIiIiIiL1REUAH5WeU8icpXtYuOEINrsDgH6tmjDn6l40jwzxcDoRERERERGpD5oO4IOKSm289uN+Fqw77CwAAGw4eIqb560nPafQg+lERERERESkvmgkgBez2x2kWgvZ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Gzx4MLfddhvXXHMN0dHRPPPMMzXKdN111xEQEMB1111HUFDVoyRMJhNLly7lgQce4NVXX2XgwIGcd955vPjii9x1111069YNgKeeeoorr7ySG2+8kT59+rB3716++eYbmjRpUu1cV155JWPGjGHkyJFER0fz3//+1+Wx48eP54UXXuDZZ5+la9euvPrqq7z99tuMGDGi2s9XUwZHdVZI+J8ff/yx3P34+Hg6dOjgvP/CCy9QXFzM/fffX3cJPcxqtWKxWMjOzsZsNp/9BA85mVtERm4xeUWlRIQEEhVmwhxcfh7NhxuOcP9HlU/X6BgbzntTBxAVZqq0X0RERETE11V1bVBYWMiBAwdo3br1WS9IXVmyLYXHPt9RbpHAeEsQj4zrwphu8eeU3RsdPHiQtm3bsn79evr06ePpOB5X3fdgjRYGPL26oyt33313TR5O6lBUmOmsF/DrD7r+tP/X9BxKShv52gAiIiIiIo3YmG7xXNgljnUHMknPKSQmvGwKgCdHADREJSUlZGRk8Je//IWBAweqAFBDNSoCuJKWlkZRUREtWrSoi4eTetI53vVIhuZNgvH31w8XERERERFP8vczMKittrWuysqVKxk5ciQdOnTgo48+8nScRqdGawLk5ORwww030LJlS2666SaKi4u54447iI+Pp3Xr1gwfPhyr1VpfWeUcjeoUgymg8i/53Re09+hqoyIiIiIiItUxYsSIskXPd++me/funo7T6NSoCPDwww+zceNG7rvvPg4fPszVV1/NihUr+Omnn/jhhx84efIkTz/9dH1lld/IKSwhM6+Ikhps7xdvCeadW/oTEXJmrQA/A0wd2oaRnWLqI6aIiIiIiIg0IDVaGLBFixbMmzePkSNHcvz4cZo3b85nn33GH/7wBwC+/PJL7r33Xnbt2lVvgd2toS0MmJFbxJZj2bz2436yCooZ2TGGa/u3ILFJMAbD2Yfz2+wO0qyFpFoLKSi20bxJME1DjYQFBZ71XBERERERX1bfCwOKnIt6WRgwPT2ddu3aAZCQkEBwcHC53QG6devGkSNHahlZziYrv5jnvt3NgnVn/o13puTw7ppDfHL7ENrFhJ31Mfz9DCREBJMQEVyfUevM6aLFsawCcgpLadU0pNKdD0REREREROTsalQEaNq0KSdOnCAxMRGAyy67jIiICGd/bm4uJpO2mKsvx7MLyxUATrMWlvLk1zuZc00vwr3oE/1Sm53NR7K4Zf4GsvJLnO3X9kvkvqSORIXrvSYiIiIiIlITNVoToEePHqxfv955f8GCBcTEnJlLvn79ejp37lx36aSc73emue7blU52QYnL/sYoJbuQCW+uLVcAAHh/wxEWJx/Dbq/2TBYRERERERGhhiMB3nvvPfz8XNcNYmNjeeKJJ845lNScN27ut3p/BoUllS98+PLyffyhRzxxlsYxrUFERERERKQhqNFIgMjIyHLD/3/v4osvZsSIEecYSVwZ1Tm2ir4YIoKNbkxT//al57rsy8grpsSmkQAiIiIiIg2ZwWBg8eLFno5RLXPnzq3yetdb1KgI8PHHH5Ofn19fWarlpZdeolWrVgQFBTFgwADWrVtX5fEffvghnTp1IigoiO7du/PVV1+5KWndi7cEccPAlhXazcEBPHRxZ8KCajSwo8Hr07KJy76WTUMwBdbo7SsiIiIiIpVITU3lT3/6E23atMFkMpGYmMi4ceNYtmyZp6MBZRfn5/Jhs8FgcN5CQ0Np3749kyZNYuPGjeWOu+aaa/j111/PMW3DV6OrqKuuuor4+HimTZvG2rVr6yuTSwsXLmTmzJk88sgjbNq0iZ49e5KUlER6enqlx69atYrrrruOW265hV9++YXx48czfvx4tm3b5ubkdSMixMjM0R145+b+DG0fRdcEM3dd0I4v/jSUNlGhno5X57o3sxDtYvG/B8d0IiZcW6+IiIiIiJex2+DAT7D1o7I/7bZ6fbqDBw/St29fvv/+e/75z3+ydetWlixZwsiRI7njjjtcnldS0rjWI3v77bdJSUlh+/btvPTSS+Tm5jJgwADmz5/vPCY4OLjcmnfeqsYfpd53331s2LCBQYMG0a1bN+bMmUNGRkZ9ZKvg+eefZ+rUqUyePJkuXbrwyiuvEBISwltvvVXp8S+88AJjxozh/vvvp3Pnzjz++OP06dOHf//7327JWx8iw4wM7RDNKzf04d1bBnDXqPa0iAzBYPC+VQESIoJZOG0gvVtEONvMwQH84/JuDG7b1HPBRERERETqw47PYE43mPcH+PiWsj/ndCtrrye33347BoOBdevWceWVV9KhQwe6du3KzJkzWbNmjfM4g8HAyy+/zKWXXkpoaKhzLbiXX36Ztm3bYjQa6dixI++8806F5zh58iSXX345ISEhtG/fns8+O/N6li9fjsFgYNmyZfTr14+QkBAGDx7M7t27XWZevnw5/fv3JzQ0lIiICIYMGcKhQ4eqfJ0RERHExcXRqlUrLrroIj766CMmTJjAnXfeyalTp4CK0wE2b97MyJEjCQ8Px2w207dvXzZs2ODs//nnnxk6dCjBwcEkJiZy1113kZeX5+x/55136NevH+Hh4cTFxXH99deX+wD71KlTTJgwgejoaIKDg2nfvj1vv/22s//IkSNcffXVREREEBkZyWWXXcbBgwerfJ3VUeMiwK233sqmTZtYv349w4YN47HHHqNZs2ZcffXVLF269JwDuVJcXMzGjRsZPXq0s83Pz4/Ro0ezevXqSs9ZvXp1ueMBkpKSXB7fmISaAmkSaiTA37uHxLeJDuPNm85j2czhfHXXUL6+exhX90skIsS71j8QERERER+34zP4YCJYj5dvt6aUtddDISAzM5MlS5Zwxx13EBpacWTx7+fHP/roo1x++eVs3bqVm2++mUWLFnH33Xdz7733sm3bNm699VYmT57MDz/8UO68xx57jKuvvpotW7YwduxYJkyYQGZmZrlj/vznP/Pcc8+xYcMGAgICuPnmmyvNXFpayvjx4xk+fDhbtmxh9erVTJs2rVYfit5zzz3k5OS4vI6dMGECzZs3Z/369WzcuJGHHnqIwMCyLdn37dvHmDFjuPLKK9myZQsLFy7k559/5s4773SeX1JSwuOPP87mzZtZvHgxBw8eZNKkSc7+v/71r+zYsYOvv/6anTt38vLLLxMVFeU8NykpifDwcH766SdWrlxJWFgYY8aMobi4uMavtRxHDRgMBkdaWlq5toKCAsf8+fMdI0aMcPj5+TlatWpVk4estmPHjjkAx6pVq8q133///Y7+/ftXek5gYKBjwYIF5dpeeuklR0xMjMvnKSwsdGRnZztvR44ccQCO7Ozsc38RIiIiIiLSaGVnZ7u8NigoKHDs2LHDUVBQUPMHtpU6HM91cjgeMbu4WRyO5zqXHVeH1q5d6wAcn3zyyVmPBRwzZswo1zZ48GDH1KlTy7VdddVVjrFjx5Y77y9/+Yvzfm5urgNwfP311w6Hw+H44YcfHIDju+++cx7z5ZdfOoBK/y0zMjIcgGP58uXVe5H/y7Bo0aIK7QUFBQ7A8fTTTzscDofj7bffdlgsFmd/eHi4Y+7cuZU+5i233OKYNm1aubaffvrJ4efn5/I9sH79egfgyMnJcTgcDse4ceMckydPrvTYd955x9GxY0eH3W53thUVFTmCg4Md33zzTaXnVPc9WKOPkSurrgQFBXHjjTfyww8/sHv3bq6//vpzqUl43JNPPonFYnHeEhMTPR1JRERERES82aFVFUcAlOMA67Gy4+qQw1Gz3bb69etX7v7OnTsZMmRIubYhQ4awc+fOcm09evRw/j00NBSz2VxhXbffHhMfHw9Q6dpvkZGRTJo0iaSkJMaNG8cLL7xASkpKjV7Haadfv6tRBDNnzmTKlCmMHj2ap556in379jn7Nm/ezNy5cwkLC3PekpKSsNvtHDhwAICNGzcybtw4WrRoQXh4OMOHDwfg8OHDAEyfPp3333+fXr168cADD7Bq1apyj793717Cw8Odjx8ZGUlhYWG5HLVRoyLA2d4k7dq1c84NqWtRUVH4+/uTlpZWrj0tLY24uLhKz4mLi6vR8QCzZs0iOzvbeTty5Mi5hxcREREREXElN+3sx9TkuGpq3749BoOBXbt2Vev4yqYMVMfpIfSnGQwG7Ha7y2NOX5T//pjT3n77bVavXs3gwYNZuHAhHTp0KLd+QXWdLla0bt260v5HH32U7du3c8kll/D999/TpUsXFi1aBEBubi633norycnJztvmzZvZs2cPbdu2JS8vj6SkJMxmM++99x7r1693nnt6OP/FF1/MoUOHuOeeezh+/DijRo3ivvvucz5+3759yz1+cnIyv/766zl/8F6jIsCBAweIjo4+pyesLaPRSN++fcttU2G321m2bBmDBg2q9JxBgwZV2NZi6dKlLo8HMJlMmM3mcjcREREREZF6ExZbt8dVU2RkJElJSbz00kvlFrQ7LSsrq8rzO3fuzMqVK8u1rVy5ki5dutRlzEr17t2bWbNmsWrVKrp168aCBQtq/Bhz5szBbDZXWEfutzp06MA999zDt99+yxVXXOFcuK9Pnz7s2LGDdu3aVbgZjUZ27dpFRkYGTz31FEOHDqVTp06VjmyIjo7mpptu4t1332XOnDm89tprzsffs2cPMTExFR7fYrHU+LX+Vo2KAC1btvToKvQzZ87k9ddfZ968eezcuZPp06eTl5fH5MmTAZg4cSKzZs1yHn/33XezZMkSnnvuOXbt2sWjjz7Khg0byi3WICIiIiIi4lEtB4M5AXB1rWUAc7Oy4+rYSy+9hM1mo3///nz88cfs2bOHnTt38uKLL1b54SnA/fffz9y5c3n55ZfZs2cPzz//PJ988onz0+z6cODAAWbNmsXq1as5dOgQ3377LXv27KFz585VnpeVlUVqaiqHDh1i6dKl/PGPf2TBggW8/PLLFRZABCgoKODOO+9k+fLlHDp0iJUrV7J+/Xrn8zz44IOsWrWKO++8k+TkZPbs2cOnn37qvNZs0aIFRqORf/3rX+zfv5/PPvuMxx9/vNxzzJ49m08//ZS9e/eyfft2vvjiC+fjT5gwgaioKC677DJ++uknDhw4wPLly7nrrrs4evToOf0bBpzT2b+zYcMG8vPzGTZsWF0+rNM111zDiRMnmD17NqmpqfTq1YslS5YQG1tWETt8+DB+fmfqGoMHD2bBggX85S9/4eGHH6Z9+/YsXryYbt261Us+ERERERGRGvPzhzFPl+0CgAH47TTs/xUGxjxVdlwda9OmDZs2beKJJ57g3nvvJSUlhejoaPr27cvLL79c5bnjx4/nhRde4Nlnn+Xuu++mdevWvP3224wYMaLOc54WEhLCrl27mDdvHhkZGcTHx3PHHXdw6623Vnne6Q+Og4KCaNasGeeffz7r1q2jT58+lR7v7+9PRkYGEydOJC0tjaioKK644goee+wxoGwNgx9//JE///nPDB06FIfDQdu2bbnmmmuAsk/4586dy8MPP8yLL75Inz59ePbZZ7n00kudz2E0Gpk1axYHDx4kODiYoUOH8v777ztf54oVK3jwwQe54ooryMnJoVmzZowaNeqcR6sbHDVdDaIKnTt35tdff8Vms9XVQ3qc1WrFYrGQnZ2tqQEiIiIiIufCVgIFWWUXsyGRnk5TY1VdGxQWFnLgwAFat25NUFBQ7Z5gx2ew5MHyiwSam5UVALpc6vo8Ear/HqzTkQDLli2jpKSkLh9SREREREQaO4cDsg7Dxrmw6wswhcHAO6DVUAiv23nujVqXS6HTJWW7AOSmla0B0HJwvYwAEN9Vp0WAhISEunw4ERERERHxBqcOwBujID/zTNvHt0CHMXDpvyAsxnPZGho/f2g91NMpxIvVqgiQmprK2rVrSU1NBcq24hswYECVW++JiIiIiIgPKsmHH58pXwA47dclkLEPAoIhLx0KsyHIDCFREBzh9qgivqBGRYC8vDxuvfVW3n//fQwGA5GRZfN4MjMzcTgcXHfddbz66quEhITUS1gREREREWlkCk7BjsWu+7e8DxGt4ftHy6YNAHRIgkv+DyzN3JFQxKfUaIvAu+++m3Xr1vHll19SWFhIWloaaWlpFBYW8tVXX7Fu3Truvvvu+soqIiIiIiKNkeEslx2Hfz5TAAD49RtYfHvlowcauDpcd12kRqr73qtREeDjjz9m7ty5JCUl4e9/ZnEKf39/LrroIt566y0++uijmiUVERERERHvFdIUelzjur/NSDi8pmL7geWQd7LeYtW1wMBAAPLz8z2cRHzV6ffe6feiKzWaDmC32zEajS77jUYjdru9Jg8pIiIiIiLeLCAIhswom///263vALpfDZn7oCin7L7BD1oPA0ti2bEFGW6PW1v+/v5ERESQnp4OlO3zbjAYPJxKfIHD4SA/P5/09HQiIiLKfWBfmRoVAf7whz8wbdo03nzzTXr37l2u75dffmH69OmMGzeu5qlFRERERMR7NWkJN39btj3g9kVgCoeBt0OT1vDvvmXHtBoKQ+6Gfd9Dxh6IagcmC5QWQYDJs/mr6fRC6acLASLuFBERUa3F+g2OGkxaOXXqFNdffz3ffPMNTZo0ISambCuP9PR0srKySEpKYsGCBURERNQ6eENjtVqxWCxkZ2djNps9HUdEREREpPFyOKDICn4BYAyFgiz4ZErZp/7DHoBF08ou+k/zD4QJH0Or88u2zvOw6l4b2Gw2SkpK3JhMfF1gYOBZRwCcVqMiwGm7du1i9erV5bYIHDRoEJ06darpQzV4KgI0DtaCEuwOBxEhrqeriIiIiEgDlH0MjifDV/dCTkrF/tAomLaiQewUoGsD8QY1mg5wWqdOnbzygl8anzRrIWv2Z/DO6kOU2h38sW9zRnWKIT4i2NPRRERERKQ6LM0g70TlBQAoWxww70SDKAKIeINqFwHWrFnDwIEDq3Vsfn4+Bw4coGvXrrUOJnI2adZC7lywifUHTznbko9k8VZUKO9OGUCCCgEiIiIijcPZBifbNbRepK5Ue4vAG2+8kaSkJD788EPy8vIqPWbHjh08/PDDtG3blo0bN9ZZSJHK/HI4q1wB4LT9J/P4fPNx7Hbt0SoiIiLSKIRGlS0WWJnAEAiLdW8eES9W7SLAjh07uOSSS/jLX/5CREQEXbt25cILL2TcuHGcf/75REVF0adPHw4cOMC3337LxIkT6zO3+Lj84lLeW3vIZf8HG46SmVfsxkQiIiIiUmvhsTDm6cr7LnwcQlUEEKkr1Z4OEBgYyF133cVdd93Fhg0b+Pnnnzl06BAFBQX07NmTe+65h5EjRxIZGVmfeUWqyYEDjQQQERERaRT8jdDpD9CkFfzwBJzcDZHtYOTDEN8TAhvHFoEijUGtFgbs168f/fr1q+ssUg35xaVk5BZTVGon1ORPbHgQfn4GT8dyuxBjANf1b8FPe05W2v/HvolEhuo/CxEREZFGI9gCrYbAtQugJB8CgyG4iadTiXidWhUBxDNSsgp4bumvfJp8jBKbg+gwE/eP6ciFnWNpEup7W+P1bdmEPi0i2HQ4q1x7q6YhXNYrAX8fLI6IiIiINHrBEWU3EakXBofjbEtx+raGshfoyZwipsxfT/KR7Ap9T1/Znav6JvrkiIC07EJ+3nuSd9YcosRm56q+zbmoa5x2BhARERGROtdQrg1EzoVGAjQSx7IKKi0AAPzzm90M6xBNvMX3LnxjLUFc2bc5ozrH4HBAREggBoPvFUNERERERESqQ0WARmJHitVl38ncYvKKbG5M0/BEhPjedAgRERGRhspud5CWU0heUSnGAH+ahhoJNenSQ6Qh0HdiIxFndr3IXaC/AVNAtXd7FBERERGpN6fyi/l2eyr//GY3J3OL8fczMLZbHLPGdtaUTZEGoMZXjgUFBfz888/s2LGjQl9hYSHz58+vk2BSXvvYcMJdVE8v7ZlA0zB9Ei4iIiIinuVwOFi2M50HP97KydxiAGx2B59vSWHK/A2cyCn0cEIRqVER4Ndff6Vz584MGzaM7t27M3z4cFJSUpz92dnZTJ48uc5DCsRbgpl/S/8KhYBeiRbuu6gjIUYN6hARERERz0q1FvLMkl2V9u04buXIqQI3JxKR36vRleODDz5It27d2LBhA1lZWcyYMYMhQ4awfPlyWrRoUV8ZBfD3M9CjeQRLZgxld1oOadlFdEkwkxARTHS466kCIiIiIiLukl9sIz2nyGX/1qPZ9GnRxI2JROT3alQEWLVqFd999x1RUVFERUXx+eefc/vttzN06FB++OEHQkND6yunUFYIaNYkhGZNQjwdRURERESkAqO/H6YAP4pK7ZX2J0QEuTmRiPxejaYDFBQUEBBwpm5gMBh4+eWXGTduHMOHD+fXX3+t84AiIiIiItI4RIebuLJP80r7wkwBdI43uzmRiPxejUYCdOrUiQ0bNtC5c+dy7f/+978BuPTSS+sumYiIiIiINCpBgf7cNao9e9JzWH/wlLM93BTAvJv7E2/R7gAinlajIsDll1/Of//7X2688cYKff/+97+x2+288sordRZOREREREQalzhLEK/c0Jfj2QXsSskhOtxE+5gw4izB+PsZPB1PxOcZHA6Hw9MhGjKr1YrFYiE7OxuzWcOXRERERER8la4NxBvUaE0AEREREREREWm8tLm8NDp5RaXkFJbi7wdRYSYMBg0rExERERERqQ4VAaTRKCm1czAjjznf7WHlvpOYgwKZMrQ1Y7rGEWPWdjMiIiIiIiJnoyKANBp7T+Qy/qWVzn1ns/JLmP3pdpbtTOe5q3oSFW7ycEIREREREZGGrU7XBLDb7XzxxRd1+ZAiAGQXlPD4FzucBYDf+vHXExw4meeBVCIiIiIiIo1LnRQB9u7dy8MPP0zz5s25/PLL6+IhRcrJKSxh1b4Ml/1fbD3OydwiNyYSERERERFpfGpdBCgoKGD+/PkMGzaMjh07smrVKmbPns3Ro0frMp8IAH4GA0Z/12/XoAB/th/PdmMiERERERGRxqfGRYD169dz6623EhcXx5w5c7jsssswGAz85z//4bbbbiM2NrY+cpKZmcmECRMwm81ERERwyy23kJubW+U5I0aMwGAwlLvddttt9ZJP6leTkEDG905w2T+gTVMWrj+C3e5wYyoREREREZHGpUYLA/bo0QOr1cr111/PqlWr6Nq1KwAPPfRQvYT7rQkTJpCSksLSpUspKSlh8uTJTJs2jQULFlR53tSpU/nb3/7mvB8SElLfUaUKGblFZOWXYHc4MAcHElvNVf2DjQHcMbIdq/ZlcPRUQbm+W4e14Ydd6cSZg/Dz03aBIiIiIiIirtSoCLB7926uueYaRo4cSZcuXeorUwU7d+5kyZIlrF+/nn79+gHwr3/9i7Fjx/Lss8+SkOD6E+KQkBDi4uLcFVVcsNkd7Eq1cv+HW9iRYgUgMTKYp67oQZ+WTQgO9D/rY7SIDOE/E/qw7kAmaw9kYgkO5MIusaw/mMk7aw7xzYyh9f0yREREREREGrUaTQfYv38/HTt2ZPr06TRv3pz77ruPX375BYOhfj99Xb16NREREc4CAMDo0aPx8/Nj7dq1VZ773nvvERUVRbdu3Zg1axb5+fn1mlUqd/RUPle/stpZAAA4klnAjW+u5cCJs6/sX1BcyqGMfAzAoYw8Qo0B5BSWMOP9ZN78+QCPX9aVhIjgenwFIiIiIiIijV+NRgI0a9aMP//5z/z5z3/m+++/56233mLIkCGUlpYyd+5cpkyZQocOHeo8ZGpqKjExMeXaAgICiIyMJDU11eV5119/PS1btiQhIYEtW7bw4IMPsnv3bj755BOX5xQVFVFUdGaVeavV6vJYqR673cGnycfIK7ZV7HPAi8v28NzVPQk1Vf52zC8uZemONO5ZmIy/n4GZF3agTXQYW49lM6RdFEPbRxMTZiI0qEZvZxERERGpT7ZiyD4KOz6H1C3QYiC0vxAsLcCvTncqF5EaqPVV0wUXXMAFF1xAdnY27733Hm+99RbPPvss3bp1Y8uWLdV6jIceeoinn366ymN27txZ24hMmzbN+ffu3bsTHx/PqFGj2LdvH23btq30nCeffJLHHnus1s8pFeUWldC7RRP+M6EPgf4GVu/L4L/rjlBQUlYUSD6SRW5RqcsiQGp2ITMWJuNwgN3m4OkluwkO9KddTBjXntecFk2C8a9i5wARERERcTO7DY6sh3cvh9L/fcC27SMwhcOkLyG+p2fzifiwc/7o1GKxcPvtt3P77beTnJzMW2+9Ve1z7733XiZNmlTlMW3atCEuLo709PRy7aWlpWRmZtZovv+AAQMA2Lt3r8siwKxZs5g5c6bzvtVqJTExsdrPIeWdzCnitRX7mbf6IEWldgwGuKBTDP++vjd3v59MblEp8ZYgTAGuL+KXbEvF8btF/wtKbGw9ls2RU/mM6hxHnKV6CwyKiIiIiBvkpMIHN54pAJxWlAMfTYZJX0N4/ewqJiJVq1ERoKCggKVLlzJy5EjCw8PL9VmtVg4fPsw///nPaj9edHQ00dHRZz1u0KBBZGVlsXHjRvr27QvA999/j91ud17YV0dycjIA8fHxLo8xmUyYTKZqP6a4Vlhi47Wf9vPaT/udbQ4HLNuZzqm8Yv50QTue/HoXfxrVnogQo8vHSckucNl3eqcBEREREWlAclIhP6Pyvox9ZX0qAoh4RI3GUL/22mu88MILFQoAAGazmRdffJE33nijzsKd1rlzZ8aMGcPUqVNZt24dK1eu5M477+Taa6917gxw7NgxOnXqxLp16wDYt28fjz/+OBs3buTgwYN89tlnTJw4kWHDhtGjR486zygVncgpYt6qg5X2bTqcRZvoMO4e1Y7eiRFVPs7IjjEu+/q0jKjWzgIiIiIi4ka2orP0F7snh4hUUKMiwHvvvceMGTNc9s+YMYN58+adayaXz92pUydGjRrF2LFjOf/883nttdec/SUlJezevdu5+r/RaOS7777joosuolOnTtx7771ceeWVfP755/WSTyrKLSqlqNTusr/Ubmfq0DY0CXU9CgCgS4KZ1lGhFdoNBvjz2C5nPV9ERERE3MycAH4uBh2bzBAa5d48IuJUo+kAe/bsoWdP14t49OjRgz179pxzqMpERkayYMECl/2tWrXC8Zth4YmJifz444/1kkWqJzjQHz9D2Q4AlUmwBBMWFHjWx4mzBPPuLQN4fuluPtt8nBKbg05x4Tx2aVc6x1cclSIiIiIiHhYaDcPuh+VPVuy76O8QpqkAIp5SoyJAaWkpJ06coEWLFpX2nzhxgtLS0joJJnUrt7CEtJwivt+ZTk5hCcM7xtAyMoSo8Ppb/yAq3MiYrnF8ta3iNo6JkcE1WsyvWZNg/n55N+65sAM2u4NQUwBRYVq7QURERKRBMoZC/6kQ3bGsEHDqIER3glGzoVk/8D/7B0EiUj9qVATo2rUr3333nXNxvt/79ttv6dq1a50Ek7qTU1jCJ5uO8chn251tL36/l8Ftm/J/1/Qi1lw/K+sHB/gza2xnTuYWs+5gprO9RWQIcyefV+PnDQ4MoHmTc97QQkRERETcIaQpdL0cWp5ftgZAgEnTAEQagBpdUd18883MnDmTrl278oc//KFc3+eff84TTzzB888/X6cB5dwdzyooVwA4bdW+DBZtOsa0YW3w8zPU6XMeO1XAhxuO8M32VCYMbMkDYzqSmVdMrDmIOEtQvRUeRERERKSBCTv7bmAi4j41KgJMmzaNFStWcOmll9KpUyc6duwIwK5du/j111+5+uqrmTZtWr0Eldr7ZNMxl31vrzrA5X2a1elF+bFTBVz1yiqOZxcC8JfF2/D3M9C3ZQQvXttbBQAREREREREPqdHuAADvvvsu77//Pu3bt+fXX39l9+7ddOzYkf/+97/897//rY+Mco7SrIUu+7LyS7C7WrmvFmw2Ox9uOOIsADjb7Q7WHTjFugOn6uy5REREREREpGZqNcH66quv5uqrr67rLFJPkrrGsTj5eKV9g9o0JSyo7ubZZ+YX8+nmyp8LYOGGw4zuHEOISXP7RURERERE3K1GIwHsdjtPP/00Q4YM4bzzzuOhhx6ioKCgvrJJHemVGEHLpiEV2gP8DNw/piPh1dimr7oMBgMBVawvEOjnh8FQt+sPiIiIiIiISPXUqAjwxBNP8PDDDxMWFkazZs144YUXuOOOO+orm9SR+Ihg3psygKv7NcfoX/Yl79uyCR9PH0y76LA6fa6moUauG1D5FpIANw5qSbDRv06fU0RERERERKrH4HA4qj0hvH379tx3333ceuutAHz33XdccsklFBQU4OdX4+UFGgWr1YrFYiE7Oxuz2ezpOOeksMRGZl4xNruD8KAAIkKM9fI8qdmFTJ67jp0pOeXah3eI5tmrehAdroUBRURERKTx8aZrA/FdNSoCmEwm9u7dS2JiorMtKCiIvXv30rx583oJ6Gn6Rq+d1OwC1h08xcL1hwn08+PGQS3p0dyiAoCIiIiINFq6NhBvUKPV2UpLSwkKKn8RFxgYSElJSZ2GksYvzhLMpT2DGd05BoPBQHCgpgCIiIiIiAt2O+Qch+yjUJgNkW0gNBqCIzydTMTr1KgI4HA4mDRpEiaTydlWWFjIbbfdRmhoqLPtk08+qbuE0qiFGLULgIiIiIhUwVYKx3+B/14N+Zln2ntNgNGPQFis57KJeKEaXaHddNNNFdpuuOGGOgsjIiIiIiI+xnoM3rkMivPKtye/B1EdYPCfwE+jSkXqSo2KAG+//XZ95RAREREREV90eE3FAsBpq16AHleDOcG9mUS8mHcu6S8iIiIiIo3DyV9d9+Vngq3YfVlEfICKACIiIiIi4jnN+7nui2gJAdpdSqQuqQggIiIiIiKeE9fD9XD/UbMhPM69eUS8nIoAIiIiIiLiOZZmcNMX0Lz/mbYgC4x9Ftpe4LlcIl5K+7eJiIiIiIhnNW0L1y+E/AwoLYTgCAiLB39drojUNX1XiYiIiIiI54VElt1EpF5pOoCIiIiIiIiIj1ARwMvY7Q5PRxAREREREZEGStMBvMSxU/ms3JvB8l/TadU0lCv6NCchIogQo77EIiIiIiIiUkZXiF5g/4lcrnplNRl5xc62l3/cx7+u7c3oLrEEBfp7MJ2IiIiIiIg0FJoO0MhlFxTz50VbyxUAABwOuOeDZE7kFHkomYiIiIiIiDQ0KgI0cqfySli9P7PSvhKbg+3Hs92cSERERERERBoqTQdo5Ert9ir784pK3ZREREREROQsbDbIPwE4ICQK/AM9nUjE56gI0MiZgwJpERnC4cz8Svt7Jka4N5CIiIiISGWyj8Iv75bd7KXQ/SroPwUiWno6mYhP0XSARi7GHMTfx3fDYKjYd1Xf5kSFmdwfSkRERETkt7KPwfxLYfmTkH0EclJg1YvwZhKcOuTpdCI+RUUAL9CvVRMWTR/MoDaRBAf606ppCE9f2Z0HL+5ERIjR0/FERERExNft/Q4y9lVsz0mBX96Bolz3ZxLxUZoO4AVCjAH0atGEV27oS36JjQA/A9HhQZ6OJSIiIiIChVbY8r7r/h2flk0NiO7ovkwiPkxFAC9iCTFi8XQIEREREZHf8vMH/yqmqAYEQdp2iGyjhQJF3EDTAUREREREpP4YQ6H/VNf9fSeBNQVy0yEnDRwOt0UT8UUqAoiIiIiISP1K6A3tLqzY3vw8CIqAsJiyXQPeHgPr3ywrBohIvTA4HCq1VcVqtWKxWMjOzsZsNns6joiIiIhI45SxD1K3wLaPwW6DDmPAzw++fhBsxXD1u/Dfa8qObX8RXPYfCIv2bObf0bWBeAOtCSAiIiIiIvXP4Aff/gVaDgaDP6z4Z9l2gadl7ClbFyBzP+z5FrIONbgigIg3UBFARERERETqn8MO2UdhyweV9xdkgTHszP3dS6B5P7dEE/EljWZNgCeeeILBgwcTEhJCREREtc5xOBzMnj2b+Ph4goODGT16NHv27KnfoCIiIiIiUpExrOyTflfie5SNAjjNFOb6WBGptUZTBCguLuaqq65i+vTp1T7nmWee4cUXX+SVV15h7dq1hIaGkpSURGFhYT0mFRERERGRCsJj4eJ/Vt6XOACsx6E490xbx4vdk0vExzSaIsBjjz3GPffcQ/fu3at1vMPhYM6cOfzlL3/hsssuo0ePHsyfP5/jx4+zePHi+g0rIiIiIiIVtRgINy6GmC5l903h0H8aDP4TLHvszHGjHoHwOI9EFPF2XrsmwIEDB0hNTWX06NHONovFwoABA1i9ejXXXnttpecVFRVRVFTkvG+1Wus9q4iIiIiITzCFQduRMPEzKMkHv4CyRQJP7oYr3wL/QGjSEkJjIMji6bQiXqnRjASoqdTUVABiY2PLtcfGxjr7KvPkk09isVict8TExHrNKSIiIiLic8Kiyy72Lc3AVgg7PoNPb4fFt8Gmd6Aox9MJRbyWR4sADz30EAaDocrbrl273Jpp1qxZZGdnO29Hjhw5+0lukl1QQmZeMXa7w9NRRERERETOXdYhePNC2PAGFJyCvJOw6kWYO7ZsJwERqXMenQ5w7733MmnSpCqPadOmihVEqxAXVzaHKC0tjfj4eGd7WloavXr1cnmeyWTCZDLV6jnrS7q1kHUHM3l75UEKS2z8oUcC43rG07xJiKejiYiIiIjUjq0UNr0LuekV+7IOl20R2H+K+3OJeDmPFgGio6OJjo6ul8du3bo1cXFxLFu2zHnRb7VaWbt2bY12GPC0EzmFPPDxFpbvPuFs237cyrxVB/lo+iAVAkRERESkcSo4BTsWu+7f9iH0uBqCzG6LJOILGs2aAIcPHyY5OZnDhw9js9lITk4mOTmZ3Nwz24h06tSJRYsWAWAwGJgxYwZ///vf+eyzz9i6dSsTJ04kISGB8ePHe+hV1NyetNxyBYDTUq2FvL3yAMWltgp9druDnMISikoq9omIiIiINAh+/hBYxQdagSGQuR9y09yXScQHNJrdAWbPns28efOc93v37g3ADz/8wIgRIwDYvXs32dnZzmMeeOAB8vLymDZtGllZWZx//vksWbKEoKAgt2avLbvdwcINrtckWPTLcaYObUOcJdjZdiQzn6+3pbBsZzpNw4zcPKQ17WLCiAgxuiOyiIiIiEj1hETCgNvKFgOsTNfL4f3rIa47jHsRwmMrP05EasTgcDi0ylwVrFYrFouF7OxszGb3DkWy2x3c80EynyYfr7S/aaiRL+8631kEOHAylytfXk1mXnG54+4Y0Y5pw1tjCVYhQEREREQakJxU+ORWOPgjtLkAmvWB0kIotEJsV/j6gbLjrv8AOiR5NiuevTYQqSuNZjqAL/LzM3Dtea63KLyiTzMiQ8su7HOLSnjq690VCgAALy3fS7q1qN5yioiIiIjUSngcXPkmTF8Ncd3g1yVwdAO0GgL+geD3v4HL616F4nzPZhXxEioCNHDtYsIZ1SmmQnu8JYibBrfCGOAPQFZ+CUt3pLp8nO93VbLqqoiIiIiIpxXnwLw/wMoXIHUrHF4Nn0yDPd/CqEfKjrGVgMPu2ZwiXqLRrAngq6LDTTx5ZXc2HcrirZUHKCi2cWmvBMZ2j6dZxJm1ABwOsFcxsaPU1jBmfdjsDlKyC9h48BR7T+TSo3kEXRPMJPzmtYiIiIiIjyjJhx//CXknK/bt/hp6XANBFug1AUxh7s8n4oVUBGgEYsKDGNMtjiHtmmKzOTAHB+LnZyh3jDk4kMFtm7JqX0aljzGyU/1sxVgTdruDbceyuf71NeQVn9m5ICbcxPvTBtImWj/YRURERHxK/inY/rHr/n3fQ7crofVQ92US8XKaDtCIhAcFEhFqrFAAALAEB/LIuC4EB/pX6LuidzPiLZ7/pD3NWsgt89aXKwAApOcUMWNhMpl5WrdARERExKcYAEPF322d/AJh5J/B3MxtkUS8nYoAXqRtdBhf3T2UCf1b0CIyhJ7NLfxnQh8evqQzTUI9vzNAqrWQk7kVFy4E2HI0m8y8EjcnEhERERGPCoqEbn903d/rOgiNcl8eER+g6QBeJMDfj9ZRocy+tAvWglIC/Q1EhHj+4v+03MLSKvuLSm1V9ouIiIiIlzEGw7D7YM83kPu7haw7XwqhsZ7JJeLFVATwQqYAf6LDK04L8LTmkSEYDGWLGP5emCmAiOBA94cSEREREc8KbgJ/nFu2G8CBH8EUXrYOQGkRfHEPXPkGhDTxdEoRr6EigLhNVJiRa/om8v6GIxX67rmwAzFmkwdSiYiIiIhH5abB3LHQehi0GVm2Y8CKZyH7f78z5p9QEUCkDqkIIG4THhTIvUkdaR0dyqsr9pOZV0yziGDuS+rAiI4xBPo3vNELIiIiIlLPCq1lfx5YUXZz1S8idUJFAHGr6HATU4a24dJeCZTYHJgC/Ig1B3k6loiIiIh4SpD53PpFpEa0O4C4nb+fgXhLMC0iQ1QAEBEREfFVNhtkHy1bMOr6hWVTAX6vzUgIiXZ/NhEvppEAIiIiIiLiXrknIPk9WDkHCk6VLQ444Fbocil8ObOsMNBmJFz2ktYDEKljKgKIiIiIiIj7FOXBT8/C2lfOtBWcguVPwcA7YPpq8PMvGwGgAoBInVMRoJHLLy7lZE4xe9NzwADtosOICjcRYtSXVkREREQaoLx0WP965X3rXoU+N0BhNgQEgykM/LWNtEhd0pViI5ZdUMwnm47xxJc7KbU7AGgbHcrsP3ThvFaRhJj05RURERGRBiY/A+y2yvvspXByD3wwEUxmGP8faHsBGEPdm1HEi2lhwEZsT1ouj32+g1K7g6ahRl68thc3DW7FRxuP8s9vdrMzxYq1oMTTMUVEREREzggMrrr/9Cf/RVb44EbIPFD/mUR8iD4qbqTyi0p5efk+AIz+fjx3dU8e+3wHB07mOY95e9VBHh7bmWv7J2IO0jAqEREREWkAQqKgaTvI2FuxL6oDnDp05r7DUbZ2wCXPQYDJfRlFvJhGAjRSBSU2jp4qAGBMtzi+2JJSrgBw2j++2kladqG744mIiIiIVC48Fq55D0J/t/VfWCwk/QNW/at8+4ldUFLgvnwiXk4jARqpsKAAereIYHdaDhd2ieW+Dze7PPbb7am0jw13YzoRERERkSrEdIJpyyF9J6TvgPCEsh0BvrofrMfKHxvfCwJDPJFSxCupCNBImQL8mTK0NR9vOoq/n4GiUrvLY7MLS92YTERERESkGizNy27tL4S07fDKkLLh/7/lFwD9p0KA0TMZRbyQpgM0Yi0iQ1gwZSBHMvMY0DrS5XEXdol1YyoRERERkRpq0qpsikBI0zNt4fFww8cQ0dJjsUS8kUYCNGLGAH/Oax1Jq6gQBraJ4o+vrKLEVr56OqB1JK2aaviUiIiIiDRgxlDoMAZu/QnyT4LBULaAYHh82d9FpM6oCOAFosODsAQH8vmfzufZb3bz896TWIIDmTy4NZf3aUZ0eJCnI4qIiIiIVM3PHyzNym4iUm9UBPASxgB/OsWZ+b9repFbVIqfwUB0mAk/P1VORUREREREpIyKAF4mPCiQ8KDAah+fV1RCXpGNoEB/zMHVP09EREREREQaHxUBfFR+USn7TuTywrI97EzJITEymLtHtadLggWLigEiIiIiIiJeSUUAH2S3O1i5L4Np72xw7sJyLKuANfvX8si4LlzbvwXBgf6eDSkiIiIiIiJ1TlsE+qA0ayGzPtlSYRtWgCe/2sXJnCL3hxIREREREZF6pyKADzqVX8LJ3OJK+4ptdo6dKjinx7fbHaRkF7DvRC5HT+VTWGI7p8cTERERERGRuqHpAD7I7yylH3//2u8okJlXzNfbUnj+21/JyCvGFODH1X2bc8cF7YmzaKtCERERERERT9JIAB/UJMRI8ybBlfaFGv1JqOXFus1m57PNx/jzom1k5JWNNCgqtfPO2sPc+2EymXmaZiAiIiIiIuJJKgL4oFhzEHOu6YUpoPyX32CA56/pRbTZVKvHTcsp4vmlv1bat3JvBmlWFQFEREREREQ8SdMBfFTP5hEsmTGMD9YfIflIFm2jQ5k4qBXNI4Mx+tduZ4CcwlKsBaUu+/em59I53lzlY9jtDtJyCikssWP09yM63IgxQDsViIiIiIiI1AUVAXxUYIAfraNCue+iDhSU2jAF+BPof24DQ4IC/fAzgL2SXQcAosKMVZ6fmVfM0h2pPPvtr5zIKSLE6M+NA1tyy/mtiTFrPQEREREREZFzpekAPs7f348wU+A5FwAAmoaauLBLbKV9TUICadk01OW5JTY7nyYf48GPt3Lif1sU5hfbeHXFfv6yeBun8irfzUBERERERESqr9EUAZ544gkGDx5MSEgIERER1Tpn0qRJGAyGcrcxY8bUb1AfFhYUwOw/dKFTXHi5dnNQAPNu7k9cFZ/mp1uL+D8X6wl8uyONE7laT0BERERERORcNZrpAMXFxVx11VUMGjSIN998s9rnjRkzhrffftt532Sq3aJ3Uj3NmoQw/5b+HM7MZ+dxK82aBNMxNpx4SzB+fq63HrQWlmAtdL2ewIGTeXSIDXfZLyIiIiIiImfXaIoAjz32GABz586t0Xkmk4m4uLh6SCSuxIQHERMeRL+WkdU+Jyiw6kEpTUICzzWWiIiIiIiIz2s00wFqa/ny5cTExNCxY0emT59ORkZGlccXFRVhtVrL3aT+RYaaGNo+ykWfkeZNQtycSERERERExPt4dRFgzJgxzJ8/n2XLlvH000/z448/cvHFF2Oz2Vye8+STT2KxWJy3xMRENyb2XZbgQP5xeXdaR5VfPNAcFMDcyedVuZ6AiIiIiIiIVI/B4XC42NCt/j300EM8/fTTVR6zc+dOOnXq5Lw/d+5cZsyYQVZWVo2fb//+/bRt25bvvvuOUaNGVXpMUVERRUVnFqGzWq0kJiaSnZ2N2Vz1Hvdy7tKshRw4kcfWY9m0bBpClwQzCWdZT0BERERExB2sVisWi0XXBtKoeXRNgHvvvZdJkyZVeUybNm3q7PnatGlDVFQUe/fudVkEMJlMWjzQg2LNQcSagxjYtqmno4iIiIiIiHgdjxYBoqOjiY6OdtvzHT16lIyMDOLj4932nCIiIiIiIiINRaNZE+Dw4cMkJydz+PBhbDYbycnJJCcnk5ub6zymU6dOLFq0CIDc3Fzuv/9+1qxZw8GDB1m2bBmXXXYZ7dq1IykpyVMvQ0RERERERMRjGs0WgbNnz2bevHnO+7179wbghx9+YMSIEQDs3r2b7OxsAPz9/dmyZQvz5s0jKyuLhIQELrroIh5//HEN9xcRERERERGf5NGFARsDLf4hIiIiIiKgawPxDo1mOoCIiIiIiIiInJtGMx1AasfhcJBmLSQzrxi7AyJDjcSag/DXlnsiIiIiIiI+R0UAL1ZUYmPDoVPMWJjMiZwiAJqEBPLkFd0Z1j6aEJO+/CIiIiIiIr5E0wG82JFTBdz01jpnAQDgVH4J09/bxL4TuVWcKSIiIiIiIt5IRQAvVWKzMX/1QUrtFdd9dDjg3z/sJa+o1APJRERERERExFM0HtyLlNhs5BXaMAb6YbM52H7c6vLY3ak55BeXEqopASIiIiIiIj5DV4BeoNRm58ipfN5dc4i1BzJJsAQzbVgbbhzQgo2HTlV6TuuoUIKN/m5OKiIiIiIiIp6kIoAX2JmSw1WvrqKwxA7AtmNWvt2RxqyLO3Fln2Z8vOlYhXP+dEF7wkyB7o4qIiIiIiIiHqQ1ARq5jNwiHvx4i7MA8FtPL9nFLee3xhx0ptZjCQ7kvSn9aRpm5FBGHidziyqcJyIiIiIiIt5JIwEauaz8EnakVD733+6A/Sfz+Pae4aRaCzEAESGBvPTDXhb/cpxim532MWE8emlXeiVGaH0AERERERERL6eRAF7O4YA4SxC9EiOIswQxdf4GPthwlGJb2ciBPem5THhjLVuPZXs4qYiIiIiIiNQ3FQEauYiQQDrGhlfa52eA7s0szvt70nP5NS230mP/9vkOMjQ1QERERERExKupCNDINQ0z8fSV3TEFVPxS3nthR6LCjM77P+854fJxdqRYKSi21UtGERERERERaRg0CdwLdEkw89VdQ3l75QHWHzxFnMXE9BHt6BQXTljQmR0A4izBLh8jzBSAv5/BHXHPWWZeMcdO5bNkeyr+BgNJ3eJIiAimSYjx7CeLiIiIiIj4MBUBvIAxwJ+2MWHMHteVnMISggL9CK1k+78RHaLxM5QtGPh7NwxsQVR4w7+IPplbxN+/2Mni5DPbHr74/V5uHNiSey5sT2SoyYPpREREREREGjZNB/AixgA/moaZKi0AAMRagnhpQp8Kn/if17IJk4e0JtDf3x0xz8mGg6fKFQBOe2fNIXam5HggkYiIiIiISOOhkQA+JDjQn5EdY/j+3uGs2Z9BZl4xA9o0JbFJCNHhDf8T9Oz8Yl5bsd9l/xs/7adPiyYEGxt+MUNERERERMQTVATwMUGB/rRsGkrLpqGejlJjJXYH1sISl/1Z+SUU2+wEoyKAiIiIiIhIZTQdQBoNS3AAIzvGuOy/qGscYSbVtURERERERFxREUAajUB/f24Y2AJzUMUL/chQI+N6xDeaHQ5EREREREQ8QUUAaVQSm4Sw6PYhXNQlFj8D+PsZ+EOPeD6ZPpjmkSGejiciIiIiItKgaey0NCp+fgbaxoTx3NU9sRaWYgAswYGEahqAiIiIiIjIWenKSRql8KBAwoMq3wpRREREREREKqfpACIiIiIiIiI+QkUAERERERERER+hIoCIiIiIiIiIj1ARQERERERERMRHqAggIiIiIiIi4iNUBBARERERERHxESoCiIiIiIiIiPgIFQFEREREREREfISKACIiIiIiIiI+QkUAERERERERER+hIoCIiIiIiIiIjwjwdICGzuFwAGC1Wj2cREREREREPOn0NcHpawSRxkhFgLPIyckBIDEx0cNJRERERESkIcjJycFisXg6hkitGBwqY1XJbrdz/PhxwsPDMRgM5fqsViuJiYkcOXIEs9nsoYTi6/Q+FE/Te1AaAr0PxdP0HvQNDoeDnJwcEhIS8PPTzGppnDQS4Cz8/Pxo3rx5lceYzWb9sBeP0/tQPE3vQWkI9D4UT9N70PtpBIA0dipfiYiIiIiIiPgIFQFEREREREREfISKAOfAZDLxyCOPYDKZPB1FfJjeh+Jpeg9KQ6D3oXia3oMi0lhoYUARERERERERH6GRACIiIiIiIiI+QkUAERERERERER+hIoCIiIiIiIiIj1ARQERERERERMRHqAhQQ0888QSDBw8mJCSEiIiIap3jcDiYPXs28fHxBAcHM3r0aPbs2VO/QcWrZWZmMmHCBMxmMxEREdxyyy3k5uZWec6IESMwGAzlbrfddpubEktj99JLL9GqVSuCgoIYMGAA69atq/L4Dz/8kE6dOhEUFET37t356quv3JRUvFlN3odz586t8DMvKCjIjWnF26xYsYJx48aRkJCAwWBg8eLFZz1n+fLl9OnTB5PJRLt27Zg7d2695xQRORsVAWqouLiYq666iunTp1f7nGeeeYYXX3yRV155hbVr1xIaGkpSUhKFhYX1mFS8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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - " from TreeOrdination import TreeOrdination, CLRClosureTransformer\n", - " \n", - " tree_ord_model = TreeOrdination(metric=\"hamming\",\n", - " feature_names=reduced_features[best_features],\n", - " n_iter_unsup=5,\n", - " transformer = CLRClosureTransformer(do_clr = True)).fit(X_removed[:, best_features], y)\n", - " \n", - " # Plot data\n", - " tree_ord_model.plot_projection(X_removed[:, best_features], y)\n", - "\n", - " plt.show()\n", - " plt.close()" - ] - }, - { - "cell_type": "markdown", - "id": "04fa1458", - "metadata": {}, - "source": [ - "#### We will also test if significant differences exist between Crohn's Disease patients and healthy controls" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "dbce69ed", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pseudo-F = 49.884184517868476\n", - "p-value = 0.001\n", - "R-squared = 0.9699855603065812\n" - ] - } - ], - "source": [ - " from skbio.stats.distance import permanova, DistanceMatrix\n", - " from sklearn.metrics import pairwise_distances\n", - " \n", - " #Get the projection\n", - " projection = tree_ord_model.emb_transform(X_removed[:, best_features], \"PCA\")\n", - " \n", - " # Calculate distance matrix\n", - " D_ij = pairwise_distances(projection, metric = \"euclidean\").astype(np.float32)\n", - " \n", - " D_ij = DistanceMatrix(D_ij)\n", - " \n", - " # PerMANOVA\n", - " pmanova = permanova(D_ij, y, permutations = 999)\n", - " \n", - " pseudo_f, pval = pmanova.values[4:6]\n", - " \n", - " R2 = 1 - 1 / (\n", - " 1\n", - " + pmanova.values[4]\n", - " * pmanova.values[4]\n", - " / (pmanova.values[2] - pmanova.values[3] - 1)\n", - " )\n", - " \n", - " print(\"Pseudo-F = \", pseudo_f)\n", - " print(\"p-value = \", pval)\n", - " print(\"R-squared = \", R2)\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "722c5829", - "metadata": {}, - "source": [ - "#### We should plot global feature importance scores as they relate to each class to broadly understand the ASVs which are contributing to the location of samples in the scatterplot above. Positive values (green) push samples towards the right of the plot while negative values (orange) push samples towards the left of the plot." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "317a1a12", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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49P3no+Pj6CmplbgPhctWiSYmJgISkpKQtOmTYW4uDiZGE6ePCm4uLgIKioqgqampuDh4SHcunWrRMcWhA/TCY8aNUrQ19cXJBKJ1Pt3w4YNgrW1taCkpCTUrFlTCAsL+6L3uCAIwoMHD4R+/foJ+vr64vtjxIgRUlNOv379WpgyZYpgZWUlKCoqCpUrVxYaN24sBAcHi9NUF6aoz7GPFfQeeP36tTB27FjB2NhYqFSpkmBtbS0sXLhQakpmQRCE27dvC82aNRNUVFQEAMVO61vY9bl3757QvXt3QVtbW1BWVhacnJyEQ4cOSdUpyTSuBcnMzBSCg4OFhg0bCurq6oKioqJgbW0tjBo1Smq62oLu54EDB4Q6deoIysrKgpmZmTB//nxh48aNUp9X169fF3r37i1Ur15dUFJSEgwMDISOHTsKV69eFfeze/duoU2bNoKBgYGgqKgoVK9eXRg6dKiQmppapufw6XvoYyW9pyV9hgt7LxX2ef6x2bNnC05OToK2tragoqIi1KxZU5gzZ06xz3T+M5C/VKpUSdDX1xeaNWsmzJkzR3j69KnMNp/GU5L7lW/t2rWCo6OjoKKiImhoaAj29vaCv7+/8Ndff4l1oqOjhUaNGgkqKiqCsbGx4O/vLxw7dkzq/+P79+8LAwYMECwtLQVlZWVBV1dXaN68uXDy5EmZY5bm7xr69iSC8I1GxiIiIiIi+n/JyckwNzfHwoUL+YspERGVO445QkREREREREQVGpMjRERERERERFShMTlCRERERERERBUaxxwhIiIiIiIiogqNLUeIiIiIiIiIqEJjcoSIiIiIiIiIKjSF8g6AiKis5eXl4a+//oKGhgYkEkl5h0NEREREROVEEAS8fv0axsbGkJMrvH0IkyNE9J/z119/wcTEpLzDICIiIiKif4iHDx+iWrVqha5ncoSI/nM0NDQAfPgA1NTULOdoiIiIiIiovKSnp8PExET8jlAYJkeI6D8nvyuNpqYmkyNERERERFRsd3sOyEpEREREREREFRqTI0RERERERERUoTE5QkREREREREQVGpMjRERERERERFShMTlCRERERERERBUakyNEREREREREVKExOUJEREREREREFRqTI0RERERERERUoTE5QkREREREREQVGpMjRERERERERFShMTlCRERERERERBUakyNERERERERE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VVXx66+/onr16ujatStsbW0xcOBAvHv3rtiWJKqqqrh9+za6desGGxsbDBkyBCNGjMDQoUNLdC5ycnLYu3cv3r59CycnJwwaNEhmVp6Crt+UKVNQp04dNGvWDPLy8ti+fXuh9VetWoWcnBy0bdsWVapUkVl27NgBAJg3bx66deuGvn37on79+rh79y6OHTsGHR2dQq8v8CFZ6erqio4dO6JDhw7w9PQUB1oFPnQfOnfuHNq3bw8rKyv07NkTGhoauHDhAgwMDMR6v/zyC5o2bYoGDRrg8OHD2L9//1d9DomIiIiIiMp9tpr/utLMxkNEZSN/RGrOVkNERERE/yWcrab0/hOz1RARERERERERfW1MjlCJpKSkSE1D++nyJdP9/lsUdf7nzp0r7/CIiIiIiIjoM/0jBmT9LwsPDy/vEMqEsbGxzKC5n67/ryvq/AubHYaIiIiIiIj++ZgcoRJRUFAo9ZS6/zUV/fyJiIiIiIj+q9ithoiIiIiIiIgqNCZHiIiIiIiIiKhCY3KEiIiIiIiIiCo0JkeIiIiIiIiIqELjgKxE9J+VNiUNmpqa5R0GERERERH9w7HlCBERERERERFVaEyOEBEREREREVGFxuQIEREREREREVVoTI4QERERERERUYXG5AgRERERERERVWhMjhARERERERFRhcapfInoP0srSAtQLu8o6N9KmCGUdwhERERE9I2w5QgRERERERERVWhMjhARERERERFRhcbkCBERERERERFVaEyOEBEREREREVGFxuQIEREREREREVVoTI4QERERERERUYXG5AgRERERERERVWhMjhARERERERFRhcbkCP2j+fr6wtPTU3zt5uaGMWPGiK/NzMywdOnSbx7Xl5BIJNi3b195h0FERERERET/j8kRgq+vLyQSicxy9+7d8g5NRmRkJGbNmvVNj/lpQuZLpaamol27dmW2v5IKCAgo8D7nL4GBgSXe1+cmeAqKoWbNmlJ1hg4dCktLS6ioqEBfXx+dO3fG7du3S30sIiIiIiKikmJyhAAAbdu2RWpqqtRibm5e3mHJ0NXVhYaGRnmH8Vmys7MBAEZGRlBSUvrmx58wYYLMPU5NTYWvry+0tbXRp0+fbxJHrVq1pI5//vx5qfWOjo4ICwtDfHw8jh07BkEQ0KZNG+Tm5n6T+IiIiIiIqOJhcoQAAEpKSjAy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d6my2NhYmSTOxzIyMnDv3j307du30DqCIEAQBGRlZRVah4iIiIiI6EuwWw0VyMrKCjk5OVi+fDnu37+PiIgImQFFJ02ahAsXLmDkyJGIjY1FYmIi9u/fLw7IamZmBh8fHwwYMAD79u1DUlISoqKixOSEtbU1rl69imPHjuHOnTuYNm1aqQf3BD58cV+wYAHu3LmDlStXYteuXRg9enSJz2PKlCmIiYnB8OHD8dtvv+H27dsIDQ0VZ54xMzPD5cuXkZycjGfPniEvLw8jRozAixcv0Lt3b8TExODevXs4duwY+vfvX6opZ62srGBiYoKAgAAkJibi8OHDWLRoUamvQUlER0dj1KhRmD59OiwsLPD48WOpJS0tDQAwceJEhIeHIzQ0FImJiVi8eDEiIyOlxiYxMzPDqVOn8PjxY7x8+RIA0KJFC1y9ehWbN29GYmIiZsyYIZMsmTBhAs6ePYvk5GRcuHABXbp0gby8vNgi5P79+wgKCsK1a9eQkpKCCxcuoEePHlBRUUH79u2/ynUhIiIiIiJicoQKVLduXSxevBjz589H7dq1sXXrVgQFBUnVqVOnDs6ePYs7d+6gadOmcHBwwPTp06W6cISGhqJ79+4YPnw4atasicGDB4tT/Q4dOhRdu3ZFz5498d133+H58+dSrUhKavz48bh69SocHBwwe/ZsLF68WJx9pSTnYWNjg+PHjyMuLg5OTk5wdnbG/v37xRYhEyZMgLy8POzs7KCvr4+UlBQYGxsjOjoaubm5aNOmDezt7TFmzBhoa2uLLVRKolKlSti2bRtu376NOnXqYP78+Zg9e3apr0FJrF+/HtnZ2Zg6dSqqVKkis+QnlDw9PRESEoLg4GDUqlULa9asQVhYmNSUvIsWLcKJEydgYmICBwcHAIC7uzumTZsGf39/NGzYEK9fv0a/fv2kYvjzzz/Ru3dv1KhRA15eXtDT08OlS5fEFjTKyso4d+4c2rdvDysrK/Ts2RMaGhq4cOECDAwMvsp1ISIiIiIikgifDhJARPQvl56eDi0tLWAygLIbVoUqGGEG/3skIiIi+rfL/26QlpYGTU3NQuux5QgRERERERERVWhMjhARERERERFRhcbkCBERERERERFVaEyOEBEREREREVGFxuQIEREREREREVVoTI4QERERERERUYXG5AgRERERERERVWgK5R0AEdHX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vn07GjZsCG9vb9jZ2WHevHmYM2eO1Jg8REREREREZUkifDpIQAndvXsX9+7dQ7NmzaCiogJBEMRZTejrOXfuHFq2bImHDx/C0NDws/cjkUiwd+9eeHp6ll1wRP8Q6enpH7p/TQZQdsOqVBjCjM/6b4GIiIiI6B8n/7tBWlpagT/05yt1y5Hnz5+jVatWsLGxQfv27cUxBgYOHIjx48d/fsRUpKysLPz5558ICAhAjx49vigxQkRERERERET/U+rkyNixY6GgoICUlBRxphQA6NmzJ44ePVqmwdH/bNu2Daampnj16hUWLFhQ3uEQERERERER/WeUekDW48eP49ixYzIDclpbW+PBgwdlFhhJ8/X1ha+vb5nt7zN7UxERERERERH955S65cibN2+kWozke/HiBZSUlMokKCIiIiIiIiKib6XUyZGmTZti8+bN4muJRIK8vDwsWLAAzZs3L9PgiIiIiIiIiIi+tlJ3q1mwYAFatmyJq1evIjs7G/7+/vjjjz/w4sULREdHf40YiYiIiIiIiIi+mlK3HKlduzbu3LmDJk2aoHPnznjz5g26du2KGzduwNLS8mvESERERERERET01UgEjsxJRP8xJZ3LnIiIiIiI/ttK+t2g1N1qAODdu3f47bff8PTpU+Tl5Umt69Sp0+fskoiIiIiIiIioXJQ6OXL06FH069cPz549k1knkUiQm5tbJoEREREREREREX0LpR5zZNSoUejRowdSU1ORl5cntTAxQkRERERERET/NqVOjjx58gTjxo2DoaHh14iHiIiIiIiIiOibKnVypHv37oiKivoKoRARERERERERfXulnq0mMzMTPXr0gL6+Puzt7VGpUiWp9X5+fmUaIBFRaXG2GiIiIiIiAr7ibDXbtm3D8ePHoaysjKioKEgkEnGdRCJhcoSI/jG0grQA5fKOonwIMzhLOxERERFRSZU6OfLTTz8hMDAQkydPhpxcqXvlEBERERERERH9o5Q6u5GdnY2ePXsyMUJERERERERE/wmlznD4+Phgx44dXyMWIiIiIiIiIqJvrtTdanJzc7FgwQIcO3YMderUkRmQdfHixWUWHBERERERERHR11bq5MjNmzfh4OAAAPj999+l1n08OCsRERERERER0b9BqZMjZ86c+RpxEBERERERERGVC46qSkREREREREQVWqlbjgDA1atX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1YWvry+mTp0KuVyOzz77DBkZGYiJiYGenh48PT0xfvx4BAcHY/r06RgzZgzOnz+PsLCwUs/boEED7N69G71794ZMJoO/v3+RaSpl4erqiujoaHz11VdiWYcOHTB06FC0aNECNWvWxPXr1zFz5kx07NgRenp6ZW7733//xd69e7Fnzx588sknkn0jR45E//79JUmDdzFq1Ch89913mDlzJoYOHQpNTU0AQL169aCmpoaVK1di/PjxuHr1apFpQW/q0KED/v33XyxevBju7u44ePAgfv/9d8k1z507F1OmTIG+vj7c3NyQm5uLuLg4PHnyBP/73/+wbNkymJqaomnTplBSUsKOHTtgYmIiedLQyZMn3xoLEZEi4ZojRERERNWAnp5eqUmDwMBA+Pv7IygoCPb29nBzc8P+/fthZWUF4NUP+V27duHXX3+Fk5MT1qxZgwULFpR6zmXLlsHQ0BBt2rRB79694erqimbNmpU7dm9vbxw4cAAZGRlimaurK8LDw9GtWzfY29vjiy++gKurK7Zv316utiMiIqCtrY3OnTsX2de5c2doamrip59+KnfMr6tXrx66dOmCJ0+eSBZgNTIyQlhYGHbs2AEHBwcsXLgQS5cuLbUte3t7hISEYNWqVXBycsLZs2fh6+srqTNmzBhs2LABoaGhaNy4MVxcXBAWFib2pa6uLhYvXowWLVqgZcuWSEtLw4EDB6Ck9Or/+sfGxiIjI0Mc4UJERIBMeHNSIxERERHRBzZo0CA0a9YMfn5+VR1Ktefh4QEnJyfMnDmzqkMhIvpocOQIEREREVW5JUuWvPOjbans8vLy0LhxY0ydOrWqQyEi+qhw5AgRERERERERKTSOHCEiIiIiIiIihcbkCBEREREREREpNCZHiIiIiIiIiEihMTlCRERERERERAqNyREiIiIiIiIiUmhMjhARERERERGRQmNyhIiIiIiIiIgUGpMjRERERERERKTQmBwhIiIiIiIiIoX2f3Jpv5M48LgfAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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CyYmJsLcuXOF9evXS31eXb9+XejRo4dQtWpVQUlJSahYsaLQrl074erVq+J+du/eLbRs2VKoWLGioKioKFStWlUYOHCgkJSUVGD8eV0zQcj7PVaSnzu5TQ2c13vlW74/kpKSBHl5ecHKyqrAa/G1u3fvCgMGDBBMTEwERUVFQUNDQ3BxcRGWLl0qNRV1ZmamEBQUJJiamgrlypUTjIyMhICAAKk6gvD5fdq2bVuZ4+T2WZzXd29e+xCEwj3nnIr5v0kiCN9pRDEiIiIioq8kJibC1NQU8+fPz7f7BhH9vF6+fAkDAwNMmTIlzxmOiH52bJdEREREREREpSY8PBxZWVno3bt3WYdCVGo45goRERERERGVuNOnT+P27duYOXMmPD09xdm/iP6LmFwhIiIiIiKiEjdt2jRcuHABLi4uJT7jHtGPhmOuEBEREREREREVA8dcISIiIiIiIiIqBiZXiIiIiIiIiIiKgWOuENF/TnZ2Np4+fQoNDQ1IJJKyDoeIiIiIiMqIIAh49+4dDA0NISdXeu1LmFwhov+cp0+fwsjIqKzDICIiIiKiH8Tjx49RpUqVUts/kytE9J+joaEB4PMHqKamZhlHQ0REREREZSUlJQVGRkbib4TSwuQKEf3n5HQF0tTUZHKFiIiIiIhKfbgADmhLRERERERERFQMTK4QERERERERERUDkytERERERERERMXA5AoRERERERERUTEwuUJEREREREREVAxMrhARERERERERFQOTK0RERERERERExcDkChERERERERFRMTC5QkRERERERERUDEyuEBEREREREREVA5MrRERERERERETFwOQKEREREREREVExMLlCRERERERERFQMTK4QERERERERERWDQlkHQET0P2OrpKwjICIiIiL635L2fQ7DlitERERERERERMXA5AoRERERERERUTEwuUJEREREREREVAxMrhARERERERERFQOTK0RERERERERExcDkChERERERERFRMTC5QkRERERERERUDEyuEBEREREREREVA5MrRERERERERETFwOQK0XcWGBiIWrVqlXUYREREREREVEKYXKGf3rNnzzBixAhYWFhAWVkZlSpVgouLC0JDQ5GWllbW4ckYO3YsTp06VSbHlkgk+S6FVZwEkb+/PxwdHaGkpJTnPo4dO4b69etDQ0MDenp66Ny5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aWlYsGCBOPvPl/T09NC8eXPY2dmhV69eWLx4MT59+oQhQ4bA1dVVvFYmJiZ48OABYmJiUKVKFWhoaEBFRQX169fHnDlzYGpqihcvXmDSpEkyx7h37x5SU1Px7NkzfPjwQUzA2NraQlFREW3btsWiRYswbdo09OjRA+/evcOvv/4KY2NjMWlDRERERET0I2FyhX5q5ubmuHHjBmbNmoWAgAD8888/UFJSgq2tLcaOHYshQ4ZAIpHg8OHD+O2339CnTx/8+++/0NfXR+PGjcUxUsrShAkT8OzZM3h7e0NeXh5+fn5wd3cXW2sAn2ck0tPTw+zZs/H3339DW1sbtWvXxq+//lro4zx69AgHDx4EAFhZWeVa58GDBzAxMcHvv/+O4cOHo3HjxpCTk0OrVq2wdOlSsV7nzp0RERGBJk2a4O3btwgLC4Ovry/Wr1+Pfv36wdHREdbW1pg3bx5atmwpdYz+/ftLzXKUkzDJOXbTpk2xdetWzJs3D/PmzYOqqiqcnZ1x9OhRsasXERERERHRj0Qi5DVCJBGViezsbNjY2MDLyyvPrjuUv5SUFGhpaSE5OVlqvJkyt1VS1hEQEREREf1PSUkDtAag1H8bsOUKURl7+PAhjh8/DldXV6Snp2PZsmV48OABevbsWdahERERERERUSFwKmaiMiYnJ4fw8HDUrVsXLi4uuHnzJk6ePAkbG5uyDo2IiIiIiIgKgS1XiMqYkZERoqKiyjoMIiIiIiIi+kZsuUJEREREREREVAxMrhARERERERERFQOTK0RERERERERExcDkChERERERERFRMXBAWyKi76WnUNYREBERERH9b0lJAQZolfph2HKFiIiIiIiIiKgYmFwhIiIiIiIiIioGJleIiIiIiIiIiIqByRUiIiIiIiIiomJgcoWIiIiIiIiIqBiYXCEiIiIiIiIiKgZOxUxERD+PrZKyjoCIiIiIfiZp3+cwbLlCRERERERERFQMTK4QERERERERERUDkytERERERERERMXA5AoRERERERERUTEwuUJEREREREREVAxMrhARERERERERFQOTK0RERERERERExcDkChERERERERFRMfynkytubm4YOXJkWYdRoJ8lzoL8V87jRyKRSLBv3z4AQGJiIiQSCWJiYso0JiIiIiIiIpJW5skVX19feHp6lnUYZSoiIgLTp08v6zCK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oiLgbEFERERERERERD8BJleoUB49eiQ1jfDXS3Gma/5Z5Hf+586dK+vwiIiIiIiIqIz8EAPa/peFh4eXdQglwtDQUGbQ4a/X/9fld/55zc5DRERERERE/31MrlChKCgoFHlK5P+a//XzJyIiIiIiotyxWxARERERERERUTEwuUJEREREREREVAxMrhARERERERERFQOTK0RERERERERExcABbYmI6OfRUyjrCIiIiIjoZ5KSAgzQKvXDsOUKEREREREREVExMLlCRERERERERFQMTK4QERERERERERUDkytERERERERERMXA5AoRERERERERUTEwuUJEREREREREVAycipmIiIiIiIiKZ6ukrCMgyl3a9zkMW64QERERERERERUDkytERERERERERMXA5AoRERERERERUTEwuUJEREREREREVAxMrhARERERERERFQOTK0RERERERERExcDkChERERERERFRMTC5QkRERERERERUDEyu0A/N19cXnp6e4ms3NzeMHDlSfG1iYoLFixd/97iKQyKRYN++fWUdBhEREREREZUQJlcIvr6+kEgkMsu9e/fKOjQZERERmD59+nc95tcJneJKSkpC69atS2x/hRUYGJjrfc5ZgoKCCr2vb00Q5RZDtWrVpOoMHDgQ5ubmUFFRgZ6eHjp06IA7d+4U+VhERERERETfC5MrBABo1aoVkpKSpBZTU9OyDkuGrq4uNDQ0yjqMb5KRkQEA0NfXh5KS0nc//tixY2XucVJSEnx9faGtrY2ePXt+lziqV68udfzz589LrXd0dERYWBji4uJw7NgxCIKAli1bIisr67vER0REREREVFRMrhAAQElJCfr6+lJLSEgI7OzsoKamBiMjIwwZMgSpqalS250/fx6NGjWCiooKjIyM4O/vj/fv34vr09PTMWHCBBgZGUFJSQkWFhZYt24dACArKwv9+vWDqakpVFRUYG1tjZCQkHzjzK0Vybt379CjRw+oqamhcuXKWL58udT6hQsXFngeUVFRcHNzg6qqKnR0dODu7o43b97A19cXZ8+eRUhIiNjSIjExEQBw69YttG7dGurq6qhUqRJ69+6Nly9fSsU6bNgwjBw5EhUqVIC7uzsA6VYfkZGRkEgkePv2rbhdTEyM1HHCw8Ohra2NgwcPwtraGqqqqujSpQvS0tKwYcMGmJiYQEdH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r8gD2h4/fhzHjh2TGdDU0tISDx8+LLHASJqvry98fX1LbH/f2BuMiIiIiIiIiL5S5JYr79+/l2qxkuP169dQUlIqkaCIiIiIiIiIiH4WRU6uNGrUCBs3bhRfSyQSZGdnY968eWjSpEmJBkdERERERERE9KMrcregefPmoVmzZrh69SoyMjIwfvx4/PXXX3j9+jWioqJKI0YiIiIiIiIioh9WkVuu1KhRA3fv3kXDhg3RoUMHvH//Hp06dcKNGzdgbm5eGjESEREREREREf2wJAJHNiWi/5iUlBRoaWmV+lz2RERERET0Y/tevw2K3C0IAD5+/Ig///wTL168QHZ2ttS69u3bl0hgREREREREREQ/gyInV44ePQpvb2+8fPlSZp1EIkFWVlaJBEZERERERERE9DMo8pgrw4cPR9euXZGUlITs7GyphYkVIiIiIiIiIvpfU+TkyvPnzzF69GhUqlSpNOIhIiIiIiIiIvqpFDm50qVLF0RGRpZCKEREREREREREP58izxaUlpaGrl27Qk9PD3Z2dihXrpzUen9//xINkIioqDhbEBERERERAT/wbEHbtm3D8ePHoaysjMjISEgkEnGdRCJhcoWIiIiIiIjoZ7FVUnCdn1na9zlMkZMrv/32G4KCgjBx4kTIyRW5VxERERERERER0X9KkbMjGRkZ6NatGxMrRERERERERET4huSKj48PduzYURqxEBERERERERH9dIrcLSgrKwvz5s3DsWPHYG9vLzOg7cKFC0ssOCIiIiIiIiKiH12Rkys3b96Eg4MDAODWrVtS674c3JaIiIiIiIiI6H9BkZMrZ86cKY04iIiIiIiIiIh+ShyVloiIiIiIiIioGIrccgUArl69ip07d+LRo0fIyMiQWhcREVEigRERERERERER/QyK3HJl+/btaNCgAeLi4rB3715kZmbir7/+wunTp6GlpVUaMRIVi5ubG0aOHFmqx/D19YWnp2eexzQxMcHixYtLNQYiIiIiIiIqG0VOrsyaNQuLFi3CgQMHoKioiJCQENy5cwdeXl6oWrVqacRIP5Gvkwwl6XskSb5VSEgIwsPDy+z4bm5ukEgkeS5nz54t1H4iIyMhkUjw9u3bIsewevVquLm5QVNTM899tG/fHlWrVoWysjIMDAzQu3dvPH36VKrOn3/+iUaNGkFZWRlGRkaYN29ekWMh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EUwRNQlMQUXB7esuuSQoQm5x0sjEcilS3LDURFwBDTO3DNM0xSVBMkFRRERFiUrU3CBkeVjm94eH+TWyCD4sau/XOXNk7tx75zPz3ON5ns+5c6d169YAnq6v8vDhQwDA22+/jV9++aV+oyMiIiIiIiIiesnVeeZK69atcevWLVhaWqJ9+/bYtWsXunfvjgMHDsDAwKABQiQiIiIiIiKiBjFOaOoIGlZeHuCv3+CnqfPMlUmTJuHixYsAgLlz52LdunXQ0NDArFmz8NFHH9V7gERERERERERELzOZIAgKpal+//13JCcnw9bWFp06daqvuIiIXlheXh709fWRm5vL18MTEREREf2HNdZvgzo/FvRvRUVFsLKy4iuAiYiIiIiIiOg/q86PBZWVlSEkJATm5ubQ0dHBzZs3AQDz58/Hli1b6j1AIiIiIiIiIqKXWZ2TK4sXL0ZUVBSWL18ONTU1sfyNN97A5s2b6zU4IiIiIiIiIqKXXZ2TK9u2bcPGjRsxfvx4KCsri+WOjo64evVqvQZHRERERERERPSyq3Ny5a+//oKtrW2l8vLycpSUlNRLUEREREREREREr4o6L2jr4OCA06dPV1rEds+ePXBycqq3wIiIiIiIiIjoJbVD1tQR1E5B45ymzsmVBQsWwMfHB3/99RfKy8uxb98+ZGRkYNu2bfjxxx8bIkYiIiIiIiIiopdWnR8LGjp0KA4cOIBjx45BW1sbCxYsQHp6Og4cOIB+/fo1RIxERERERERERC+tWs9cuXnzJmxsbCCTydCzZ08cPXq0IeMiIiIiIiIiInol1HrmStu2bfH333+L+97e3rh7926DBEVERERERERE9KqodXJFEATJ/qFDh/DkyZN6D4iIiIiIiIiI6FVS5zVXiIiIiIiIiIjo/9U6uSKTySCTySqVERERERERERH9l9V6QVtBEODr6wt1dXUAQFFREaZOnQptbW1JvX379tVvhEREREREREREL7Faz1zx8fFBixYtoK+vD319fUyYMAFmZmbifsVGr66TJ09CJpPh8ePHAICoqCgYGBg0aUwN5dlrW7RoETp37txk8RAREREREdGrq9bJlcjIyFpt1HB8fX0hk8kwderUSsdmzJgBmUwGX1/fejuft7c3rl27Ju6/TgmIZ6+tMTRksiorK0t8dK+qzcbGptZ9+fr6YtiwYXWOoaio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li1bim+HCg4Ofu4YioiIgJOTk7iGSq9eveDk5ITY2FgAT2eg3LhxA3FxcWjVqpUkvgr6+vr4+eefcevWLXTt2hUffvghFixYgICAgOeMLCIiIiIioqYjE55dSIGI6BWXl5cHfX195ObmVrv4MhERERER1YMdsqaOoEZ5BYC+Pxr8twFnrhARERERERERKYDJFSIiIiIiIiIiBTC5QkRERERERESkACZXiIiIiIiIiIgUwOQKEREREREREZECmFwhIiIiIiIiIlIAkytERERERERERApQaeoAiIiIiIiIiOgVNU5o6ghqlpcH+Os3+Gk4c4WIiIiIiIiISAFMrhARERERERERKYDJFSIiIiIiIiIiBTC5QkRERERERESkACZXiIiIiIiIiIgUwOQKEREREREREZEC+CpmIiIiIiIiIqo/O2RNHcH/K2ic03DmChERERERERGRAphcISIiIiIiIiJSAJMrREREREREREQKYHKFiIiIiIiIiEgBTK4QERERERERESmAyRUiIiIiIiIiIgUwuUJEREREREREpAAmV4iIiIiIiIiIFMDkCr2wRYsWoXPnzk0dBhEREREREVGTYnLlNeDr6wuZTAaZTAZVVVXY2Nhgzpw5KCoqatDzBgUFIS4urkHPQbXj7u4ujoGqtlOnTtWqn5MnT0Imk+Hx48d1jmHjxo1wd3eHnp5elX1U9F3Vdu7cObHepUuX0LNnT2hoaMDCwgLLly+vcyxERERERESNSaWpA6D64eXlhcjISJSUlCA5ORk+Pj6QyWRYtmxZg51TR0cHOjo6DdY/1d6+ffsgl8slZXK5HIMGDYKGhgacnZ0bPIaCggJ4eXnBy8sLwcHBlY67uroiJydHUjZ//nzExcWhW7duAIC8vDz0798fHh4eiIiIQGpqKiZPngwDAwMEBAQ0+DUQERERERG9CM5ceU2oq6vDxMQEFhYWGDZsGDw8PHD06FEAgLW1Nb766itJ/c6dO2PRokXivkwmw4YNGzB48GBoaWnB3t4eiYmJuHHjBtzd3aGtrQ1XV1dkZmaKbZ59LMjX1xfDhg3DypUrYWpqCiMjI8yYMQMlJSVinUePHmHixIkwNDSElpYWBgwYgOvXr0tiS0hIgLu7O7S0tGBoaAhPT088evQIAFBcXIzAwEC0aNECGhoaePvttyWzHgAgLS0NgwcPhp6eHnR1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Zz0AT1/9u2nTJvTo0QOdOnXCsWPHcODAARgZGQEAwsLCYGFhgZ49e2LcuHEICgoSH0MCABUVFaxZswYbNmyAmZmZmFDw9/eHnZ0dunXrBmNjYyQkJEBLSwu//PILLC0tMWLECNjb28PPzw9FRUU1zkh50XYVjI2NERUVhd27d8PBwQFLly7FypUrn9suPDwcubm5ePPNN2FqalppO3PmDICni+t27doVgwcPhouLCwRBwKFDh8REiaurK6ZOnQpvb28YGxtj+fLltbq36urq2LlzJ9zc3NChQwcsXrwYs2bNwsaNG8U6+vr6+Pnnn3Hr1i107doVH374IRYsWICAgACxzvr16yGXyzFq1ChJ/LW5B0RERERERE1BJjy7iAIR0SsuLy8P+vr6yM3NfaFHs4iIiIiIqIHskD2/Tj3KKwD0/dHgvw04c4WIiIiIiIiISAFMrhARERERERERKYDJFSIiIiIiIiIiBTC5QkRERERERESkACZXiIiIiIiIiIgUwOQKEREREREREZECmFwhIiIiIiIiIlKASlMHQERERERERET/EeOExj1fXh7gr9/gp+HMFSIiIiIiIiIiBTC5QkRERERERESkACZXiIiIiIiIiIgUwOQKEREREREREZECmFwhIiIiIiIiIlIAkytERERERERERApgcoWIiIiIiIiISAFMrhARERERERERKYDJFSIiIiIiIiIiBTC5QkRERERERESkACZXiIiIiIiIiIgUwOQKEREREREREZECmFwhIiIiIiIiIlIAkytERERERERERApgcoWIiIiIiIiISAFMrhARERERERERKUClqQMgIqpvgiAAAPLy8po4EiIiIiIiakoVvwkqfiM0FCZXiOi1888//wAALCwsmjgSIiIiIiJ6GTx48AD6+voN1r9MaOj0DRFRIysvL8ft27ehq6sLmUzW4OfLy8uDhYUF/vjjD+jp6TX4+ej1xzFFDYHjiuobxxTVN44pagi5ubmwtLTEo0ePYGBg0GDn4cwVInrtKCkpoVWrVo1+Xj09PX4RoHrFMUUNgeOK6hvHFNU3jilqCEpKDbvkLBe0JSIiIiIiIiJSAJMrREREREREREQKYHKFiEhB6urqWLhwIdTV1Zs6FHpNcExRQ+C4ovrGMUX1jWOKGkJjjSsuaEtEREREREREpADOXCEiIiIiIiIiUgCTK0RE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BQC4evUqHjx4gKVLl8LCwgIAkJSUVGN/xsbGuHPnDgRBEBM7KSkp4vGWLVvCzMwMN2/exPjx46vtR09PD97e3vD29saoUaPg5eWFhw8folmzZgCAy5cvV1r0mIiIXhyTK0RERESvOGVlZaSnp4t/P0tXVxdBQUGYNWsWysvL8fbbbyM3NxcJCQnQ09ODj48Ppk6dirCwMHz00UeYMmUKkpOTERUVVeN527Zti3379mHIkCGQyWSYP39+pcdsasPT0xPx8fH44IMPxDJ3d3eMHTsW3bp1g5GREa5cuYJ58+ahd+/e0NPTq3Xff//9Nw4cOIDY2Fi88cYbkmMTJ07E8OHDJUmHFzFp0iR8/vnnmDdvHsaOHQtNTU0AgKWlJdTU1LB27VpMnToVly9frvRY07Pc3d3x999/Y/ny5Rg1ahQOHz6Mn376SXLNn332GQIDA6Gvrw8vLy8UFxcjKSkJjx49wuzZs7Fq1SqYmprCyckJSkpK2L17N0xMTCRvejp9+vRzYyEiotrjmitERERErwE9Pb0akw4hISGYP38+QkNDYW9vDy8vLxw8eBA2NjYAniYC9u7di/3798PR0RERERFYsmRJjedctWoVDA0N4erqiiFDhsDT0xNdunSpc+x+fn44dOgQcnNzxTJPT09ER0ejf//+sLe3x/vvvw9PT0/s2rWrTn1v27YN2tra6Nu3b6Vjffv2haamJr755ps6x/xvlpaW8PDwwKNHjyQL2BobGyMqKgq7d++Gg4MDli5dipUrV9bYl729PcLDw7Fu3To4Ojrit99+Q1BQkKTOlClTsHnzZkRGRqJjx45wc3NDVFSU+Fnq6upi+fLl6NatG958801kZWXh0KFDUFJ6+tU/MTERubm54gwbIiJSnEx49qFOIiIiIqJGNnr0aHTp0gXBwcFNHcprz9vbG46Ojpg3b15Th0JE9NrgzBUiIiIianIrVqx44VcTU+3J5XJ07NgRs2bNaupQiIheK5y5QkRERERERESkAM5cISIiIiIiIiJSAJMrREREREREREQKYHKFiIiIiIiIiEgBTK4QERERERERESmAyRUiIiIiIiIiIgUwuUJEREREREREpAAmV4iIiIiIiIiIFMDkChERERERERGRAphcISIiIiIiIiJSwP8BokGDHbncxicAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - " tree_ord_model.get_importance()\n", - " \n", - " tree_ord_model.plot_importance_global(X_removed[:, best_features], y, class_name = \"Crohn's Disease\")\n", - " plt.show()\n", - " plt.close()\n", - " \n", - " tree_ord_model.plot_importance_global(X_removed[:, best_features], y, class_name = \"Healthy Control\")\n", - " plt.show()\n", - " plt.close()" - ] - }, - { - "cell_type": "markdown", - "id": "acf06505", - "metadata": {}, - "source": [ - "#### Finally, we can create a cluster map of the CLR-Transformed values. Red samples are Crohn's Disease patients while blue samples are healthy controls." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "ab396b45", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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8X7bbZRiG1Xctbc6xCSbxkuSHNn+Hg3dfdQ0//1028dAknT0kGn8thePmObXb1ximi9JBQfqmuY7sv09OhGCPzmLO9puWXblxprzN2HlypVasmSJUlJSlJKSooULF+qOO+5Qnz59tHTpUiUlJQWdTeGNgIViGfi4ceNM8wEAAADguwoLCxUX978S2eVyadasWRo7dqwyMjL0yiuvBJ1N4Q0AAAAAiHodO3bUmjVrlJ6eXub2GTNmSJKGDh0adDaFN2qkhISEkM1608QNAAAAwNVXX61XX31VN9988ynHZsyYoZKSEs2ePTuobApv1EherzfcQwAAAAAQRTwejzweT4XHZ86cqZkzZwaVTVdzAAAAAAAMMeMNRIkSh47aZ3LJa/vCPQQYu+4Yj/GZ9Fluu2sFKsc5YfuavX1RrGl+JDzX5ialmObXubSNab4kOXnbTfPPeegHpvn7pq00zZdq/+9qXJL9+7tdG2y3KShxouPvDoV3lKmOrcDY6gsAAABAJHIcR19++aVat26tuLg4nThxQvPnz5ff79fgwYOVkhLch3IU3lGmOrYCY6svAAAAALWB3++X3192r3C32y23233KfXNzczVw4EDt2LFD7dq10+LFi3Xttddq48aNchxHiYmJWrlypTp06BDwOCi8EXbVMQtfFXQ1BwAAACKT1+tVTk5OmduysrKUnZ19yn0nTJigrl27auHChZozZ46uuuoqnXvuuVq1apVKSkp07bXX6sEHH9RLL70U8DgovBF21TELDwAAAADf5/F4lJmZWea28ma7JWnlypVavHixunTpokmTJmn69Ol65plnFB8fL0m67777dP311wc1jogovC33fOZ6ZgAAAAConSpaVl6eo0ePqnHjxpKkpKQkJSUlKTU1tfR469attWfPnqDGERGFt+Wez1zPjEhxqOhouIcAY5cnn2t+jmVHvjA/ByKf9e/qpSWJpvm/P/aRab4kueLqmuY3aXHMNP+9Sr7JrYr4hi7T/Jc/bGian/TsJtN8SUrJsH0cYg4cNs3fvbO+ab4kTVVT0/xXEk6Y5h/Pt30MJCkxyfb/YdLxdqb5gWjRooXy8vLUps03uw5MnTpVzZo1Kz2+d+9eNWrUKKhs9vEGAAAAAES9/v37a+PGjaXf33777UpO/t92aosXL9ZFF10UVHZEzHgjtKp7aT/L+QEAAACE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eXl5Gj16dLiHUSW1aafe7z+vPvzwQ33wwQfy+/1hGlFwDh8+rNzcXOXm5taq5/GJEyc0b948jRs3Ttdff72uv/56jRs3Tn/5y19q9XsLK36/v9b9bn4XhTeAMo4dO6bnnntO999/v2bMmKH9+/eHe0hntG/fPrPsnJwcPfvss+revbtef/113X777frDH/6gZ555Rn/84x/17rvvatq0aWbnry4HDhzQNddcozZt2uj2229XcXGxfv7znys1NVUtW7bUpZdeql27dlX5PLt379bf//53Pf3003r66af197//vdoL+2PHjun999/Xa6+9pr/85S9au3Zttb3RffPNN/XAAw9oxYoVkqT33ntPgwcP1o9+9CM988wzVc7Pz8/Xe++9V/rGcM+ePZo6daomT56s//73v1XO/9ZXX32lo0ePnnJ7UVGR3n///aAyJ02apN/+9rc6fvy4xo0bpylTpmjcuHG68cYbdcstt+jZZ5/VQw89FPSY16xZo/T0dL311lsqKirSpk2b1K1bNyUlJenee+/VZZddpiNHjgSdfya/+MUvtHPnzmrJ+vjjjzVy5Ei1a9dOdevWVVJSkrp06aKJEyeqoKCgWs5h8RhXxHEcLV26VH/84x/15ptvqqioKOisgoKC035V52Ns+TPy+/2lv5dTpkyR9M1zpF69ekpOTtYNN9xQbY/1d+Xk5FTL37zt27ere/fucrvdGjRokAoKCnTllVfqhz/8oS699FJ16tRJX3zxRZXP4ziOtm3bVvqh3IkTJ/Taa6/pxRdfrJb/j2effVadOnVS48aN1alTpzL//ac//alK2UOGDNFLL72kwsLCKo+zPJs3b1Z6erpuueUWrV+/XiUlJSopKdH69es1cuRInX/++dq8ebPJudu1a6dNmzZVOSc/P7/M9x999JFuueUW9erVS9dcc42WLVtW5XO88847Gjx4sBo1aqTExEQlJiaqUaNGGjx4sJYsWVLl/JByAES19PR0Z//+/Y7jOE5eXp5z9tlnOw0aNHB69OjhNG7c2GnWrJmzdetW0zF89NFHTkxMTND/PiYmxunbt6/z5z//2fH5fNU4Msdp166ds3DhQsdxHGfTpk1OTEyMM3fu3NLjr732mtO5c+dqOddTTz3l9OvXz7n22mudJUuWlDm2d+9ep23btkFn33rrrU7nzp2dP/zhD05GRoYzbNgw54ILLnCWL1/urFy50unRo4czcuTIoPOPHj3q3HjjjU5sbKwTFxfnNGvWzGnWrJkTFxfnxMbGOjfddJNz7NixoPMdx3GKi4ud8ePHO4mJiU5MTIwTExPjuFwux+VyOWlpac6CBQuqlD979mwnLi7O6datm1O/fn3npZdecpKTk52f//znzi9/+Uunbt26zrRp04LOX7p0qZOUlOS4XC7nrLPOcj766COnVatWTocOHZzzzjvPcbvdzj//+c8q/T/s3LnT6dGjhxMTE+PExsY6N998s3PkyJHS47t37w76uXbOOec4f/3rXx3H+eY5Gxsb67z88sulx9944w2nffv2QY+9V69eTnZ2dun3L730ktOzZ0/HcRznwIEDzoUXXujcddddQed/q1GjRuV+uVwup0GDBqXfB2vRokVO3bp1nZ/+9KfOTTfd5CQmJjpjx451JkyY4LRv394555xznF27dgWdb/kYf2vQoEHOoUOHHMdxnP379zs9e/Z0XC6X07RpUycmJsbp2LGjk5+fH1S2y+Uqff6W9/Xt8aoIxc9o3LhxTosWLZzf/OY3Tnp6unPHHXc4bdq0cV5++WXnlVdecdq3b+/ceeedQecfPnz4lK9Dhw458fHxzurVq0tvC9ZPf/pTJyMjw1m4cKEzYsQIp1evXs7ll1/ufPXVV87OnTudgQMHOsOHDw8633EcZ+PGjU5aWpoTExPjtG/f3tm6davTrVs3JykpyUlMTHRSUlKcL774Iuj8qVOnOomJic59993nLF261Pn888+dzz//3Fm6dKnj8XicpKQk55FHHgk63+VyOXFxcU6DBg2cX/3qV86aNWuCzipP//79nWHDhpX7OB4+fNgZNmyYM2DAgCqdY/r06eV+xcbGOh6Pp/T7YMXExDh79uxxHMdxVqxY4cTHxzsZGRnO+PHjnSuvvNKJi4tz/vWvfwWd//zzzztxcXHOdddd5zz33HPOW2+95bz11lvOc88951x//fVOfHy88+KLLwadH2oU3kCUc7lcpS+aN954o3PppZeWvuE6cuSI079/f+f66683HcNHH33kuFyuoP+9y+VyfvSjHzl16tRxGjVq5IwdO9ZZv359tYwtISHBycvLK/P9hg0bSr/funWrk5ycXOXzTJ8+3UlMTHR+/etfOzfddJNTp04d5/e//33p8aq+UUxNTXVWrFhR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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - " # Get top 30 best features from each cluster\n", - " asv_selected = np.asarray([True if entry in reduced_features[best_features] else False for i, entry in enumerate(reduced_features)])\n", - " \n", - " sorted_sage = pd.Series(best_model_sage.values, index = best_feature_names)[reduced_features[best_features]].sort_values(ascending = False)\n", - "\n", - " sorted_asvs = sorted_sage.index.values[0:29]\n", - " \n", - " patient_cols = [\"r\" if x == \"Crohn's Disease\" else \"b\" for x in y]\n", - "\n", - " sns.clustermap(pd.DataFrame(clr(multiplicative_replacement(closure(X_removed))), \n", - " columns = reduced_features)[sorted_asvs],\n", - " row_colors = patient_cols,\n", - " metric = \"correlation\",\n", - " method = \"complete\")\n", - "\n", - " plt.tight_layout()\n", - " plt.savefig(\"triglav_clustermap.svg\")\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "06e1b92b", - "metadata": {}, - "source": [ - "#### References\n", - "\n", - "Rudar, J., Porter, T.M., Wright, M., Golding G.B., Hajibabaei, M. LANDMark: an ensemble \n", - "approach to the supervised selection of biomarkers in high-throughput sequencing data. \n", - "BMC Bioinformatics 23, 110 (2022). https://doi.org/10.1186/s12859-022-04631-z\n", - "\n", - "Pedregosa F, Varoquaux G, Gramfort A, Michel V, Thirion B, Grisel O, et al. Scikit-learn: \n", - "Machine Learning in Python. Journal of Machine Learning Research. 2011;12:2825–30. \n", - "\n", - "Geurts P, Ernst D, Wehenkel L. Extremely Randomized Trees. Machine Learning. 2006;63(1):3–42.\n", - "\n", - "Rudar, J., Golding, G.B., Kremer, S.C., Hajibabaei, M. (2023). Decision Tree Ensembles Utilizing \n", - "Multivariate Splits Are Effective at Investigating Beta Diversity in Medically Relevant 16S Amplicon \n", - "Sequencing Data. Microbiology Spectrum e02065-22.\n", - "\n", - "Porter, T. M., & Hajibabaei, M. (2022). MetaWorks: A flexible, scalable bioinformatic pipeline for high-throughput multi-marker \n", - "biodiversity assessments. PLOS ONE, 17(9), e0274260. doi: 10.1371/journal.pone.0274260\n", - "\n", - "Wang, Q., Garrity, G. M., Tiedje, J. M., & Cole, J. R. (2007). Naive Bayesian Classifier for Rapid Assignment of rRNA Sequences into the New Bacterial Taxonomy. Applied and Environmental Microbiology, 73(16), 5261–5267. doi:10.1128/AEM.00062-07\n", - "\n", - "Forbes JD, Chen C-Y, Knox NC, Marrie R-A, El-Gabalawy H, de Kievit T, et al. A comparative study of the gut microbiota in immune-mediated inflammatory diseases-does a common dysbiosis exist? Microbiome. 2018 Dec 13;6(1):221–221.\n", - "\n", - "The scikit-bio development team (2020). scikit-bio: A Bioinformatics Library for Data Scientists, Students, and Developers. http://scikit-bio.org. version 0.5.8." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "65d73360", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/Diseased-Gut-Analysis/stability.py b/notebooks/Diseased-Gut-Analysis/stability.py index ac64c5a..e59ea24 100644 --- a/notebooks/Diseased-Gut-Analysis/stability.py +++ b/notebooks/Diseased-Gut-Analysis/stability.py @@ -1,4 +1,4 @@ -''' +""" This package implements the statistical tools for quantifying the stability of feature selection as given in [1]. It includes 5 functions that provide: @@ -17,7 +17,7 @@ NB: This package requires the installation of the packages: numpy, scipy and math -''' +""" import numpy as np from scipy.stats import norm @@ -25,155 +25,182 @@ def getStability(Z): - ''' + """ Let us assume we have M>1 feature sets and d>0 features in total. This function computes the stability estimate as given in Definition 4 in [1]. - + INPUT: A BINARY matrix Z (given as a list or as a numpy.ndarray of size M*d). - Each row of the binary matrix represents a feature set, where a 1 at the f^th position + Each row of the binary matrix represents a feature set, where a 1 at the f^th position means the f^th feature has been selected and a 0 means it has not been selected. - + OUTPUT: The stability of the feature selection procedure - ''' - Z=checkInputType(Z) - M,d=Z.shape - hatPF=np.mean(Z,axis=0) - kbar=np.sum(hatPF) - denom=(kbar/d)*(1-kbar/d) - return 1-(M/(M-1))*np.mean(np.multiply(hatPF,1-hatPF))/denom + """ + Z = checkInputType(Z) + M, d = Z.shape + hatPF = np.mean(Z, axis=0) + kbar = np.sum(hatPF) + denom = (kbar / d) * (1 - kbar / d) + return 1 - (M / (M - 1)) * np.mean(np.multiply(hatPF, 1 - hatPF)) / denom + def getVarianceofStability(Z): - ''' + """ Let us assume we have M>1 feature sets and d>0 features in total. This function computes the stability estimate and its variance as given in [1]. - + INPUT: A BINARY matrix Z (given as a list or as a numpy.ndarray of size M*d, raises a ValueError exception otherwise). - Each row of the binary matrix represents a feature set, where a 1 at the f^th position + Each row of the binary matrix represents a feature set, where a 1 at the f^th position means the f^th feature has been selected and a 0 means it has not been selected. - + OUTPUT: A dictionnary where the key 'stability' provides the corresponding stability value # and where the key 'variance' provides the variance of the stability estimate - ''' - Z=checkInputType(Z) # check the input Z is of the right type - M,d=Z.shape # M is the number of feature sets and d the total number of features - hatPF=np.mean(Z,axis=0) # hatPF is a numpy.array with the frequency of selection of each feature - kbar=np.sum(hatPF) # kbar is the average number of selected features over the M feature sets - k=np.sum(Z,axis=1) # k is a numpy.array with the number of features selected on each one of the M feature sets - denom=(kbar/d)*(1-kbar/d) - stab=1-(M/(M-1))*np.mean(np.multiply(hatPF,1-hatPF))/denom # the stability estimate - phi=np.zeros(M) + """ + Z = checkInputType(Z) # check the input Z is of the right type + M, d = Z.shape # M is the number of feature sets and d the total number of features + hatPF = np.mean( + Z, axis=0 + ) # hatPF is a numpy.array with the frequency of selection of each feature + kbar = np.sum( + hatPF + ) # kbar is the average number of selected features over the M feature sets + k = np.sum( + Z, axis=1 + ) # k is a numpy.array with the number of features selected on each one of the M feature sets + denom = (kbar / d) * (1 - kbar / d) + stab = ( + 1 - (M / (M - 1)) * np.mean(np.multiply(hatPF, 1 - hatPF)) / denom + ) # the stability estimate + phi = np.zeros(M) for i in range(M): - phi[i]=(1/denom)*(np.mean(np.multiply(Z[i,],hatPF))-(k[i]*kbar)/d**2+(stab/2)*((2*k[i]*kbar)/d**2-k[i]/d-kbar/d+1)) - phiAv=np.mean(phi) - variance=(4/M**2)*np.sum(np.power(phi-phiAv,2)) # the variance of the stability estimate as given in [1] - return {'stability':stab,'variance':variance} + phi[i] = (1 / denom) * ( + np.mean(np.multiply(Z[i,], hatPF)) + - (k[i] * kbar) / d**2 + + (stab / 2) * ((2 * k[i] * kbar) / d**2 - k[i] / d - kbar / d + 1) + ) + phiAv = np.mean(phi) + variance = (4 / M**2) * np.sum( + np.power(phi - phiAv, 2) + ) # the variance of the stability estimate as given in [1] + return {"stability": stab, "variance": variance} -def confidenceIntervals(Z,alpha=0.05,res={}): - ''' + +def confidenceIntervals(Z, alpha=0.05, res={}): + """ Let us assume we have M>1 feature sets and d>0 features in total. - This function provides the stability estimate and the lower and upper bounds of the (1-alpha)- approximate confidence + This function provides the stability estimate and the lower and upper bounds of the (1-alpha)- approximate confidence interval as given by Corollary 9 in [1] - - INPUTS: - A BINARY matrix Z (given as a list or as a numpy.ndarray of size M*d, raises a ValueError exception otherwise). - Each row of the binary matrix represents a feature set, where a 1 at the f^th position + + INPUTS: - A BINARY matrix Z (given as a list or as a numpy.ndarray of size M*d, raises a ValueError exception otherwise). + Each row of the binary matrix represents a feature set, where a 1 at the f^th position means the f^th feature has been selected and a 0 means it has not been selected. - - alpha is an optional argument corresponding to the level of significance for the confidence interval + - alpha is an optional argument corresponding to the level of significance for the confidence interval (default is 0.05), e.g. alpha=0.05 give the lower and upper bound of for a (1-alpha)=95% confidence interval. - - In case you already computed the stability estimate of Z using the function getVarianceofStability(Z), + - In case you already computed the stability estimate of Z using the function getVarianceofStability(Z), you can provide theresult (a dictionnary) as an optional argument to this function for faster computation. - + OUTPUT: - A dictionnary where the key 'stability' provides the corresponding stability value, where: - the key 'variance' provides the variance of the stability estimate; - - the keys 'lower' and 'upper' respectively give the lower and upper bounds + - the keys 'lower' and 'upper' respectively give the lower and upper bounds of the (1-alpha)-confidence interval. - ''' - Z=checkInputType(Z) # check the input Z is of the right type + """ + Z = checkInputType(Z) # check the input Z is of the right type ## we check if values of alpha between ) and 1 - if alpha>=1 or alpha<=0: - raise ValueError('The level of significance alpha should be a value >0 and <1') - if len(res)==0: - res=getVarianceofStability(Z) # get a dictionnary with the stability estimate and its variance - lower=res['stability']-norm.ppf(1-alpha/2)*math.sqrt(res['variance']) # lower bound of the confidence interval at a level alpha - upper=res['stability']+norm.ppf(1-alpha/2)*math.sqrt(res['variance']) # upper bound of the confidence interval - return {'stability':res['stability'],'lower':lower,'upper':upper} + if alpha >= 1 or alpha <= 0: + raise ValueError("The level of significance alpha should be a value >0 and <1") + if len(res) == 0: + res = getVarianceofStability( + Z + ) # get a dictionnary with the stability estimate and its variance + lower = res["stability"] - norm.ppf(1 - alpha / 2) * math.sqrt( + res["variance"] + ) # lower bound of the confidence interval at a level alpha + upper = res["stability"] + norm.ppf(1 - alpha / 2) * math.sqrt( + res["variance"] + ) # upper bound of the confidence interval + return {"stability": res["stability"], "lower": lower, "upper": upper} + ## this tests whether the true stability is equal to a given value stab0 -def hypothesisTestV(Z,stab0,alpha=0.05): - ''' +def hypothesisTestV(Z, stab0, alpha=0.05): + """ Let us assume we have M>1 feature sets and d>0 features in total. - This function implements the null hypothesis test in [1] that test whether the population stability is greater + This function implements the null hypothesis test in [1] that test whether the population stability is greater than a given value stab0. - + INPUTS:- A BINARY matrix Z (given as a list or as a numpy.ndarray of size M*d, raises a ValueError exception otherwise). Each row of the binary matrix represents a feature set, where a 1 at the f^th position - means the f^th feature has been selected and a 0 means it has not been selected. + means the f^th feature has been selected and a 0 means it has not been selected. - stab0 is the value we want to compare the stability of the feature selection to. - - alpha is an optional argument corresponding to the level of significance of the null hypothesis test + - alpha is an optional argument corresponding to the level of significance of the null hypothesis test (default is 0.05). - + OUTPUT: A dictionnary with: - a boolean value for key 'reject' equal to True if the null hypothesis is rejected and to False otherwise - - a float for the key 'V' giving the value of the test statistic + - a float for the key 'V' giving the value of the test statistic - a float giving for the key 'p-value' giving the p-value of the hypothesis test - ''' - Z=checkInputType(Z) # check the input Z is of the right type - res=getVarianceofStability(Z) - V=(res['stability']-stab0)/math.sqrt(res['variance']) - zCrit=norm.ppf(1-alpha) - if V>=zCrit: reject=True - else: reject=False - pValue=1-norm.cdf(V) - return {'reject':reject,'V':V,'p-value':pValue} + """ + Z = checkInputType(Z) # check the input Z is of the right type + res = getVarianceofStability(Z) + V = (res["stability"] - stab0) / math.sqrt(res["variance"]) + zCrit = norm.ppf(1 - alpha) + if V >= zCrit: + reject = True + else: + reject = False + pValue = 1 - norm.cdf(V) + return {"reject": reject, "V": V, "p-value": pValue} + # this tests the equality of the stability of two algorithms -def hypothesisTestT(Z1,Z2,alpha=0.05): - ''' +def hypothesisTestT(Z1, Z2, alpha=0.05): + """ Let us assume we have M>1 feature sets and d>0 features in total. - This function implements the null hypothesis test of Theorem 10 in [1] that test whether + This function implements the null hypothesis test of Theorem 10 in [1] that test whether two population stabilities are identical. - + INPUTS:- Two BINARY matrices Z1 and Z2 (given as lists or as numpy.ndarray objects of size M*d). - Each row of the binary matrix represents a feature set, where a 1 at the f^th position - means the f^th feature has been selected and a 0 means it has not been selected. - - alpha is an optional argument corresponding to the level of significance of the null + Each row of the binary matrix represents a feature set, where a 1 at the f^th position + means the f^th feature has been selected and a 0 means it has not been selected. + - alpha is an optional argument corresponding to the level of significance of the null hypothesis test (default is 0.05) - + OUTPUT: A dictionnary with: - a boolean value for key 'reject' equal to True if the null hypothesis is rejected and to False otherwise - - a float for the key 'T' giving the value of the test statistic + - a float for the key 'T' giving the value of the test statistic - a float giving for the key 'p-value' giving the p-value of the hypothesis test - ''' - Z1=checkInputType(Z1) # check the input Z1 is of the right type - Z2=checkInputType(Z2) # check the input Z2 is of the right type - res1=getVarianceofStability(Z1) - res2=getVarianceofStability(Z2) - stab1=res1['stability'] - stab2=res2['stability'] - var1=res1['variance'] - var2=res2['variance'] - T=(stab2-stab1)/math.sqrt(var1+var2) - zCrit=norm.ppf(1-alpha/2) + """ + Z1 = checkInputType(Z1) # check the input Z1 is of the right type + Z2 = checkInputType(Z2) # check the input Z2 is of the right type + res1 = getVarianceofStability(Z1) + res2 = getVarianceofStability(Z2) + stab1 = res1["stability"] + stab2 = res2["stability"] + var1 = res1["variance"] + var2 = res2["variance"] + T = (stab2 - stab1) / math.sqrt(var1 + var2) + zCrit = norm.ppf(1 - alpha / 2) ## the cumulative inverse of the gaussian at 1-alpha/2 - if(abs(T)>=zCrit): - reject=True - #print('Reject H0: the two algorithms have different population stabilities') + if abs(T) >= zCrit: + reject = True + # print('Reject H0: the two algorithms have different population stabilities') else: - reject=False - #print('Do not reject H0') - pValue=2*(1-norm.cdf(abs(T))) - return {'reject':reject,'T':T,'p-value':pValue} + reject = False + # print('Do not reject H0') + pValue = 2 * (1 - norm.cdf(abs(T))) + return {"reject": reject, "T": T, "p-value": pValue} + def checkInputType(Z): - ''' This function checks that Z is of the rigt type and dimension. - It raises an exception if not. - OUTPUT: The input Z as a numpy.ndarray - ''' + """This function checks that Z is of the rigt type and dimension. + It raises an exception if not. + OUTPUT: The input Z as a numpy.ndarray + """ ### We check that Z is a list or a numpy.array - if isinstance(Z,list): - Z=np.asarray(Z) - elif not isinstance(Z,np.ndarray): - raise ValueError('The input matrix Z should be of type list or numpy.ndarray') + if isinstance(Z, list): + Z = np.asarray(Z) + elif not isinstance(Z, np.ndarray): + raise ValueError("The input matrix Z should be of type list or numpy.ndarray") ### We check if Z is a matrix (2 dimensions) - if Z.ndim!=2: - raise ValueError('The input matrix Z should be of dimension 2') + if Z.ndim != 2: + raise ValueError("The input matrix Z should be of dimension 2") return Z diff --git a/paper/Figure 1.pdf b/paper/Figure 1.pdf deleted file mode 100644 index 900e916..0000000 Binary files a/paper/Figure 1.pdf and /dev/null differ diff --git a/paper/Figure 2.pdf b/paper/Figure 2.pdf deleted file mode 100644 index 53f37fe..0000000 Binary files a/paper/Figure 2.pdf and /dev/null differ diff --git a/paper/paper.bib b/paper/paper.bib deleted file mode 100644 index f46e4c4..0000000 --- a/paper/paper.bib +++ /dev/null @@ -1,241 +0,0 @@ -@article{shapley1951notes, - title={Notes on the n-person game—ii: The value of an n-person game.(1951)}, - author={Shapley, Lloyd S}, - journal={Lloyd S Shapley}, - year={1951} -} - -@software{BortuaShap, - author = {Eoghan Keany}, - title = {{BorutaShap : A wrapper feature selection method - which combines the Boruta feature selection - algorithm with Shapley values.}}, - month = nov, - year = 2020, - publisher = {Zenodo}, - version = {1.1}, - doi = {10.5281/zenodo.4247618}, - url = {https://doi.org/10.5281/zenodo.4247618} -} - -@article{JSSv036i11, - title={Feature Selection with the Boruta Package}, - volume={36}, - url={https://www.jstatsoft.org/index.php/jss/article/view/v036i11}, - doi={10.18637/jss.v036.i11}, - abstract={This article describes a &lt;b&gt;R&lt;/b&gt; package &lt;b&gt;Boruta&lt;/b&gt;, implementing a novel feature selection algorithm for finding emph{all relevant variables}. The algorithm is designed as a wrapper around a Random Forest classification algorithm. It iteratively removes the features which are proved by a statistical test to be less relevant than random probes. The &lt;b&gt;Boruta&lt;/b&gt; package provides a convenient interface to the algorithm. The short description of the algorithm and examples of its application are presented.}, - number={11}, - journal={Journal of Statistical Software}, - author={Kursa, Miron B. and Rudnicki, Witold R.}, - year={2010}, - pages={1–13} -} - -@article{NoiseR, - title={noisyR: enhancing biological signal in sequencing datasets by characterizing random technical noise}, - volume={49}, - number={14}, - doi={10.1093/nar/gkab433}, - journal={Nucleic Acids Research}, - author={Moutsopoulos, Ilias. and Maischak, Lukas and Lauzikaite, Elze and Vasquez Urbina, Sergio A and Williams, Eleanor C and Drost, Hajk-Georg and Mohorianu, Irina I}, - year={2021}, - pages={e83} -} - -@article{ETC, - title={Extremely randomized trees}, - volume={63}, - number={1}, - doi={10.1007/s10994-006-6226-1}, - journal={Machine Learning}, - author={Geurts, Pierre and Ernst, Damien and Wehenkel, Louis}, - year={2006}, - pages={3-42} -} - -@article{MLVir, - title={Machine-learning prediction of hosts of novel coronaviruses requires caution as it may affect wildlife conservation}, - volume={13}, - number={1}, - doi={10.1038/s41467-022-32746-7}, - journal={Nature Communications}, - author={Rasmussen, Sophie Lund and Pertoldi, Cino and Macdonald, David W.}, - year={2022}, - pages={5101} -} - -@article{lowabdmicrobiome, - doi = {10.1371/journal.pcbi.1005361}, - author = {Claussen, Jens Christian AND Skiecevičienė, Jurgita AND Wang, Jun AND Rausch, Philipp AND Karlsen, Tom H. AND Lieb, Wolfgang AND Baines, John F. AND Franke, Andre AND Hütt, Marc-Thorsten}, - journal = {PLOS Computational Biology}, - publisher = {Public Library of Science}, - title = {Boolean analysis reveals systematic interactions among low-abundance species in the human gut microbiome}, - year = {2017}, - month = {06}, - volume = {13}, - url = {https://doi.org/10.1371/journal.pcbi.1005361}, - pages = {1-21}, - abstract = {The analysis of microbiome compositions in the human gut has gained increasing interest due to the broader availability of data and functional databases and substantial progress in data analysis methods, but also due to the high relevance of the microbiome in human health and disease. While most analyses infer interactions among highly abundant species, the large number of low-abundance species has received less attention. Here we present a novel analysis method based on Boolean operations applied to microbial co-occurrence patterns. We calibrate our approach with simulated data based on a dynamical Boolean network model from which we interpret the statistics of attractor states as a theoretical proxy for microbiome composition. We show that for given fractions of synergistic and competitive interactions in the model our Boolean abundance analysis can reliably detect these interactions. Analyzing a novel data set of 822 microbiome compositions of the human gut, we find a large number of highly significant synergistic interactions among these low-abundance species, forming a connected network, and a few isolated competitive interactions.}, - number = {6}, -} - -@article{CD, - title={A comparative study of the gut microbiota in immune-mediated inflammatory diseases—does a common dysbiosis exist?}, - volume={6}, - url={https://doi.org/10.1186/s40168-018-0603-4}, - doi={10.1186/s40168-018-0603-4}, - abstract={Immune-mediated inflammatory disease (IMID) represents a substantial health concern. It is widely recognized that IMID patients are at a higher risk for developing secondary inflammation-related conditions. While an ambiguous etiology is common to all IMIDs, in recent years, considerable knowledge has emerged regarding the plausible role of the gut microbiome in IMIDs. This study used 16S rRNA gene amplicon sequencing to compare the gut microbiota of patients with Crohn’s disease (CD; N = 20), ulcerative colitis (UC; N = 19), multiple sclerosis (MS; N = 19), and rheumatoid arthritis (RA; N = 21) versus healthy controls (HC; N = 23). Biological replicates were collected from participants within a 2-month interval. This study aimed to identify common (or unique) taxonomic biomarkers of IMIDs using both differential abundance testing and a machine learning approach.}, - number={1}, - journal={Microbiome}, - author={Forbes, Jessica D. and Chen, Chih-yu and Knox, Natalie C. and Marrie, Ruth-Ann and El-Gabalawy, Hani and de Kievit, Teresa and Alfa, Michelle and Bernstein, Charles N. and Van Domselaar, Gary}, - year={2018}, - pages={221} -} - -@Inbook{Thanh-Hai2021, -author={Thanh-Hai, Nguyen -and Tran, Toan Bao -and Phan, Nhi Yen Kim -and Dien, Tran Thanh -and Thai-Nghe, Nguyen}, -editor={Phuong, Nguyen Hoang -and Kreinovich, Vladik}, -title={Feature Selection Based on Shapley Additive Explanations on Metagenomic Data for Colorectal Cancer Diagnosis}, -bookTitle={Soft Computing: Biomedical and Related Applications}, -year={2021}, -publisher={Springer International Publishing}, -pages={69--80}, -abstract={Personalized medicine is one of the hottest current approaches to take care of and improve human health. Scientists who participate in projects related to personalized medicine approaches usually consider metagenomic data as a valuable data source for developing and proposing methods for disease treatments. We usually face challenges for processing metagenomic data because of its high dimensionality and complexities. Numerous studies have attempted to find biomarkers which can be medical signs related significantly to the diseases. In this study, we propose an approach based on Shapley Additive Explanations, a model explainability, to select valuable features from metagenomic data to improve the disease prediction tasks. The proposed feature selection method is evaluated on more than 500 samples of colorectal cancer coming from various geographic regions such as France, China, the United States, Austria, and Germany. The set of 10 selected features based on Shapley Additive Explanations can achieve significant results compared to the feature selection method based on the Pearson coefficient and it also obtains comparative performances compared to the original set of features including approximately 2000 features.}, -isbn={978-3-030-76620-7}, -doi={10.1007/978-3-030-76620-7_6}, -url={https://doi.org/10.1007/978-3-030-76620-7_6} -} - -@article{2020SciPy-NMeth, - author = {Virtanen, Pauli and Gommers, Ralf and Oliphant, Travis E. and - Haberland, Matt and Reddy, Tyler and Cournapeau, David and - Burovski, Evgeni and Peterson, Pearu and Weckesser, Warren and - Bright, Jonathan and {van der Walt}, St{\'e}fan J. and - Brett, Matthew and Wilson, Joshua and Millman, K. Jarrod and - Mayorov, Nikolay and Nelson, Andrew R. J. and Jones, Eric and - Kern, Robert and Larson, Eric and Carey, C J and - Polat, {\.I}lhan and Feng, Yu and Moore, Eric W. and - {VanderPlas}, Jake and Laxalde, Denis and Perktold, Josef and - Cimrman, Robert and Henriksen, Ian and Quintero, E. A. and - Harris, Charles R. and Archibald, Anne M. and - Ribeiro, Ant{\^o}nio H. and Pedregosa, Fabian and - {van Mulbregt}, Paul and {SciPy 1.0 Contributors}}, - title = {{{SciPy} 1.0: Fundamental Algorithms for Scientific - Computing in Python}}, - journal = {Nature Methods}, - year = {2020}, - volume = {17}, - pages = {261--272}, - adsurl = {https://rdcu.be/b08Wh}, - doi = {10.1038/s41592-019-0686-2}, -} - -@article{SHAP1, - title={From local explanations to global understanding with explainable AI for trees}, - author={Lundberg, Scott M. and Erion, Gabriel and Chen, Hugh and DeGrave, Alex and Prutkin, Jordan M. and Nair, Bala and Katz, Ronit and Himmelfarb, Jonathan and Bansal, Nisha and Lee, Su-In}, - journal={Nature Machine Intelligence}, - volume={2}, - number={1}, - pages={2522-5839}, - year={2020}, - publisher={Nature Publishing Group}, - doi={10.1038/s42256-019-0138-9} -} - -@inproceedings{SHAP2, -author = {Lundberg, Scott M. and Lee, Su-In}, -title = {A Unified Approach to Interpreting Model Predictions}, -year = {2017}, -isbn = {9781510860964}, -publisher = {Curran Associates Inc.}, -address = {Red Hook, NY, USA}, -abstract = {Understanding why a model makes a certain prediction can be as crucial as the prediction's accuracy in many applications. However, the highest accuracy for large modern datasets is often achieved by complex models that even experts struggle to interpret, such as ensemble or deep learning models, creating a tension between accuracy and interpretability. In response, various methods have recently been proposed to help users interpret the predictions of complex models, but it is often unclear how these methods are related and when one method is preferable over another. To address this problem, we present a unified framework for interpreting predictions, SHAP (SHapley Additive exPlanations). SHAP assigns each feature an importance value for a particular prediction. Its novel components include: (1) the identification of a new class of additive feature importance measures, and (2) theoretical results showing there is a unique solution in this class with a set of desirable properties. The new class unifies six existing methods, notable because several recent methods in the class lack the proposed desirable properties. Based on insights from this unification, we present new methods that show improved computational performance and/or better consistency with human intuition than previous approaches.}, -booktitle = {Proceedings of the 31st International Conference on Neural Information Processing Systems}, -pages = {4768–4777}, -numpages = {10}, -location = {Long Beach, California, USA}, -series = {NIPS'17}, -publisher = {Curran Associates, Inc.}, -url = {http://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions.pdf}, -} - -@article{wilcoxon, - ISSN = {00994987}, - URL = {http://www.jstor.org/stable/3001968}, - author = {Frank Wilcoxon}, - journal = {Biometrics Bulletin}, - number = {6}, - pages = {80--83}, - publisher = {[International Biometric Society, Wiley]}, - title = {Individual Comparisons by Ranking Methods}, - urldate = {2023-05-02}, - volume = {1}, - year = {1945}, - doi = {10.2307/3001968} -} - -@article{LANDMark, - title={LANDMark: an ensemble approach to the supervised selection of biomarkers in high-throughput sequencing data}, - author={Rudar, Josip and Porter, Teresita M. and Wright, Michael and Golding, G. Brian and Hajibabaei, Mehrdad}, - journal={BMC Bioinformatics}, - volume={23}, - number={1}, - year={2022}, - doi={10.1186/s12859-022-04631-z} -} - -@article{TreeOrdination, -author = {Josip Rudar and G. Brian Golding and Stefan C. Kremer and Mehrdad Hajibabaei}, -title = {Decision Tree Ensembles Utilizing Multivariate Splits Are Effective at Investigating Beta Diversity in Medically Relevant 16S Amplicon Sequencing Data}, -journal = {Microbiology Spectrum}, -volume = {11}, -number = {2}, -pages = {e02065-22}, -year = {2023}, -doi = {10.1128/spectrum.02065-22}, -URL = {https://journals.asm.org/doi/abs/10.1128/spectrum.02065-22}, -eprint = {https://journals.asm.org/doi/pdf/10.1128/spectrum.02065-22}, -abstract = { There is an ever-increasing level of interest in accurately modeling and understanding the roles that commensal organisms play in human health and disease. We show that learned representations can be used to create informative ordinations. Developing an understanding of how microbial communities vary across conditions is an important analytical step. We used 16S rRNA data isolated from human stool samples to investigate whether learned dissimilarities, such as those produced using unsupervised decision tree ensembles, can be used to improve the analysis of the composition of bacterial communities in patients suffering from Crohn’s disease and adenomas/colorectal cancers. We also introduce a workflow capable of learning dissimilarities, projecting them into a lower dimensional space, and identifying features that impact the location of samples in the projections. For example, when used with the centered log ratio transformation, our new workflow (TreeOrdination) could identify differences in the microbial communities of Crohn’s disease patients and healthy controls. Further investigation of our models elucidated the global impact amplicon sequence variants (ASVs) had on the locations of samples in the projected space and how each ASV impacted individual samples in this space. Furthermore, this approach can be used to integrate patient data easily into the model and results in models that generalize well to unseen data. Models employing multivariate splits can improve the analysis of complex high-throughput sequencing data sets because they are better able to learn about the underlying structure of the data set. IMPORTANCE There is an ever-increasing level of interest in accurately modeling and understanding the roles that commensal organisms play in human health and disease. We show that learned representations can be used to create informative ordinations. We also demonstrate that the application of modern model introspection algorithms can be used to investigate and quantify the impacts of taxa in these ordinations, and that the taxa identified by these approaches have been associated with immune-mediated inflammatory diseases and colorectal cancer. } -} - -@INPROCEEDINGS{SingleCell, - author={Walsh, Evan S. and Ghashghaei, H. Troy and Peng, Xinxia}, - booktitle={2021 IEEE International Conference on Bioinformatics and Biomedicine (BIBM)}, - title={Feature selection using co-occurrence correlation improves cell clustering and embedding in single cell RNAseq data}, - year={2021}, - volume={}, - number={}, - pages={751-756}, - doi={10.1109/BIBM52615.2021.9669819} -} - -@inproceedings{SAGE, -author = {Covert, Ian C. and Lundberg, Scott and Lee, Su-In}, -title = {Understanding Global Feature Contributions with Additive Importance Measures}, -year = {2020}, -isbn = {9781713829546}, -publisher = {Curran Associates Inc.}, -address = {Red Hook, NY, USA}, -abstract = {Understanding the inner workings of complex machine learning models is a longstanding problem and most recent research has focused on local interpretability. To assess the role of individual input features in a global sense, we explore the perspective of defining feature importance through the predictive power associated with each feature. We introduce two notions of predictive power (model-based and universal) and formalize this approach with a framework of additive importance measures, which unifies numerous methods in the literature. We then propose SAGE, a model-agnostic method that quantifies predictive power while accounting for feature interactions. Our experiments show that SAGE can be calculated efficiently and that it assigns more accurate importance values than other methods.}, -booktitle = {Proceedings of the 34th International Conference on Neural Information Processing Systems}, -articleno = {1444}, -numpages = {12}, -location = {Vancouver, BC, Canada}, -series = {NIPS'20} -} - -@article{Stability, - author = {Nogueira, Sarah and Sechidis, Konstantinos and Brown, Gavin}, - title = {On the Stability of Feature Selection Algorithms}, - journal = {Journal of Machine Learning Research}, - year = {2018}, - volume = {18}, - number = {174}, - pages = {1--54}, - url = {http://jmlr.org/papers/v18/17-514.html} -} diff --git a/paper/paper.md b/paper/paper.md deleted file mode 100644 index 3d21c0d..0000000 --- a/paper/paper.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: 'Triglav: Iterative Refinement and Selection of Stable Features Using Shapley Values' -tags: - - Python - - feature selection - - genomics - - metabarcoding - - machine learning -authors: - - name: Josip Rudar - orcid: 0000-0003-0484-8028 - corresponding: true - affiliation: "1,3" - - name: Peter Kruczkiewicz - orcid: 0000-0002-0044-9460 - affiliation: 3 - - name: Oliver Lung - affiliation: "3,4" - - name: G. Brian Golding - orcid: 0000-0002-7575-0282 - affiliation: 2 - - name: Mehrdad Hajibabaei - orcid: 0000-0002-8859-7977 - corresponding: true - affiliation: 1 -affiliations: - - name: Centre for Biodiversity Genomics at Biodiversity Institute of Ontario and Department of Integrative Biology, University of Guelph, 50 Stone Road East, Guelph, ON, N1G 2W1, Canada - index: 1 - - name: Department of Biology, McMaster University, 1280 Main St. West, Hamilton, ON, L8S 4K1, Canada - index: 2 - - name: National Centre for Foreign Animal Disease, Canadian Food Inspection Agency, Winnipeg, Manitoba, Canada - index: 3 - - name: Deptartment of Biological Sciences, University of Manitoba, 50 Sifton Road, Winnipeg, Manitoba R3T 2N2 Canada. - index: 4 -date: 2 May 2023 -bibliography: paper.bib ---- - -# Summary - -`Triglav` is a Python package implementing a feature selection algorithm applicable for identification -of relevant and stable sets of features in high-dimensional tabular datasets. Like `Boruta` and `BorutaShap`, it uses an iterative approach to -identify a stable and predictive subset of features [@JSSv036i11; @BortuaShap; @Stability]. -Briefly, an ensemble approach is used to identify impactful clusters of features and the consistent identification -of impactful clusters over many iterations determines if a cluster of features is retained or discarded. -This approach is particularly beneficial since the identification of impactful clusters (and features) is accomplished using explainable artificial -intelligence approaches shown to be useful for feature selection [@Thanh-Hai2021]. -Further, we demonstrate how `Triglav` can be used to identify a stable set of features from a real-world dataset of 16S rRNA amplicon sequencing data from patients -suffering from Crohn's Disease and healthy controls [@CD]. -With this metagenomic data, we show that `Triglav` identifies a set of features more stable than those identified by competing methods (see \autoref{fig:overview1}A) [@Stability]. -By identifying stable sets of predictive features, `Triglav` may lead to useful interpretations of the underlying data. - -# Statement of need - -As datasets grow in complexity and in the number of features, analysis becomes increasingly difficult due to noise and the presence of irrelevant features. -To tackle this problem, feature selection methods are often used to reduce the complexity of the data while identifying the most relevant -features given the task at hand [@JSSv036i11; @BortuaShap; @NoiseR]. With genomic and metagenomic datasets, this task has become increasingly important since generating -models of the data and an understanding of how these models work directly improves our knowledge of complex systems such as disease process, -viral transmission, and how ecosystems change over time [@LANDMark; @TreeOrdination; @MLVir]. Many feature selection approaches tend to remove redundant features, however, -this may not be optimal for biological datasets. With complex modern genomic and metagenomic data, it is often important to identify the -relevant functional changes occurring in microbiomes or networks of genes [@lowabdmicrobiome; @SingleCell]. However, the removal of redundant -features could obfuscate important biological insights since the function of particular organism or gene may not be included in downstream analyses. -Therefore, `Triglav` was developed to implement an approach capable of identifying all relevant predictive features using explainable artificial -intelligence to ensure that the selected features are enriched with those that reflect actual differences and not the nuances the between different sets of training data. -This results in a generalized way to measure differentially abundant species or genes in biological datasets. -With the `Triglav` approach, these measurements would no longer rely on the performance of a particular statistical model, but rather, the ability of a -machine learning model to successfully classify a dataset. - -![`Triglav` analysis identifies a stable set of features from a real-world dataset of 16S rRNA amplicon sequencing data from patients suffering from Crohn's Disease and healthy controls [@CD]. -**A**, a comparison of `Triglav`'s feature stability performance against several common approaches. -**B**, SAGE importance scores from each of the selected features. -Many of the selected features were also detected in @CD. -**C**, a clustermap of the top features from each cluster visualizing differences in the microbiomes of healthy patients (blue) and those suffering from Crohn's Disease (red). -\label{fig:overview1}](Figure 1.pdf) - -# Outline of the Triglav Algorithm - -The core assumption behind `Triglav` is that clusters of impactful features sharing similar pattern of values across all samples should be discoverable. -This is not an unreasonable assumption for biological datasets. For example, patterns in the abundance of gut bacterial species exist between healthy controls and Crohn's Disease patients [@CD]. -To take advantage of this observation,`Triglav` begins by clustering features using a user-supplied dissimilarity measure (\autoref{fig:overview2}A) [@2020SciPy-NMeth]. The feature clustering -is only performed once and the result is used in subsequent steps. -Following clustering, one feature from each cluster is randomly selected. A set of shadow features is then constructed by sampling without replacement from the marginal distribution of each real feature (\autoref{fig:overview2}B) [@JSSv036i11]. -The real and shadow data is combined and used to train an Extremely Randomized Tree classifier in the default implementation of `Triglav`. Shapley values are then calculated (\autoref{fig:overview2}C) [@ETC; @BortuaShap; @JSSv036i11; @shapley1951notes; @SHAP1; @SHAP2]. -This process is repeated to generate a distribution of Shapley values associated with each cluster of features and their shadow counterparts. -A Wilcoxon signed-rank test is then used to determine if the distribution of Shapley values belonging to each cluster of real features is greater than those from the corresponding shadow cluster (Figure 2C) [@wilcoxon]. -These steps are then repeated multiple times, generating a binary matrix where '1' represents a cluster of features differing significantly from its shadow counterpart (\autoref{fig:overview2}D). -A beta-binomial distribution is then used to determine if a cluster should be selected. A second beta-binomial distribution, -using a different parameterization, is used to determine if a cluster should be rejected (\autoref{fig:overview2}E). -By using two differently parameterized beta-binomial distributions, `Triglav` has a better ability to control the selection and rejection of clusters. Once a significant hit is detected, the cluster is removed from the pool of tentative clusters -and the process begins again. Finally, if there is interest in removing potentially redundant features, the best feature from each cluster can be discovered by calculating SAGE importance scores [@SAGE]. - -![A high-level overview of the `Triglav` algorithm. -**A**, Features are clustered. -**B**, A number of Extremely Randomized Tree classifiers are trained on randomly selected subsets of features and their shadow counterparts. -**C**, This process is repeated to generate a distribution of Shapley values. -**D**, A Wilcoxon signed-rank test is used to determine if a cluster's Shapley values are greater than the shadow counterpart. -**E**, Beta-binomial distributions are then used to determine if a feature is to be kept, rejected, or remain tentative. -Kept and rejected features are removed and steps **B-E** are repeated using the remaining tentative features. -False discovery rate corrections are applied at step **D** and **E**. -\label{fig:overview2}](Figure 2.pdf) - -# Ongoing Research - -Currently, this method is being used in projects to discover features capable of predicting host-origin of viral samples and strain -specific bacterial markers at the National Centre for Foreign Animal Disease with the Canadian Food Inspection Agency. In addition -to this work, we hope to integrate `Triglav` into an end-to-end suite of software with our previously developed tools, `LANDMark` and -`TreeOrdination` [@LANDMark; @TreeOrdination]. Together, this will form the basis of a modern toolset capable of investigating -the organisms and genes associated with pathogenicity and environmental outcomes. - -# Acknowledgements - -We thank Dr. Terri M. Porter, Dr. Oksana Vernygora, and Hoang Hai Nguyen for their thoughtful review of the manuscript and code. -J.R. is supported by funds from the Food from Thought project as part of Canada First Research Excellence Fund and from CSSP-CFPADP-1278. -M.H. received funding from the Government of Canada through Genome Canada and Ontario Genomics. G.B.G. is supported by a Natural -Sciences and Engineering Research Council of Canada (NSERC) grant (RGPIN-2020-05733). - -# References diff --git a/pyproject.toml b/pyproject.toml index 27082b1..9f405c0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ requires = ["hatchling"] [project] name = "triglav" -version = "1.0.6" +version = "1.2.0" authors = [ {name = "Josip Rudar", email = "joe.rudar@inspection.gc.ca"}, {name = "Peter Kruczkiewicz"}, @@ -33,18 +33,22 @@ classifiers = [ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3 :: Only", ] dependencies = [ - "matplotlib >= 3.4.3", + "matplotlib >= 3.7.1", "numpy == 1.23.5", - "scikit-learn >= 1.0.1", + "scikit-learn >= 1.3.1", "statsmodels >= 0.12.0", - "shap >= 0.40.0", - "sage-importance >= 0.0.5", - "scipy >= 1.7.3", - "joblib >= 1.1.0", - "imbalanced-learn >= 0.10.1" + "shap >= 0.41.0", + "scipy >= 1.10.1", + "joblib >= 1.3.1", + "imbalanced-learn >= 0.11.0", + "mealpy >= 2.5.4", + "umap-learn >= 0.5.4", + "scikit-bio >= 0.5.8", + "skrebate >= 0.62" ] [project.urls] @@ -66,7 +70,7 @@ test = [ ] [tool.pytest.ini_options] -addopts = "--cov --cov-report html --cov-report term-missing --cov-fail-under 70" +addopts = "--cov --cov-report html --cov-report term-missing --cov-fail-under 65" [tool.coverage.run] source = ["triglav"] diff --git a/tests/__init__.py b/tests/__init__.py index fa2a44b..3ad4802 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +1 @@ -"""Unit test package for Triglav.""" \ No newline at end of file +"""Unit test package for Triglav.""" diff --git a/tests/data/expected_output.csv b/tests/data/expected_output.csv deleted file mode 100644 index d9f8c7b..0000000 --- a/tests/data/expected_output.csv +++ /dev/null @@ -1,3 +0,0 @@ -,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 -Selected Best,False,True,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False -Selected,True,True,True,False,True,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False diff --git a/tests/test_triglav.py b/tests/test_triglav.py index ccb2404..0735204 100644 --- a/tests/test_triglav.py +++ b/tests/test_triglav.py @@ -1,5 +1,6 @@ from triglav import Triglav, ETCProx, NoScale, Scaler, NoResample +from sklearn.metrics import balanced_accuracy_score from sklearn.datasets import make_classification from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split @@ -11,31 +12,34 @@ from pathlib import Path + # Checks for symmetry def check_symmetric(X): - - if np.allclose(X, X.T, rtol = 1e-08, atol = 1e-08): + if np.allclose(X, X.T, rtol=1e-08, atol=1e-08): pass else: raise ValueError("The matrix returned by ETCProx() is not symmetric") + dirpath = Path(__file__).parent -expected_output = dirpath / 'data/expected_output.csv' +expected_output = dirpath / "data/expected_output.csv" + # Tests the transformer and proximity modules def test_transformers_prox(): - # Create the dataset - X, y = make_classification(n_samples = 200, - n_features = 20, - n_informative = 5, - n_redundant = 2, - n_repeated = 0, - n_classes = 2, - shuffle = False, - random_state = 0) + X, y = make_classification( + n_samples=200, + n_features=20, + n_informative=5, + n_redundant=2, + n_repeated=0, + n_classes=2, + shuffle=False, + random_state=0, + ) # To prevent negative proportions X = np.abs(X) @@ -45,19 +49,19 @@ def test_transformers_prox(): X = pd.DataFrame(X) R = pd.DataFrame(R) - pd.testing.assert_frame_equal(X, R, check_dtype = False) + pd.testing.assert_frame_equal(X, R, check_dtype=False) # Ensures that Scaler returns the closure of X R = pd.DataFrame(Scaler().fit_transform(X.values)) - X_closure = X.values / X.values.sum(axis = 1)[:, None] + X_closure = X.values / X.values.sum(axis=1)[:, None] X_closure = pd.DataFrame(X_closure) - pd.testing.assert_frame_equal(X_closure, R, check_dtype = False) + pd.testing.assert_frame_equal(X_closure, R, check_dtype=False) # Ensures that NoResample returns the input R = pd.DataFrame(NoResample().fit_transform(X)) - pd.testing.assert_frame_equal(X, R, check_dtype = False) + pd.testing.assert_frame_equal(X, R, check_dtype=False) # Ensure that ETCProx returns a square matrix and symmetric matrixo R = ETCProx().transform(X) @@ -70,47 +74,75 @@ def test_transformers_prox(): # Tests the overall Triglav pipeline def test_triglav_basic(): - - #Create the dataset - X, y = make_classification(n_samples = 200, - n_features = 20, - n_informative = 5, - n_redundant = 2, - n_repeated = 0, - n_classes = 2, - shuffle = False, - random_state = 0) - - #Split into train and test sets - X_train, X_test, y_train, y_test = train_test_split(X, y, - test_size = 0.2, - random_state = 0, - stratify = y) - - #Set up Triglav - model = Triglav(n_jobs = 5, - verbose = 3, - estimator = ExtraTreesClassifier(512, bootstrap = True, max_depth = 7), - metric = "euclidean", - linkage = "ward", - criterion="maxclust", - thresh = 9, - transformer=StandardScaler()) - - #Identify predictive features + # Create the dataset + X, y = make_classification( + n_samples=200, + n_features=20, + n_informative=5, + n_redundant=2, + n_repeated=0, + n_classes=2, + shuffle=False, + random_state=0, + ) + + # Split into train and test sets + X_train, X_test, y_train, y_test = train_test_split( + X, y, test_size=0.2, random_state=0, stratify=y + ) + + # Set up Triglav + model = Triglav( + n_jobs=4, + verbose=3, + n_iter_fwer=5, + estimator=ExtraTreesClassifier(512, bootstrap=True, max_depth=4), + stage_2_estimator=ExtraTreesClassifier(512, bootstrap=True, max_depth=4), + metric="euclidean", + criterion="maxclust", + thresh=9, + run_stage_2="auto", + transformer=StandardScaler(), + ) + + model = Triglav( + n_jobs=4, + verbose=3, + n_iter_fwer=5, + estimator=ExtraTreesClassifier(512, bootstrap=True, max_depth=4), + stage_2_estimator=ExtraTreesClassifier(512, bootstrap=True, max_depth=4), + metric="euclidean", + criterion="maxclust", + thresh=9, + run_stage_2="mms", + transformer=StandardScaler(), + ) + + # Identify predictive features model.fit(X_train, y_train) - features_selected = model.selected_ - features_best = model.selected_best_ + s1 = ( + ExtraTreesClassifier(512) + .fit(X_train[:, model.selected_], y_train) + .predict(X_test[:, model.selected_]) + ) + s2 = ( + ExtraTreesClassifier(512) + .fit(X_train[:, model.selected_best_], y_train) + .predict(X_test[:, model.selected_best_]) + ) - df = pd.DataFrame(data = [features_best, features_selected], index = ["Selected Best", "Selected"], columns = [str(i) for i in range(0, 20)]) - - test_df = pd.read_csv(expected_output, index_col = 0) + s1, s2 = balanced_accuracy_score(y_test, s1), balanced_accuracy_score(y_test, s2) - pd.testing.assert_frame_equal(df, test_df, check_dtype = False) + assert s1 > 0.75 + + assert s2 > 0.75 print("Triglav Test Complete.") -test_transformers_prox() -test_triglav_basic() +if __name__ == "__main__": + test_transformers_prox() + test_triglav_basic() + + fdfd = 5 diff --git a/triglav/__init__.py b/triglav/__init__.py index 808a006..4c01bee 100644 --- a/triglav/__init__.py +++ b/triglav/__init__.py @@ -4,4 +4,4 @@ from .triglav import Triglav, Scaler, NoScale, ETCProx, NoResample -__all__ = ['Triglav', 'Scaler', 'NoScale', 'ETCProx', 'NoResample'] +__all__ = ["Triglav", "Scaler", "NoScale", "ETCProx", "NoResample"] diff --git a/triglav/triglav.py b/triglav/triglav.py index 9d6e545..ea36ba4 100644 --- a/triglav/triglav.py +++ b/triglav/triglav.py @@ -1,17 +1,22 @@ from __future__ import annotations from collections import defaultdict + from typing import Union, Tuple, Mapping, List, Type, Set import matplotlib.axes +from matplotlib import pyplot as plt + import numpy as np -import sage as sg + import shap as sh + from joblib import Parallel, delayed -from matplotlib import pyplot as plt + from scipy.cluster import hierarchy from scipy.stats import wilcoxon, betabinom from scipy.spatial.distance import squareform + from sklearn.base import TransformerMixin, BaseEstimator, clone, ClassifierMixin from sklearn.ensemble import ( ExtraTreesClassifier, @@ -20,15 +25,29 @@ ) from sklearn.ensemble._forest import BaseForest from sklearn.feature_selection import VarianceThreshold -from sklearn.metrics import pairwise_distances -from sklearn.model_selection import GridSearchCV, RandomizedSearchCV -from sklearn.preprocessing import LabelEncoder, OneHotEncoder +from sklearn.metrics import pairwise_distances, log_loss +from sklearn.model_selection import GridSearchCV, RandomizedSearchCV, cross_validate, cross_val_score +from sklearn.preprocessing import OneHotEncoder from sklearn.utils import check_X_y, resample from sklearn.utils.validation import check_is_fitted + from statsmodels.stats.multitest import multipletests + +from skrebate import MultiSURF + +from umap import UMAP + from imblearn.under_sampling.base import BaseCleaningSampler, BaseUnderSampler from imblearn.over_sampling.base import BaseOverSampler +from mealpy.swarm_based.NMRA import ImprovedNMRA +from mealpy.utils.logger import Logger +from mealpy.utils.problem import Problem + +from skbio.stats.distance._cutils import permanova_f_stat_sW_cy +from skbio.stats.distance._base import _preprocess_input_sng +from skbio import DistanceMatrix + ################################################################################## # Utility Classes - Transform and Scaling @@ -62,21 +81,22 @@ def __init__(self): def fit_transform(self, X, y=None, **fit_params): self.zero_samps = np.where(np.sum(X, axis=1) == 0, False, True) - row_sums = np.sum(X, axis = 1)[self.zero_samps] - - return X[self.zero_samps]/np.sum(X[self.zero_samps], axis = 1)[:,None] + return X[self.zero_samps] / np.sum(X[self.zero_samps], axis=1)[:, None] ################################################################################## # Utility Classes - Calculation of Dissimilarities for Clustering ################################################################################## class ETCProx: - def __init__(self, n_estimators=1024, min_samples_split=0.33, n_sets=5): + def __init__( + self, n_estimators=1024, min_samples_split=0.33, n_sets=5, return_clf=False + ): self.n_estimators = n_estimators self.min_samples_split = min_samples_split self.n_sets = n_sets + self.return_clf = return_clf - def transform(self, X: np.ndarray) -> np.ndarray: + def transform(self, X: np.ndarray): """ Transform data using the ETCProx method. @@ -88,7 +108,10 @@ def transform(self, X: np.ndarray) -> np.ndarray: Returns ------- np.ndarray - Proximity matrix of shape (n_samples, n_samples). + Proximity matrix of shape (n_samples, n_samples) + + ExtraTreesClassifier + If 'return_clf' is True. """ # Randomize class labels (https://inria.hal.science/hal-01667317/file/unsupervised-extremely-randomized_Dalleau_Couceiro_Smail-Tabbone.pdf) y_rnd = [0 for _ in range(X.shape[0] // 2)] @@ -115,7 +138,12 @@ def transform(self, X: np.ndarray) -> np.ndarray: S = np.dot(L, L.T) S = S / 1024 S = 1 - S - return np.sqrt(S) + + if self.return_clf: + return np.sqrt(S), clf + + else: + return np.sqrt(S) ################################################################################## @@ -130,10 +158,234 @@ def __init__(self): pass def fit_transform(self, X, y=None, **fit_params): - return X +################################################################################## +# Utility Classes - Discrete Feature Selection Problem +################################################################################## +# The code for the f_stat() function was adapted from Scikit-Bio's PerMANOVA +def f_stat(X, y): + D = DistanceMatrix(pairwise_distances(X, metric="euclidean").astype(np.float32)) + + SST = D[:] ** 2 + SST = SST.sum() / X.shape[0] + SST = SST / 2.0 + + n_groups, grouping = _preprocess_input_sng(D.ids, X.shape[0], y, None) + + grouping = np.asarray(grouping) + + group_sizes = np.bincount(grouping) + + SSW = permanova_f_stat_sW_cy(DistanceMatrix(D).data, group_sizes, grouping) + + SSA = SST - SSW + + return (SSW / (X.shape[0] - n_groups)) / ( + SSA / (n_groups - 1) + ) # To turn this into a minimization problem + + +# The Problem code below was adapted from the MealPy Problem class +class DSFSProblem(Problem): + SUPPORTED_ARRAY = (list, tuple, np.ndarray) + + def __init__( + self, lb=None, ub=None, minmax="min", X=None, y=None, M=None, **kwargs + ): + r"""Initialize Problem. + + Args: + lb (numpy.ndarray, list, tuple): Lower bounds of the problem. + ub (numpy.ndarray, list, tuple): Upper bounds of the problem. + minmax (str): Minimization or maximization problem (min, max) + name (str): Name for this particular problem + """ + self.name, self.log_to, self.log_file = "P", "console", "history.txt" + self.n_objs, self.obj_is_list, self.multi_objs = 1, False, False + self.n_dims, self.lb, self.ub, self.save_population = None, None, None, False + self.X, self.y, self.M = X, y, M + self.obj_weights = [0.6, 0.4] + + self.__set_keyword_arguments(kwargs) + self.__set_domain_range(lb, ub) + self.__set_functions(kwargs) + self.logger = Logger(self.log_to, log_file=self.log_file).create_logger( + name=f"{__name__}.{__class__.__name__}", + format_str="%(asctime)s, %(levelname)s, %(name)s [line: %(lineno)d]: %(message)s", + ) + self.minmax = minmax + + def __set_keyword_arguments(self, kwargs): + for key, value in kwargs.items(): + setattr(self, key, value) + + def __set_domain_range(self, lb, ub): + if type(lb) in self.SUPPORTED_ARRAY and type(ub) in self.SUPPORTED_ARRAY: + self.lb = np.array(lb).flatten() + self.ub = np.array(ub).flatten() + if len(self.lb) == len(self.ub): + self.n_dims = len(self.lb) + if len(self.lb) < 1: + raise ValueError( + f"Dimensions do not qualify. Length(lb) = {len(self.lb)} < 1." + ) + else: + raise ValueError( + f"Length of lb and ub do not match. {len(self.lb)} != {len(self.ub)}." + ) + else: + raise ValueError(f"lb and ub need to be a list, tuple or np.array.") + + def __set_functions(self, kwargs): + tested_solution = self.generate_position(self.lb, self.ub) + if "amend_position" in kwargs: + if not callable(self.amend_position): + raise ValueError( + f"Use default 'amend_position()' or passed a callable function. {type(self.amend_position)} != function" + ) + else: + tested_solution = self.amend_position(tested_solution, self.lb, self.ub) + result = self.fit_func(tested_solution) + if type(result) in self.SUPPORTED_ARRAY: + result = np.array(result).flatten() + self.n_objs = len(result) + self.obj_is_list = True + if self.n_objs > 1: + self.multi_objs = True + if type(self.obj_weights) in self.SUPPORTED_ARRAY: + self.obj_weights = np.array(self.obj_weights).flatten() + if self.n_objs != len(self.obj_weights): + raise ValueError( + f"{self.n_objs}-objective problem, but N weights = {len(self.obj_weights)}." + ) + self.msg = f"Solving {self.n_objs}-objective optimization problem with weights: {self.obj_weights}." + else: + raise ValueError( + f"Solving {self.n_objs}-objective optimization, need to set obj_weights list with length: {self.n_objs}" + ) + elif self.n_objs == 1: + self.multi_objs = False + self.obj_weights = np.ones(1) + self.msg = f"Solving single objective optimization problem." + else: + raise ValueError( + f"fit_func needs to return a single value or a list of values list" + ) + elif ( + type(result) in (int, float) + or isinstance(result, np.floating) + or isinstance(result, np.integer) + ): + self.multi_objs = False + self.obj_is_list = False + self.obj_weights = np.ones(1) + self.msg = f"Solving single objective optimization problem." + else: + raise ValueError( + f"fit_func needs to return a single value or a list of values list" + ) + + def fit_func(self, x): + """Fitness function + + Args: + x (numpy.ndarray): Solution. + + Returns: + float: Function value of `x`. + """ + selected = x > 0 + + num_selected = selected.sum() + if num_selected == 0: + return 1.0 + + # Subset + x_train = self.X[:, selected].astype(float) + + # Train + c1 = cross_validate( + self.M, + x_train, + self.y, + cv=3, + scoring="balanced_accuracy", + return_estimator=True, + return_indices=True, + n_jobs=5, + ) + + test_ind = [inds for inds in c1["indices"]["test"]] + log_losses_1 = [ + log_loss( + self.y[test_ind[i]], + c1["estimator"][i].predict_proba(x_train[test_ind[i]]), + ) + for i in range(3) + ] + log_losses_1 = np.asarray(log_losses_1).mean() + + # Score + s_1 = 1 - c1["test_score"].mean() + s_2 = np.asarray(log_losses_1).mean() + s_3 = f_stat(x_train, self.y) + + num_features = self.X.shape[1] + f_frac = num_selected / num_features + + o_1 = (0.85 * s_1) + (0.10 * s_2) + (0.05 * s_3) + o_2 = f_frac + + return o_1, o_2 + + def get_name(self): + """ + Returns: + string: The name of the problem + """ + return self.name + + def get_class_name(self): + """Get class name.""" + return self.__class__.__name__ + + def generate_position(self, lb=None, ub=None): + """ + Generate the position depends on the problem. For discrete problem such as permutation, this method can be override. + + Args: + lb: list of lower bound values + ub: list of upper bound values + + Returns: + np.array: the position (the solution for the problem) + """ + pos = np.random.uniform(lb, ub) + pos = np.where(pos > 0.4, 1, 0) + + return pos + + def amend_position(self, position=None, lb=None, ub=None): + """ + The goal is to transform the solution into the right format corresponding to the problem. + For example, with discrete problems, floating-point numbers must be converted to integers + to ensure the solution is in the correct format. + + Args: + position: vector position (location) of the solution. + lb: list of lower bound values + ub: list of upper bound values + + Returns: + Amended position (make the right format of the solution) + """ + position_clipped = np.where(position > 0.4, 1, 0) + + return position_clipped + + ################################################################################## # Functions used by Triglav ################################################################################## @@ -153,7 +405,7 @@ def beta_binom_test( X : np.ndarray Data matrix of shape (n_samples, n_features). C : int, optional - Number of classes, by default 1 + Number of iterations for FWER correction alpha : float, optional Significance level, by default 0.05 p : float, optional @@ -384,19 +636,15 @@ def get_hits( S_r = shap_scores(clf, X_resamp, per_class) if per_class: - if S_r.ndim == 2: - S_p = S_r[:, n_features:] S_r = S_r[:, 0:n_features] else: - S_p = S_r[:, n_features:, :] S_r = S_r[:, 0:n_features, :] else: - S_p = S_r[n_features:] S_r = S_r[0:n_features] @@ -461,6 +709,7 @@ def global_imps( H_shadow: np.ndarray, alpha: float = 0.05, alternative: str = "two-sided", + use_bayes: bool = False, ) -> np.ndarray: """ Used to calculate if real and shadow features differ significantly. @@ -481,11 +730,9 @@ def global_imps( np.ndarray The p-values. """ - # Calculate p-values associated with each feature using the Wilcoxon Test p_vals_raw = [] for column in range(H_real.shape[1]): - if np.all(np.equal(H_real[:, column], H_shadow[:, column])): p_vals_raw.append(1.0) @@ -538,7 +785,6 @@ def per_class_imps( # For more than two classes or Extra Trees/Random Forest if np.asarray([H_real[0]]).ndim > 3: - # Get the class being examined H_real_i = [row[:, :, i] for row in H_real] H_shadow_i = [row[:, :, i] for row in H_shadow] @@ -706,8 +952,77 @@ def update_lists( return A_new, T_new, R_new, np.asarray(T_idx) +def get_metasamples(X: np.ndarray, y: np.ndarray) -> np.ndarray: + """ + Inputs: + + X: NumPy array of shape (m, n) where 'm' is the number of samples and 'n' + the number of features (taxa, OTUs, ASVs, etc). + + y: NumPy array of shape (m,) where 'm' is the number of samples. Each entry + of 'y' should be a factor. + + Returns: + + final_estimates: NumPy array of shape (n, p) where 'n' is the number of + features and 'p' is the number of components (meta-samples). + """ + et_estimates = [] + ms_estimates = [] + + # Estimate multivariate FI Using ETC + for _ in range(10): + M = ExtraTreesClassifier(512, bootstrap=True).fit(X, y) + + explainer = sh.Explainer(M) + + s = explainer(X, check_additivity=False).values + + s = np.abs(s) + + if s.ndim > 2: + s = s.mean(axis=2) + + s = s.mean(axis=0) + + et_estimates.append(s) + + for _ in range(10): + M = ExtraTreesClassifier(512, bootstrap=True, max_depth=3).fit(X, y) + + explainer = sh.Explainer(M) + + s = explainer(X, check_additivity=False).values + + s = np.abs(s) + + if s.ndim > 2: + s = s.mean(axis=2) + + s = s.mean(axis=0) + + et_estimates.append(s) + + # Estimate multivariate FI using MultiSURF + for _ in range(10): + X_re, y_re = resample(X, y, stratify=y) + ms_estimates.append(MultiSURF(n_jobs=4).fit(X_re, y_re).feature_importances_) + + # Reduce dimensionality with UMAP + final_estimates = np.vstack((et_estimates, ms_estimates)).T + + final_estimates = UMAP(n_neighbors=12, + n_components=4, + metric = "mahalanobis").fit_transform( + final_estimates + ) + + return final_estimates.T + + def get_clusters( X: np.ndarray, + y: np.ndarray, linkage_method: str, T: float, criterion: str, @@ -722,6 +1037,9 @@ def get_clusters( X : array-like of shape (n_samples, n_features) The training input samples. + y: NumPy array of shape (m,) where 'm' is the number of samples. Each entry + of 'y' should be a factor. + linkage_method : str The linkage method to use for hierarchical clustering. @@ -750,7 +1068,7 @@ def get_clusters( """ # Cluster Features - X_final, _ = scale_features(X, transformer) + X_final = get_metasamples(transformer.fit_transform(X), y) if type(metric) == ETCProx: D = squareform(metric.transform(X_final.T).astype(np.float32)) @@ -780,6 +1098,7 @@ def get_clusters( cluster_id_to_feature_ids[cluster_id].append(idx) selected_clusters_ = list(cluster_id_to_feature_ids) + return selected_clusters_, cluster_id_to_feature_ids, D @@ -817,7 +1136,7 @@ def select_features( # Get clusters selected_clusters_, cluster_id_to_feature_ids, D = get_clusters( - X_red, linkage, thresh, criterion, clone(transformer), metric + X_red, y, linkage, thresh, criterion, clone(transformer), metric ) # Prepare tracking dictionaries @@ -827,7 +1146,7 @@ def select_features( T_idx = np.copy(selected_clusters_, "C") - # Stage 1: Calculate Initial Significance - Only Remove Unimportant Features + # Stage 1: Calculate Initial Significance - Only Remove Features if verbose > 0: print("Stage One: Identifying an initial set of tentative features...") @@ -855,8 +1174,8 @@ def select_features( else: H_arr.append(H_new) - if ITERATION >= n_iter_fwer: - P_h, P_r = beta_binom_test(H_arr, ITERATION - 4, alpha, p, p2) + if ITERATION > n_iter_fwer: + P_h, P_r = beta_binom_test(H_arr, ITERATION - n_iter_fwer, alpha, p, p2) F_accepted, F_tentative, F_rejected, _ = update_lists( F_accepted, F_tentative, F_rejected, T_idx, P_h, P_r ) @@ -867,81 +1186,180 @@ def select_features( H_arr = H_arr[:, idx] IDX = {x: i for i, x in enumerate(T_idx)} - if verbose > 0: + if verbose > 0: + print( + f"Round {ITERATION:d} " + f"/ Tentative (Accepted): {len(F_accepted)} " + f"/ Tentative (Not Accepted): {len(F_tentative)} " + f"/ Rejected: {len(F_rejected)}" + ) + + if verbose > 0 and ITERATION <= n_iter_fwer: print( f"Round {ITERATION:d} " f"/ Tentative (Accepted): {len(F_accepted)} " - f"/ Tentative (Not Accepted): {len(F_tentative)} " + f"/ Tentative (Not Accepted): {len(cluster_id_to_feature_ids)} " f"/ Rejected: {len(F_rejected)}" ) + # Get a list of feature indicies which were selected S = [] - rev_cluster_id = {} for C in F_accepted: for entry in cluster_id_to_feature_ids[C]: S.append(entry) - rev_cluster_id[entry] = C - + # Sort indices in ascending order S.sort() + S = np.asarray(S) S_1 = np.asarray(S) # Return to original size - S1s = np.zeros(shape=(X_red.shape[1],), dtype=int) + S1s = np.zeros(shape=(X_red.shape[1],), dtype=bool) for entry in S_1: - S1s[entry] = 1 + S1s[entry] = True S_1 = nZVF.inverse_transform([S1s])[0] - S_1 = np.where(S_1 > 0, True, False) - # Stage 2: Determine the best feature from each cluster using Sage - if run_stage_2: - if verbose > 0: - print("Stage Two: Identifying best features from each cluster...") - - y_enc = LabelEncoder().fit_transform(y) - - X_red, zero_samps = scale_features(X_red, transformer) - - S_tmp = nZVF.transform([S_1])[0] - - model = stage_2_estimator.fit(X_red[:, S_tmp], y_enc[zero_samps]) + # Stage 2: Determine the best features from the stage 1 features + if (run_stage_2 == "mms") or (run_stage_2 == "auto") or (run_stage_2 == True): + if (run_stage_2 == "mms") or (run_stage_2 == True): + if verbose > 0: + print( + "Stage Two: Identifying best features using a modified MultiSURF..." + ) - I = sg.MarginalImputer(model, X_red[:, S_tmp]) - E = sg.SignEstimator(I) - sage = E(X_red[:, S_tmp], y_enc[zero_samps]) + F_selector = stage_2_mms( + transformer.fit_transform(X_red[:, S]), y, stage_2_estimator + ) - S_vals = sage.values + S2_features = F_selector.transform(np.asarray([S])) - best_in_clus = {} - for ix, f_val in enumerate(S_vals): - F_id = S[ix] - C = rev_cluster_id[F_id] + elif run_stage_2 == "auto": + if verbose > 0: + print( + "Stage Two: Identifying best features using swarm optimization..." + ) - if ( - C in best_in_clus - and f_val > best_in_clus[C][1] - or C not in best_in_clus - ): - best_in_clus[C] = (F_id, f_val) + S2_features, F_selector = stage_2_soa( + transformer.fit_transform(X_red[:, S]), y, stage_2_estimator + ) - S_2 = [v[0] for _, v in best_in_clus.items()] - S_2.sort() - S_2 = np.asarray(S_2) + S2_features = S[S2_features] # Return to original size - S2s = np.zeros(shape=(X_red.shape[1],), dtype=int) - for entry in S_2: - S2s[entry] = 1 + S2s = np.zeros(shape=(X_red.shape[1],), dtype=bool) + for entry in S2_features: + S2s[entry] = True S_2 = nZVF.inverse_transform([S2s])[0] - S_2 = np.where(S_2 > 0, True, False) if verbose > 0: print(f"Final Feature Set Contains {str(S_1.sum())} Features.") - if run_stage_2: + if (run_stage_2 == "mms") or (run_stage_2 == "auto") or (run_stage_2 == True): print(f"Final Set of Best Features Contains {str(S_2.sum())} Features.") - return (S_1, S_2, sage, D) if run_stage_2 else (S_1, None, None, D) + return (S_1, S_2, F_selector, D) if run_stage_2 else (S_1, None, None, D) + + +def stage_2_mms( + X: np.ndarray, y: np.ndarray, M: Type[ClassifierMixin, BaseEstimator] +) -> MultiSURF: + """ + Stage 2 Feature Selection using MultiSURF. + + Inputs: + + X: NumPy array of shape (m, n) where 'm' is the number of samples and 'n' + the number of features (taxa, OTUs, ASVs, etc). + + y: NumPy array of shape (m,) where 'm' is the number of samples. Each entry + of 'y' should be a factor. + + Returns: + + best_model: MultiSURF model associated with the best cross-validated + balanced accuracy. + """ + + scores = [] + best_model = [] + + if X.shape[1] <= 5: + n_selected_init = X.shape[1] - 1 + else: + n_selected_init = 5 + + for n_selected in [ + n_selected_init, + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 150, + 200, + 250, + 300, + ]: + if n_selected < X.shape[1]: + MMS_model = MultiSURF(n_selected, n_jobs=6).fit(X, y) + + X_trf = MMS_model.transform(X) + + score = cross_val_score( + estimator=M, X=X_trf, y=y, scoring="balanced_accuracy", cv=5, n_jobs=5 + ).mean() + + scores.append(score) + best_model.append(MMS_model) + + else: + break + + best_score = np.argmax(scores) + + return best_model[best_score] + + +def stage_2_soa( + X: np.ndarray, y: np.ndarray, M: Type[ClassifierMixin, BaseEstimator] +) -> Tuple[np.ndarray, ImprovedNMRA]: + """ + Stage 2 Feature Selection using Swarm Optimization. + + Inputs: + + X: NumPy array of shape (m, n) where 'm' is the number of samples and 'n' + the number of features (taxa, OTUs, ASVs, etc). + + y: NumPy array of shape (m,) where 'm' is the number of samples. Each entry + of 'y' should be a factor. + + Returns: + + best_features: NumPy array of shape (n,) of the mask of the best selected + features. + """ + + FS_problem = DSFSProblem( + lb=np.zeros(shape=(X.shape[1]), dtype=int), + ub=np.ones(shape=(X.shape[1]), dtype=int), + name="FS", + minmax="min", + X=X, + y=y, + M=M, + ) + + model = ImprovedNMRA(epoch=20, pop_size=30) + best_features, _ = model.solve(problem=FS_problem) + best_features = best_features > 0.4 + + return best_features, model ################################################################################## @@ -964,8 +1382,8 @@ class Triglav(TransformerMixin, BaseEstimator): estimator: default = ExtraTreesClassifier(512, bootstrap = True) The estimator used to calculate Shapley scores. stage_2_estimator: default = ExtraTreesClassifier(512) - The estimator used to calculate SAGE values. Only used if the - 'run_stage_2' is set to True. + The estimator used to calculate MultiSURF CV scores. + Only used if the 'run_stage_2' is set to True or 'mms'. per_class_imp: bool, default = False Specifies if importance scores are calculated globally or per class. Note, per class importance scores are calculated in a @@ -980,23 +1398,24 @@ class Triglav(TransformerMixin, BaseEstimator): p_2: float, default = 0.30 Used to determine the shape of the Beta-Binomial distribution modelling misses. - metric: str, default = "correlation" + metric: str, default = "euclidean" The dissimilarity measure used to calculate distances between features. - linkage: str, default = "complete" + linkage: str, default = "ward" The type of hierarchical clustering method to apply. The available methods include: single, complete, ward, average, centroid. thresh: float, default = 2.0 The threshold or max number of clusters. criterion: str, default = "distance" The method used to form flat clusters. The available methods - include: inconsistent, distance, maxclust, monocrit, - maxclust_monocrit. + include: distance or maxclust. alpha: float, default = 0.05 The level at which corrected p-values will be rejected. - run_stage_2: bool, default = True - This stage will determine the best feature from each of the - selected clusters by calculating SAGE values. + run_stage_2: str or bool, default = "mms" + This stage will determine the best features from the selected + Triglav features. If 'str' is "auto", swarm optimization is used. + If "mms" (default), a modified version of the MultiSURF algorithm + is used. If True, "mms" is used. If False, stage 2 is not run. verbose: int, default = 0 Specifies if basic reporting is sent to the user. n_jobs: int, default = 10 @@ -1007,23 +1426,26 @@ def __init__( self, transformer=NoScale(), sampler=NoResample(), - estimator=ExtraTreesClassifier(512, bootstrap=True), - stage_2_estimator=ExtraTreesClassifier(512), + estimator: Type[ClassifierMixin, BaseEstimator] = ExtraTreesClassifier( + 512, bootstrap=True + ), + stage_2_estimator: Type[ClassifierMixin, BaseEstimator] = ExtraTreesClassifier( + 512 + ), per_class_imp: bool = False, n_iter: int = 40, n_iter_fwer: int = 11, p_1: float = 0.65, p_2: float = 0.30, - metric: Union[str, ETCProx] = "correlation", - linkage: str = "complete", + metric: Union[str, ETCProx] = "euclidean", + linkage: str = "ward", thresh: Union[int, float] = 2.0, criterion: str = "distance", alpha: float = 0.05, - run_stage_2: bool = True, + run_stage_2: Union[str, bool] = "mms", verbose: int = 0, n_jobs: int = 10, ): - self.n_class_ = None self.classes_ = None self.transformer = transformer @@ -1068,7 +1490,7 @@ def fit(self, X: np.ndarray, y: np.ndarray) -> Triglav: ( self.selected_, self.selected_best_, - self.sage_values_, + self.stage_2_model_, self.linkage_matrix_, ) = select_features( transformer=self.transformer, @@ -1175,6 +1597,7 @@ def visualize_hclust( # Get clusters _, _, D = get_clusters( X_red, + y, self.linkage, self.thresh, self.criterion, @@ -1187,14 +1610,12 @@ def visualize_hclust( return hierarchy.dendrogram(D, ax=ax, **dendrogram_kwargs) - def _check_params(self, X, y): - + def _check_params( + self, X: np.ndarray, y: np.ndarray + ) -> Tuple[np.ndarray, np.ndarray]: crit_set = { - "inconsistent", "distance", "maxclust", - "monocrit", - "maxclust_monocrit", } link_set = {"single", "complete", "ward", "average", "centroid"} @@ -1224,43 +1645,103 @@ def _check_params(self, X, y): "yule", } + stage_2_params = {"mms", "auto", True, False} + # Check if X and y are consistent X_in, y_in = check_X_y(X, y, estimator="Triglav") - # Basic check on parameter bounds - if self.alpha <= 0 or self.alpha > 1: - raise ValueError("The 'alpha' parameter should be between 0 and 1.") + # Basic check on parameter bounds and types - if (self.p_1 <= 0 or self.p_1 > 1) or (self.p_2 <= 0 or self.p_2 > 1): - raise ValueError("The 'p' parameter should be between 0 and 1.") + # Check the alpha parameter + if isinstance(self.alpha, float): + if self.alpha <= 0 or self.alpha > 1: + raise ValueError( + "The 'alpha' parameter should be a float between 0 and 1." + ) + else: + raise TypeError("The 'alpha' parameter should be a float between 0 and 1.") - if self.verbose < 0: - raise ValueError( - "The 'verbose' parameter should be greater than or equal to zero." + # Check parameters of the beta-binomial distributions + if isinstance(self.p_1, float): + if (self.p_1 <= 0) or (self.p_1 > 1): + raise ValueError( + "The 'p_1' parameter should be a float between 0 and 1." + ) + else: + raise TypeError("The 'p_1' parameter should be a float between 0 and 1.") + + if isinstance(self.p_2, float): + if (self.p_2 <= 0) or (self.p_2 > 1): + raise ValueError( + "The 'p_2' parameter should be a float between 0 and 1." + ) + else: + raise TypeError("The 'p_2' parameter should be a float between 0 and 1.") + + # Check verbose parameter` + if isinstance(self.verbose, int): + if self.verbose < 0: + raise ValueError( + "The 'verbose' parameter should be greater than or equal to zero." + ) + else: + raise TypeError( + "The 'verbose' parameter should be an integer greater than \ + or equal to 0." ) - if self.n_iter <= 0: - raise ValueError("The 'max_iter' parameter should be at least one.") + # Check iteration parameters + if isinstance(self.n_iter, int): + if self.n_iter <= 0: + raise ValueError("The 'max_iter' parameter should be at least one.") + else: + raise TypeError( + "The 'n_iter' parameter should be an integer greater than \ + or equal to 0." + ) - if self.n_iter_fwer <= 0: - raise ValueError("The 'n_iter_fwer' parameter should be at least one.") + if isinstance(self.n_iter_fwer, int): + if self.n_iter_fwer <= 0: + raise ValueError("The 'n_iter_fwer' parameter should be at least one.") + else: + raise TypeError( + "The 'n_iter_fwer' parameter should be an integer greater than \ + or equal to 0." + ) - if self.n_jobs <= 0: - raise ValueError( - "The 'n_jobs' parameter should be greater than or equal to one." + if isinstance(self.n_jobs, int): + if self.n_jobs <= 0: + raise ValueError( + "The 'n_jobs' parameter should be greater than or equal to one." + ) + else: + raise TypeError( + "The 'n_jobs' parameter should be an integer greater than \ + or equal to 1." ) - if self.thresh <= 0: - raise ValueError("The 'thresh' parameter should be greater than one.") + # Check clustering parameters + if isinstance(self.thresh, int) or isinstance(self.thresh, float): + if self.thresh <= 0: + raise ValueError("The 'thresh' parameter should be greater than one.") + else: + raise TypeError( + "The 'thresh' parameter should be an integer or float \ + greater than or equal to 1." + ) - if self.metric not in metrics and type(self.metric) != ETCProx: + if self.metric in metrics: + pass + elif isinstance(self.metric, ETCProx): + pass + else: raise ValueError( "The 'metric' parameter should be one supported by Scikit-Learn or 'ETCProx'." ) if self.criterion not in crit_set: raise ValueError( - "The 'criterion' parameter should be one supported in 'scipy.hierarchy'." + "The 'criterion' parameter should be either 'distance' or 'maxclust'." ) if self.linkage not in link_set: @@ -1268,10 +1749,11 @@ def _check_params(self, X, y): "The 'linkage' parameter should one supported in 'scipy.hierarchy'." ) - if type(self.run_stage_2) is not bool: - raise ValueError("The 'run_stage_2' parameter should be True or False.") - - if type(self.per_class_imp) is not bool: - raise ValueError("The 'per_class_imp' parameter should be True or False.") + # Check stage 2 parameter + if self.run_stage_2 not in stage_2_params: + raise ValueError( + "The 'run_stage_2' parameter should be a string set to 'auto' or 'mms' \ + or set to True or False" + ) return X_in, y_in