{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Baseline model variants"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/sergiusz/anaconda3/envs/whitelist/lib/python3.6/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n",
      "/home/sergiusz/anaconda3/envs/whitelist/lib/python3.6/site-packages/sklearn/grid_search.py:42: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. This module will be removed in 0.20.\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "%matplotlib inline\n",
    "%pylab inline\n",
    "pylab.rcParams['figure.figsize'] = (12, 7)\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.grid_search import GridSearchCV\n",
    "from sklearn.metrics import r2_score\n",
    "from sklearn.metrics import mean_squared_error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\n",
    "df = pd.read_feather('../data/basemodel_cumsum.feather')\n",
    "\n",
    "model = LinearRegression(fit_intercept = True)\n",
    "x = df[['popularity']]\n",
    "y = df[['log_all_streams_cumsum']]\n",
    "\n",
    "def PolynomialRegression(degree=2, **kwargs):\n",
    "    return make_pipeline(PolynomialFeatures(degree), LinearRegression(**kwargs))\n",
    "\n",
    "param_grid = {'polynomialfeatures__degree': np.arange(3), 'linearregression__normalize': [True, False]}\n",
    "\n",
    "grid = GridSearchCV(PolynomialRegression(), param_grid, cv = 5, error_score=mean_squared_error)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Baseline model (2018-05-21 22:12)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best model: Pipeline(memory=None,\n",
      "     steps=[('polynomialfeatures', PolynomialFeatures(degree=2, include_bias=True, interaction_only=False)), ('linearregression', LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=True))])\n",
      "RMSE: 5.691645826227121\n",
      "Rsq: 0.5953026658448666\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def fitAndEvaluate(x,y,grid):\n",
    "    grid.fit(x,y)\n",
    "    model = grid.best_estimator_\n",
    "    print(f'Best model: {model}')\n",
    "    y_pred = model.predict(x)\n",
    "\n",
    "    plt.subplot(1,2,1)\n",
    "    plt.scatter(y_pred, y_pred - y)\n",
    "    plt.hlines(y = 0, xmin = min(y_pred), xmax = max(y_pred))\n",
    "    plt.title('Residual Errors')\n",
    "    \n",
    "    plt.subplot(1,2,2)\n",
    "    plt.scatter(x,y)\n",
    "    lim = plt.axis()\n",
    "    plt.scatter(x,y_pred, c = 'red')\n",
    "    plt.title('Prediction versus actual')\n",
    "\n",
    "    rmse = np.sqrt(np.sum((y_pred - y)**2))[0]\n",
    "    print(f'RMSE: {rmse}')\n",
    "    print(f'Rsq: {r2_score(y,y_pred)}')\n",
    "    \n",
    "\n",
    "fitAndEvaluate(x,y,grid)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Baseline with outlier removed (2018-05-22 22:15)\n",
    "* Evaluate outlier at 0 popularity. It seems to skew the results. It looks like linear would be a good fit here actually"
   ]
  },
  {
   "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>track_id</th>\n",
       "      <th>popularity</th>\n",
       "      <th>all_streams_cumsum</th>\n",
       "      <th>log_all_streams_cumsum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0A488iaPeDAUP5q7Jm3paF</td>\n",
       "      <td>0</td>\n",
       "      <td>791514</td>\n",
       "      <td>13.581703</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>1ekNZULmcBHp3WRNKft7ou</td>\n",
       "      <td>8</td>\n",
       "      <td>68719</td>\n",
       "      <td>11.137781</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>0DPXH5sPDVwjsqfgvmi1yt</td>\n",
       "      <td>26</td>\n",
       "      <td>139665</td>\n",
       "      <td>11.847002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>1cinSNWNJeGVxMgUSNCHRT</td>\n",
       "      <td>27</td>\n",
       "      <td>137729</td>\n",
       "      <td>11.833043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>00mc2RHScEYMEFlc7FRGaK</td>\n",
       "      <td>28</td>\n",
       "      <td>93919</td>\n",
       "      <td>11.450188</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  track_id  popularity  all_streams_cumsum  \\\n",
       "6   0A488iaPeDAUP5q7Jm3paF           0              791514   \n",
       "41  1ekNZULmcBHp3WRNKft7ou           8               68719   \n",
       "11  0DPXH5sPDVwjsqfgvmi1yt          26              139665   \n",
       "37  1cinSNWNJeGVxMgUSNCHRT          27              137729   \n",
       "1   00mc2RHScEYMEFlc7FRGaK          28               93919   \n",
       "\n",
       "    log_all_streams_cumsum  \n",
       "6                13.581703  \n",
       "41               11.137781  \n",
       "11               11.847002  \n",
       "37               11.833043  \n",
       "1                11.450188  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sort_values('popularity').head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Popularity 0 outlier\n",
    "There is an outlier that has massive impact on the curve with 0 popularity, ,this could be some corner case but also some data error. Look into this explicitly.\n",
    "* 0A488iaPeDAUP5q7Jm3paF\n",
    "\n",
    "**UPDATE this was caused by an erratic jump to 0 and back**\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df = pd.read_feather('../data/basemodel_cumsum_outlier_removed.feather')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = df[['popularity']]\n",
    "y = df[['log_all_streams_cumsum']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best model: Pipeline(memory=None,\n",
      "     steps=[('polynomialfeatures', PolynomialFeatures(degree=1, include_bias=True, interaction_only=False)), ('linearregression', LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=True))])\n",
      "RMSE: 5.600131028898199\n",
      "Rsq: 0.608212130063924\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fitAndEvaluate(x,y,grid)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "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.6.6"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "384px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  },
  "widgets": {
   "state": {},
   "version": "1.1.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
