{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "02eaf587-125d-a4fe-62c7-3dac63b6c75f"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "b8ff0786-470f-f3de-e826-2334abc61cda"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "from xgboost import XGBClassifier\n",
        "from sklearn.metrics import matthews_corrcoef, roc_auc_score\n",
        "from sklearn.cross_validation import cross_val_score, StratifiedKFold\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "eb108407-22f9-9716-1905-d6ebfd6a5b59"
      },
      "outputs": [],
      "source": [
        "# I'm limited by RAM here and taking the first N rows is likely to be\n",
        "# a bad idea for the date data since it is ordered.\n",
        "# Sample the data in a roundabout way:\n",
        "date_chunks = pd.read_csv(\"../input/train_date.csv\", index_col=0, chunksize=100000, dtype=np.float32)\n",
        "num_chunks = pd.read_csv(\"../input/train_numeric.csv\", index_col=0,\n",
        "                         usecols=list(range(969)), chunksize=100000, dtype=np.float32)\n",
        "X = pd.concat([pd.concat([dchunk, nchunk], axis=1).sample(frac=0.05)\n",
        "               for dchunk, nchunk in zip(date_chunks, num_chunks)])\n",
        "y = pd.read_csv(\"../input/train_numeric.csv\", index_col=0, usecols=[0,969], dtype=np.float32).loc[X.index].values.ravel()\n",
        "X = X.values"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "7fa0923e-ddfa-d046-f7a8-842667883110"
      },
      "outputs": [],
      "source": [
        "clf = XGBClassifier(base_score=0.005)\n",
        "clf.fit(X, y)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "c6159cc6-47b5-e632-b0b6-2f8e0578876d"
      },
      "outputs": [],
      "source": [
        "# threshold for a manageable number of features\n",
        "plt.hist(clf.feature_importances_[clf.feature_importances_>0])\n",
        "important_indices = np.where(clf.feature_importances_>0.005)[0]\n",
        "print(important_indices)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "d2a8fa06-d180-d316-2f92-aef473339726"
      },
      "outputs": [],
      "source": [
        "# load entire dataset for these features. \n",
        "# note where the feature indices are split so we can load the correct ones straight from read_csv\n",
        "n_date_features = 1156\n",
        "X = np.concatenate([\n",
        "    pd.read_csv(\"../input/train_date.csv\", index_col=0, dtype=np.float32,\n",
        "                usecols=np.concatenate([[0], important_indices[important_indices < n_date_features] + 1])).values,\n",
        "    pd.read_csv(\"../input/train_numeric.csv\", index_col=0, dtype=np.float32,\n",
        "                usecols=np.concatenate([[0], important_indices[important_indices >= n_date_features] + 1 - 1156])).values\n",
        "], axis=1)\n",
        "y = pd.read_csv(\"../input/train_numeric.csv\", index_col=0, dtype=np.float32, usecols=[0,969]).values.ravel()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "0dd2d440-bb20-82c5-7519-d1eb24a7e510"
      },
      "outputs": [],
      "source": [
        "clf = XGBClassifier(max_depth=5, base_score=0.005)\n",
        "cv = StratifiedKFold(y, n_folds=3)\n",
        "preds = np.ones(y.shape[0])\n",
        "for i, (train, test) in enumerate(cv):\n",
        "    preds[test] = clf.fit(X[train], y[train]).predict_proba(X[test])[:,1]\n",
        "    print(\"fold {}, ROC AUC: {:.3f}\".format(i, roc_auc_score(y[test], preds[test])))\n",
        "print(roc_auc_score(y, preds))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "eca4bd3d-586a-233d-6dcd-4380939e2b1e"
      },
      "outputs": [],
      "source": [
        "# pick the best threshold out-of-fold\n",
        "thresholds = np.linspace(0.01, 0.99, 50)\n",
        "mcc = np.array([matthews_corrcoef(y, preds>thr) for thr in thresholds])\n",
        "plt.plot(thresholds, mcc)\n",
        "best_threshold = thresholds[mcc.argmax()]\n",
        "print(mcc.max())"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "0e9aceeb-3b06-74af-3238-c500a33d5a71"
      },
      "outputs": [],
      "source": [
        "# load test data\n",
        "X = np.concatenate([\n",
        "    pd.read_csv(\"../input/test_date.csv\", index_col=0, dtype=np.float32,\n",
        "                usecols=np.concatenate([[0], important_indices[important_indices<1156]+1])).values,\n",
        "    pd.read_csv(\"../input/test_numeric.csv\", index_col=0, dtype=np.float32,\n",
        "                usecols=np.concatenate([[0], important_indices[important_indices>=1156] +1 - 1156])).values\n",
        "], axis=1)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "a796c10a-d149-0608-350b-6adb5c733e8b"
      },
      "outputs": [],
      "source": [
        "# generate predictions at the chosen threshold\n",
        "preds = (clf.predict_proba(X)[:,1] > best_threshold).astype(np.int8)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "e0574c4a-ece0-6545-fbc9-cafe21d0844c"
      },
      "outputs": [],
      "source": [
        "# and submit\n",
        "sub = pd.read_csv(\"../input/sample_submission.csv\", index_col=0)\n",
        "sub[\"Response\"] = preds\n",
        "sub.to_csv(\"submission.csv.gz\", compression=\"gzip\")"
      ]
    }
  ],
  "metadata": {
    "_change_revision": 0,
    "_is_fork": false,
    "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.5.2"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}