{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Test Gridsearch\n",
    "with different kernels and different configurations"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Setup\n",
    "Uncomment the next cell if STree is not already installed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#\n",
    "# Google Colab setup\n",
    "#\n",
    "#!pip install git+https://github.com/doctorado-ml/stree\n",
    "!pip install pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "zIHKVxthDZEa"
   },
   "outputs": [],
   "source": [
    "import random\n",
    "import os\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.model_selection import GridSearchCV, train_test_split\n",
    "from stree import Stree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "IEmq50QgDZEi"
   },
   "outputs": [],
   "source": [
    "if not os.path.isfile('data/creditcard.csv'):\n",
    "    !wget --no-check-certificate --content-disposition http://nube.jccm.es/index.php/s/Zs7SYtZQJ3RQ2H2/download\n",
    "    !tar xzf creditcard.tgz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "z9Q-YUfBDZEq",
    "outputId": "afc822fb-f16a-4302-8a67-2b9e2880159b",
    "tags": []
   },
   "outputs": [],
   "source": [
    "random_state=1\n",
    "\n",
    "def load_creditcard(n_examples=0):\n",
    "    df = pd.read_csv('data/creditcard.csv')\n",
    "    print(\"Fraud: {0:.3f}% {1}\".format(df.Class[df.Class == 1].count()*100/df.shape[0], df.Class[df.Class == 1].count()))\n",
    "    print(\"Valid: {0:.3f}% {1}\".format(df.Class[df.Class == 0].count()*100/df.shape[0], df.Class[df.Class == 0].count()))\n",
    "    y = df.Class\n",
    "    X = df.drop(['Class', 'Time', 'Amount'], axis=1).values\n",
    "    if n_examples > 0:\n",
    "        # Take first n_examples samples\n",
    "        X = X[:n_examples, :]\n",
    "        y = y[:n_examples, :]\n",
    "    else:\n",
    "        # Take all the positive samples with a number of random negatives\n",
    "        if n_examples < 0:\n",
    "            Xt = X[(y == 1).ravel()]\n",
    "            yt = y[(y == 1).ravel()]\n",
    "            indices = random.sample(range(X.shape[0]), -1 * n_examples)\n",
    "            X = np.append(Xt, X[indices], axis=0)\n",
    "            y = np.append(yt, y[indices], axis=0)\n",
    "    print(\"X.shape\", X.shape, \" y.shape\", y.shape)\n",
    "    print(\"Fraud: {0:.3f}% {1}\".format(len(y[y == 1])*100/X.shape[0], len(y[y == 1])))\n",
    "    print(\"Valid: {0:.3f}% {1}\".format(len(y[y == 0]) * 100 / X.shape[0], len(y[y == 0])))\n",
    "    Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, train_size=0.7, shuffle=True, random_state=random_state, stratify=y)\n",
    "    return Xtrain, Xtest, ytrain, ytest\n",
    "\n",
    "data = load_creditcard(-1000) # Take all true samples + 1000 of the others\n",
    "# data = load_creditcard(5000)  # Take the first 5000 samples\n",
    "# data = load_creditcard(0) # Take all the samples\n",
    "\n",
    "Xtrain = data[0]\n",
    "Xtest = data[1]\n",
    "ytrain = data[2]\n",
    "ytest = data[3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tests"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "HmX3kR4PDZEw"
   },
   "outputs": [],
   "source": [
    "parameters = [{\n",
    "    'base_estimator': [Stree(random_state=random_state)],\n",
    "    'n_estimators': [10, 25],\n",
    "    'learning_rate': [.5, 1],\n",
    "    'base_estimator__split_criteria': ['max_samples', 'impurity'],\n",
    "    'base_estimator__tol': [.1,  1e-02],\n",
    "    'base_estimator__max_depth': [3, 5, 7],\n",
    "    'base_estimator__C': [1, 7, 55],\n",
    "    'base_estimator__kernel': ['linear']\n",
    "},\n",
    "{\n",
    "    'base_estimator': [Stree(random_state=random_state)],\n",
    "    'n_estimators': [10, 25],\n",
    "    'learning_rate': [.5, 1],\n",
    "    'base_estimator__split_criteria': ['max_samples', 'impurity'],\n",
    "    'base_estimator__tol': [.1,  1e-02],\n",
    "    'base_estimator__max_depth': [3, 5, 7],\n",
    "    'base_estimator__C': [1, 7, 55],\n",
    "    'base_estimator__degree': [3, 5, 7],\n",
    "    'base_estimator__kernel': ['poly']\n",
    "},\n",
    "{\n",
    "    'base_estimator': [Stree(random_state=random_state)],\n",
    "    'n_estimators': [10, 25],\n",
    "    'learning_rate': [.5, 1],\n",
    "    'base_estimator__split_criteria': ['max_samples', 'impurity'],\n",
    "    'base_estimator__tol': [.1,  1e-02],\n",
    "    'base_estimator__max_depth': [3, 5, 7],\n",
    "    'base_estimator__C': [1, 7, 55],\n",
    "    'base_estimator__gamma': [.1, 1, 10],\n",
    "    'base_estimator__kernel': ['rbf']\n",
    "}]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Stree().get_params()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "CrcB8o6EDZE5",
    "outputId": "7703413a-d563-4289-a13b-532f38f82762",
    "tags": []
   },
   "outputs": [],
   "source": [
    "clf = AdaBoostClassifier(random_state=random_state, algorithm=\"SAMME\")\n",
    "grid = GridSearchCV(clf, parameters, verbose=5, n_jobs=-1, return_train_score=True)\n",
    "grid.fit(Xtrain, ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "ZjX88NoYDZE8",
    "outputId": "285163c8-fa33-4915-8ae7-61c4f7844344",
    "tags": []
   },
   "outputs": [],
   "source": [
    "print(\"Best estimator: \", grid.best_estimator_)\n",
    "print(\"Best hyperparameters: \", grid.best_params_)\n",
    "print(\"Best accuracy: \", grid.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Best estimator:  AdaBoostClassifier(algorithm='SAMME',\n",
    "                   base_estimator=Stree(C=55, max_depth=7, random_state=1,\n",
    "                                        split_criteria='max_samples', tol=0.1),\n",
    "                   learning_rate=0.5, n_estimators=25, random_state=1)\n",
    "Best hyperparameters:  {'base_estimator': Stree(C=55, max_depth=7, random_state=1, split_criteria='max_samples', tol=0.1), 'base_estimator__C': 55, 'base_estimator__kernel': 'linear', 'base_estimator__max_depth': 7, 'base_estimator__split_criteria': 'max_samples', 'base_estimator__tol': 0.1, 'learning_rate': 0.5, 'n_estimators': 25}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Best accuracy:  0.9511777695988222"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "name": "gridsearch.ipynb",
   "provenance": []
  },
  "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.2-final"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}