{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 필요한 모듈 import"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from imblearn.pipeline import make_pipeline, Pipeline\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.model_selection import StratifiedKFold, RandomizedSearchCV, GridSearchCV, train_test_split\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_selection import VarianceThreshold"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "APCFP = pd.read_csv('finalfingerprint_sub_apc.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>target_name_bin</th>\n",
       "      <th>target_name_ter</th>\n",
       "      <th>target_name_quater</th>\n",
       "      <th>smiles</th>\n",
       "      <th>APC2D1_C_C</th>\n",
       "      <th>APC2D1_C_N</th>\n",
       "      <th>APC2D1_C_O</th>\n",
       "      <th>APC2D1_C_S</th>\n",
       "      <th>APC2D1_C_P</th>\n",
       "      <th>APC2D1_C_F</th>\n",
       "      <th>...</th>\n",
       "      <th>SubFPC303</th>\n",
       "      <th>SubFPC304</th>\n",
       "      <th>SubFPC305</th>\n",
       "      <th>SubFPC306</th>\n",
       "      <th>SubFPC307</th>\n",
       "      <th>bond:C=S_carbonyl_thio_generic</th>\n",
       "      <th>bond:CN_amine_pri-NH2_aromatic</th>\n",
       "      <th>bond:CS_sulfide</th>\n",
       "      <th>bond:S=O_sulfonyl_generic</th>\n",
       "      <th>ring:hetero_[6_6]_O_benzopyrone_(1_4-)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>A</td>\n",
       "      <td>A</td>\n",
       "      <td>A1</td>\n",
       "      <td>Nc1ccccc1</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>A</td>\n",
       "      <td>A</td>\n",
       "      <td>A1</td>\n",
       "      <td>COc1ccc(N)cc1</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>A</td>\n",
       "      <td>A</td>\n",
       "      <td>A1</td>\n",
       "      <td>COP(=S)(OC)SCn1nnc2ccccc2c1=O</td>\n",
       "      <td>7</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>A</td>\n",
       "      <td>A</td>\n",
       "      <td>A1</td>\n",
       "      <td>CC(C)(c1ccc(O)cc1)c1ccc(O)cc1</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>A</td>\n",
       "      <td>A</td>\n",
       "      <td>A1</td>\n",
       "      <td>CC(C)(C)c1cc(O)ccc1O</td>\n",
       "      <td>10</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>582</td>\n",
       "      <td>B</td>\n",
       "      <td>C</td>\n",
       "      <td>C</td>\n",
       "      <td>CSCCCCN=C=S</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>583</td>\n",
       "      <td>B</td>\n",
       "      <td>C</td>\n",
       "      <td>C</td>\n",
       "      <td>CCCN=C=S</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>584</td>\n",
       "      <td>B</td>\n",
       "      <td>C</td>\n",
       "      <td>C</td>\n",
       "      <td>CS(=O)CCCCC#N</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>585</td>\n",
       "      <td>B</td>\n",
       "      <td>C</td>\n",
       "      <td>C</td>\n",
       "      <td>CSCCCCC#N</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>586</td>\n",
       "      <td>B</td>\n",
       "      <td>C</td>\n",
       "      <td>C</td>\n",
       "      <td>C=CCSC#N</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>587 rows × 1096 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    target_name_bin target_name_ter target_name_quater  \\\n",
       "0                 A               A                 A1   \n",
       "1                 A               A                 A1   \n",
       "2                 A               A                 A1   \n",
       "3                 A               A                 A1   \n",
       "4                 A               A                 A1   \n",
       "..              ...             ...                ...   \n",
       "582               B               C                  C   \n",
       "583               B               C                  C   \n",
       "584               B               C                  C   \n",
       "585               B               C                  C   \n",
       "586               B               C                  C   \n",
       "\n",
       "                            smiles  APC2D1_C_C  APC2D1_C_N  APC2D1_C_O  \\\n",
       "0                        Nc1ccccc1           6           1           0   \n",
       "1                    COc1ccc(N)cc1           6           1           2   \n",
       "2    COP(=S)(OC)SCn1nnc2ccccc2c1=O           7           3           3   \n",
       "3    CC(C)(c1ccc(O)cc1)c1ccc(O)cc1          16           0           2   \n",
       "4             CC(C)(C)c1cc(O)ccc1O          10           0           2   \n",
       "..                             ...         ...         ...         ...   \n",
       "582                    CSCCCCN=C=S           3           2           0   \n",
       "583                       CCCN=C=S           2           2           0   \n",
       "584                  CS(=O)CCCCC#N           4           1           0   \n",
       "585                      CSCCCCC#N           4           1           0   \n",
       "586                       C=CCSC#N           2           1           0   \n",
       "\n",
       "     APC2D1_C_S  APC2D1_C_P  APC2D1_C_F  ...  SubFPC303  SubFPC304  SubFPC305  \\\n",
       "0             0           0           0  ...          0          0          0   \n",
       "1             0           0           0  ...          0          0          0   \n",
       "2             1           0           0  ...          0          0          0   \n",
       "3             0           0           0  ...          0          0          0   \n",
       "4             0           0           0  ...          0          0          0   \n",
       "..          ...         ...         ...  ...        ...        ...        ...   \n",
       "582           3           0           0  ...          0          0          0   \n",
       "583           1           0           0  ...          0          0          0   \n",
       "584           2           0           0  ...          0          0          0   \n",
       "585           2           0           0  ...          0          0          0   \n",
       "586           2           0           0  ...          0          0          0   \n",
       "\n",
       "     SubFPC306  SubFPC307  bond:C=S_carbonyl_thio_generic  \\\n",
       "0            0          6                               0   \n",
       "1            0          6                               0   \n",
       "2            0          9                               0   \n",
       "3            0         13                               0   \n",
       "4            0          7                               0   \n",
       "..         ...        ...                             ...   \n",
       "582          0          0                               1   \n",
       "583          0          0                               1   \n",
       "584          0          1                               0   \n",
       "585          0          0                               0   \n",
       "586          0          1                               0   \n",
       "\n",
       "     bond:CN_amine_pri-NH2_aromatic  bond:CS_sulfide  \\\n",
       "0                                 1                0   \n",
       "1                                 1                0   \n",
       "2                                 0                1   \n",
       "3                                 0                0   \n",
       "4                                 0                0   \n",
       "..                              ...              ...   \n",
       "582                               0                1   \n",
       "583                               0                0   \n",
       "584                               0                0   \n",
       "585                               0                1   \n",
       "586                               0                1   \n",
       "\n",
       "     bond:S=O_sulfonyl_generic  ring:hetero_[6_6]_O_benzopyrone_(1_4-)  \n",
       "0                            0                                       0  \n",
       "1                            0                                       0  \n",
       "2                            0                                       0  \n",
       "3                            0                                       0  \n",
       "4                            0                                       0  \n",
       "..                         ...                                     ...  \n",
       "582                          0                                       0  \n",
       "583                          0                                       0  \n",
       "584                          0                                       0  \n",
       "585                          0                                       0  \n",
       "586                          0                                       0  \n",
       "\n",
       "[587 rows x 1096 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "APCFP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "target_bin = APCFP.loc[:, 'target_name_bin']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "target_bin = pd.DataFrame(target_bin)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "target_ter = APCFP.loc[:, 'target_name_ter']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "target_ter = pd.DataFrame(target_ter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "target_quater = APCFP.loc[:, 'target_name_quater']\n",
    "target_quater = pd.DataFrame(target_quater)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>target_name_ter</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>A</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>A</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>A</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>A</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>A</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>582</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>583</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>584</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>585</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>586</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>587 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    target_name_ter\n",
       "0                 A\n",
       "1                 A\n",
       "2                 A\n",
       "3                 A\n",
       "4                 A\n",
       "..              ...\n",
       "582               C\n",
       "583               C\n",
       "584               C\n",
       "585               C\n",
       "586               C\n",
       "\n",
       "[587 rows x 1 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "target_ter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>target_name_quater</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>A1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>A1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>A1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>A1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>A1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>582</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>583</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>584</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>585</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>586</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>587 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    target_name_quater\n",
       "0                   A1\n",
       "1                   A1\n",
       "2                   A1\n",
       "3                   A1\n",
       "4                   A1\n",
       "..                 ...\n",
       "582                  C\n",
       "583                  C\n",
       "584                  C\n",
       "585                  C\n",
       "586                  C\n",
       "\n",
       "[587 rows x 1 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "target_quater"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "features = APCFP.loc[:, 'APC2D1_C_C':'ring:hetero_[6_6]_O_benzopyrone_(1_4-)']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>APC2D1_C_C</th>\n",
       "      <th>APC2D1_C_N</th>\n",
       "      <th>APC2D1_C_O</th>\n",
       "      <th>APC2D1_C_S</th>\n",
       "      <th>APC2D1_C_P</th>\n",
       "      <th>APC2D1_C_F</th>\n",
       "      <th>APC2D1_C_Cl</th>\n",
       "      <th>APC2D1_C_Br</th>\n",
       "      <th>APC2D1_C_I</th>\n",
       "      <th>APC2D1_C_B</th>\n",
       "      <th>...</th>\n",
       "      <th>SubFPC303</th>\n",
       "      <th>SubFPC304</th>\n",
       "      <th>SubFPC305</th>\n",
       "      <th>SubFPC306</th>\n",
       "      <th>SubFPC307</th>\n",
       "      <th>bond:C=S_carbonyl_thio_generic</th>\n",
       "      <th>bond:CN_amine_pri-NH2_aromatic</th>\n",
       "      <th>bond:CS_sulfide</th>\n",
       "      <th>bond:S=O_sulfonyl_generic</th>\n",
       "      <th>ring:hetero_[6_6]_O_benzopyrone_(1_4-)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>7</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>10</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>582</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>583</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>584</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>585</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>586</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>587 rows × 1092 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     APC2D1_C_C  APC2D1_C_N  APC2D1_C_O  APC2D1_C_S  APC2D1_C_P  APC2D1_C_F  \\\n",
       "0             6           1           0           0           0           0   \n",
       "1             6           1           2           0           0           0   \n",
       "2             7           3           3           1           0           0   \n",
       "3            16           0           2           0           0           0   \n",
       "4            10           0           2           0           0           0   \n",
       "..          ...         ...         ...         ...         ...         ...   \n",
       "582           3           2           0           3           0           0   \n",
       "583           2           2           0           1           0           0   \n",
       "584           4           1           0           2           0           0   \n",
       "585           4           1           0           2           0           0   \n",
       "586           2           1           0           2           0           0   \n",
       "\n",
       "     APC2D1_C_Cl  APC2D1_C_Br  APC2D1_C_I  APC2D1_C_B  ...  SubFPC303  \\\n",
       "0              0            0           0           0  ...          0   \n",
       "1              0            0           0           0  ...          0   \n",
       "2              0            0           0           0  ...          0   \n",
       "3              0            0           0           0  ...          0   \n",
       "4              0            0           0           0  ...          0   \n",
       "..           ...          ...         ...         ...  ...        ...   \n",
       "582            0            0           0           0  ...          0   \n",
       "583            0            0           0           0  ...          0   \n",
       "584            0            0           0           0  ...          0   \n",
       "585            0            0           0           0  ...          0   \n",
       "586            0            0           0           0  ...          0   \n",
       "\n",
       "     SubFPC304  SubFPC305  SubFPC306  SubFPC307  \\\n",
       "0            0          0          0          6   \n",
       "1            0          0          0          6   \n",
       "2            0          0          0          9   \n",
       "3            0          0          0         13   \n",
       "4            0          0          0          7   \n",
       "..         ...        ...        ...        ...   \n",
       "582          0          0          0          0   \n",
       "583          0          0          0          0   \n",
       "584          0          0          0          1   \n",
       "585          0          0          0          0   \n",
       "586          0          0          0          1   \n",
       "\n",
       "     bond:C=S_carbonyl_thio_generic  bond:CN_amine_pri-NH2_aromatic  \\\n",
       "0                                 0                               1   \n",
       "1                                 0                               1   \n",
       "2                                 0                               0   \n",
       "3                                 0                               0   \n",
       "4                                 0                               0   \n",
       "..                              ...                             ...   \n",
       "582                               1                               0   \n",
       "583                               1                               0   \n",
       "584                               0                               0   \n",
       "585                               0                               0   \n",
       "586                               0                               0   \n",
       "\n",
       "     bond:CS_sulfide  bond:S=O_sulfonyl_generic  \\\n",
       "0                  0                          0   \n",
       "1                  0                          0   \n",
       "2                  1                          0   \n",
       "3                  0                          0   \n",
       "4                  0                          0   \n",
       "..               ...                        ...   \n",
       "582                1                          0   \n",
       "583                0                          0   \n",
       "584                0                          0   \n",
       "585                1                          0   \n",
       "586                1                          0   \n",
       "\n",
       "     ring:hetero_[6_6]_O_benzopyrone_(1_4-)  \n",
       "0                                         0  \n",
       "1                                         0  \n",
       "2                                         0  \n",
       "3                                         0  \n",
       "4                                         0  \n",
       "..                                      ...  \n",
       "582                                       0  \n",
       "583                                       0  \n",
       "584                                       0  \n",
       "585                                       0  \n",
       "586                                       0  \n",
       "\n",
       "[587 rows x 1092 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from imblearn.over_sampling import *\n",
    "import joblib\n",
    "from sklearn.ensemble import VotingClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# AtomPairCount_Binary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "seed=28\n",
    "X_train_bin, X_test_bin, y_train_bin, y_test_bin = train_test_split(features, target_bin, test_size=0.2, random_state=seed, stratify=target_bin)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hard Voting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "bin_rf_pca = joblib.load(\"Binary_APC_RF_PCA.pkl\")\n",
    "bin_xgb_pca = joblib.load(\"Binary_APC_XGB_PCA.pkl\")\n",
    "bin_ann_lda = joblib.load(\"Binary_APC_ANN_LDA.pkl\")\n",
    "bin_rf_lda = joblib.load(\"Binary_APC_RF_LDA.pkl\")\n",
    "\n",
    "vot_bin = VotingClassifier(estimators=[('rf_pca', bin_rf_pca),\n",
    "                                       ('xgb_pca', bin_xgb_pca),\n",
    "                                       ('ann_lda', bin_ann_lda),\n",
    "                                       ('rf_lda', bin_rf_lda)], voting='hard')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:   11.9s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   43.9s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.7min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  1.9min finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 300 candidates, totalling 1500 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    2.1s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:    6.4s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:   13.6s\n",
      "[Parallel(n_jobs=-1)]: Done 632 tasks      | elapsed:   24.5s\n",
      "[Parallel(n_jobs=-1)]: Done 997 tasks      | elapsed:   38.2s\n",
      "[Parallel(n_jobs=-1)]: Done 1442 tasks      | elapsed:   54.3s\n",
      "[Parallel(n_jobs=-1)]: Done 1500 out of 1500 | elapsed:   56.4s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 25 candidates, totalling 125 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:   18.8s\n",
      "[Parallel(n_jobs=-1)]: Done 125 out of 125 | elapsed: 42.3min finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    5.2s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   33.7s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.3min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  1.4min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('rf_pca',\n",
       "                              GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=28, shuffle=True),\n",
       "                                           error_score=nan,\n",
       "                                           estimator=Pipeline(memory=None,\n",
       "                                                              steps=[('std',\n",
       "                                                                      MinMaxScaler(copy=True,\n",
       "                                                                                   feature_range=(0,\n",
       "                                                                                                  1))),\n",
       "                                                                     ('thresholder',\n",
       "                                                                      VarianceThreshold(threshold=0.01)),\n",
       "                                                                     ('PCA',\n",
       "                                                                      PCA(copy=True,\n",
       "                                                                          iterated_power='auto',\n",
       "                                                                          n_components=None,\n",
       "                                                                          random_state=None,\n",
       "                                                                          svd...\n",
       "                                                                                             warm_start=False))],\n",
       "                                                              verbose=False),\n",
       "                                           iid='deprecated', n_jobs=-1,\n",
       "                                           param_grid=[{'LDA__n_components': [1,\n",
       "                                                                              2,\n",
       "                                                                              3],\n",
       "                                                        'classifier__max_depth': [5,\n",
       "                                                                                  10,\n",
       "                                                                                  20,\n",
       "                                                                                  40,\n",
       "                                                                                  80],\n",
       "                                                        'classifier__n_estimators': [200,\n",
       "                                                                                     400,\n",
       "                                                                                     800,\n",
       "                                                                                     1600,\n",
       "                                                                                     3200]}],\n",
       "                                           pre_dispatch='2*n_jobs', refit=True,\n",
       "                                           return_train_score=False,\n",
       "                                           scoring='f1_macro', verbose=2))],\n",
       "                 flatten_transform=True, n_jobs=None, voting='hard',\n",
       "                 weights=None)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vot_bin.fit(X_train_bin, y_train_bin.values.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_bin = vot_bin.predict(X_test_bin)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "f1 score (test): 0.6635\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics\n",
    "testscore_bin = metrics.f1_score(y_test_bin, pred_bin, average='macro')\n",
    "\n",
    "print(\"f1 score (test): {:.4f}\".format(testscore_bin))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "오차 행렬: \n",
      " [[89  8]\n",
      " [13  8]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "print(\"오차 행렬: \\n\", confusion_matrix(y_test_bin, pred_bin))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Binary_APC_Vot_hard.pkl']"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(vot_bin, \"Binary_APC_Vot_hard.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Soft Voting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "bin_rf_pca = joblib.load(\"Binary_APC_RF_PCA.pkl\")\n",
    "bin_xgb_pca = joblib.load(\"Binary_APC_XGB_PCA.pkl\")\n",
    "bin_ann_lda = joblib.load(\"Binary_APC_ANN_LDA.pkl\")\n",
    "bin_rf_lda = joblib.load(\"Binary_APC_RF_LDA.pkl\")\n",
    "\n",
    "vot_bin_soft = VotingClassifier(estimators=[('rf_pca', bin_rf_pca),\n",
    "                                            ('xgb_pca', bin_xgb_pca),\n",
    "                                            ('ann_lda', bin_ann_lda),\n",
    "                                            ('rf_lda', bin_rf_lda)], voting='soft')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    4.3s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   33.7s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.4min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  1.5min finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 300 candidates, totalling 1500 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    1.0s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:    4.9s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:   11.3s\n",
      "[Parallel(n_jobs=-1)]: Done 632 tasks      | elapsed:   20.2s\n",
      "[Parallel(n_jobs=-1)]: Done 997 tasks      | elapsed:   31.8s\n",
      "[Parallel(n_jobs=-1)]: Done 1442 tasks      | elapsed:   46.6s\n",
      "[Parallel(n_jobs=-1)]: Done 1500 out of 1500 | elapsed:   48.5s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 25 candidates, totalling 125 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:   17.9s\n",
      "[Parallel(n_jobs=-1)]: Done 125 out of 125 | elapsed: 42.1min finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    5.0s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   31.0s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.2min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  1.4min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('rf_pca',\n",
       "                              GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=28, shuffle=True),\n",
       "                                           error_score=nan,\n",
       "                                           estimator=Pipeline(memory=None,\n",
       "                                                              steps=[('std',\n",
       "                                                                      MinMaxScaler(copy=True,\n",
       "                                                                                   feature_range=(0,\n",
       "                                                                                                  1))),\n",
       "                                                                     ('thresholder',\n",
       "                                                                      VarianceThreshold(threshold=0.01)),\n",
       "                                                                     ('PCA',\n",
       "                                                                      PCA(copy=True,\n",
       "                                                                          iterated_power='auto',\n",
       "                                                                          n_components=None,\n",
       "                                                                          random_state=None,\n",
       "                                                                          svd...\n",
       "                                                                                             warm_start=False))],\n",
       "                                                              verbose=False),\n",
       "                                           iid='deprecated', n_jobs=-1,\n",
       "                                           param_grid=[{'LDA__n_components': [1,\n",
       "                                                                              2,\n",
       "                                                                              3],\n",
       "                                                        'classifier__max_depth': [5,\n",
       "                                                                                  10,\n",
       "                                                                                  20,\n",
       "                                                                                  40,\n",
       "                                                                                  80],\n",
       "                                                        'classifier__n_estimators': [200,\n",
       "                                                                                     400,\n",
       "                                                                                     800,\n",
       "                                                                                     1600,\n",
       "                                                                                     3200]}],\n",
       "                                           pre_dispatch='2*n_jobs', refit=True,\n",
       "                                           return_train_score=False,\n",
       "                                           scoring='f1_macro', verbose=2))],\n",
       "                 flatten_transform=True, n_jobs=None, voting='soft',\n",
       "                 weights=None)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vot_bin_soft.fit(X_train_bin, y_train_bin.values.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_bin_soft = vot_bin_soft.predict(X_test_bin)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "f1 score (test): 0.5623\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics\n",
    "testscore_bin_soft = metrics.f1_score(y_test_bin, pred_bin_soft, average='macro')\n",
    "\n",
    "print(\"f1 score (test): {:.4f}\".format(testscore_bin_soft))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "오차 행렬: \n",
      " [[75 22]\n",
      " [13  8]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "print(\"오차 행렬: \\n\", confusion_matrix(y_test_bin, pred_bin_soft))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Binary_APC_Vot_soft.pkl']"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(vot_bin_soft, \"Binary_APC_Vot_soft.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# AtomPairCount_Ternary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_ter, X_test_ter, y_train_ter, y_test_ter = train_test_split(features, target_ter, test_size=0.2, random_state=seed, stratify=target_ter)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hard Voting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "ter_xgb_lda = joblib.load(\"Ternary_APC_XGB_LDA.pkl\")\n",
    "ter_svm_lda = joblib.load(\"Ternary_APC_SVM_LDA.pkl\")\n",
    "ter_xgb_pca = joblib.load(\"Ternary_APC_XGB_PCA.pkl\")\n",
    "ter_rf_lda = joblib.load(\"Ternary_APC_RF_LDA.pkl\")\n",
    "\n",
    "vot_ter_hard = VotingClassifier(estimators=[('xgb_lda', ter_xgb_lda),\n",
    "                                            ('svm_lda', ter_svm_lda),\n",
    "                                            ('xgb_pca', ter_xgb_pca),\n",
    "                                            ('rf_lda', ter_rf_lda)], voting='hard')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 252 candidates, totalling 1260 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    7.8s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   12.9s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:   21.0s\n",
      "[Parallel(n_jobs=-1)]: Done 632 tasks      | elapsed:   33.3s\n",
      "[Parallel(n_jobs=-1)]: Done 997 tasks      | elapsed:   47.1s\n",
      "[Parallel(n_jobs=-1)]: Done 1260 out of 1260 | elapsed:   56.8s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 288 candidates, totalling 1440 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  34 tasks      | elapsed:    0.9s\n",
      "[Parallel(n_jobs=-1)]: Done 276 tasks      | elapsed:    6.2s\n",
      "[Parallel(n_jobs=-1)]: Done 682 tasks      | elapsed:   13.7s\n",
      "[Parallel(n_jobs=-1)]: Done 1248 tasks      | elapsed:   23.9s\n",
      "[Parallel(n_jobs=-1)]: Done 1440 out of 1440 | elapsed:   27.4s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 192 candidates, totalling 960 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  34 tasks      | elapsed:    1.3s\n",
      "[Parallel(n_jobs=-1)]: Done 276 tasks      | elapsed:    9.1s\n",
      "[Parallel(n_jobs=-1)]: Done 682 tasks      | elapsed:   22.3s\n",
      "[Parallel(n_jobs=-1)]: Done 960 out of 960 | elapsed:   32.9s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    4.3s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   34.0s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.3min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  1.5min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('xgb_lda',\n",
       "                              GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=28, shuffle=True),\n",
       "                                           error_score=nan,\n",
       "                                           estimator=Pipeline(memory=None,\n",
       "                                                              steps=[('std',\n",
       "                                                                      MinMaxScaler(copy=True,\n",
       "                                                                                   feature_range=(0,\n",
       "                                                                                                  1))),\n",
       "                                                                     ('thresholder',\n",
       "                                                                      VarianceThreshold(threshold=0.01)),\n",
       "                                                                     ('LDA',\n",
       "                                                                      LinearDiscriminantAnalysis(n_components=None,\n",
       "                                                                                                 priors=None,\n",
       "                                                                                                 shrinkage=None,\n",
       "                                                                                                 so...\n",
       "                                                                                             warm_start=False))],\n",
       "                                                              verbose=False),\n",
       "                                           iid='deprecated', n_jobs=-1,\n",
       "                                           param_grid=[{'LDA__n_components': [1,\n",
       "                                                                              2,\n",
       "                                                                              3],\n",
       "                                                        'classifier__max_depth': [5,\n",
       "                                                                                  10,\n",
       "                                                                                  20,\n",
       "                                                                                  40,\n",
       "                                                                                  80],\n",
       "                                                        'classifier__n_estimators': [200,\n",
       "                                                                                     400,\n",
       "                                                                                     800,\n",
       "                                                                                     1600,\n",
       "                                                                                     3200]}],\n",
       "                                           pre_dispatch='2*n_jobs', refit=True,\n",
       "                                           return_train_score=False,\n",
       "                                           scoring='f1_macro', verbose=2))],\n",
       "                 flatten_transform=True, n_jobs=None, voting='hard',\n",
       "                 weights=None)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vot_ter_hard.fit(X_train_ter, y_train_ter.values.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_ter_hard = vot_ter_hard.predict(X_test_ter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "f1 score (test): 0.4862\n"
     ]
    }
   ],
   "source": [
    "testscore_ter_hard = metrics.f1_score(y_test_ter, pred_ter_hard, average='macro')\n",
    "\n",
    "print(\"f1 score (test): {:.4f}\".format(testscore_ter_hard))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "오차 행렬: \n",
      " [[47 15  9]\n",
      " [12 10  4]\n",
      " [ 2 10  9]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "print(\"오차 행렬: \\n\", confusion_matrix(y_test_ter, pred_ter_hard))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Ternary_APC_Vot_hard.pkl']"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(vot_ter_hard, \"Ternary_APC_Vot_hard.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Soft Voting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "ter_xgb_lda = joblib.load(\"Ternary_APC_XGB_LDA.pkl\")\n",
    "ter_svm_lda = joblib.load(\"Ternary_APC_SVM_LDA.pkl\")\n",
    "ter_xgb_pca = joblib.load(\"Ternary_APC_XGB_PCA.pkl\")\n",
    "ter_rf_lda = joblib.load(\"Ternary_APC_RF_LDA.pkl\")\n",
    "\n",
    "vot_ter_soft = VotingClassifier(estimators=[('xgb_lda', ter_xgb_lda),\n",
    "                                            ('svm_lda', ter_svm_lda),\n",
    "                                            ('xgb_pca', ter_xgb_pca),\n",
    "                                            ('rf_lda', ter_rf_lda)], voting='soft')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 252 candidates, totalling 1260 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:   14.1s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   18.9s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:   26.9s\n",
      "[Parallel(n_jobs=-1)]: Done 632 tasks      | elapsed:   38.5s\n",
      "[Parallel(n_jobs=-1)]: Done 997 tasks      | elapsed:   53.3s\n",
      "[Parallel(n_jobs=-1)]: Done 1260 out of 1260 | elapsed:  1.1min finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 288 candidates, totalling 1440 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  34 tasks      | elapsed:    0.8s\n",
      "[Parallel(n_jobs=-1)]: Done 276 tasks      | elapsed:    5.3s\n",
      "[Parallel(n_jobs=-1)]: Done 682 tasks      | elapsed:   12.8s\n",
      "[Parallel(n_jobs=-1)]: Done 1248 tasks      | elapsed:   23.4s\n",
      "[Parallel(n_jobs=-1)]: Done 1440 out of 1440 | elapsed:   27.0s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 192 candidates, totalling 960 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  34 tasks      | elapsed:    1.5s\n",
      "[Parallel(n_jobs=-1)]: Done 276 tasks      | elapsed:    9.6s\n",
      "[Parallel(n_jobs=-1)]: Done 682 tasks      | elapsed:   23.3s\n",
      "[Parallel(n_jobs=-1)]: Done 960 out of 960 | elapsed:   34.4s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    4.2s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   34.1s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.4min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  1.5min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('xgb_lda',\n",
       "                              GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=28, shuffle=True),\n",
       "                                           error_score=nan,\n",
       "                                           estimator=Pipeline(memory=None,\n",
       "                                                              steps=[('std',\n",
       "                                                                      MinMaxScaler(copy=True,\n",
       "                                                                                   feature_range=(0,\n",
       "                                                                                                  1))),\n",
       "                                                                     ('thresholder',\n",
       "                                                                      VarianceThreshold(threshold=0.01)),\n",
       "                                                                     ('LDA',\n",
       "                                                                      LinearDiscriminantAnalysis(n_components=None,\n",
       "                                                                                                 priors=None,\n",
       "                                                                                                 shrinkage=None,\n",
       "                                                                                                 so...\n",
       "                                                                                             warm_start=False))],\n",
       "                                                              verbose=False),\n",
       "                                           iid='deprecated', n_jobs=-1,\n",
       "                                           param_grid=[{'LDA__n_components': [1,\n",
       "                                                                              2,\n",
       "                                                                              3],\n",
       "                                                        'classifier__max_depth': [5,\n",
       "                                                                                  10,\n",
       "                                                                                  20,\n",
       "                                                                                  40,\n",
       "                                                                                  80],\n",
       "                                                        'classifier__n_estimators': [200,\n",
       "                                                                                     400,\n",
       "                                                                                     800,\n",
       "                                                                                     1600,\n",
       "                                                                                     3200]}],\n",
       "                                           pre_dispatch='2*n_jobs', refit=True,\n",
       "                                           return_train_score=False,\n",
       "                                           scoring='f1_macro', verbose=2))],\n",
       "                 flatten_transform=True, n_jobs=None, voting='soft',\n",
       "                 weights=None)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vot_ter_soft.fit(X_train_ter, y_train_ter.values.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_ter_soft = vot_ter_soft.predict(X_test_ter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "f1 score (test): 0.4838\n"
     ]
    }
   ],
   "source": [
    "testscore_ter_soft = metrics.f1_score(y_test_ter, pred_ter_soft, average='macro')\n",
    "\n",
    "print(\"f1 score (test): {:.4f}\".format(testscore_ter_soft))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "오차 행렬: \n",
      " [[46 16  9]\n",
      " [13  9  4]\n",
      " [ 2  9 10]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "print(\"오차 행렬: \\n\", confusion_matrix(y_test_ter, pred_ter_soft))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Ternary_APC_Vot_soft.pkl']"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(vot_ter_soft, \"Ternary_APC_Vot_soft.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# APC_Quaternary(w/o SMOTE)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "seed=28\n",
    "X_train_quater, X_test_quater, y_train_quater, y_test_quater = train_test_split(features, target_quater, test_size=0.2, random_state=seed, stratify=target_quater)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hard Voting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "quater_svm_pca_smotx = joblib.load(\"Quaternary_APC_SVM_PCA_smotx.pkl\")\n",
    "quater_rf_pca_smotx = joblib.load(\"Quaternary_APC_RF_PCA_smotx.pkl\")\n",
    "quater_ann_pca_smotx = joblib.load(\"Quaternary_APC_ANN_PCA_smotx.pkl\")\n",
    "quater_ann_lda_smotx = joblib.load(\"Quaternary_APC_ANN_LDA_smotx.pkl\")\n",
    "\n",
    "vot_quater_smotx_hard = VotingClassifier(estimators=[('svm_pca', quater_svm_pca_smotx),\n",
    "                                                     ('rf_pca', quater_rf_pca_smotx),\n",
    "                                                     ('ann_pca', quater_ann_pca_smotx),\n",
    "                                                     ('ann_lda', quater_ann_lda_smotx)], voting='hard')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 288 candidates, totalling 1440 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  34 tasks      | elapsed:    0.6s\n",
      "[Parallel(n_jobs=-1)]: Done 276 tasks      | elapsed:    3.9s\n",
      "[Parallel(n_jobs=-1)]: Done 682 tasks      | elapsed:    9.5s\n",
      "[Parallel(n_jobs=-1)]: Done 1248 tasks      | elapsed:   17.2s\n",
      "[Parallel(n_jobs=-1)]: Done 1440 out of 1440 | elapsed:   20.0s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    3.8s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   30.9s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.3min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  1.4min finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 35 candidates, totalling 175 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:   47.4s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:  5.1min\n",
      "[Parallel(n_jobs=-1)]: Done 175 out of 175 | elapsed:  6.5min finished\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:470: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "  self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 35 candidates, totalling 175 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    3.7s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   20.5s\n",
      "[Parallel(n_jobs=-1)]: Done 175 out of 175 | elapsed:   29.7s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('svm_pca',\n",
       "                              GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=28, shuffle=True),\n",
       "                                           error_score=nan,\n",
       "                                           estimator=Pipeline(memory=None,\n",
       "                                                              steps=[('std',\n",
       "                                                                      MinMaxScaler(copy=True,\n",
       "                                                                                   feature_range=(0,\n",
       "                                                                                                  1))),\n",
       "                                                                     ('thresholder',\n",
       "                                                                      VarianceThreshold(threshold=0.01)),\n",
       "                                                                     ('PCA',\n",
       "                                                                      PCA(copy=True,\n",
       "                                                                          iterated_power='auto',\n",
       "                                                                          n_components=None,\n",
       "                                                                          random_state=None,\n",
       "                                                                          sv...\n",
       "                                                        'classifier__activation': ['relu'],\n",
       "                                                        'classifier__alpha': [0.005,\n",
       "                                                                              0.01,\n",
       "                                                                              0.05,\n",
       "                                                                              0.1,\n",
       "                                                                              0.5,\n",
       "                                                                              1,\n",
       "                                                                              5],\n",
       "                                                        'classifier__hidden_layer_sizes': [(10,),\n",
       "                                                                                           (10,\n",
       "                                                                                            10),\n",
       "                                                                                           (10,\n",
       "                                                                                            10,\n",
       "                                                                                            10),\n",
       "                                                                                           (10,\n",
       "                                                                                            10,\n",
       "                                                                                            10,\n",
       "                                                                                            10),\n",
       "                                                                                           (10,\n",
       "                                                                                            10,\n",
       "                                                                                            10,\n",
       "                                                                                            10,\n",
       "                                                                                            10)],\n",
       "                                                        'classifier__solver': ['sgd']}],\n",
       "                                           pre_dispatch='2*n_jobs', refit=True,\n",
       "                                           return_train_score=False,\n",
       "                                           scoring='f1_macro', verbose=2))],\n",
       "                 flatten_transform=True, n_jobs=None, voting='hard',\n",
       "                 weights=None)"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vot_quater_smotx_hard.fit(X_train_quater, y_train_quater.values.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_quater_smotx_hard = vot_quater_smotx_hard.predict(X_test_quater)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "f1 score (test): 0.4902\n"
     ]
    }
   ],
   "source": [
    "testscore_quater_smotx_hard = metrics.f1_score(y_test_quater, pred_quater_smotx_hard, average='macro')\n",
    "\n",
    "print(\"f1 score (test): {:.4f}\".format(testscore_quater_smotx_hard))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "오차 행렬: \n",
      " [[16  9  0  0]\n",
      " [ 7 29  5  5]\n",
      " [ 3 15  6  2]\n",
      " [ 0 12  0  9]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "print(\"오차 행렬: \\n\", confusion_matrix(y_test_quater, pred_quater_smotx_hard))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Quaternary_APC_Vot_hard_smotx.pkl']"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(vot_quater_smotx_hard, \"Quaternary_APC_Vot_hard_smotx.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Soft Voting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "quater_svm_pca_smotx = joblib.load(\"Quaternary_APC_SVM_PCA_smotx.pkl\")\n",
    "quater_rf_pca_smotx = joblib.load(\"Quaternary_APC_RF_PCA_smotx.pkl\")\n",
    "quater_ann_pca_smotx = joblib.load(\"Quaternary_APC_ANN_PCA_smotx.pkl\")\n",
    "quater_ann_lda_smotx = joblib.load(\"Quaternary_APC_ANN_LDA_smotx.pkl\")\n",
    "\n",
    "vot_quater_smotx_soft = VotingClassifier(estimators=[('svm_pca', quater_svm_pca_smotx),\n",
    "                                                     ('rf_pca', quater_rf_pca_smotx),\n",
    "                                                     ('ann_pca', quater_ann_pca_smotx),\n",
    "                                                     ('ann_lda', quater_ann_lda_smotx)], voting='soft')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 288 candidates, totalling 1440 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:   12.2s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   14.1s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:   17.3s\n",
      "[Parallel(n_jobs=-1)]: Done 632 tasks      | elapsed:   21.7s\n",
      "[Parallel(n_jobs=-1)]: Done 997 tasks      | elapsed:   27.3s\n",
      "[Parallel(n_jobs=-1)]: Done 1440 out of 1440 | elapsed:   34.0s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    3.9s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   31.2s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.3min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  1.4min finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 35 candidates, totalling 175 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:   46.5s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:  5.1min\n",
      "[Parallel(n_jobs=-1)]: Done 175 out of 175 | elapsed:  6.5min finished\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:470: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "  self.n_iter_ = _check_optimize_result(\"lbfgs\", opt_res, self.max_iter)\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 35 candidates, totalling 175 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    3.7s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   20.8s\n",
      "[Parallel(n_jobs=-1)]: Done 175 out of 175 | elapsed:   29.8s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('svm_pca',\n",
       "                              GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=28, shuffle=True),\n",
       "                                           error_score=nan,\n",
       "                                           estimator=Pipeline(memory=None,\n",
       "                                                              steps=[('std',\n",
       "                                                                      MinMaxScaler(copy=True,\n",
       "                                                                                   feature_range=(0,\n",
       "                                                                                                  1))),\n",
       "                                                                     ('thresholder',\n",
       "                                                                      VarianceThreshold(threshold=0.01)),\n",
       "                                                                     ('PCA',\n",
       "                                                                      PCA(copy=True,\n",
       "                                                                          iterated_power='auto',\n",
       "                                                                          n_components=None,\n",
       "                                                                          random_state=None,\n",
       "                                                                          sv...\n",
       "                                                        'classifier__activation': ['relu'],\n",
       "                                                        'classifier__alpha': [0.005,\n",
       "                                                                              0.01,\n",
       "                                                                              0.05,\n",
       "                                                                              0.1,\n",
       "                                                                              0.5,\n",
       "                                                                              1,\n",
       "                                                                              5],\n",
       "                                                        'classifier__hidden_layer_sizes': [(10,),\n",
       "                                                                                           (10,\n",
       "                                                                                            10),\n",
       "                                                                                           (10,\n",
       "                                                                                            10,\n",
       "                                                                                            10),\n",
       "                                                                                           (10,\n",
       "                                                                                            10,\n",
       "                                                                                            10,\n",
       "                                                                                            10),\n",
       "                                                                                           (10,\n",
       "                                                                                            10,\n",
       "                                                                                            10,\n",
       "                                                                                            10,\n",
       "                                                                                            10)],\n",
       "                                                        'classifier__solver': ['sgd']}],\n",
       "                                           pre_dispatch='2*n_jobs', refit=True,\n",
       "                                           return_train_score=False,\n",
       "                                           scoring='f1_macro', verbose=2))],\n",
       "                 flatten_transform=True, n_jobs=None, voting='soft',\n",
       "                 weights=None)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vot_quater_smotx_soft.fit(X_train_quater, y_train_quater.values.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_quater_smotx_soft = vot_quater_smotx_soft.predict(X_test_quater)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "f1 score (test): 0.4801\n"
     ]
    }
   ],
   "source": [
    "testscore_quater_smotx_soft = metrics.f1_score(y_test_quater, pred_quater_smotx_soft, average='macro')\n",
    "\n",
    "print(\"f1 score (test): {:.4f}\".format(testscore_quater_smotx_soft))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "오차 행렬: \n",
      " [[14 10  1  0]\n",
      " [ 7 29  5  5]\n",
      " [ 1 14  9  2]\n",
      " [ 1  9  4  7]]\n"
     ]
    }
   ],
   "source": [
    "print(\"오차 행렬: \\n\", confusion_matrix(y_test_quater, pred_quater_smotx_soft))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Quaternary_APC_Vot_soft_smotx.pkl']"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(vot_quater_smotx_soft, \"Quaternary_APC_Vot_soft_smotx.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RDKit_Quaternary (w/ SMOTE)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hard Voting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "quater_svm_pca_smot = joblib.load(\"Quaternary_APC_SVM_PCA_smot.pkl\")\n",
    "quater_ann_pca_smot = joblib.load(\"Quaternary_APC_ANN_PCA_smot.pkl\")\n",
    "quater_xgb_lda_smot = joblib.load(\"Quaternary_APC_XGB_LDA_smot.pkl\")\n",
    "quater_rf_pca_smot = joblib.load(\"Quaternary_APC_RF_PCA_smot.pkl\")\n",
    "\n",
    "vot_quater_smot_hard = VotingClassifier(estimators=[('svm_pca', quater_svm_pca_smot),\n",
    "                                                    ('ann_pca', quater_ann_pca_smot),\n",
    "                                                    ('xgb_pca', quater_xgb_lda_smot),\n",
    "                                                    ('rf_pca', quater_rf_pca_smot)], voting='hard')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 288 candidates, totalling 1440 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    7.0s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:    9.5s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:   14.5s\n",
      "[Parallel(n_jobs=-1)]: Done 632 tasks      | elapsed:   21.7s\n",
      "[Parallel(n_jobs=-1)]: Done 997 tasks      | elapsed:   29.9s\n",
      "[Parallel(n_jobs=-1)]: Done 1440 out of 1440 | elapsed:   39.9s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 35 candidates, totalling 175 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:  1.7min\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:  8.7min\n",
      "[Parallel(n_jobs=-1)]: Done 175 out of 175 | elapsed: 10.1min finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 405 candidates, totalling 2025 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    6.4s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   28.3s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.1min\n",
      "[Parallel(n_jobs=-1)]: Done 632 tasks      | elapsed:  2.0min\n",
      "[Parallel(n_jobs=-1)]: Done 997 tasks      | elapsed:  3.3min\n",
      "[Parallel(n_jobs=-1)]: Done 1442 tasks      | elapsed:  4.8min\n",
      "[Parallel(n_jobs=-1)]: Done 1969 tasks      | elapsed:  6.7min\n",
      "[Parallel(n_jobs=-1)]: Done 2025 out of 2025 | elapsed:  6.9min finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    5.2s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   44.0s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.8min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  2.0min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('svm_pca',\n",
       "                              GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=28, shuffle=True),\n",
       "                                           error_score=nan,\n",
       "                                           estimator=Pipeline(memory=None,\n",
       "                                                              steps=[('std',\n",
       "                                                                      MinMaxScaler(copy=True,\n",
       "                                                                                   feature_range=(0,\n",
       "                                                                                                  1))),\n",
       "                                                                     ('thresholder',\n",
       "                                                                      VarianceThreshold(threshold=0.01)),\n",
       "                                                                     ('PCA',\n",
       "                                                                      PCA(copy=True,\n",
       "                                                                          iterated_power='auto',\n",
       "                                                                          n_components=None,\n",
       "                                                                          random_state=None,\n",
       "                                                                          sv...\n",
       "                                                                                             warm_start=False))],\n",
       "                                                              verbose=False),\n",
       "                                           iid='deprecated', n_jobs=-1,\n",
       "                                           param_grid=[{'PCA__n_components': [1,\n",
       "                                                                              2,\n",
       "                                                                              3],\n",
       "                                                        'classifier__max_depth': [5,\n",
       "                                                                                  10,\n",
       "                                                                                  20,\n",
       "                                                                                  40,\n",
       "                                                                                  80],\n",
       "                                                        'classifier__n_estimators': [200,\n",
       "                                                                                     400,\n",
       "                                                                                     800,\n",
       "                                                                                     1600,\n",
       "                                                                                     3200]}],\n",
       "                                           pre_dispatch='2*n_jobs', refit=True,\n",
       "                                           return_train_score=False,\n",
       "                                           scoring='f1_macro', verbose=2))],\n",
       "                 flatten_transform=True, n_jobs=None, voting='hard',\n",
       "                 weights=None)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vot_quater_smot_hard.fit(X_train_quater, y_train_quater.values.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_quater_smot_hard = vot_quater_smot_hard.predict(X_test_quater)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "f1 score (test): 0.5026\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics\n",
    "testscore_quater_smot_hard = metrics.f1_score(y_test_quater, pred_quater_smot_hard, average='macro')\n",
    "\n",
    "print(\"f1 score (test): {:.4f}\".format(testscore_quater_smot_hard))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "오차 행렬: \n",
      " [[16  6  2  1]\n",
      " [ 6 22 11  7]\n",
      " [ 2  8 10  6]\n",
      " [ 0  7  3 11]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "print(\"오차 행렬: \\n\", confusion_matrix(y_test_quater, pred_quater_smot_hard))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Quaternary_APC_Vot_hard_smot.pkl']"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(vot_quater_smot_hard, \"Quaternary_APC_Vot_hard_smot.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Soft Voting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "quater_svm_pca_smot = joblib.load(\"Quaternary_APC_SVM_PCA_smot.pkl\")\n",
    "quater_ann_pca_smot = joblib.load(\"Quaternary_APC_ANN_PCA_smot.pkl\")\n",
    "quater_xgb_lda_smot = joblib.load(\"Quaternary_APC_XGB_LDA_smot.pkl\")\n",
    "quater_rf_pca_smot = joblib.load(\"Quaternary_APC_RF_PCA_smot.pkl\")\n",
    "\n",
    "vot_quater_smot_soft = VotingClassifier(estimators=[('svm_pca', quater_svm_pca_smot),\n",
    "                                                    ('ann_pca', quater_ann_pca_smot),\n",
    "                                                    ('xgb_pca', quater_xgb_lda_smot),\n",
    "                                                    ('rf_pca', quater_rf_pca_smot)], voting='soft')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 288 candidates, totalling 1440 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    8.4s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   11.1s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:   15.5s\n",
      "[Parallel(n_jobs=-1)]: Done 632 tasks      | elapsed:   21.9s\n",
      "[Parallel(n_jobs=-1)]: Done 997 tasks      | elapsed:   30.8s\n",
      "[Parallel(n_jobs=-1)]: Done 1440 out of 1440 | elapsed:   41.4s finished\n",
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 35 candidates, totalling 175 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:  1.6min\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:  8.5min\n",
      "[Parallel(n_jobs=-1)]: Done 175 out of 175 | elapsed:  9.9min finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 405 candidates, totalling 2025 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    7.1s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   31.2s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.2min\n",
      "[Parallel(n_jobs=-1)]: Done 632 tasks      | elapsed:  2.2min\n",
      "[Parallel(n_jobs=-1)]: Done 997 tasks      | elapsed:  3.6min\n",
      "[Parallel(n_jobs=-1)]: Done 1442 tasks      | elapsed:  4.9min\n",
      "[Parallel(n_jobs=-1)]: Done 1969 tasks      | elapsed:  6.6min\n",
      "[Parallel(n_jobs=-1)]: Done 2025 out of 2025 | elapsed:  6.8min finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 75 candidates, totalling 375 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed:    4.1s\n",
      "[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed:   35.6s\n",
      "[Parallel(n_jobs=-1)]: Done 349 tasks      | elapsed:  1.4min\n",
      "[Parallel(n_jobs=-1)]: Done 375 out of 375 | elapsed:  1.6min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('svm_pca',\n",
       "                              GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=28, shuffle=True),\n",
       "                                           error_score=nan,\n",
       "                                           estimator=Pipeline(memory=None,\n",
       "                                                              steps=[('std',\n",
       "                                                                      MinMaxScaler(copy=True,\n",
       "                                                                                   feature_range=(0,\n",
       "                                                                                                  1))),\n",
       "                                                                     ('thresholder',\n",
       "                                                                      VarianceThreshold(threshold=0.01)),\n",
       "                                                                     ('PCA',\n",
       "                                                                      PCA(copy=True,\n",
       "                                                                          iterated_power='auto',\n",
       "                                                                          n_components=None,\n",
       "                                                                          random_state=None,\n",
       "                                                                          sv...\n",
       "                                                                                             warm_start=False))],\n",
       "                                                              verbose=False),\n",
       "                                           iid='deprecated', n_jobs=-1,\n",
       "                                           param_grid=[{'PCA__n_components': [1,\n",
       "                                                                              2,\n",
       "                                                                              3],\n",
       "                                                        'classifier__max_depth': [5,\n",
       "                                                                                  10,\n",
       "                                                                                  20,\n",
       "                                                                                  40,\n",
       "                                                                                  80],\n",
       "                                                        'classifier__n_estimators': [200,\n",
       "                                                                                     400,\n",
       "                                                                                     800,\n",
       "                                                                                     1600,\n",
       "                                                                                     3200]}],\n",
       "                                           pre_dispatch='2*n_jobs', refit=True,\n",
       "                                           return_train_score=False,\n",
       "                                           scoring='f1_macro', verbose=2))],\n",
       "                 flatten_transform=True, n_jobs=None, voting='soft',\n",
       "                 weights=None)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vot_quater_smot_soft.fit(X_train_quater, y_train_quater.values.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_quater_smot_soft = vot_quater_smot_soft.predict(X_test_quater)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "f1 score (test): 0.5217\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics\n",
    "testscore_quater_smot_soft = metrics.f1_score(y_test_quater, pred_quater_smot_soft, average='macro')\n",
    "\n",
    "print(\"f1 score (test): {:.4f}\".format(testscore_quater_smot_soft))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "오차 행렬: \n",
      " [[16  6  2  1]\n",
      " [ 5 22  9 10]\n",
      " [ 2  9 10  5]\n",
      " [ 0  5  3 13]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "print(\"오차 행렬: \\n\", confusion_matrix(y_test_quater, pred_quater_smot_soft))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Quaternary_APC_Vot_soft_smot.pkl']"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(vot_quater_smot_soft, \"Quaternary_APC_Vot_soft_smot.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
