{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "7dace94e",
   "metadata": {},
   "source": [
    "Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "6102776a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import time\n",
    "\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.feature_selection import RFECV\n",
    "from sklearn.model_selection import StratifiedKFold, train_test_split"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "224fc386",
   "metadata": {},
   "source": [
    "Load data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "11248f30",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_pickle(\"../data/cleaned/NSDUH_2023_clean.pkl\")\n",
    "\n",
    "TARGET = \"IRAMDEYR\"\n",
    "WEIGHT = \"ANALWT2_C\"   # drop it for feature selection\n",
    "\n",
    "y = df[TARGET]\n",
    "X = df.drop(columns=[TARGET, WEIGHT])\n",
    "\n",
    "# Ensure numeric\n",
    "X = X.apply(pd.to_numeric, errors=\"coerce\").fillna(0)\n",
    "\n",
    "feature_names = X.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a274b58",
   "metadata": {},
   "source": [
    "Train/Test split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "061f6a2a",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y,\n",
    "    test_size=0.2,\n",
    "    stratify=y,\n",
    "    random_state=42\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d16dd2b",
   "metadata": {},
   "source": [
    "Scale"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "57b77d13",
   "metadata": {},
   "outputs": [],
   "source": [
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train)\n",
    "X_test_scaled = scaler.transform(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8325008",
   "metadata": {},
   "source": [
    "Define logistic regression estimator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "bdd46bc2",
   "metadata": {},
   "outputs": [],
   "source": [
    "estimator = LogisticRegression(\n",
    "    penalty=\"l2\",\n",
    "    solver=\"lbfgs\",\n",
    "    max_iter=2000,\n",
    "    n_jobs=-1\n",
    ")\n",
    "\n",
    "cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db531ffb",
   "metadata": {},
   "source": [
    "Run RFECV (AUC)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "7b9c1c4f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting RFECV (AUC)\n",
      "RFECV-AUC completed in 4.70 minutes\n"
     ]
    }
   ],
   "source": [
    "print(\"Starting RFECV (AUC)\")\n",
    "start = time.time()\n",
    "\n",
    "rfecv_auc = RFECV(\n",
    "    estimator=estimator,\n",
    "    step=0.2,\n",
    "    cv=cv,\n",
    "    scoring=\"roc_auc\",\n",
    "    n_jobs=1\n",
    ")\n",
    "\n",
    "rfecv_auc.fit(X_train_scaled, y_train)\n",
    "\n",
    "print(f\"RFECV-AUC completed in {(time.time() - start)/60:.2f} minutes\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f749b40f",
   "metadata": {},
   "source": [
    "Extract and Save RFECV-AUC results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "6c47f380",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved: rfecv_auc_top100.csv\n",
      "\n",
      "Top 100 RFECV-AUC features:\n",
      "PREGAGE2\n",
      "CATAG7\n",
      "CATAGE\n",
      "IIEDUHIGHST2\n",
      "IREDUHIGHST2\n",
      "IRMARIT\n",
      "IRSEX\n",
      "COCLALCUSE\n",
      "GRSKCOCMON\n",
      "GRSKMRJWK\n",
      "RKFQPBLT\n",
      "RSKYFQTES\n",
      "RSKYFQDGR\n",
      "DIFGETHER\n",
      "DIFGETCRK\n",
      "RSKBNGWK\n",
      "SYNMRJFLAG\n",
      "MILTSPPAR\n",
      "EDUHIGHCAT\n",
      "SEXAGE\n",
      "DRVINDETAG\n",
      "COMHAPTDL\n",
      "COMHTELE\n",
      "COFINANC\n",
      "COCLDRGUSE\n",
      "COMHTELE2\n",
      "COHCTELE2\n",
      "AGE3\n",
      "COHCRXDL2\n",
      "COHCSVHLT2\n",
      "COMHAPTDL2\n",
      "ILIMFOTHYR\n",
      "IISYNSTMREC\n",
      "IISYNMRJREC\n",
      "WRKOKRAND\n",
      "WRKOKPREH\n",
      "WRKTSTDRG\n",
      "WRKTSTALC\n",
      "WRKDRGHLP\n",
      "WRKDRGEDU\n",
      "MJDABYR\n",
      "MJSMKYR\n",
      "CIGYR\n",
      "MJCMOTHMON\n",
      "MJSKNMON\n",
      "WRKSICKMO\n",
      "WRKNUMJOB2\n",
      "WRKSELFEM\n",
      "IIHH65_2\n",
      "IRHH65_2\n",
      "IIKI17_2\n",
      "IRKI17_2\n",
      "EDFAM18\n",
      "KRATOMYR\n",
      "RCVYSUBPRB\n",
      "CASUPROB2\n",
      "MJMTHMON\n",
      "DAMTFXMON\n",
      "ECSTMOMON\n",
      "LSDMON\n",
      "HALLUCMON\n",
      "IRTRQNMAGE\n",
      "IRTRQNMYFU\n",
      "IIIMFREC\n",
      "SYNSTMREC\n",
      "SYNSTMEVR\n",
      "KRATREC\n",
      "CAMHRCVR\n",
      "CAMHPROB\n",
      "CASURCVR\n",
      "HLTINMNT\n",
      "CHAMPUS\n",
      "IISTMNMINIT\n",
      "IITRQNMINIT\n",
      "SALVIAMON\n",
      "KETMINYR\n",
      "OXYCNNMYR\n",
      "CNSANYYR\n",
      "PSYANYYR\n",
      "PRXYDATA\n",
      "IIKRATREC\n",
      "IMFNDLEVER\n",
      "CNSNMYR\n",
      "MESCEVER\n",
      "PEYOTEEVER\n",
      "ILLALCFLG\n",
      "ILLORALC\n",
      "ILTOBVAPALC\n",
      "ILTOBALCFG\n",
      "IIECSTMOYFU\n",
      "PSYCHFLAG\n",
      "CDCGMO\n",
      "ILLEMMON\n",
      "ILLEMFLAG\n",
      "MJONLYFLAG\n",
      "IMFEVER\n",
      "HVYDRKMON\n",
      "BNGDRKMON\n",
      "CDNOCGMO\n",
      "IRCD2YFU\n"
     ]
    }
   ],
   "source": [
    "# RFECV ranking_: 1 = selected, 2 = next-best, etc.\n",
    "auc_ranks = pd.Series(rfecv_auc.ranking_, index=feature_names)\n",
    "\n",
    "# Top 100 lowest-ranked features\n",
    "top100_auc = auc_ranks.sort_values().head(100).index.tolist()\n",
    "\n",
    "pd.Series(top100_auc).to_csv(\"../results/rfecv_auc_top100.csv\", index=False)\n",
    "\n",
    "print(\"Saved: rfecv_auc_top100.csv\")\n",
    "print(\"\\nTop 100 RFECV-AUC features:\")\n",
    "for f in top100_auc:\n",
    "    print(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "daca2433",
   "metadata": {},
   "source": [
    "Run RFECV (Recall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "9b68702d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting RFECV (Recall)\n",
      "RFECV-Recall completed in 3.98 minutes\n"
     ]
    }
   ],
   "source": [
    "print(\"Starting RFECV (Recall)\")\n",
    "start = time.time()\n",
    "\n",
    "rfecv_recall = RFECV(\n",
    "    estimator=estimator,\n",
    "    step=0.2,\n",
    "    cv=cv,\n",
    "    scoring=\"recall\",\n",
    "    n_jobs=1\n",
    ")\n",
    "\n",
    "rfecv_recall.fit(X_train_scaled, y_train)\n",
    "\n",
    "print(f\"RFECV-Recall completed in {(time.time() - start)/60:.2f} minutes\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81d6f394",
   "metadata": {},
   "source": [
    "Extract and Save RFECV-Recall"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "d31ce3b9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved: rfecv_recall_top100.csv\n",
      "\n",
      "Top 100 RFECV-Recall features:\n",
      "PREGAGE2\n",
      "CATAG7\n",
      "CATAGE\n",
      "IIEDUHIGHST2\n",
      "IREDUHIGHST2\n",
      "IRMARIT\n",
      "IRSEX\n",
      "COCLALCUSE\n",
      "GRSKCOCMON\n",
      "GRSKMRJWK\n",
      "RKFQPBLT\n",
      "RSKYFQTES\n",
      "RSKYFQDGR\n",
      "DIFGETHER\n",
      "DIFGETCRK\n",
      "RSKBNGWK\n",
      "SYNMRJFLAG\n",
      "MILTSPPAR\n",
      "EDUHIGHCAT\n",
      "SEXAGE\n",
      "DRVINDETAG\n",
      "COMHAPTDL\n",
      "COMHTELE\n",
      "COFINANC\n",
      "COCLDRGUSE\n",
      "COMHTELE2\n",
      "COHCTELE2\n",
      "AGE3\n",
      "COHCRXDL2\n",
      "COHCSVHLT2\n",
      "COMHAPTDL2\n",
      "ILIMFOTHYR\n",
      "IISYNSTMREC\n",
      "IISYNMRJREC\n",
      "WRKOKRAND\n",
      "WRKOKPREH\n",
      "WRKTSTDRG\n",
      "WRKTSTALC\n",
      "WRKDRGHLP\n",
      "WRKDRGEDU\n",
      "MJDABYR\n",
      "MJSMKYR\n",
      "CIGYR\n",
      "MJCMOTHMON\n",
      "MJSKNMON\n",
      "WRKSICKMO\n",
      "WRKNUMJOB2\n",
      "WRKSELFEM\n",
      "IIHH65_2\n",
      "IRHH65_2\n",
      "IIKI17_2\n",
      "IRKI17_2\n",
      "EDFAM18\n",
      "KRATOMYR\n",
      "RCVYSUBPRB\n",
      "CASUPROB2\n",
      "MJMTHMON\n",
      "DAMTFXMON\n",
      "ECSTMOMON\n",
      "LSDMON\n",
      "HALLUCMON\n",
      "IRTRQNMAGE\n",
      "IRTRQNMYFU\n",
      "IIIMFREC\n",
      "SYNSTMREC\n",
      "SYNSTMEVR\n",
      "KRATREC\n",
      "CAMHRCVR\n",
      "CAMHPROB\n",
      "CASURCVR\n",
      "HLTINMNT\n",
      "CHAMPUS\n",
      "IISTMNMINIT\n",
      "IITRQNMINIT\n",
      "SALVIAMON\n",
      "KETMINYR\n",
      "OXYCNNMYR\n",
      "CNSANYYR\n",
      "PSYANYYR\n",
      "PRXYDATA\n",
      "IIKRATREC\n",
      "IMFNDLEVER\n",
      "CNSNMYR\n",
      "MESCEVER\n",
      "PEYOTEEVER\n",
      "ILLALCFLG\n",
      "ILLORALC\n",
      "ILTOBVAPALC\n",
      "ILTOBALCFG\n",
      "IIECSTMOYFU\n",
      "PSYCHFLAG\n",
      "CDCGMO\n",
      "ILLEMMON\n",
      "ILLEMFLAG\n",
      "MJONLYFLAG\n",
      "IMFEVER\n",
      "HVYDRKMON\n",
      "BNGDRKMON\n",
      "CDNOCGMO\n",
      "IRCD2YFU\n"
     ]
    }
   ],
   "source": [
    "recall_ranks = pd.Series(rfecv_recall.ranking_, index=feature_names)\n",
    "\n",
    "# Top 100 lowest-ranked ranked features\n",
    "top100_recall = recall_ranks.sort_values().head(100).index.tolist()\n",
    "\n",
    "pd.Series(top100_recall).to_csv(\"../results/rfecv_recall_top100.csv\", index=False)\n",
    "\n",
    "print(\"Saved: rfecv_recall_top100.csv\")\n",
    "print(\"\\nTop 100 RFECV-Recall features:\")\n",
    "for f in top100_recall:\n",
    "    print(f)"
   ]
  }
 ],
 "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.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
