{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Basic usage example of `DupleBalanceClassifier`\n\nThis example shows the basic usage of :class:`duplebalance.DupleBalanceClassifier`.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "print(__doc__)\n\nRANDOM_STATE = 42"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Preparation\nFirst, we will import necessary packages and generate an example\nmulti-class imbalanced dataset.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "from duplebalance import DupleBalanceClassifier\nfrom duplebalance.base import sort_dict_by_key\nfrom duplebalance.utils._plot import plot_2Dprojection_and_cardinality\n\nfrom collections import Counter\nimport matplotlib.pyplot as plt\n\nfrom sklearn.decomposition import KernelPCA\nfrom sklearn.datasets import make_classification\nfrom sklearn.model_selection import train_test_split"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Make a 5-class imbalanced classification task\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "X, y = make_classification(n_classes=5, class_sep=1, # 3-class\n    weights=[0.05, 0.05, 0.15, 0.25, 0.5], n_informative=10, n_redundant=1, flip_y=0,\n    n_features=20, n_clusters_per_class=1, n_samples=2000, random_state=0)\n\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)\n\norigin_distr = sort_dict_by_key(Counter(y_train))\ntest_distr = sort_dict_by_key(Counter(y_test))\nprint('Original training dataset shape %s' % origin_distr)\nprint('Original test dataset shape %s' % test_distr)\n\n# Visualize the dataset\nprojection = KernelPCA(n_components=2).fit(X, y)\nfig = plot_2Dprojection_and_cardinality(X, y, projection=projection)\nplt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Train a DupleBalance Classifier\nBasic usage of DupleBalanceClassifier\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Train a DupleBalanceClassifier\nclf = DupleBalanceClassifier(\n    n_estimators=5,\n    random_state=RANDOM_STATE,\n).fit(X_train, y_train)\n\n# Predict & Evaluate\nscore = clf.score(X_test, y_test)\nprint (\"DupleBalance {} | Balanced AUROC: {:.3f} | #Training Samples: {:d}\".format(\n    len(clf.estimators_), score, sum(clf.estimators_n_training_samples_)\n    ))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Train DupleBalanceClassifier with automatic parameter tuning\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Train a DupleBalanceClassifier\nclf = DupleBalanceClassifier(\n    n_estimators=5,\n    random_state=RANDOM_STATE,\n).fit(\n    X_train, y_train,\n    perturb_alpha='auto',\n)\n\n# Predict & Evaluate\nscore = clf.score(X_test, y_test)\nprint (\"DupleBalance {} | Balanced AUROC: {:.3f} | #Training Samples: {:d}\".format(\n    len(clf.estimators_), score, sum(clf.estimators_n_training_samples_)\n    ))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Train DupleBalanceClassifier with advanced training log\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Train a DupleBalanceClassifier\nclf = DupleBalanceClassifier(\n    n_estimators=5,\n    random_state=RANDOM_STATE,\n).fit(\n    X_train, y_train,\n    perturb_alpha='auto',\n    eval_datasets={'test': (X_test, y_test)},\n    train_verbose={\n        'granularity': 1,\n        'print_distribution': True,\n        'print_metrics': True,\n    },\n)\n\n# Predict & Evaluate\nscore = clf.score(X_test, y_test)\nprint (\"DupleBalance {} | Balanced AUROC: {:.3f} | #Training Samples: {:d}\".format(\n    len(clf.estimators_), score, sum(clf.estimators_n_training_samples_)\n    ))"
      ]
    }
  ],
  "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.5"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}