{ "cells": [ { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "import pandas as pd\n", "import seaborn as sns\n", "import numpy as np\n", "import scipy.sparse as sp\n", "from scipy.sparse.linalg import svds\n", "import matplotlib.pyplot as plt\n", "import random\n", "from sklearn.cross_validation import train_test_split\n", "from sklearn.neighbors import NearestNeighbors\n", "from sklearn.datasets import make_classification" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read raw impressions\n", "#### For examples in the book, this file (above) was approx 20 million observations and required a large server to process for testing. The test file is 1 million observations. Predictions will be relatively poor, especially for kNN, because of extreme sparseness and small sample size." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "df = pd.DataFrame.from_csv('data/advertising.csv')" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pub_domainuser_idviewedctrclick
100010001410160True0.463089True
100010001157972True0.463089False
100010001061623True0.463089True
100110011169015True0.303266True
100110011111880True0.303266False
\n", "
" ], "text/plain": [ " pub_domain user_id viewed ctr click\n", "1000 1000 1410160 True 0.463089 True\n", "1000 1000 1157972 True 0.463089 False\n", "1000 1000 1061623 True 0.463089 True\n", "1001 1001 1169015 True 0.303266 True\n", "1001 1001 1111880 True 0.303266 False" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Publication level summaries" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_pub = df[['viewed', 'click', 'pub_domain']].groupby('pub_domain').aggregate(sum)\n", "df_pub['nImps'] = df.pub_domain.value_counts()\n", "df_pub.columns = [['vImps', 'clicks', 'nImps']]\n", "df_pub['CTR'] = df_pub.clicks / df_pub.nImps\n", "df_pub['reach'] = df[['pub_domain', 'user_id']].groupby('pub_domain').aggregate(lambda x: len(x.unique()))\n", "df_pub['vReach'] = df[df.viewed == True][['pub_domain', 'user_id']].groupby('pub_domain').aggregate(lambda x: int(len(x.unique())))\n", "df_pub['vRate'] = (df_pub.vImps / df_pub.nImps) * [random.random() for x in range(len(df_pub))] * df_pub.CTR\n", "df_pub['reachRate'] = df_pub.reach / df_pub.nImps\n", "df_pub['vReachRate'] = df_pub.vReach / df_pub.nImps\n", "df_pub['meanViewTime'] = [60 * random.random() * x for x in df_pub.CTR]\n", "df_pub['exposure'] = df_pub.vImps * df_pub.meanViewTime\n", "df_pub = df_pub.fillna(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cardinalities of imps, pubs, and users" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nImps=1000000\n", "nPubs=3993\n", "nUsers=377464\n" ] } ], "source": [ "nImps = len(df)\n", "nPubs = len(df.pub_domain.unique())\n", "nUsers = len(df.user_id.unique())\n", "print('nImps={}\\nnPubs={}\\nnUsers={}'.format(nImps, nPubs, nUsers))" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nImps2=161334\n", "nPubs2=3920\n", "nUsers2=131535\n" ] } ], "source": [ "df2 = df[df.click == True]\n", "nImps2 = len(df2)\n", "nPubs2 = len(df2.pub_domain.unique())\n", "nUsers2 = len(df2.user_id.unique())\n", "print('nImps2={}\\nnPubs2={}\\nnUsers2={}'.format(nImps2, nPubs2, nUsers2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Clicks" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nClicks=161334 (16.13%)\n" ] } ], "source": [ "nClicks = df.click.value_counts()[True]\n", "print('nClicks={} ({}%)'.format(nClicks, round(float(nClicks) * 100 / nImps, 2)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Views" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nViews=800306 (80.03%)\n" ] } ], "source": [ "nViews = df.viewed.value_counts()[True]\n", "print('nViews={} ({}%)'.format(nViews, round(float(nViews) * 100 / nImps, 2)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Size of user / item matrix" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "uim, all imps: 1507213752, clicks only: 515617200\n" ] } ], "source": [ "uimsz = (nPubs * nUsers) # all visits\n", "uimsz2 = (nPubs2 * nUsers2) # clicks\n", "print('uim, all imps: {}, clicks only: {}'. format(uimsz, uimsz2))" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [], "source": [ "f = df.groupby('pub_domain').size()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Distribution of impressions by pub_domain" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAECCAYAAAAb5qc/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmQXeV95vHvPXdfe+/WLgFCr1gNCAeMiW1s7CRekjiT\nyZQdkxmnKNuJqzJMqjJjKuVMzVRlxlWZcYVUKpOxsbMSjxfieDAZDMGgsBgIGCEJwYsktKu3q17u\n2nc988ftlrqbVnerdbvv0s+nqgv1ObfP+ekgPffVe9/zOx7XdRERkfbkNLoAERFZPQp5EZE2ppAX\nEWljCnkRkTamkBcRaWMKeRGRNuZbbKcxxgd8E9gBBIA/tNY+Mmv/fcC9wMj0ps9baw+vTqkiInKp\nFg154DNA0lr7G8aYLmAf8Mis/XuAe6y1r65WgSIisnJLhfx3gO9O/9oBSvP27wHuN8ZsBB611n6l\nzvWJiMhlWHRO3lqbs9ZmjTFxamH/+/Ne8i3gC8BdwJ3GmI+uTpkiIrISS37waozZCvwY+Ctr7bfn\n7X7AWjtmrS0DjwI3r0KNIiKyQkt98DoA/Aj4orX2qXn7EsBBY8xuIA98EPjGUid0Xdf1eDwrr1hE\nZH1aUXB6FmtQZoz5Y+DXgDenT+ACXwei1toHjTG/Dvx7YAp40lr7X5ZxTnd0NL2SWptCX18c1d84\nqr9xWrl2aIv6VxTyi47krbX3Afctsv8h4KGVnFhERFafboYSEWljCnkRkTamkBcRaWMKeRGRNqaQ\nFxFpYwp5EZE2ppAXEWljCnkRkTamkBcRaWMKeRGRNqaQFxFpYwp5EZE2ppAXEWljCnkRkTamkBcR\naWMKeRGRNqaQFxFpYwp5EZE2ppAXEWljCnkRkTamkBcRaWMKeRGRNqaQFxFpYwp5EZE2ppAXEWlj\nCnkRkTamkBcRaWMKeRGRNqaQFxFpYwp5EZE2ppAXEWljCnkRkTamkBcRaWMKeRGRNqaQFxFpYwp5\nEZE2ppAXEWljvsV2GmN8wDeBHUAA+ENr7SOz9n8C+DJQAv7CWvvg6pUqIiKXaqmR/GeApLX2fcAv\nAH86s2P6DeCrwN3AB4DPGWP6VqlOEZE14bouqdTkgl+u6za6vEu26Ege+A7w3elfO9RG7DOuAQ5b\na1MAxphngfcBD9e7SBGRtZJOp3jixSOEI9E52/O5LB++bSeJREeDKluZRUPeWpsDMMbEqYX978/a\n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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.distplot(np.log10(f));" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pub_domainuser_idviewedctrclick
100010001410160True0.463089True
100010001157972True0.463089False
100010001061623True0.463089True
100110011169015True0.303266True
100110011111880True0.303266False
\n", "
" ], "text/plain": [ " pub_domain user_id viewed ctr click\n", "1000 1000 1410160 True 0.463089 True\n", "1000 1000 1157972 True 0.463089 False\n", "1000 1000 1061623 True 0.463089 True\n", "1001 1001 1169015 True 0.303266 True\n", "1001 1001 1111880 True 0.303266 False" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_ = plt.hist(df.pub_domain.value_counts(), bins=range(2,100,1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### split data into training and test subsets" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "df.set_index(df.pub_domain, inplace=True)\n", "df5, df6 = train_test_split(df, test_size = 0.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### substitute integer indices for user and pub symbolic keys" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "users = df5.user_id.unique()\n", "pubs = df5.pub_domain.unique()\n", "\n", "user_idx, pub_idx = {}, {}\n", "for i in range(len(users)):\n", " user_idx[users[i]] = i\n", "for i in range(len(pubs)):\n", " pub_idx[pubs[i]] = i\n", "\n", "pidx = {b: a for a, b in pub_idx.items()} # for reverse lookup pub_domain = pidx[integer_key]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SVD" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### create sparse matrix" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "def makeUIM(df):\n", " dframe = df.sort_values(by='user_id', axis=0)\n", " nUsers = len(user_idx)\n", " nPubs = len(dframe.pub_domain.unique())\n", " V = sp.lil_matrix((nUsers, nPubs))\n", " def matput(imp):\n", " try:\n", " if imp.viewed:\n", " V[user_idx[imp.user_id], pub_idx[imp.pub_domain]] = 1\n", " except:\n", " pass\n", " _ = dframe[dframe.click == True].apply(matput, axis=1)\n", " return V" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "df5 = df5.sort_values(by='user_id', axis=0)\n", "V = makeUIM(df5)\n", "VT = V.T\n", "df6 = df6.sort_values(by='user_id', axis=0)\n", "TT = makeUIM(df6).T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### compute SVD" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "u, s, vt = svds(V, k = 400)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### plot singular values" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(s[::-1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## KNN" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ts0 = df6.pub_domain.value_counts()\n", "tsums = pd.DataFrame.from_dict({\n", " 'pub_domain': ts0.index,\n", " 'nImps': ts0,\n", " 'clicks': df6.groupby('pub_domain')['click'].aggregate(sum)\n", " })\n", "tsums.reset_index(inplace=True)\n", "tsums['CTR'] = tsums.clicks / np.float64(tsums.nImps)\n", "\n", "ts1 = df.pub_domain.value_counts()\n", "pubsums = pd.DataFrame.from_dict({\n", " 'pub_domain': ts1.index,\n", " 'nImps': ts1,\n", " 'clicks': df.groupby('pub_domain')['click'].aggregate(sum)\n", " })\n", "pubsums['CTR'] = pubsums.clicks / np.float64(pubsums.nImps)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "weight functionf1\n", "1. 16.0163810193\n", "2. 13.1859662817\n", "3. 12.9689393099\n", "4. 16.680206999\n", "5. 14.6384491895\n", "6. 14.0660686046\n", "7. 14.0650293768\n", "8. 13.4824095333\n", "9. 13.942187028\n", "weight functionf2\n", "1. 15.2772888351\n", "2. 12.3886556128\n", "3. 12.1874934405\n", "4. 16.194856847\n", "5. 14.0479046742\n", "6. 13.4458243001\n", "7. 13.4445755208\n", "8. 12.8089387628\n", "9. 13.3148983652\n", "weight functionf3\n", "1. 15.2772888351\n", "2. 12.3886674674\n", "3. 12.1874643295\n", "4. 16.1946693787\n", "5. 14.0477756095\n", "6. 13.4457115246\n", "7. 13.444468316\n", "8. 12.8088199565\n", "9. 13.3148077251\n" ] }, { "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tt = TT.todense()\n", "tt = np.asarray(tt)\n", "plt.rcParams[\"figure.figsize\"] = [12.0, 4.0]\n", "\n", "kMin = 1\n", "kMax = 10\n", "weightFunctions = {\n", " 'f1': lambda x: [1 for i in range(len(x))],\n", " 'f2': lambda x: 1 / x,\n", " 'f3': lambda x: 1 / x ** 2\n", "}\n", "for idx, f in enumerate(weightFunctions):\n", " print('weight function{}'.format(f))\n", " rmseL = []\n", " wf = weightFunctions[f]\n", " for nNeighbors in range(kMin, kMax):\n", " neigh = NearestNeighbors(nNeighbors)\n", " neigh.fit(VT) \n", " act = pd.Series()\n", " pred = pd.Series()\n", " for i in range(TT.shape[0]):\n", " d = neigh.kneighbors(tt[i,:].reshape(1, -1), return_distance=True)\n", " W = pd.Series([v for v in d[0][0]])\n", " y = pd.Series(pubsums.iloc[d[1][0]].CTR)\n", " a0 = tsums.iloc[i].CTR\n", " try:\n", " p0 = np.average(y[y.values > 0], weights = wf(W[y.values > 0]) )\n", " except:\n", " p0 = 0\n", " act = act.append(pd.Series(a0))\n", " pred = pred.append(pd.Series(p0))\n", " exit\n", " rmse = ((act.sub(pred).pow(2).mean()) ** .5 / (act.max() - act.min())) * 100 \n", " rmseL.append(rmse)\n", " print('{}. {}'.format(nNeighbors, rmse))\n", " plt0 = plt.subplot(130+idx+1)\n", " plt0.plot(range(kMin, kMax ,1), rmseL)\n", " plt.tight_layout(pad=2.0)\n", " exit" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Random Forest Regressor" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
vImpsclicksnImpsCTRreachvReachvRatereachRatevReachRatemeanViewTimeexposure
pub_domain
10003.02.030.66666733.00.2752621.0000001.00000033.520006100.560017
100112.03.0130.2307691312.00.1220781.0000000.9230773.52902542.348299
10028.05.0110.454545118.00.1184681.0000000.72727310.60496784.839733
100323.00.0260.0000002623.00.0000001.0000000.8846150.0000000.000000
100415.07.0220.3181822215.00.0208411.0000000.6818185.07910876.186626
100530.010.0400.2500004030.00.0710031.0000000.7500001.62772048.831589
100624.06.0290.2068972924.00.0844371.0000000.8275867.496946179.926693
100728.08.0340.2352943428.00.0911251.0000000.8235294.873371136.454401
100832.06.0360.1666673632.00.0904471.0000000.8888899.077761290.488350
100942.02.0580.0344835842.00.0229881.0000000.7241380.62703226.335348
101047.04.0570.0701755747.00.0045821.0000000.8245611.47481669.316332
101141.02.0510.0392165141.00.0008351.0000000.8039221.73689371.212603
101239.012.0470.2553194739.00.0589981.0000000.8297877.929435309.247953
101351.010.0630.1587306351.00.0227371.0000000.8095243.495873178.289529
101452.03.0640.0468756452.00.0369951.0000000.8125001.926381100.171790
101551.014.0660.2121216651.00.1513451.0000000.7727276.375563325.153704
101661.00.0730.0000007361.00.0000001.0000000.8356160.0000000.000000
101770.028.0880.3181828769.00.0607750.9886360.7840912.140038149.802684
101864.011.0800.1375008064.00.0764331.0000000.8000007.370584471.717395
101980.013.01030.12621410380.00.0520281.0000000.7766991.04180883.344671
102078.04.01000.04000010078.00.0157761.0000000.7800002.303285179.656253
102188.029.01060.27358510688.00.1267391.0000000.8301892.302842202.650140
102281.010.01050.09523810581.00.0040291.0000000.7714293.049524247.011468
102398.010.01190.08403411998.00.0569591.0000000.8235294.639320454.653313
102498.023.01240.18548412498.00.0330211.0000000.7903231.170400114.699215
102590.050.01190.42016811990.00.2391071.0000000.7563033.018353271.651810
1026108.034.01290.263566129108.00.0934601.0000000.83720915.4544021669.075431
1027116.073.01410.517730141116.00.2112571.0000000.82269514.8653861724.384743
1028110.017.01400.121429140110.00.0241981.0000000.7857141.399765153.974098
1029120.013.01520.085526152120.00.0598371.0000000.7894740.0581776.981241
....................................
49633.00.050.00000053.00.0000001.0000000.6000000.0000000.000000
49643.01.040.25000043.00.1685391.0000000.7500002.9490268.847079
49651.01.020.50000021.00.0047601.0000000.50000029.45736929.457369
49662.01.040.25000042.00.0259501.0000000.5000009.39752518.795049
49671.00.020.00000021.00.0000001.0000000.5000000.0000000.000000
49685.01.050.20000055.00.1144281.0000001.0000000.0446190.223097
49695.00.050.00000055.00.0000001.0000001.0000000.0000000.000000
49701.00.010.00000011.00.0000001.0000001.0000000.0000000.000000
49711.00.010.00000011.00.0000001.0000001.0000000.0000000.000000
49725.00.060.00000065.00.0000001.0000000.8333330.0000000.000000
49732.00.020.00000022.00.0000001.0000001.0000000.0000000.000000
49741.02.021.00000021.00.0053101.0000000.50000052.39024552.390245
49752.00.020.00000022.00.0000001.0000001.0000000.0000000.000000
49762.00.020.00000022.00.0000001.0000001.0000000.0000000.000000
49772.00.040.00000042.00.0000001.0000000.5000000.0000000.000000
49784.00.050.00000054.00.0000001.0000000.8000000.0000000.000000
49791.01.040.25000041.00.0179881.0000000.2500005.2021265.202126
49802.02.021.00000022.00.9364631.0000001.00000059.367776118.735551
49821.00.020.00000021.00.0000001.0000000.5000000.0000000.000000
49831.00.010.00000011.00.0000001.0000001.0000000.0000000.000000
49852.00.020.00000022.00.0000001.0000001.0000000.0000000.000000
49861.00.010.00000011.00.0000001.0000001.0000000.0000000.000000
49871.01.011.00000011.00.2465741.0000001.00000050.47469450.474694
49881.00.020.00000021.00.0000001.0000000.5000000.0000000.000000
49902.00.030.00000032.00.0000001.0000000.6666670.0000000.000000
49911.00.010.00000011.00.0000001.0000001.0000000.0000000.000000
49920.00.010.00000010.00.0000001.0000000.0000000.0000000.000000
49930.00.010.00000010.00.0000001.0000000.0000000.0000000.000000
49961.00.010.00000011.00.0000001.0000001.0000000.0000000.000000
49991.00.010.00000011.00.0000001.0000001.0000000.0000000.000000
\n", "

3993 rows × 11 columns

\n", "
" ], "text/plain": [ " vImps clicks nImps CTR reach vReach vRate \\\n", "pub_domain \n", "1000 3.0 2.0 3 0.666667 3 3.0 0.275262 \n", "1001 12.0 3.0 13 0.230769 13 12.0 0.122078 \n", "1002 8.0 5.0 11 0.454545 11 8.0 0.118468 \n", "1003 23.0 0.0 26 0.000000 26 23.0 0.000000 \n", "1004 15.0 7.0 22 0.318182 22 15.0 0.020841 \n", "1005 30.0 10.0 40 0.250000 40 30.0 0.071003 \n", "1006 24.0 6.0 29 0.206897 29 24.0 0.084437 \n", "1007 28.0 8.0 34 0.235294 34 28.0 0.091125 \n", "1008 32.0 6.0 36 0.166667 36 32.0 0.090447 \n", "1009 42.0 2.0 58 0.034483 58 42.0 0.022988 \n", "1010 47.0 4.0 57 0.070175 57 47.0 0.004582 \n", "1011 41.0 2.0 51 0.039216 51 41.0 0.000835 \n", "1012 39.0 12.0 47 0.255319 47 39.0 0.058998 \n", "1013 51.0 10.0 63 0.158730 63 51.0 0.022737 \n", "1014 52.0 3.0 64 0.046875 64 52.0 0.036995 \n", "1015 51.0 14.0 66 0.212121 66 51.0 0.151345 \n", "1016 61.0 0.0 73 0.000000 73 61.0 0.000000 \n", "1017 70.0 28.0 88 0.318182 87 69.0 0.060775 \n", "1018 64.0 11.0 80 0.137500 80 64.0 0.076433 \n", "1019 80.0 13.0 103 0.126214 103 80.0 0.052028 \n", "1020 78.0 4.0 100 0.040000 100 78.0 0.015776 \n", "1021 88.0 29.0 106 0.273585 106 88.0 0.126739 \n", "1022 81.0 10.0 105 0.095238 105 81.0 0.004029 \n", "1023 98.0 10.0 119 0.084034 119 98.0 0.056959 \n", "1024 98.0 23.0 124 0.185484 124 98.0 0.033021 \n", "1025 90.0 50.0 119 0.420168 119 90.0 0.239107 \n", "1026 108.0 34.0 129 0.263566 129 108.0 0.093460 \n", "1027 116.0 73.0 141 0.517730 141 116.0 0.211257 \n", "1028 110.0 17.0 140 0.121429 140 110.0 0.024198 \n", "1029 120.0 13.0 152 0.085526 152 120.0 0.059837 \n", "... ... ... ... ... ... ... ... \n", "4963 3.0 0.0 5 0.000000 5 3.0 0.000000 \n", "4964 3.0 1.0 4 0.250000 4 3.0 0.168539 \n", "4965 1.0 1.0 2 0.500000 2 1.0 0.004760 \n", "4966 2.0 1.0 4 0.250000 4 2.0 0.025950 \n", "4967 1.0 0.0 2 0.000000 2 1.0 0.000000 \n", "4968 5.0 1.0 5 0.200000 5 5.0 0.114428 \n", "4969 5.0 0.0 5 0.000000 5 5.0 0.000000 \n", "4970 1.0 0.0 1 0.000000 1 1.0 0.000000 \n", "4971 1.0 0.0 1 0.000000 1 1.0 0.000000 \n", "4972 5.0 0.0 6 0.000000 6 5.0 0.000000 \n", "4973 2.0 0.0 2 0.000000 2 2.0 0.000000 \n", "4974 1.0 2.0 2 1.000000 2 1.0 0.005310 \n", "4975 2.0 0.0 2 0.000000 2 2.0 0.000000 \n", "4976 2.0 0.0 2 0.000000 2 2.0 0.000000 \n", "4977 2.0 0.0 4 0.000000 4 2.0 0.000000 \n", "4978 4.0 0.0 5 0.000000 5 4.0 0.000000 \n", "4979 1.0 1.0 4 0.250000 4 1.0 0.017988 \n", "4980 2.0 2.0 2 1.000000 2 2.0 0.936463 \n", "4982 1.0 0.0 2 0.000000 2 1.0 0.000000 \n", "4983 1.0 0.0 1 0.000000 1 1.0 0.000000 \n", "4985 2.0 0.0 2 0.000000 2 2.0 0.000000 \n", "4986 1.0 0.0 1 0.000000 1 1.0 0.000000 \n", "4987 1.0 1.0 1 1.000000 1 1.0 0.246574 \n", "4988 1.0 0.0 2 0.000000 2 1.0 0.000000 \n", "4990 2.0 0.0 3 0.000000 3 2.0 0.000000 \n", "4991 1.0 0.0 1 0.000000 1 1.0 0.000000 \n", "4992 0.0 0.0 1 0.000000 1 0.0 0.000000 \n", "4993 0.0 0.0 1 0.000000 1 0.0 0.000000 \n", "4996 1.0 0.0 1 0.000000 1 1.0 0.000000 \n", "4999 1.0 0.0 1 0.000000 1 1.0 0.000000 \n", "\n", " reachRate vReachRate meanViewTime exposure \n", "pub_domain \n", "1000 1.000000 1.000000 33.520006 100.560017 \n", "1001 1.000000 0.923077 3.529025 42.348299 \n", "1002 1.000000 0.727273 10.604967 84.839733 \n", "1003 1.000000 0.884615 0.000000 0.000000 \n", "1004 1.000000 0.681818 5.079108 76.186626 \n", "1005 1.000000 0.750000 1.627720 48.831589 \n", "1006 1.000000 0.827586 7.496946 179.926693 \n", "1007 1.000000 0.823529 4.873371 136.454401 \n", "1008 1.000000 0.888889 9.077761 290.488350 \n", "1009 1.000000 0.724138 0.627032 26.335348 \n", "1010 1.000000 0.824561 1.474816 69.316332 \n", "1011 1.000000 0.803922 1.736893 71.212603 \n", "1012 1.000000 0.829787 7.929435 309.247953 \n", "1013 1.000000 0.809524 3.495873 178.289529 \n", "1014 1.000000 0.812500 1.926381 100.171790 \n", "1015 1.000000 0.772727 6.375563 325.153704 \n", "1016 1.000000 0.835616 0.000000 0.000000 \n", "1017 0.988636 0.784091 2.140038 149.802684 \n", "1018 1.000000 0.800000 7.370584 471.717395 \n", "1019 1.000000 0.776699 1.041808 83.344671 \n", "1020 1.000000 0.780000 2.303285 179.656253 \n", "1021 1.000000 0.830189 2.302842 202.650140 \n", "1022 1.000000 0.771429 3.049524 247.011468 \n", "1023 1.000000 0.823529 4.639320 454.653313 \n", "1024 1.000000 0.790323 1.170400 114.699215 \n", "1025 1.000000 0.756303 3.018353 271.651810 \n", "1026 1.000000 0.837209 15.454402 1669.075431 \n", "1027 1.000000 0.822695 14.865386 1724.384743 \n", "1028 1.000000 0.785714 1.399765 153.974098 \n", "1029 1.000000 0.789474 0.058177 6.981241 \n", "... ... ... ... ... \n", "4963 1.000000 0.600000 0.000000 0.000000 \n", "4964 1.000000 0.750000 2.949026 8.847079 \n", "4965 1.000000 0.500000 29.457369 29.457369 \n", "4966 1.000000 0.500000 9.397525 18.795049 \n", "4967 1.000000 0.500000 0.000000 0.000000 \n", "4968 1.000000 1.000000 0.044619 0.223097 \n", "4969 1.000000 1.000000 0.000000 0.000000 \n", "4970 1.000000 1.000000 0.000000 0.000000 \n", "4971 1.000000 1.000000 0.000000 0.000000 \n", "4972 1.000000 0.833333 0.000000 0.000000 \n", "4973 1.000000 1.000000 0.000000 0.000000 \n", "4974 1.000000 0.500000 52.390245 52.390245 \n", "4975 1.000000 1.000000 0.000000 0.000000 \n", "4976 1.000000 1.000000 0.000000 0.000000 \n", "4977 1.000000 0.500000 0.000000 0.000000 \n", "4978 1.000000 0.800000 0.000000 0.000000 \n", "4979 1.000000 0.250000 5.202126 5.202126 \n", "4980 1.000000 1.000000 59.367776 118.735551 \n", "4982 1.000000 0.500000 0.000000 0.000000 \n", "4983 1.000000 1.000000 0.000000 0.000000 \n", "4985 1.000000 1.000000 0.000000 0.000000 \n", "4986 1.000000 1.000000 0.000000 0.000000 \n", "4987 1.000000 1.000000 50.474694 50.474694 \n", "4988 1.000000 0.500000 0.000000 0.000000 \n", "4990 1.000000 0.666667 0.000000 0.000000 \n", "4991 1.000000 1.000000 0.000000 0.000000 \n", "4992 1.000000 0.000000 0.000000 0.000000 \n", "4993 1.000000 0.000000 0.000000 0.000000 \n", "4996 1.000000 1.000000 0.000000 0.000000 \n", "4999 1.000000 1.000000 0.000000 0.000000 \n", "\n", "[3993 rows x 11 columns]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_pub" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn import cross_validation\n", "features = ['exposure', 'meanViewTime', 'nImps', 'reach', 'reachRate', \n", " 'vImps', 'vRate', 'vReach', 'vReachRate']\n", "\n", "X_train, X_test, y_train, y_test = cross_validation.train_test_split(\n", " df_pub[features], df_pub.CTR, test_size=0.40, random_state=0)\n", "reg = RandomForestRegressor(n_estimators=100, n_jobs=-1)\n", "model = reg.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(array([ 0.6366208 , 0.62995482, 0.69740879]), 0.65466146813267001)\n" ] } ], "source": [ "scores = cross_validation.cross_val_score(model, X_train, y_train)\n", "print(scores, scores.mean())" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.7195525938702716" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.score(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nMAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.rcParams[\"figure.figsize\"] = [12.0, 4.0]\n", "plt.bar(range(len(features)), model.feature_importances_, align='center')\n", "_ = plt.xticks(range(len(features)), features)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11" } }, "nbformat": 4, "nbformat_minor": 0 }