{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Developing Recommendation Systems for Users on Yelp-like Networks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Collaborative Filtering systems\n", "\n", "In this project, we create a recommendation system for **restaurants** using [collaborative filtering](http://en.wikipedia.org/wiki/Collaborative_filtering) (CF). The general structure of a recommendation system is that there are users and there are items. Users express explicit or implicit preferences towards certain items. CF thus relies on users' past behavior.\n", "\n", "There are two primary approaches to CF: neighboorhood and latent factor model. The former is concerned with computing the relationships between items or between users. In the latter approach you have a model of hidden factors through which users and items are transformed to the same space. For example, if you are rating movies we may transform items into genre factors, and users into their preference for a particular genre.\n", "\n", "Factor models generally lead to more accurate recommenders. One of the reasons for this is the sparsity of the item-user matrix. Most users tend to rate barely one or two items. Latent factor models are more expressive, and fit fewer parameters. However, neighborhood models are more prevalent, as they have an intuitive aspect that appeals to users(if you liked this you will like that) and online(a new preference can be incorporated very quickly).\n", "\n", "Most recommenders today combine neighboorhood CF with model based CF, and SVD based matrix factorization approaches.\n", "\n", "To see the example of a simple beer recommender, go [here](http://nbviewer.ipython.org/20a18d52c539b87de2af). This homework is inspired by the one there but we go after food instead, and go deeper into the problem of making recommendations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### User and Item based approaches\n", "\n", "Original approaches to neighborhood based CF used user-user models. By this we mean that rating estimates are made from recorded ratings of like minded users. However, since most users tend to rate very few items, this is usually a losing proposition for explicit-rating based recommenders. Thus, most neighborhood based systems such as Amazon these days rely on item-item approaches. In these methods, a rating is estimated by other ratings made by the user on \"similar\" or \"nearby\" items: we have a K-Nearest-Neighbors algorithm, in effect." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Outline of this Project\n", "\n", "The outline of this project is as follows:\n", "\n", "1. Create a database of item-item similarities. Use this to implement a neighborhood-based CF recommender that can answer simple questions like \"give me more restaurants like this one\". This part of the homework assumes that the similaties calculated make good \"global recommendations\".\n", "\n", "2. In the second part, we go one step further and attempt to predict the rating that a user will give an item they have not seen before. This requires that we find the restaurants that *this* user would rate as similar (not just those which are globally similar). \n", "\n", "3. In the third part, we implement a factor-based CF recommender using a Bayesian model. While quite a bit more complex, this allows us to pool information both about similar users and about similar restaurants.\n", "\n", "5. We will scale up our system by creating a recommender on the lines of Q1 and Q2 that works on the entire data set. We will use the map-reduce paradigm to split the computation over multiple machines." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "from collections import defaultdict\n", "import json\n", "\n", "import numpy as np\n", "import scipy as sp\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "from matplotlib import rcParams\n", "import matplotlib.cm as cm\n", "import matplotlib as mpl\n", "\n", "#colorbrewer2 Dark2 qualitative color table\n", "dark2_colors = [(0.10588235294117647, 0.6196078431372549, 0.4666666666666667),\n", " (0.8509803921568627, 0.37254901960784315, 0.00784313725490196),\n", " (0.4588235294117647, 0.4392156862745098, 0.7019607843137254),\n", " (0.9058823529411765, 0.1607843137254902, 0.5411764705882353),\n", " (0.4, 0.6509803921568628, 0.11764705882352941),\n", " (0.9019607843137255, 0.6705882352941176, 0.00784313725490196),\n", " (0.6509803921568628, 0.4627450980392157, 0.11372549019607843)]\n", "\n", "rcParams['figure.figsize'] = (10, 6)\n", "rcParams['figure.dpi'] = 150\n", "rcParams['axes.color_cycle'] = dark2_colors\n", "rcParams['lines.linewidth'] = 2\n", "rcParams['axes.facecolor'] = 'white'\n", "rcParams['font.size'] = 14\n", "rcParams['patch.edgecolor'] = 'white'\n", "rcParams['patch.facecolor'] = dark2_colors[0]\n", "rcParams['font.family'] = 'StixGeneral'\n", "\n", "\n", "def remove_border(axes=None, top=False, right=False, left=True, bottom=True):\n", " \"\"\"\n", " Minimize chartjunk by stripping out unnecesasry plot borders and axis ticks\n", " \n", " The top/right/left/bottom keywords toggle whether the corresponding plot border is drawn\n", " \"\"\"\n", " ax = axes or plt.gca()\n", " ax.spines['top'].set_visible(top)\n", " ax.spines['right'].set_visible(right)\n", " ax.spines['left'].set_visible(left)\n", " ax.spines['bottom'].set_visible(bottom)\n", " \n", " #turn off all ticks\n", " ax.yaxis.set_ticks_position('none')\n", " ax.xaxis.set_ticks_position('none')\n", " \n", " #now re-enable visibles\n", " if top:\n", " ax.xaxis.tick_top()\n", " if bottom:\n", " ax.xaxis.tick_bottom()\n", " if left:\n", " ax.yaxis.tick_left()\n", " if right:\n", " ax.yaxis.tick_right()\n", " \n", "pd.set_option('display.width', 500)\n", "pd.set_option('display.max_columns', 100)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 111 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Description of the data set\n", "\n", "The data set has been extracted from the Yelp Phoenix restaurants dataset. It is available [here](https://dl.dropboxusercontent.com/u/75194/bigdf.csv)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "fulldf=pd.read_csv(\"bigdf.csv\")\n", "fulldf.head(2)" ], "language": "python", "metadata": {}, "outputs": [ { "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", "
user_idbusiness_iddatereview_idstarsusefulvotes_reviewuser_namecategoriesbiz_namelatitudelongitudebusiness_avgbusiness_review_countuser_avguser_review_count
0 rLtl8ZkDX5vH5nAx9C3q5Q 9yKzy9PApeiPPOUJEtnvkg 2011-01-26 00:00:00 fWKvX83p0-ka4JS3dc6E5A 5 5 Jason [Breakfast & Brunch, Restaurants] Morning Glory Cafe 33.390792-112.012504 3.87156 109 3.796954 197
1 SBbftLzfYYKItOMFwOTIJg 9yKzy9PApeiPPOUJEtnvkg 2008-05-04 00:00:00 DASdFe-g0BgfN9J2tanStg 5 1 Jennifer [Breakfast & Brunch, Restaurants] Morning Glory Cafe 33.390792-112.012504 3.87156 109 3.473684 57
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 112, "text": [ " user_id business_id date review_id stars usefulvotes_review user_name categories biz_name latitude longitude business_avg business_review_count user_avg user_review_count\n", "0 rLtl8ZkDX5vH5nAx9C3q5Q 9yKzy9PApeiPPOUJEtnvkg 2011-01-26 00:00:00 fWKvX83p0-ka4JS3dc6E5A 5 5 Jason [Breakfast & Brunch, Restaurants] Morning Glory Cafe 33.390792 -112.012504 3.87156 109 3.796954 197\n", "1 SBbftLzfYYKItOMFwOTIJg 9yKzy9PApeiPPOUJEtnvkg 2008-05-04 00:00:00 DASdFe-g0BgfN9J2tanStg 5 1 Jennifer [Breakfast & Brunch, Restaurants] Morning Glory Cafe 33.390792 -112.012504 3.87156 109 3.473684 57" ] } ], "prompt_number": 112 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data frame is a frame of reviews. We have joined in information about users and businesses into this frame so that you have only one frame to work with." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This information is for the reviews themselves:" ] }, { "cell_type": "raw", "metadata": {}, "source": [ " 'stars': (star rating, integer 1-5),\n", " 'date': (date, formatted like '2011-04-19'),\n", " 'review_id': (unique id for the review)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is a description of the data fields in this dataframe, on the business side" ] }, { "cell_type": "raw", "metadata": {}, "source": [ " 'business_id': (a unique identifier for this business),\n", " 'biz_name': (the full business name),\n", " 'latitude': (latitude),\n", " 'longitude': (longitude),\n", " 'business_review_count': (review count for the restaurant[this is a repeated field for all reviews of the restaurant]),\n", " 'categories': [(localized category names)],\n", " 'business_avg': (average stars over all users reviews for business[this is a repeated field for all reviews of the restaurant])." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And Finally, a set of fields for users" ] }, { "cell_type": "raw", "metadata": {}, "source": [ " 'user_id': (unique user identifier),\n", " 'user_name': (first name, last initial, like 'Matt J.'),\n", " 'user_review_count': (count of restaurants reviewed by user[this is a repeated field for all reviews by the user]),\n", " 'user_avg': (floating point average of users reviews over all businesses, like 4.31[this is a repeated field for all reviews by the user])." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this data set, every user has only one review for each restaurant. Convince yourself of this. (This answer does not need to be submitted)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "grouped_by_userid = fulldf.groupby('user_id')\n", "marker = False\n", "\n", "for name, group in grouped_by_userid:\n", " if len(group.business_id.drop_duplicates()) != len(group.business_id):\n", " print 'OW MY GAWD'\n", " marker = True\n", "\n", "if marker == False: print 'they were right after all.'\n", "\"\"\"" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 113, "text": [ "\"\\ngrouped_by_userid = fulldf.groupby('user_id')\\nmarker = False\\n\\nfor name, group in grouped_by_userid:\\n if len(group.business_id.drop_duplicates()) != len(group.business_id):\\n print 'OW MY GAWD'\\n marker = True\\n\\nif marker == False: print 'they were right after all.'\\n\"" ] } ], "prompt_number": 113 }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Our Recommender\n", "\n", "To motivate our recommendation system, consider the follwing example. Let's pretend we are in Boston for a second. Lets say the average rating of restaurants here by all the users is 3.5. Sandrine's at Harvard square is better than an average restaurant, so it tends to be rated 0.5 stars above the average (over all the users). However, you are a curmudgeon, who tends to rate 0.2 stars below the average. Then a baseline estimate for the recommendation for Sandrine's, for you, is 3.5+0.5-0.2=3.8.\n", "\n", "These baseline estimates thus adjust the data by accounting for the systematic tendencies for some users who give higher ratings than others, and for some restaurants to recieve higher ratings than others. We can write the baseline estimate $\\hat Y_{um}^{baseline}$ for an unknown rating $Y_{um}$ for user $u$ and restaurant or business $m$ as:\n", "\n", "$$ \\hat Y_{um}^{baseline} = \\hat \\mu + \\hat \\theta_{u0} + \\hat \\gamma_{m0} $$\n", "\n", "where the unknown parameters $\\theta_{u0}$ and $\\gamma_{m0}$ indicate the deviations, or biases, of user $u$ and item $m$, respectively, from some intercept parameter $\\mu$. (The reason for the strange notation with 0s will become clear in Problem 3)\n", "\n", "Notice that the $\\theta_{u0}$ and $\\gamma_{m0}$ are parameters which need to be fit. The simplest thing to start with, and something we will do for Problems 1 and 2 (but not 3), is to replace them by their \"mean\" estimates from the data. Thus:\n", "\n", "$$ \\hat Y^{baseline}_{um} = \\bar Y + (\\bar Y_u - \\bar Y) + (\\bar Y_m - \\bar Y)$$\n", "\n", "where $\\bar Y_u$ = `user_avg`, the average of all a user $u$'s ratings and $\\bar Y_m$ = `business_avg`, the average of all ratings for a restaurant $m$. $\\bar Y$ is the average rating over all reviews.\n", "\n", "The final two terms correspond to the user-specific and item-specific bias in ratings, that is, how their ratings tend to systematically diverge from the global average. This is the simplest possible way to predict a rating, based only on information about *this* user and *this* restaurant.\n", "\n", "Can we do a better job of predicting the rating $Y_{um}$ user $u$ would give to restaurant $r$? According to the central dogma of CF, we ought to be able to use the responses of *similar* users regarding *similar* restaurants to get a better prediction. \n", "\n", "We can make an estimate of $Y_{um}$ as:\n", "\n", "$$ \\hat{Y_{um}} = \\hat Y_{um}^{baseline}\\, + \\,\\frac{\\sum\\limits_{j \\in S^{k}(m)} s_{mj} ( Y_{uj} - \\hat Y_{um}^{baseline} )}{\\sum\\limits_{j \\in S^{k}(m)} s_{mj} } $$\n", "\n", "where $s^{k}(m)$ is the $k$ neighbor items of item $m$ based on some pooling criterion, for example, those items which have been rated by user $u$.\n", "\n", "In the next two problems, we will focus on using similar restaurants, or the item neighborhood.\n", "To do this, we compute a *similarity measure* $s_{mj}$ between the $m$th and $j$th items. This similarity might be measured via [cosine similarity](http://en.wikipedia.org/wiki/Cosine_similarity), [pearson co-efficient](http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient) or using other distance based measures. Here we shall use the Pearson coefficient. This measures the tendency of users to rate items similarly. Since most ratings are unknown, it is computed on the \"common user support\" (`n_common`), which is the set of common raters of both items. \n", "\n", "In the first problem we shall set $S$ to the global neighborhood of the item, and in the second we shall set it to those items which have been rated by user $u$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Q1. Writing a simple \"global\" recommender" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we have a way to pool information between similar restaurants to try to predict a user's recommendation. But how do we choose the neighborhood to pool over? We begin with the simplest choice. We calculate the similarity between items using their entire common user support, and rank the nearest neighbors of an item by this similarity. We call this a \"global\" recommender because it assumes that every user perceives the similarity between restaurants in the same way. Later on, we will implement a more specific recommender that pools information based on which items seem the most similar *to this user*.\n", "\n", "The global recommender does have the advantage of dealing with the possible sparsity of the user's rated items, but also the disadvantage of giving one answer for all users, without taking the user's preferences into account. This is a classic case of bias-variance tradeoff.\n", "\n", "Lets implement this simpler global recommender first.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exploratory Data Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.1** Visualize the sparsity of the full data set by plotting two histograms of the review count grouped by the `user_id` and `business_id` respectively. Are there more users or more businesses? " ] }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here\n", "\n", "fig = plt.figure()\n", "\n", "# plot histogram for reviews per user\n", "\n", "ax = fig.add_subplot(2,1,1)\n", "num_reviews_per_user = [numrev for numrev in fulldf['user_id'].value_counts()] \n", "#print num_reviews_per_user\n", "ax.set_title('Frequency of Restaurant Reviews per User')\n", "ax.hist(num_reviews_per_user, bins=100, label=\"reviews per user\")\n", "# scale review count as logarithmic\n", "ax.set_xscale('log')\n", "# add ticks, labels, etc\n", "ax.set_xlim(0,1000)\n", "ax.set_xticks([1,2,3,4,5,10,50,100,max(num_reviews_per_user),500,1000])\n", "ax.set_xticklabels([1,2,3,4,5,10,50,100,max(num_reviews_per_user),500,1000], horizontalalignment='center')\n", "ax.set_yscale('linear')\n", "maxline = ax.vlines(max(num_reviews_per_user), 1, 10000, colors='red', label='most reviews per user')\n", "handles, labels = ax.get_legend_handles_labels()\n", "ax.legend(handles, labels)\n", "\n", "# plot histogram for reviews per restaurant\n", "\n", "ax = fig.add_subplot(2,1,2)\n", "num_reviews_per_joint = [numrev for numrev in fulldf['business_id'].value_counts()] \n", "#print num_reviews_per_user\n", "ax.set_title('Frequency of Restaurant Reviews per Restaurant')\n", "ax.hist(num_reviews_per_joint, bins=100, label=\"reviews per joint\")\n", "# scale review count as logarithmic\n", "ax.set_xscale('log')\n", "# add ticks, labels, etc\n", "ax.set_xlim(0,1000)\n", "ax.set_xticks([1,2,3,4,5,10,50,100,500,max(num_reviews_per_joint),1000])\n", "ax.set_xticklabels([1,2,3,4,5,10,50,100,500,max(num_reviews_per_joint),1000], horizontalalignment='center')\n", "ax.set_yscale('linear')\n", "ax.set_ylim(1,2000)\n", "maxline = ax.vlines(max(num_reviews_per_joint), 1, 500, colors='red', label='most reviews per joint')\n", "handles, labels = ax.get_legend_handles_labels()\n", "ax.legend(handles, labels)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 114, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n8n1XrlzB6NGjMXr06FzTGzRoAAcHB/j7+6NXr17YunUrunTpgq1bt+K7777Djh07MGTIEGn/+xq1\n5gAAIABJREFUxYsXo2fPnrh48SLWrVsHBweHfK8vez80XV1d2Nra4vbt27hz5w5ev36NhQsXQls7\n78d9QUaEZg+qLl68CAD45JNPpG3a2tpo3LgxLl++/MG8spe1PE23okpseSMionLj7du3EEJI/dmy\nyx5IjB8/Hn/88QdiY2ORmpqKqlWr5plncnLyB/MbOXIk/vjjDzx79gwnT57E5s2bER0djdOnTyM8\nPBwdO3aU9nVycsKff/6JqlWrwsnJCStXrizUNVapUgX6+vpITk4GgA+WrSCyB4haWloAgIcPHyrt\nY2xsnOcr3qKch/LG4I2IiMoNIyMjGBoaYv369Urbr169imPHjkmfBwwYAAMDAwwZMiTP15ZZGjRo\ngO3bt+Pt27fStjdv3mDt2rXS54EDB6JChQpwd3dH3759YWpqis8//xyzZs1Cq1atlPILCQlBs2bN\n8N///heTJ0/Ot9UvN/fu3UPnzp1Rr149yOXyHNd66NAh3Lhxo1B5ZmdnZwcAOQYVPHr0SHoVWxQy\nmQwZGRlFPr48YfBGRERllkKhQHp6utK2iRMnYt++fRg/fjzCw8OxdetW/Pjjj+jVq5e0j46ODkaM\nGIGYmBh06dJF6fis/LJarzw8PBATE4MePXrg2LFjCA4OxpAhQzBgwADpmEqVKmHw4MG4du0avvrq\nKwCAu7s7Lly4ADc3N6X8V61aJb2mdHd3R+3atfO8PiEEoqOjpc/nz5/HgwcPMHPmTCn4XL58OebP\nn4+IiAj8+uuvOHDgAFq1aiUFSu/fnw+xt7eHs7MzfH19pXtw//593Lx5E3PmzMn1HmVtyx6cZR8A\nAWQG1nfv3kV6ejouXbpUqDKVN+zzRkREeUrPUKh9ktz0DAV05FqFPm7Lli24du0a7t27h8DAQAwc\nOBByuRzz589HYmIiduzYgT179qB3795KrWRZRo8ejZo1aypti4qKgr+/P2QyGVasWIF58+ahc+fO\n+PXXX7F48WL0798ftra28PX1hampqdKx48ePR5MmTaTXjv369cOECRNgbGystN+1a9fg4uICFxcX\nXL16VZp2JC9v377F6NGjoauri4SEBISGhqJ69eoAMgNBhUIBX19f+Pn5YfDgwVixYgXevHkDHx8f\n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\n", "text": [ "" ] } ], "prompt_number": 114 }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here\n", "if len(fulldf['user_id'].drop_duplicates()) > len(fulldf['business_id'].drop_duplicates()): \n", " print 'more users than joints'\n", "else: \n", " print 'more joints than users'" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "more users than joints\n" ] } ], "prompt_number": 119 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.2** Compute the average rating of restaurants in the data set and a histogram of all the ratings in the dataset." ] }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here\n", "\n", "# not sure which of these you're looking for:\n", "\n", "print 'Average of all ratings of restaurants:',round(fulldf.stars.mean(),2)\n", "\n", "means_by_joint = np.mean(fulldf.groupby('business_id')['stars'].mean())\n", "print \"Average rating across each restaurant's aggregated rating:\",round(means_by_joint,2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Average of all ratings of restaurants: 3.74\n", "Average rating across each restaurant's aggregated rating: 3.46\n" ] } ], "prompt_number": 116 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following function is used to re-compute review counts and averages whenever you subset a reviews data frame. We'll use it soon to construct a smaller, more computationally tractable data frame." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def recompute_frame(ldf):\n", " \"\"\"\n", " takes a dataframe ldf, makes a copy of it, and returns the copy\n", " with all averages and review counts recomputed\n", " this is used when a frame is subsetted.\n", " \"\"\"\n", " ldfu=ldf.groupby('user_id')\n", " ldfb=ldf.groupby('business_id')\n", " user_avg=ldfu.stars.mean()\n", " user_review_count=ldfu.review_id.count()\n", " business_avg=ldfb.stars.mean()\n", " business_review_count=ldfb.review_id.count()\n", " nldf=ldf.copy()\n", " nldf.set_index(['business_id'], inplace=True)\n", " nldf['business_avg']=business_avg\n", " nldf['business_review_count']=business_review_count\n", " nldf.reset_index(inplace=True)\n", " nldf.set_index(['user_id'], inplace=True)\n", " nldf['user_avg']=user_avg\n", " nldf['user_review_count']=user_review_count\n", " nldf.reset_index(inplace=True)\n", " return nldf" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 120 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.3** Create a smaller data set in dataframe `smalldf` by looking for those businesses with more than 150 reviews and those users with more than 60 reviews. Include all the columns that were there in the parent dataframe. Since you have created a subset of the data set, use the method provided above to recalculate the averages. Print the number of unique users and items in this data set. \n", "\n", "Note that while this cut makes sure we have prolific users, the cut on businesses restores sparsity by reducing the number of reviews per user." ] }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here\n", "\n", "# we need to make an actual copy of fulldf here\n", "# otherwise straight assignment (eg. x = fulldf) just creates a symbolic referent, and manipulations on x change fulldf!\n", "copydf = fulldf.copy()\n", "# reduce df by given parameters\n", "smalldf = copydf[(copydf.user_review_count > 60) & (copydf.business_review_count > 150)]\n", "# recompute frame\n", "smalldf = recompute_frame(smalldf)\n", "\n", "print 'Number unique items:',smalldf.business_id.drop_duplicates().count()\n", "print 'Number unique users:',smalldf.user_id.drop_duplicates().count()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Number unique items: 172\n", "Number unique users: 240\n" ] } ], "prompt_number": 121 }, { "cell_type": "markdown", "metadata": {}, "source": [ "How does this compare to the parent data set, in terms of size and sparsity? Once again, plot histograms of the review count grouped by user, and by the review count grouped by business, respectively, and describe the results" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here\n", "\n", "fig = plt.figure()\n", "\n", "# plot histogram for reviews per user\n", "\n", "ax = fig.add_subplot(2,1,1)\n", "num_reviews_per_user = [numrev for numrev in smalldf['user_id'].value_counts()] \n", "\n", "#print num_reviews_per_user\n", "ax.set_title('Frequency of Restaurant Reviews per User')\n", "ax.hist(num_reviews_per_user, bins=40, label=\"reviews per user\")\n", "\n", "# add ticks, labels, etc\n", "ax.set_xlim(0,90)\n", "maxline = ax.vlines(max(num_reviews_per_user), 0, 5, colors='red', label='most reviews per user')\n", "handles, labels = ax.get_legend_handles_labels()\n", "ax.legend(handles, labels)\n", "\n", "# plot histogram for reviews per restaurant\n", "\n", "ax = fig.add_subplot(2,1,2)\n", "num_reviews_per_joint = [numrev for numrev in smalldf['business_id'].value_counts()] \n", "\n", "#print num_reviews_per_user\n", "ax.set_title('Frequency of Restaurant Reviews per Restaurant')\n", "ax.hist(num_reviews_per_joint, bins=40, label=\"reviews per joint\")\n", "\n", "# add ticks, labels, etc\n", "ax.set_xlim(0,120)\n", "ax.set_ylim(1,20)\n", "maxline = ax.vlines(max(num_reviews_per_joint), 0, 5, colors='red', label='most reviews per joint')\n", "handles, labels = ax.get_legend_handles_labels()\n", "ax.legend(handles, labels)\n", "\n", "plt.subplots_adjust(top=1.5)\n", "plt.subplots_adjust(bottom=.5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\niEhBTK6IiIiIFMTkioiIiEhBTK6IqEzlqPNKtTwRUXmr8vNcEVHFwnm3iKiqY88VERERkYKYXBER\nEREpiMkVERERkYKYXBEREREpiMkVERERkYKYXBEREREpiMkVERERkYIUT65SU1ORmZmpdLVERERE\nlYIiyVXv3r2hUqmgUqnQs2dP1KlTR4lqiYiIiCqdEs/QHhMTAwcHB/zwww8AgGbNmpU4KCIiIqLK\nqsQ9V0uXLoW2tjZ0dXXRpUsXNGzYUIm4iIiIiCqlEiVXeXl5SE1NxZIlS2BhYYGhQ4ciJydHqdiI\niIiIKp0SJVdaWloIDw9HYmIiQkNDER4ejpkzZyoVGxEREVGlo8iAdkmS4O7ujoCAAISFhSlRJRER\nEVGlVOIB7S9ycXHBpEmTClw3d+5c+bmtrS1sbW2V3DRRhZGjzkNNlVZ5h0FEVDFI0vN/hSjfON4g\nKioKUVFRitWnaHKVl5cHCwuLAte9mFwRVWU1VVpoFjy90OVvj1xcitEQEdHbvNzpM2/evBLVV6LT\ngqdPn8a6deugVqsBAMuXL8esWbNKFBARERFRZVainqukpCTMnj0bYWFhcHBwgI2NDQYOHKhUbERE\nRESVTomSK2dnZyQmJioVCxEREVGlxxs3ExERESmIyRURERGRgphcEZGGHHVeqZYnIqrqFJ2KgYgq\nv+JMJcGpJ4iI/oc9V0REREQKYnJFREREpCAmV0REREQKYnJFREREpCAmV0REREQKYnJFREREpCAm\nV0RUrRVnni7O7aUszq1GVQ3nuSKiaq2o83oBnKtLacWZW42oImPPFREREZGCmFwRERERKYjJFRER\nEZGCmFwRERERKYjJFREREZGCmFwRERERKYjJFRERUQXHucAqF85zRUREVMFxLrDKhT1XRERERApi\nckVERESkICZXRERERApickVERESkICZXRERERApickVERESkICZXRFShVcf5fUq7zRWtfGkri/gr\n+z4qqsoef2njPFdEVKEVZ36fyj4fUFm0uaKVL01lMUdUdZuHqijtvV3KsVREJeq5unPnDiZMmIA1\na9bA09MTFy9eVCouIiIiokqp2D1XQggMHDgQ/v7+sLe3x/vvv4/+/fvjypUr0NLSUjJGIiIiokqj\n2D1XERERiI+Ph62tLQDAysoKNWvWxO7du5WKrdLLunSrvEMoF2x39RIVFVXeIZSL6tpufs6rl+ra\n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\n3btX1lUgohfgbUEiIiIiFTG5IiIiIlIRkysiIiIiFTG5IiIiIlIRkysiIiIiFTG5IiIiIlIRkysi\nIiIiFTG5IiIiIlIRkyvSk5mtK+sqKIpbF9adiIheBRyhnfQUZ9RywLAjl79KdSmu8lx3IiIqGbZc\nEREREamIyRURERGRiphcEREREamIyRURERGRiphcEREREamIyRURERGRiphcEREREamIyRURERGR\niphcEREREamIyRX9ZfAnZIiI6FXAn7+hvwz+5AwREb0K2HJFREREpCImV0REREQqYnJFREREpCIm\nV0REREQqYnJFREREpCImV0REREQqYnJFREREpCImV0REREQqYnJFREREpCImV0REREQqYnJFRERE\npCImV0REREQqKnJylZaWhpSUFEPWhYiIiKjce2FyJSIICQmBg4MD4uLilOnXr1/H+PHjsXz5cgwd\nOhRnzpwxaEWJiIiIyoMXJld37txB9+7dce3aNWg0GgA5CVffvn3Rv39/jB07FlOmTIGnpyd0Op3B\nK0xERET0KnthcmVtbY169erpTYuMjERCQgJcXV0BAM2aNYOJiQl27NhhkEoSERERlRcv1aH98OHD\naNiwIYyNjZVpDg4OOHDggGoVIyIiIiqPXiq5Sk5OhoWFhd60qlWr4tq1a6pUioiIiKi8Mn5xkXwW\nMjaGiYmJ3rTs7OxCl5k1a5byf1dXV+WWIhEREVFZio6ORnR0tGrre6nkqk6dOoiNjdWb9uDBA9ja\n2ha4TN7kioiIiOhV8Wyjz+zZs0u0vpe6Lejq6oqLFy/qTTt37hxbo4iIiOi1V6TkKveWn4gAAN58\n8000aNAAUVFRAICzZ88iNTUVnp6eBqomERERUfnwwtuCt2/fRnBwMDQaDcLCwlC3bl00bdoUO3fu\nxJw5c5CQkIAjR44gPDwcZmZmpVFnIiIiolfWC5Mra2trTJs2DdOmTdOb3rBhQ4SEhAAAxo8fb5DK\nEREREZU3/OFmIiIiIhUxuSIiIiJSEZMrIiIiIhUxuSIiIiJSEZMrIiIiIhUxuaJSk5mtK+sqEBER\nGdxL/fwN0csw0Rqh3popRS5/bfh3BqwNERGRYbDlioiIiEhFTK6IiIiIVMTkioiIiEhFTK6IiIiI\nVMTkioiIiEhFTK6IiIiIVMTkioiIiEhFTK6IiIiIVMTk6hVQnJHLOcp52TB03Iu7fh4HRESvLo7Q\n/goozsjlHLW8bBh6dHmOXk9E9NfBlisiIiIiFTG5IiIiIlIRkysiIiIiFTG5IiIiIlIRkysiIiIi\nFTG5IiIiIlIRkysiIiIiFTG5IiIiIlIRkyuicoij+hMRvbo4QjtROcRR/YmIXl1suSIiIiJSEZMr\nIiIiIhUxuSIiIiJSEZMrIiIiIhUxuSIiIiJSEZMrIiIiIhUxuSIiIiJSEZMrIiIiIhUxuSIiIiJS\nEZOrcoY/ZUJERPRq48/flDPF+dkTgD99QkREVNrYckVERESkIiZXRERERCpSPbm6d+8eUlNT1V4t\nERERUbmgSnLl7OwMrVYLrVaLt956C5UqVVJjtURERETlTok7tMfHx8Pd3R2LFy8GANSrV6/ElSIi\nIiIqr0rcchUQEICKFSvC3Nwc7du3R82aNdWoFxEREVG5VKLkSqfT4d69e/jxxx/RpEkTDBw4EJmZ\nmWrVjYiIiKjcKVFyZWRkhIiICCQlJWHdunWIiIjAtGnT1KobERERUbmjyiCiGo0GQ4YMQVpaGmbM\nmIEFCxY8V2bWrFnK/11dXeHq6qrGpl85mdk6/HkvCWfvJxepfK8GLWFuWtHAtSIiIiqnNJqcf0UM\ntono6GhER0ertj5VR2h/99138cknn+Q7L29y9VcXfukUfvrjYJHKdnrDlskVERFRGXq20Wf27Nkl\nWp+q41zpdDo0adJEzVUSERERlSslSq7i4uKwcuVKZGdnAwCWLFmC6dOnq1IxIiIiovKoRLcFk5OT\nMWPGDISGhsLd3R1OTk7o27evWnUjIiIiKndKlFx5enoiKSlJrboQERERlXv84WYiIiIiFTG5IiIi\nIlIRkysiIiIiFTG5IiIiIlIRkysiIiIiFTG5IiIiIlIRkysiIiIiFTG5IiIiIlIRkysiIiIiFTG5\nIiIiIlIRkysiIiIiFTG5IiIiIlIRkysiIiIiFTG5IiIiIlIRkysiIiIiFTG5IqJSlZmtM0jZlylP\n+WPciUrGuKwrQESvFxOtEeqtmVKksteGf1fksrnlqeSKs48Axp3oWWy5IiIiIlIRkysiIiIiFTG5\nIiIiIlIRkysiIiIiFTG5IiIiIlIRkysiIiIiFTG5IiIiIlIRkysiIiIiFTG5IvqLM/Ro2+V5dG5D\nftZXKY7leR8RlUccoZ3oL+5lRtt+XUbnNuRI5K/SKOevUl2IXgdsuSIiIiJSEZMrIiIiIhUxuSIi\n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\nIlLR/wM9BEJmxGcXdQAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 122 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Our sparsity problem is attenuated considerably with the smaller dataset. \n", "
\n", "Now we have a good spread of users with a fair number of reviews (per user). We pruned the per-user frequency somewhat by also selecting for restaurants with lots of reviews. \n", "
\n", "That explains why, even though we selected for reviewers with >60 reviews each, we still have frequencies in our new df of <60 - these new review frequencies are limited to the set of restaurants we included. (So even if I had >60 reviews total, I still may have <60 reviews within this set of establishments. Thus sparsity is kept in a reasonable balance in this new, reduced dataset.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.4** Compute histograms of the average user rating in the smaller data set, and the average business rating in the smaller data set. Print the overall mean." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print 'Average User Rating'\n", "a,b,c = plt.hist(smalldf.user_avg)\n", "plt.show()\n", "\n", "print '\\n'\n", "\n", "print 'Average Business Rating'\n", "a,b,c = plt.hist(smalldf.business_avg)\n", "plt.show()\n", "\n", "print '\\n\\nOverall mean:', round(smalldf.stars.mean(),3),'\\n\\n'" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Average User Rating\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nOQ+yw4cPx9y5c6Og4OOLc2VlZdHQ0JDrqTAAQZZ7/qeZe9Y896x57lnz8SXnQdbR0RHFxcX9jpWU\nlERbW1uupwIAMCbkPMgKCgqisLCw37He3t5cT2PM+t9xuhbv/2936ikAwLiVyWaz2Vz+wp/97Gfx\nu9/9Lv7yl7/0Hbv77rtj9uzZ8ctf/rLfuTfffHO8+uqruZweAMCw3HTTTXH69Olh/WzO/8py2bJl\nsWXLln7HWltbY82aNRecO9wnBQAwnuT8JctFixZFaWlpHDhwICIiWlpaoqurK6qqqnI9FQCAMSHn\nV8gymUzs27cvampqorm5OY4ePRr79++PoqKiXE8FAGBMyPk9ZIxP7e3tceONN6aeBlxR9jkTgX0+\nejo7O2PSpElxzTXXjPixkn6WZVNTU9x2221RXFwclZWV8cYbbwx43q9+9auoqamJzZs3x8aNG3M8\ny6vLYNe8vr4+8vLy+r7+9Kc/5XimV48///nP8eUvfzk++9nPxle+8pV45513BjzPPh89g11z+3z0\n9fb2xrJly6KpqWnAcft89F1uze3z0bVkyZK+tVy8ePGAMTasfZ5N5K233sref//92RMnTmRfeuml\nbGlpaXb58uUXnFdbW5tdvHhx3/ff+ta3srt27crlVK8ag13zbDabXbt2bfb48ePZ48ePZ//617/m\neKZXjw8++CD7ox/9KNvV1ZV97733sosWLcpu2LDhgvPs89Ez2DXPZu3zK+GZZ57JXnvttdmmpqYL\nxuzzK+NSa57N2uej6eWXX87W1NT0redbb711wTnD3efJrpA1NDTEM888E/Pnz4/KysrYtGlTHDp0\n6ILzfv7zn8dXv/rVvu+/9rWvxbZt23I51avGYNf81KlTceLEifjHP/4R8+fPjy984QsJZnt1+Ne/\n/hWbNm2KoqKi+PSnPx1Lly4d8DNb7fPRM9g1t89H36FDh2LOnDkXvPn3R+zz0Xe5NbfPR9e2bdti\n0qRJMXny5FiwYEFMmzbtgnOGu8+TBdmqVati8uTJfd9ff/31UVpa2u+c//73v/Hyyy/Hrbfe2nfs\nlltuiZMnT8aZM2dyNterxWDWPCLi+PHj8Z///Ce+/vWvx8yZM6O+vj6X07yqXH/99fGpT30qIiI+\n+OCDeOutt+IHP/hBv3Ps89E1mDWPsM9H2zvvvBNHjhyJu+++e8Bx+3z0XW7NI+zz0dTT0xOdnZ3x\n5JNPRnl5eaxatSq6u/u/KfpI9nnSe8jO98orr8TatWv7Hevs7Izu7u4oKSnpOzZlypSICB+1NAoG\nWvOID8Pt+PHj8fe//z1uv/32uPfee6OjoyPBDK8eL774YixcuDDq6+vjb3/7W78x+/zKuNSaR9jn\no23btm3x/e9//6Lj9vnou9yaR9jnoyk/Pz/q6urizTffjOeeey7q6upiw4YN/c4ZyT4fE0F27ty5\nOHHiRHzve9/rd/yjDyA//6OWPvqYpaw/Dh2Ri635+WbMmBEvvPBCfO5zn4t9+/blcHZXn6qqqqit\nrY0777wzVq9e3W/MPr8yLrXm57PPR27nzp3x7W9/u+/KZMSFe9c+H12DWfPz2eejJ5PJxOrVq+Op\np56KPXv29BsbyT4fE0H2xBNPxPbt2yMvr/90rrvuuigsLIx///vffcfOnj0bEeFPdkfoYmv+SUVF\nRXHXXXf1rTvDN3v27Pj1r38dZ86c6fdXf/b5lXOxNf8k+3xkdu7cGV/84hejqKgoioqK4vXXX4+7\n7rorVq1a1XeOfT66BrPmn2Sfj6577rnngrUcyT7P+RvDftLOnTtj9erVMXXq1IiI6O7u7ivLTCYT\nFRUVcerUqb7zW1paYt68eQPeSMfgXGrNB9LT09Pv9XCGb9KkSXHdddfFtdde23fMPr+yBlrzgdjn\nw3f06NF+38+ZMyd+85vfxJ133tl3zD4fXYNZ84HY56Onp6cnysvL+x0byT5PeoVs9+7dUVRUFN3d\n3dHS0hJNTU3x/PPPx+OPPx4nTpyIiIjvfOc78eKLL/b9zO9///t48MEHU0153BvMmv/iF7+IlpaW\niIjo6OiI1tbWWLFiRcppj1udnZ399m9TU1Pcf//9kclk7PMrZLBrbp/nhn2ee/b5lXHs2LHYtWtX\n30uQ27dvj8ceeywiRmefJ7tC9tJLL8VDDz0UPT09fccymUy0tLTE9u3bY8GCBfH5z38+vvnNb8br\nr78ejz/+eBQVFUVpaWn88Ic/TDXtcW0waz5//vz4wx/+ED/5yU9i7dq1UVJSEi+88ELf6+IMzWuv\nvRYPPfRQlJeXxze+8Y34zGc+Ez/96U8j4sP/Hvb56BvMmtvnuWOf5559fmV0dHTExo0bY8+ePVFZ\nWRkLFy6MlStXRsTo7HMfnQQAkNiYuKkfAGAiE2QAAIkJMgCAxAQZAEBiggwAIDFBBgCQmCADAEhM\nkAEAJCbIAAAS+z+vmkZ7zpILzwAAAABJRU5ErkJggg==\n", "text": [ "" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "\n", "Average Business Rating\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "\n", "Overall mean: 3.868 \n", "\n", "\n" ] } ], "prompt_number": 123 }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Common Support\n", "\n", "Lets now make a histogram of the common user support (the number of common reviewers) of each pair of restaurants on the smaller set, and print the mean. Pay attention to the code, as you will use parts of it later. (This code takes a bit of time to run, so be patient).\n", "\n", "The common support is an important concept, as for each pair of restaurants, its the number of people who reviewed both. It will be used to modify similarity between restaurants. If the common support is low, the similarity is less believable." ] }, { "cell_type": "code", "collapsed": false, "input": [ "restaurants=smalldf.business_id.unique()\n", "supports=[]\n", "for i,rest1 in enumerate(restaurants):\n", " for j,rest2 in enumerate(restaurants):\n", " if i < j:\n", " rest1_reviewers = smalldf[smalldf.business_id==rest1].user_id.unique()\n", " rest2_reviewers = smalldf[smalldf.business_id==rest2].user_id.unique()\n", " common_reviewers = set(rest1_reviewers).intersection(rest2_reviewers)\n", " supports.append(len(common_reviewers))\n", "print \"Mean support is:\",np.mean(supports)\n", "plt.hist(supports)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Mean support is: 6.84679722562\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 124, "text": [ "(array([ 7.02000000e+03, 4.98700000e+03, 1.79400000e+03,\n", " 5.90000000e+02, 1.95000000e+02, 7.60000000e+01,\n", " 2.20000000e+01, 1.00000000e+01, 1.00000000e+01,\n", " 2.00000000e+00]),\n", " array([ 0. , 5.1, 10.2, 15.3, 20.4, 25.5, 30.6, 35.7, 40.8,\n", " 45.9, 51. ]),\n", " )" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAmIAAAF1CAYAAABLbYZYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X9slfX99/HX1XMOUCfn1EmB8uO0RewPt+gGRAsinMYC\nX+U+1VhciBJaXTDSqDFxiUxlg2q2suB3ZMjWrBNZhi5BE9rRLmaw9jSlmJWBTtadHkHC5HQrKrUS\n2gldz3X/4e3Bcwu058A5n9Y+H0kTer2vnvO5rpyUZ65zTo9l27YtAAAApFya6QUAAACMVYQYAACA\nIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIcMKsf379+tHP/qRtmzZolWrVikUCkmSurq6\nVFlZqZqaGpWXl6ujoyP6M4nOAAAAxgprqD/oOjg4qPz8fL333ntKS0tTS0uLXnjhBe3du1dz587V\npk2bVFJSomAwqOXLl+vYsWOyLEvz5s2La3b06FE5HI5UHTcAAIBxzqF26Onp0b/+9S/19/fr2muv\nVUZGhj755BPt27dPwWBQPp9PklRYWCiXy6Xdu3fL7XbHPaurq1NZWVmyjhMAAGDEGfKpyczMTM2d\nO1erV6/WmTNntHXrVj3//PPav3+/cnNz5XReaLm8vDw1NTXpwIEDCc0AAADGkmG9Ruz1119XZ2en\npk2bpjvvvFN33XWXuru75fF4YvbLyMhQOByOe+bxeBQOh6/wUAAAAEaXIZ+alKTu7m6VlJSou7tb\nFRUVcjqdcrlccrlcMftFIhHZth2dxzMDAAAYa4YMsf7+ft111106cuSIJk2apOeee07f//739YMf\n/ECffvppzL69vb3yer3KyspSa2trXLOcnJyv3Pfs2bP1/vvvJ3BYAAAAqXXDDTfo2LFjcf3MkE9N\n/v3vf1ckEtGkSZMkSRs3blRaWpp8Pp+OHz8es29nZ6eKi4tVXFwc1ywUCkVfvP9l77//vmzb5iuF\nXz/+8Y+Nr2GsfXHOOedj4YtzzjkfC1+JXDwaMsRuvPFGnT9/Xv/+978lSefPn9c3vvENfec731F2\ndraam5ujodXX1ye/36+ioqK4Zv39/fL7/XEvHgAAYDQb8qnJ6667Tm+88YaeeuopzZs3TydPntTv\nfvc7ud1u1dfXq6qqSsFgUO3t7WpsbFR6erokxTVraGiIzgAAAMaKIf+gq0mWZWkEL+9rKRAIXPRp\nYiQP5zz1OOepxzlPPc556iXSLYQYAADAVZBIt/Ch3wAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAA\nAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQ\nYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAA\nAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIZcNsROnjwph8OhtLS0mK9QKKSuri5VVlaq\npqZG5eXl6ujoiP5cojMAAICxxLJt277UcNu2bSooKNCNN94oSfrss89UVlamI0eOaO7cudq0aZNK\nSkoUDAa1fPlyHTt2TJZlad68eXHNjh49KofD8dXFWZYuszwAAIARI5FucV5uWFZWpqlTp0a//+Mf\n/6glS5Zo7969CgaD8vl8kqTCwkK5XC7t3r1bbrc77lldXZ3KysriWjgAAMBod9mnJr8cYZJUX1+v\n0tJStbW1KTc3V07nhY7Ly8tTU1OTDhw4kNAMAABgrBn2i/UjkYhaW1t1xx13qLu7Wx6PJ2aekZGh\ncDgc98zj8SgcDl/BIQAAAIxOl31q8sv+8pe/aM6cOXI4HHI6nXK5XDHzSCQi27YTml3O2YFzw13i\niOK00jTB6Rp6RwAAMGYNO8Tq6upUWloqScrKytL+/ftj5r29vfJ6vcrKylJra2tcs5ycnEveb+GD\n/yf6b8+3ZsnzrRuGu2Rj7ph2o56Z9z+aIEIMAICvq0AgoEAgcEW3cdl3TX7ZzTffrLa2Nk2cOFFv\nvfWWli1bpjNnzkTnN9xwg376059q5syZCc2+973vfXVxlqXp25++kuMzYqn3Jm254365x6WbXgoA\nAEiRRN41OazXiAWDQU2ZMkUTJ06UJBUVFSk7O1vNzc2SpM7OTvX19cnv98c96+/vl9/vj2vRAAAA\nXwfDemryD3/4g+65557o95Zlqb6+XlVVVQoGg2pvb1djY6PS0z+/AhTPrKGhIToDAAAYS4b91KQJ\nPDUJAABGi6Q9NQkAAICrjxADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAw\nhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBAD\nAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAwhBADAAAw\nhBADAAAwhBADAAAwhBADAAAwxBnPzidOnNCuXbs0efJkLV++XJmZmclaFwAAwNfesK+I7dq1Sw88\n8IDuv/9+VVRUKDMzU11dXaqsrFRNTY3Ky8vV0dER3T/RGQAAwFgxrCtigUBAjz32mN555x1NmzZN\nkmTbtkpLS7Vp0yaVlJRo8eLFWr58uY4dOybLsuKeHT16VA6HI6kHCwAAMJIMGWK2bWvt2rV64okn\nohEmSfv27VMwGJTP55MkFRYWyuVyaffu3XK73XHP6urqVFZWdtUPEAAAYKQaMsTeeusthUIhnThx\nQitWrFBHR4cee+wxffTRR8rNzZXTeeEm8vLy1NTUpMmTJyc0I8QAAMBYMmSIHTp0SBMnTlR1dbUm\nTZqkw4cP69Zbb9WSJUvk8Xhi9s3IyFA4HFYkEolr5vF4FA6Hr8LhAAAAjB5Dvlj/7Nmzys/P16RJ\nkyRJc+bM0bx58zR79my5XK6YfSORiGzbltPpjHsGAAAw1gx5RWzq1Knq6+uL2TZjxgxt27ZNt9xy\nS8z23t5eeb1eZWVlqbW1Na5ZTk7ORe//TN3+6L/HF3g1vsA71JIBAACSLhAIKBAIXNFtDBli8+fP\n1wcffKCBgYHolaxz585pw4YN2rx5c8y+nZ2dKi8v18yZM1VdXT3sWSgUUkVFxUXv333vwniOBwAA\nICV8Pl/0zYeStHHjxrhvY8inJgsKCjR37lw1NDRIks6fP693331XjzzyiLKzs9Xc3Czp89Dq6+uT\n3+9XUVFRXLP+/n75/f64Fw8AADCaDevviO3cuVNPPfWUQqGQwuGwamtrNXXqVNXX16uqqkrBYFDt\n7e1qbGxUenq6JMU1a2hoiM4AAADGCsu2bdv0Ii7FsixN3/606WXEban3Jm254365xxGXAACMFZZl\nKd6s4kO/AQAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAA\nDCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHE\nAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAADCHEAAAA\nDCHEAAAADCHEAAAADIk7xHp6etTf35+MtQAAAIwpwwqxhQsXKi0tTWlpaVqwYIGuueYadXV1qbKy\nUjU1NSovL1dHR0d0/0RnAAAAY4lzqB0OHTqkZcuW6Re/+IUkacaMGbJtW6Wlpdq0aZNKSkq0ePFi\nLV++XMeOHZNlWXHPjh49KofDkfSDBQAAGEmGDLEtW7bo5ptv1sSJE3XjjTdKkvbu3atgMCifzydJ\nKiwslMvl0u7du+V2u+Oe1dXVqaysLCkHCAAAMFJd9qnJwcFB9fT06MUXX1R+fr5WrlypgYEBtbW1\nadasWXI6L3RcXl6empqadODAAeXm5sY9AwAAGGsue0XM4XCosbFRtm3r1Vdf1dq1a/XMM8/o7Nmz\ncrvdMftmZGQoHA4rEonI4/EMe+bxeBQOh6/S4QAAAIwew3qxvmVZWrVqlX7+859r586dcjqdcrlc\nMftEIhHZtp3QDAAAYCwa8jViX3bPPffo8ccfV1ZWllpbW2Nmvb298nq9Cc1ycnIueZ9n6vZH/z2+\nwKvxBd54lgwAAJAUgUBAgUDgim4jrhAbHBxUfn6+iouLVV1dHTPr7OxUeXm5Zs6cGdcsFAqpoqLi\nkvfpvndhPEscMdId40wv4YoMRAblSuOdrAAAXIrP54u+AVGSNm7cGPdtXDbEDh48qL/97W96+OGH\nlZaWpq1bt+rZZ5/V/PnzlZ2drebmZhUXF6uzs1N9fX3y+/2aMGFCXLP+/n75/f64Fz7SuRwOzXhl\nnellJCz8UPXQOwEAgCty2RDr7u7W+vXrtXPnTi1btky33XabSktLJUn19fWqqqpSMBhUe3u7Ghsb\nlZ6eHvesoaEhOgMAABhLLNu2bdOLuBTLsjR9+9OmlxG3pd6btP3O1VwRAwBgDLEsS/FmFR/6DQAA\nYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAgh\nBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAA\nYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAghBgAAYAgh\nBgAAYAghBgAAYMiwQywSiai4uFgtLS2SpK6uLlVWVqqmpkbl5eXq6OiI7pvoDAAAYCxxDnfHX/3q\n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\n9hWxzZs3a+vWrXI4HJo2bZr2798fM+/t7ZXX61VWVpZaW1vjmuXk5Fzyfs/UXbif8QVejS/wDnfJ\nAAAASRMIBBQIBK7oNoYVYrW1tVq1apUyMzMlSQsXLlR1dXXMPp2dnSovL9fMmTPjmoVCIVVUVFzy\nvt33LhzOEgEAAFLK5/NF34AoSRs3boz7NoZ8anLHjh1KT0/XwMCAOjs71dLSouPHjysnJ0fNzc2S\nPg+tvr4++f1+FRUVKTs7e9iz/v5++f3+uBcOAAAw2l32itibb76pNWvWxPydL8uyFAqFtGjRIlVV\nVSkYDKq9vV2NjY1KT0+XJNXX1w971tDQEJ0BAACMJZZt27bpRVyKZVmavv1p08uI21LvTdp+52rN\neGWd6aUkLPxQ9dA7AQCAKMuyFG9W8VmTAAAAhhBiAAAAhhBiAAAAhhBiuKiByOj9IPbRvHYAwNgS\n10ccYexwpTlG7ZsNeKMBAGC04IoYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQY\nAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACA\nIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIYQYAACAIXGF\n2GeffaYzZ84kay0AAABjyrBCzLZt7dixQ3l5eTp48GB0e1dXlyorK1VTU6Py8nJ1dHRc8QwAAGCs\nGFaIffzxxyopKVE4HJZlWZI+j7PS0lLdd999evTRR7Vu3Tr5/X5FIpGEZoODg0k9UAAAgJHGOZyd\nMjMzv7Jt3759CgaD8vl8kqTCwkK5XC7t3r1bbrc77lldXZ3KysquykEBAACMBgm/WL+trU2zZs2S\n03mh5fLy8tTU1KQDBw4oNzc37hkAAMBYMqwrYhfT3d0tt9sdsy0jI0PhcFiRSEQej2fYM4/Ho3A4\nnOhSAAAARqWEr4g5nU65XK6YbV+8BiyRGQAAwFiT8BWxadOmaf/+/THbent75fV6lZWVpdbW1rhm\nOTk5F72fM3UX7mN8gVfjC7yJLhkAAOCqCQQCCgQCV3QbCYeYz+dTdXV1zLbOzk6Vl5dr5syZcc1C\noZAqKiouej/uexcmukQAAICk8fl80TcfStLGjRvjvo1hPzX5xdOHtm1LkubPn6/s7Gw1NzdL+jy0\n+vr65Pf7VVRUFNesv79ffr8/7sUDAACMZsO6IvbRRx+ptrZWlmXptdde0/Tp01VQUKD6+npVVVUp\nGAyqvb1djY2NSk9Pl6S4Zg0NDdEZAADAWGHZX1ziGoEsy9L07U+bXkbclnpv0vY7V2vGK+tMLyVh\n4YeqR+36ww9VD70TAABXmWVZijer+NBvAAAAQwgxAAAAQwgxAAAAQwgxAAAAQwgxAAAAQwgxAAAA\nQwgxAAAAQwgxAAAAQwgxAAAAQwgxAAAAQwgxAAAAQwgxAAAAQwgxfO0MRAZNLyFho3ntAID4OU0v\nALjaXGkOzXhlnellJCT8ULXpJQAAUogrYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAA\nAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYgAAAIYQYsAIMhAZ\nNL2EKzLa1w8AqeY0vQAAF7jSHJrxyjrTy0hY+KFq00sAgFHFyBWxrq4uVVZWqqamRuXl5ero6DCx\nDAAAAKNSfkXMtm2VlpZq06ZNKikp0eLFi7V8+XIdPXpUDocj1csBAAAwJuVXxPbt26dgMCifzydJ\nKiwslMvlUl1dXaqXgos41/mB6SWMOZzz1AsEAqaXMOZwzlOPcz46pDzE2traNGvWLDmdFy7G5eXl\nqampKdVLwUUQBan3dTrno+XF+hf7D2q0rH20IgpSj3M+OqT8qcnu7m653e6YbR6PR+FwONVLAXCV\njZY3G5x5e79+88pnMdt4owEAE1IeYk6nUy6XK2ZbJBK55P4Z469J9pKuuomu8aaXAAAARgHLtm07\nlXf4k5/8RLt27dI777wT3Xb33XcrJydHv/zlL2P2nT17tt5///1ULg8AACAhN9xwg44dOxbXz6T8\nilhxcbGqq2OfAgiFQqqoqPjKvvEeDAAAwGiS8hfrFxUVKTs7W83NzZKkzs5O9ff3y+/3p3opAAAA\nRqX8iphlWaqvr1dVVZWCwaDa29vV0NCg9PT0VC8FAADAqJS/Rgwjy2effabz589/5Z2sAIDRqaen\nRxMmTNA114y+N7uNNidOnNCuXbs0efJkLV++XJmZmXHfxoj80G8+Ain5bNvWjh07lJeXp4MHD0a3\nc+6Tp6WlRbfccovcbreWLVumkydPSuKcJ9Pbb7+t22+/Xdddd52WLFmi06dPS+Kcp0IkElFxcbFa\nWlokcc6TbeHChUpLS1NaWpoWLFiga665hnOeZLt27dIDDzyg+++/XxUVFcrMzEzsnNsjTCQSsefM\nmWPv3bvXtm3b/sc//mHn5uba//3vfw2v7Ovlww8/tE+ePGlblmX/+c9/tm2bc59Mp06dslevXm0f\nOXLEfvPNN+3s7Gy7pKTEtm2bc54k586ds3/4wx/a/f399tmzZ+2ioiL7mWeesW2bc54KL730kv3N\nb37Tbmlp4XdLkv31r3+1q6qq7EOHDtmHDh2yT506xTlPsubmZjszM9Pu6uqKbkv0nI+4EPvTn/5k\np6en2wMDA9FteXl59htvvGFwVV9fXw4xzn3y/P73v7fPnDkT/f6VV16xJ0yYYO/du5dzniTd3d32\nuXPnot8//fTT9vr163mcp0Bra6vd2Nho5+Tk2C0tLZzzJFu1apX9s5/9zH7vvfei2zjnyROJROyC\nggL7+eefj9me6DkfcU9N8hFI5nDuk2flypWaOHFi9PspU6bI6/Wqra1Nubm5nPMkmDJlisaNGydJ\nOnfunE6dOqUnn3ySx3mSnT59WgcOHNDdd98t6fOXQfA4T57BwUH19PToxRdfVH5+vlauXKmBgQEe\n50n01ltvKRQK6cSJE1qxYoUKCwu1bdu2hB/nKX/X5FD4CCRzOPepc/jwYa1du1ahUEgejydmxjm/\nuvbs2aPnnntOPT096ujo4HGeZFu2bNH69etjtp06dYrHeZI4HA41NjbKtm29+uqrWrt2rZ555hmd\nPXuWx3mSHDp0SBMnTlR1dbUmTZqkw4cP69Zbb9WSJUsSepyPuCti8X4EEq4ezn1q9PX16ciRI3r8\n8cflcDg450nm9/tVX1+vRYsWadWqVXK5XJzzJKmtrdWDDz4YvRL5BR7nyWdZllatWqWf//zn2rlz\nJ7/Pk+js2bPKz8/XpEmTJElz5szRvHnzNHv27ITO+YgLsWnTpunTTz+N2dbb26vp06cbWtHYwblP\njc2bN2vr1q1yOByc8xTJycnRyy+/rI8//liZmZmc8ySpra3Vd7/7XaWnpys9PV3//Oc/tXTpUv36\n17/WmTNnYvblnCfHPffco97eXmVlZfE4T5KpU6eqr68vZtuMGTO0bdu2hB7nIy7EiouLdfz48Zht\noVBIPp/PzILGEJ/Px7lPstraWq1atSr6t2YWLlzIOU+RCRMm6Prrr1dJSQnnPEna29v1n//8J/qV\nnZ2tvXv3qqWl5SufG8w5T47BwUHl5+fzf2kSzZ8/Xx988IEGBgai286dO6cNGzYk9DgfcSHGRyCl\nzheXTO3jIrIyAAABQ0lEQVT/9zd958+fz7lPoh07dig9PV0DAwPq7OxUS0uLjh8/rpycHM55EvT0\n9GjPnj3R71taWrR69WotWLCAx3mK8Xs9eQ4ePKjf/OY30d/nW7du1bPPPsvv8yQqKCjQ3Llz1dDQ\nIEk6f/683n33XT3yyCMJnfMR92J9PgIpNT766CPV1tbKsiy99tprmj59ugoKCjj3SfLmm29qzZo1\nGhwcjG6zLEuhUEiLFi3inCfB8ePHtWbNGuXn52vFihW69tpr9cILL0gSj/MU4/d68nR3d2v9+vXa\nuXOnli1bpttuu02lpaWSeJwn086dO/XUU08pFAopHA6rtrZWU6dOTeic8xFHAAAAhoy4pyYBAADG\nCkIMAADAEEIMAADAEEIMAADAEEIMAADAEEIMAADAEEIMAADAEEIMAADAEEIMAADAkP8LYP/402N5\nDYAAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 124 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, even though we chose a subset of the dataframe in which every restaurant had 150 reviews and every user had atleast made 60, the common support of most pairs of restaurants is really low, indeed less than 10!." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculating Similarity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Users rate restaurants on a scale of 1-5. Even though this rating is integer valued, for the purposes of this assignment we shall treat it as a real number.\n", "\n", "Even though each reviewer uses the same 5-star scale when rating restaurants, comparing two users by comparing their raw user ratings can be problematic. Consider a user whose average rating is 2. This is a curmudgeonly user. Consider another whose average rating is 4. This is a rather enthusiastic one. How should we compare a 3 rating by the curmudgeonly one to a 5 rating of the enthusiastic one?\n", "\n", "It is for this purpose that we must subtract the average rating of the user from the actual rating of the restaurants in computing the similarity of two restaurants. This makes the above ratings by the two users comparable. We do this in the function `pearson_sim` defined below.\n", "\n", "If there is no common support (`n_common=0`), we have no basis for making a similarity estimate, and so we set the similarity to 0. In the case that the individual restaurant rating variance is 0, such as in the case where there is only one common reviewer (`n_common=1`), we return the `NaN` that the scipy `pearsonr` returns. We will deal with it soon," ] }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy.stats.stats import pearsonr\n", "def pearson_sim(rest1_reviews, rest2_reviews, n_common):\n", " \"\"\"\n", " Given a subframe of restaurant 1 reviews and a subframe of restaurant 2 reviews,\n", " where the reviewers are those who have reviewed both restaurants, return \n", " the pearson correlation coefficient between the user average subtracted ratings.\n", " The case for zero common reviewers is handled separately. Its\n", " ok to return a NaN if any of the individual variances are 0.\n", " \"\"\"\n", " if n_common==0:\n", " rho=0.\n", " else:\n", " diff1=rest1_reviews['stars']-rest1_reviews['user_avg']\n", " diff2=rest2_reviews['stars']-rest2_reviews['user_avg']\n", " rho=pearsonr(diff1, diff2)[0]\n", " return rho" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 125 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function `get_restaurant_reviews` defined below takes a restaurant `business_id` and a set of users, and returns the reviews of that restaurant by those users. You will use this function in calculating a similarity function, in **1.5**." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def get_restaurant_reviews(restaurant_id, df, set_of_users):\n", " \"\"\"\n", " given a resturant id and a set of reviewers, return the sub-dataframe of their\n", " reviews.\n", " \"\"\"\n", " mask = (df.user_id.isin(set_of_users)) & (df.business_id==restaurant_id)\n", " reviews = df[mask]\n", " reviews = reviews[reviews.user_id.duplicated()==False]\n", " return reviews" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 126 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.5** Write a function `calculate_similarity` that operates between two restaurants and calculates a similarity for them, taking a dataframe and a similarity function `similarity_func`. An example of the `similarity_func` is the `pearson_sim` we defined above. `calculate_similarity` operates as follows: \n", "\n", "1. For each of the two restaurants, get the set of reviewers who have reviewed the restaurant and compute the intersection of these two sets. Also compute the number of common reviewers `n_common`.\n", "\n", "2. Use the function `get_restaurant_reviews` defined below to get the reviews for each restaurant as made by these common reviewers. Notice that `get_restaurant_reviews` returns a sub data frame of reviews.\n", "\n", "3. Calculate the similarity using `similarity_func` which takes the two reviews dataframes from part 2 and the number of common reviewers `n_common` as arguments\n", "\n", "4. Return the similarity and `n_common` in a tuple `(sim, n_common)`. If the similarity is a `NaN`, set the similarity to 0.\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Function\n", "--------\n", "calculate_similarity\n", "\n", "Parameters\n", "----------\n", "rest1 : string\n", " The id of restaurant 1\n", "rest2 : string\n", " The id of restaurant 2\n", "df : DataFrame\n", " A dataframe of reviews, such as the smalldf above\n", "similarity_func : func\n", " A function like pearson_sim above which takes two dataframes of individual\n", " restaurant reviews made by a common set of reviewers, and the number of\n", " common reviews. This function returns the similarity of the two restaurants\n", " based on the common reviews.\n", " \n", "Returns\n", "--------\n", "A tuple\n", " The first element of the tuple is the similarity and the second the\n", " common support n_common. If the similarity is a NaN, set it to 0\n", "\"\"\"\n", "#your code here\n", "\n", "def calculate_similarity(rest1, rest2, df, similarity_func):\n", "\n", " # adapted from the code we were given above\n", " rest1_reviewers = df[df.business_id==rest1].user_id.unique()\n", " rest2_reviewers = df[df.business_id==rest2].user_id.unique()\n", " common_reviewers = set(rest1_reviewers).intersection(rest2_reviewers)\n", " n_common = len(common_reviewers)\n", " \n", " # this is a list comprehension, but it's only really getting at the two rest_ids passed into the function\n", " # for each one, it runs get_restaurant_reviews and stores both outputs together in a list\n", " revs = [get_restaurant_reviews(rid, df, common_reviewers) for rid in [rest1,rest2]]\n", " # compute similarity\n", " sim = similarity_func(revs[0], revs[1], n_common)\n", " # check for NaN, if so return 0\n", " similarity = sim if (not np.isnan(sim)) else 0\n", "\n", " return (similarity, n_common)\n", "\n", "\n", "# test\n", "# print calculate_similarity(smalldf.business_id.ix[0], smalldf.business_id.ix[210], smalldf, pearson_sim)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Making a database of similarities\n", "\n", "We now move to calculating a global database of pairwise restaurant similarities.\n", "We provide you here with a function to make a database of the similarities for each pair of restaurants in the database. The class `Database` is initialized in its constructor by taking as arguments a dataframe of reviews. The method `populate_by calculating` iterates over every possible pair of business_id's in the dataframe and populates the database with similarities and common supports. It takes as arguments a function the similarity function `similarity_func` like `pearson_sim` (`calculate_similarity` then uses this to calculate the similarity). The `get` method on the database can be used to retrieve the similarity for two business ids." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(See Thu Oct 17th's class video for information about classes)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Database:\n", " \"A class representing a database of similaries and common supports\"\n", " \n", " def __init__(self, df):\n", " \"the constructor, takes a reviews dataframe like smalldf as its argument\"\n", " database={}\n", " self.df=df\n", " self.uniquebizids={v:k for (k,v) in enumerate(df.business_id.unique())}\n", " keys=self.uniquebizids.keys()\n", " l_keys=len(keys)\n", " self.database_sim=np.zeros([l_keys,l_keys])\n", " self.database_sup=np.zeros([l_keys, l_keys], dtype=np.int)\n", " \n", " def populate_by_calculating(self, similarity_func):\n", " \"\"\"\n", " a populator for every pair of businesses in df. takes similarity_func like\n", " pearson_sim as argument\n", " \"\"\"\n", " items=self.uniquebizids.items()\n", " for b1, i1 in items:\n", " for b2, i2 in items:\n", " if i1 < i2:\n", " sim, nsup=calculate_similarity(b1, b2, self.df, similarity_func)\n", " self.database_sim[i1][i2]=sim\n", " self.database_sim[i2][i1]=sim\n", " self.database_sup[i1][i2]=nsup\n", " self.database_sup[i2][i1]=nsup\n", " elif i1==i2:\n", " nsup=self.df[self.df.business_id==b1].user_id.count()\n", " self.database_sim[i1][i1]=1.\n", " self.database_sup[i1][i1]=nsup\n", " \n", "\n", " def get(self, b1, b2):\n", " \"returns a tuple of similarity,common_support given two business ids\"\n", " sim=self.database_sim[self.uniquebizids[b1]][self.uniquebizids[b2]]\n", " nsup=self.database_sup[self.uniquebizids[b1]][self.uniquebizids[b2]]\n", " return (sim, nsup)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 127 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets run `make_database` and store the result in the global variable `db`. Lets print out an example entry. Running this function will take a bit of time." ] }, { "cell_type": "code", "collapsed": false, "input": [ "db=Database(smalldf)\n", "db.populate_by_calculating(pearson_sim)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 128 }, { "cell_type": "code", "collapsed": false, "input": [ "db.get(\"z3yFuLVrmH-3RJruPEMYKw\", \"zruUQvFySeXyEd7_rQixBg\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 129, "text": [ "(0.39904554525734559, 7)" ] } ], "prompt_number": 129 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### K-Nearest restaurants (in similarity)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We are now going to find the k-nearest restaurants to a given restaurant based on the database of similaities that we calculated. But we have a problem.\n", "\n", "Consider the two cases where there is just one common reviewer, and where there are 40. In the former case, we might get a artificially high similarity based on the tastes of just this user, and thus we must reduce its importance in the nearest-neighbor calculation. In the latter case, we would get a much more unbiased estimator of the similarity of the two restaurants.\n", "\n", "To control the effect of small common supports, we can **shrink** our pearson co-efficients. We shall do this by using the \"regularization\" parameter `reg`:\n", "\n", "$$s_{mj} = \\frac{N_{common}\\, \\rho_{mj}}{N_{common}+reg} $$\n", "\n", "where $N_{common}$ (`n_common`) is the common reviewer support and $\\rho_{ij}$ is the pearson co-relation coefficient.\n", "\n", "Recall the notions of regularization introduced in class. We want to reduce the variance in our estimates, so we pull our estimates in toward a conservative point in a way that strongly corrals in estimates when there is very little data, but allows the data to speak when there is a lot. This can be shown as equivalent to adding in a `reg` amount of bayesian prior, as Joe has alluded to in class. \n", "\n", "A good value of the regularizer is intuitively one that dosent affect the similarity when the common support is high ~ 10, but has a large effect when the support is small. In this case, values of 2-4 are good. Usually, the value of `reg` is determined using cross-validation, but for the sake of simplicity we will generally set it to 3.\n", "\n", "We define a function `shrunk_sim` which takes the `sim` and `n_common` obtained from the database, and shrinks the similarity down using the regularizer `reg`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def shrunk_sim(sim, n_common, reg=3.):\n", " \"takes a similarity and shrinks it down by using the regularizer\"\n", " ssim=(n_common*sim)/(n_common+reg)\n", " return ssim" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 130 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.6** Now we can move to writing a `knearest` function, which finds the `k` nearest neighbors of a given restaurant based on the shrunk similarities we calculate. Note that as defined here, the nearest neighbors are global over the entire set of restaurants, as opposed to being restricted to the restaurants a user has reviewed(we shall do that in the next problem). Thus, this is an expensive function!\n", "\n", "Write a `knearest` that returns a *k-length sorted list* of 3-tuples each corresponding to a restaurant. The tuple structure is `(business_id, shrunken similarity score, common support)` where the similarity score and common support are with respect to the restaurant whose neighbors we are finding, and the `rest_id` is the id of the \"nearby\" restaurant found. The nearby restaurants are found from a supplied numpy array of restaurants `set_of_restaurants`. The spec for the function is given below. HINT: use `itemgetter` from the `operator` module to do the sorting." ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Function\n", "--------\n", "knearest\n", "\n", "Parameters\n", "----------\n", "restaurant_id : string\n", " The id of the restaurant whose nearest neighbors we want\n", "set_of_restaurants : array\n", " The set of restaurants from which we want to find the nearest neighbors\n", "dbase : instance of Database class.\n", " A database of similarities, on which the get method can be used to get the similarity\n", " of two businessed. e.g. dbase.get(rid1,rid2)\n", "k : int\n", " the number of nearest neighbors desired, default 7\n", "reg: float\n", " the regularization.\n", " \n", " \n", "Returns\n", "--------\n", "A sorted list\n", " of the top k similar restaurants. The list is a list of tuples\n", " (business_id, shrunken similarity, common support).\n", "\"\"\"\n", "#your code here\n", "\n", "from operator import itemgetter\n", "\n", "def knearest(restaurant_id, set_of_restaurants, dbase, k, reg):\n", " \n", " neighbors = []\n", " rid = restaurant_id\n", " \n", " for joint in set_of_restaurants:\n", " \n", " # make sure we're not comparing a restaurant against itself\n", " if joint != rid:\n", " \n", " # get similarity and ncommon\n", " (sim, ncom) = dbase.get(rid, joint)\n", " # shrink via regularization\n", " shrunken = shrunk_sim(sim, ncom, reg)\n", " # add to nearest neighbors list\n", " neighbors.append((joint, shrunken, ncom))\n", " \n", " # sort neighbors so that the closest are on top\n", " neighbors.sort(key=itemgetter(1), reverse=True)\n", " \n", " # return k nearest\n", " return neighbors[:k]\n", "\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 132 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ok it's time to recommend!\n", "\n", "Lets choose the two very different businesses in the dataframe" ] }, { "cell_type": "code", "collapsed": false, "input": [ "testbizid=\"eIxSLxzIlfExI6vgAbn2JA\"\n", "testbizid2=\"L-uPZxooP_ziXCtRrWi8Pw\"" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 133 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We provide functions to look up a business name given a business id, and a username given a user id." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def biznamefromid(df, theid):\n", " return df['biz_name'][df['business_id']==theid].values[0]\n", "def usernamefromid(df, theid):\n", " return df['user_name'][df['user_id']==theid].values[0]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 134 }, { "cell_type": "code", "collapsed": false, "input": [ "print testbizid, biznamefromid(smalldf,testbizid)\n", "print testbizid2, biznamefromid(smalldf, testbizid2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "eIxSLxzIlfExI6vgAbn2JA Lobbys Beef Burgers Dogs\n", "L-uPZxooP_ziXCtRrWi8Pw Caf\u00e9 Monarch\n" ] } ], "prompt_number": 135 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Get top matches\n", "\n", "Its now time to answer the question: \"if you liked this, you might also like these\". We use our `testbizid` and `testbizid2` to compute the `k=7` nearest neighbors with a regularization of `3.` . We print these top 15 matches names, along with their similarity coefficient and common support." ] }, { "cell_type": "code", "collapsed": false, "input": [ "tops=knearest(testbizid, smalldf.business_id.unique(), db, k=7, reg=3.)\n", "print \"For \",biznamefromid(smalldf, testbizid), \", top matches are:\"\n", "for i, (biz_id, sim, nc) in enumerate(tops):\n", " print i,biznamefromid(smalldf,biz_id), \"| Sim\", sim, \"| Support\",nc" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "For Lobbys Beef Burgers Dogs , top matches are:\n", "0 La Condesa Gourmet Taco Shop | Sim 0.598714448434 | Support 6\n", "1 Citizen Public House | Sim 0.571428571429 | Support 4\n", "2 FnB | Sim 0.527129890943 | Support 5\n", "3 Defalco's Italian Grocery | Sim 0.519456555658 | Support 6\n", "4 Republic Ramen + Noodles | Sim 0.519140146937 | Support 5\n", "5 unPhogettable | Sim 0.5 | Support 3\n", "6 Haus Murphy's | Sim 0.467637235308 | Support 3\n" ] } ], "prompt_number": 136 }, { "cell_type": "code", "collapsed": false, "input": [ "tops2=knearest(testbizid2, smalldf.business_id.unique(), db, k=7, reg=3.)\n", "print \"For \",biznamefromid(smalldf, testbizid2), \", top matches are:\"\n", "for i, (biz_id, sim, nc) in enumerate(tops2):\n", " print i,biznamefromid(smalldf,biz_id), \"| Sim\", sim, \"| Support\",nc" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "For Caf\u00e9 Monarch , top matches are:\n", "0 Postino Arcadia | Sim 0.625 | Support 5\n", "1 The Main Ingredient Ale House And Caf\u00e9 | Sim 0.571428571429 | Support 4\n", "2 Brio Tuscan Grille | Sim 0.571428571429 | Support 4\n", "3 Kazimierz World Wine Bar | Sim 0.5 | Support 3\n", "4 Harlow's Cafe | Sim 0.5 | Support 3\n", "5 The Fry Bread House | Sim 0.5 | Support 3\n", "6 Cien Agaves Tacos & Tequila | Sim 0.5 | Support 3\n" ] } ], "prompt_number": 137 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that these two restaurants are in somewhat different orbits :-)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets now turn our attention to another question: what are the top recommendations for a user? To answer this we must find the user's top rated restaurants, find the nearest neighbors of these restaurants, merge these lists while removing the duplicates and the ones that the user has already rated, and sort by the restaurant's average rating. We provide the code to get the user's top choices in a subset data frame." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def get_user_top_choices(user_id, df, numchoices=5):\n", " \"get the sorted top 5 restaurants for a user by the star rating the user gave them\"\n", " udf=df[df.user_id==user_id][['business_id','stars']].sort(['stars'], ascending=False).head(numchoices)\n", " return udf\n", "testuserid=\"7cR92zkDv4W3kqzii6axvg\"\n", "print \"For user\", usernamefromid(smalldf,testuserid), \"top choices are:\" \n", "bizs=get_user_top_choices(testuserid, smalldf)['business_id'].values\n", "[biznamefromid(smalldf, biz_id) for biz_id in bizs]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "For user Vern top choices are:\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 138, "text": [ "['Local Breeze',\n", " \"Carly's Bistro\",\n", " 'Tee Pee Mexican Food',\n", " 'District American Kitchen and Wine Bar',\n", " 'Los Reyes de la Torta']" ] } ], "prompt_number": 138 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Get top recommendations for user." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.8** Its your job now to write a function `get_top_recos_for_user` which takes as arguments a `userid`, the `n` top choices for the user, the dataframe, `k`, and a regularizer, and returns the top recommendations obtained from combining the restaurants that are neighbors of each of the `n` choices, in the way described in the previous paragraph. This returned list is a list of tuples `(restaurant_id, business_avg)` sorted by `business_avg` where `business_avg` is the average rating of the restaurant over the dataframe." ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Function\n", "--------\n", "get_top_recos_for_user\n", "\n", "Parameters\n", "----------\n", "userid : string\n", " The id of the user for whom we want the top recommendations\n", "df : Dataframe\n", " The dataframe of restaurant reviews such as smalldf\n", "dbase : instance of Database class.\n", " A database of similarities, on which the get method can be used to get the similarity\n", " of two businessed. e.g. dbase.get(rid1,rid2)\n", "n: int\n", " the n top choices of the user by star rating\n", "k : int\n", " the number of nearest neighbors desired, default 8\n", "reg: float\n", " the regularization.\n", " \n", " \n", "Returns\n", "--------\n", "A sorted list\n", " of the top recommendations. The list is a list of tuples\n", " (business_id, business_avg). You are combining the k-nearest recommendations \n", " for each of the user's n top choices, removing duplicates and the ones the user\n", " has already rated.\n", "\"\"\"\n", "#your code here\n", "def get_top_recos_for_user(userid, df, dbase, n, k, reg):\n", " \n", " # put top n user choices into 'tops'\n", " tops = get_user_top_choices(userid, df, n)\n", " \n", " # included is a set because sets only allow unique instances\n", " included = set()\n", " neighbors = []\n", "\n", " # loop through the list of top choices' ids\n", " for joint in tops.business_id:\n", "\n", " # loop through knearest data for each top user choice\n", " for (jid, sim, ncom) in knearest(joint, df.business_id.unique(), dbase, k, reg):\n", " \n", " # set mask to identify businesses that the user has already rated\n", " mask = (df.business_id == jid) & (df.user_id == userid)\n", " \n", " # if we haven't already seen this biz, AND if user hasn't already rated, then keep it\n", " if (jid not in included) & (not df[mask]):\n", " \n", " included.add(jid)\n", " # grab avg rating\n", " rating = df[df.business_id == jid].stars.mean()\n", " # append id/rating tuple to list of neighbors\n", " neighbors.append((jid, rating))\n", " \n", " # sort in the usual way\n", " # does it matter if we use x.sort() or y = sorted(x...)?\n", " final_neighbors = sorted(neighbors, key=itemgetter(1), reverse=True)\n", " \n", " return final_neighbors\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets print the top recommendations for `testuserid`, with a regularization of 3." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"For user\", usernamefromid(smalldf,testuserid), \"the top recommendations are:\"\n", "toprecos=get_top_recos_for_user(testuserid, smalldf, db, n=5, k=7, reg=3.)\n", "for biz_id, biz_avg in toprecos:\n", " print biznamefromid(smalldf,biz_id), \"| Average Rating |\", round(biz_avg,2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "For user Vern the top recommendations are:\n", "Rokerij" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " | Average Rating | 4.38\n", "Wildfish Seafood Grille | Average Rating | 4.29\n", "Cornish Pasty Company | Average Rating | 4.21\n", "Pappadeaux Seafood Kitchen | Average Rating | 4.19\n", "Four Peaks Brewing Co | Average Rating | 4.17\n", "The Fry Bread House | Average Rating | 4.12\n", "Yasu Sushi Bistro | Average Rating | 4.08\n", "Pho Thanh | Average Rating | 4.05\n", "Pita Jungle | Average Rating | 3.91\n", "Carolina's Mexican Food | Average Rating | 3.91\n", "Malee's Thai Bistro | Average Rating | 3.88\n", "Modern Steak | Average Rating | 3.85\n", "Arcadia Farms Cafe | Average Rating | 3.79\n", "Delux | Average Rating | 3.78\n", "CherryBlossom Noodle Cafe | Average Rating | 3.75\n", "Hula's Modern Tiki | Average Rating | 3.75\n", "SanTan Brewing Company | Average Rating | 3.73\n", "Republic Ramen + Noodles | Average Rating | 3.69\n", "Oregano's Pizza Bistro | Average Rating | 3.68\n", "TEXAZ Grill | Average Rating | 3.66\n", "Pita Jungle | Average Rating | 3.64\n", "Yupha's Thai Kitchen | Average Rating | 3.63\n", "Culinary Dropout | Average Rating | 3.62\n", "Rice Paper | Average Rating | 3.29\n", "The Breakfast Club | Average Rating | 3.24\n", "Stingray Sushi | Average Rating | 3.11\n", "Kabuki Japanese Restaurant | Average Rating | 3.09\n", "Teharu Sushi | Average Rating | 2.87\n" ] } ], "prompt_number": 139 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem 2: A user based recommender with predicted ratings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is all very nice. We can provide ratings based on global similarities to a restaurant. However, in many cases this is not enough.\n", "\n", "For example, it is hard to judge if the above recommendations are any good. In the usual testing paradigm, say that we break the dataframe into train and test. Based on the training set, I am recommended restaurant B. Now, I have rated B, but that information is in the testing set. I have no way of comparing the rating I give B in the testing set, to the similarity computed from the training set that was used to make the recomendation. The best I could do is to compare the average rating of restaurant B in the training set to my rating of restaurant B in the test set. \n", "\n", "In this section, we shift our focus to more fine-grained predictions about each user, and try to predict what _rating_ a user would give to a restaurant they have never tried before. To do this, we will try to personalize the information we use even further, and only pool information from restaurants that the user has rated.\n", "\n", "This allows us to return to the original problem of prediction $Y_{um}$ for a restaurant $m$ that user $u$ has never rated before. Using our newly computed similarity metrics, we can modify our original baseline estimate by pulling in information from the user's neighborhood of the restaurant $m$, and predict $Y_{um}$ as:\n", "\n", "$$ \\hat{Y_{um}} = \\hat Y^{baseline}_{um}\\, + \\,\\frac{\\sum\\limits_{j \\in S^{k}(m;u)} s_{mj} ( Y_{uj} - \\hat Y^{baseline}_{um} )}{\\sum\\limits_{j \\in S^{k}(m;u)} s_{mj} } $$\n", "\n", "where $s^{k}(m;u)$ is the $k$ neighbor items of item $m$ which have been rated by user $u$.\n", "\n", "Now, this is not a particularly good assumption, especially in the situation where a restaurant is new (new item problem) or a user is new (cold start problem), or in the case when there are very few reviewers of a restaurant, or very few reviews by a user respectively. However, one must start somewhere!\n", "\n", "Notice that in adding in the similarity term, we subtract the baseline estimate from the observed rating of the user's neighbor items." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Defining the predicted rating" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.1** Write a function `knearest_amongst_userrated`, analogous to the `knearest` function we defined above, to find the nearest `k` neighbors to a given restaurant from the **restaurants that the user has already rated**. This function will take as arguments the `restaurant_id`, the `user_id`, the dataframe of reviews, the database, the `k`, and the regularizer `reg`. Just like before, return a *k-length sorted list* of 3-tuples each corresponding to a restaurant. HINT: use the `knearest` function you defined earlier" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Function\n", "--------\n", "knearest_amongst_userrated\n", "\n", "Parameters\n", "----------\n", "restaurant_id : string\n", " The id of the restaurant whose nearest neighbors we want\n", "user_id : string\n", " The id of the user, in whose reviewed restaurants we want to find the neighbors\n", "df: Dataframe\n", " The dataframe of reviews such as smalldf\n", "dbase : instance of Database class.\n", " A database of similarities, on which the get method can be used to get the similarity\n", " of two businesses. e.g. dbase.get(rid1,rid2)\n", "k : int\n", " the number of nearest neighbors desired, default 7\n", "reg: float\n", " the regularization.\n", " \n", " \n", "Returns\n", "--------\n", "A sorted list\n", " of the top k similar restaurants. The list is a list of tuples\n", " (business_id, shrunken similarity, common support).\n", "\"\"\"\n", "#your code here\n", "def knearest_among_userrated(restaurant_id, user_id, df, dbase, k, reg):\n", " \n", " # trim df to only instances where our specific user has rated\n", " mydf = df[df['user_id'] == user_id]\n", " \n", " # run knearest on the unique rest_ids in this trimmed df\n", " neighbors = knearest(restaurant_id, mydf.business_id.unique(), dbase, k, reg)\n", " \n", " return neighbors[:k]\n", " " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 140 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.2** Now write a function that returns the predicted rating for a user and an item using the formula at the beginning of this problem. Include code to deal with the possibility that the sum of scores that goes in the denominator is 0: return an predicted rating of the baseline portion of the formula in that case. This function `rating` takes as arguments the dataframe, the database, the wanted `restaurant_id` and `user_id`, and `k` as well as the regularizer." ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "\n", "Function\n", "--------\n", "rating\n", "\n", "Parameters\n", "----------\n", "df: Dataframe\n", " The dataframe of reviews such as smalldf\n", "dbase : instance of Database class.\n", " A database of similarities, on which the get method can be used to get the similarity\n", " of two businessed. e.g. dbase.get(rid1,rid2)\n", "restaurant_id : string\n", " The id of the restaurant whose nearest neighbors we want\n", "user_id : string\n", " The id of the user, in whose reviewed restaurants we want to find the neighbors\n", "k : int\n", " the number of nearest neighbors desired, default 7\n", "reg: float\n", " the regularization.\n", " \n", " \n", "Returns\n", "--------\n", "A float\n", " which is the imputed rating that we predict that user_id will make for restaurant_id\n", "\"\"\"\n", "\n", "#your code here\n", "def rating(df, dbase, restaurant_id, user_id, k, reg):\n", "\n", " rid = restaurant_id\n", " \n", " # get knearest neighbor\n", " nearest = knearest_among_userrated(restaurant_id, user_id, df, dbase, k, reg)\n", "\n", " # compute formula elements\n", " Yavg_U = df[df.user_id==user_id].stars.mean()\n", " Yavg_M = df[df.business_id==rid].stars.mean()\n", " Yavg = df.stars.mean()\n", " Yhat_base_M = Yavg + (Yavg_U - Yavg) + (Yavg_M - Yavg)\n", " \n", " # this list is for collecting S_mj and Y_diff values across all restaurants in set\n", " neighbor_data = []\n", " \n", " # loop through all joints in k nearest\n", " for (jid, S_Mj, ncom) in nearest:\n", " \n", " # compute all of the 'j' elements of our formula\n", " Yavg_J = df[df.business_id==jid].stars.mean()\n", " Yhat_base_J = Yavg + (Yavg_U - Yavg) + (Yavg_J - Yavg)\n", " Y_Uj = df[(df.user_id == user_id) & (df.business_id == jid)].stars.iloc[0]\n", "\n", " # compute Yuj - Yhat_base_J\n", " Y_diff = Y_Uj - Yhat_base_J\n", " \n", " # compute atomic (ie. un-summed) numerator of our neighbor ratio expression\n", " atomic_numerator = float(S_Mj) * float(Y_diff)\n", " \n", " # append similarity and atomic numerator before iterating\n", " neighbor_data.append((S_Mj, atomic_numerator))\n", " \n", " # from: stackoverflow.com/questions/638048/how-do-i-sum-the-first-value-in-each-tuple-in-a-list-of-tuples-in-python\n", " numerator = sum([pair[1] for pair in neighbor_data])\n", " denominator = sum([pair[0] for pair in neighbor_data])\n", " \n", " if denominator == 0:\n", " \n", " return Yhat_base_M\n", " \n", " else:\n", " \n", " neighbor_factor = float(numerator) / float(denominator)\n", "\n", " Yhat_M = Yhat_base_M + neighbor_factor\n", "\n", " return Yhat_M\n", " " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 143 }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the top-recommendations in the variable `toprecos` from the previous section, we compute the predicted rating and compare it with the average rating over all users available inside the tuples that make up `toprecos`. We use a `k` of 7 and regularization 3. For comparision we also print this users' average rating. Do you notice anything interesting about how the order has changed from when we did this with the global similarities? (for you to think, not to answer)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"User Average\", round(smalldf[smalldf.user_id==testuserid].stars.mean(),3),\"for\",usernamefromid(smalldf,testuserid)\n", "print \"Predicted ratings for top choices calculated earlier:\"\n", "for biz_id,biz_avg in toprecos:\n", " print biznamefromid(smalldf, biz_id),\"|\",round(rating(smalldf, db, biz_id, testuserid, k=7, reg=3.),2),\"|\",\"Average\",round(biz_avg,2) \n", "\n", " " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "User Average 3.565 for Vern\n", "Predicted ratings for top choices calculated earlier:\n", "Rokerij | 4.72 | Average 4.38\n", "Wildfish Seafood Grille | 4.28 | Average 4.29\n", "Cornish Pasty Company | " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "4.63 | Average 4.21\n", "Pappadeaux Seafood Kitchen | 4.09 | Average 4.19\n", "Four Peaks Brewing Co | 4.26 | Average 4.17\n", "The Fry Bread House" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " | 4.23 | Average 4.12\n", "Yasu Sushi Bistro | 4.61 | Average 4.08\n", "Pho Thanh | " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "4.1 | Average 4.05\n", "Pita Jungle | 4.4 | Average 3.91\n", "Carolina's Mexican Food | 4.32 | Average 3.91\n", "Malee's Thai Bistro | " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "4.4 | Average 3.88\n", "Modern Steak | 3.76 | Average 3.85\n", "Arcadia Farms Cafe | 3.14 | Average 3.79\n", "Delux | " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "3.92 | Average 3.78\n", "CherryBlossom Noodle Cafe | 3.95 | Average 3.75\n", "Hula's Modern Tiki | 3.82 | Average 3.75\n", "SanTan Brewing Company | " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "3.31 | Average 3.73\n", "Republic Ramen + Noodles | 3.51 | Average 3.69\n", "Oregano's Pizza Bistro | " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "3.92 | Average 3.68\n", "TEXAZ Grill | 3.89 | Average 3.66\n", "Pita Jungle | " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "3.73 | Average 3.64\n", "Yupha's Thai Kitchen | 3.01 | Average 3.63\n", "Culinary Dropout | 3.5 | Average 3.62\n", "Rice Paper | " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "3.25 | Average 3.29\n", "The Breakfast Club | 3.05 | Average 3.24\n", "Stingray Sushi | 3.03 | Average 3.11\n", "Kabuki Japanese Restaurant | " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "3.19 | Average 3.09\n", "Teharu Sushi | 2.43 | Average 2.87\n" ] } ], "prompt_number": 144 }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Testing the ratings\n", "\n", "Let us compare the predicted ratings with a user's ratings. Note that we are doing this on the same set that we constructed the predictions with, so this is not a validation of the procedure, but simply a check of the procedure's fit. We first write a helper function to return the user score for a restaurant, and the restaurant's average score over all users." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def get_other_ratings(restaurant_id, user_id, df):\n", " \"get a user's rating for a restaurant and the restaurant's average rating\"\n", " choice=df[(df.business_id==restaurant_id) & (df.user_id==user_id)]\n", " users_score=choice.stars.values[0]\n", " average_score=choice.business_avg.values[0]\n", " return users_score, average_score" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 145 }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the user `testuserid`, we loop over the variable `bizs` (which is a set of restaurants the user has rated) and print the predicted rating, and the actual rating and restaurant average rating obtained using the function above. We again use `k=7` and a regularization of 3." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"for user\",usernamefromid(smalldf,testuserid), 'avg', smalldf[smalldf.user_id==testuserid].stars.mean() \n", "for biz_id in bizs:\n", " print \"----------------------------------\"\n", " print biznamefromid(smalldf, biz_id)\n", " print \"Predicted Rating:\",rating(smalldf, db, biz_id, testuserid, k=7, reg=3.) \n", " u,a=get_other_ratings(biz_id, testuserid, smalldf)\n", " print \"Actual User Rating:\",u,\"Avg Rating\",a" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "for user Vern avg 3.5652173913\n", "----------------------------------\n", "Local Breeze\n", "Predicted Rating: 4.2280987611\n", "Actual User Rating: 5 Avg Rating 4.0\n", "----------------------------------\n", "Carly's Bistro\n", "Predicted Rating: 3.99008654065\n", "Actual User Rating: 5 Avg Rating 3.5\n", "----------------------------------\n", "Tee Pee Mexican Food\n", "Predicted Rating: " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "3.52640184162\n", "Actual User Rating: 5 Avg Rating 3.04347826087\n", "----------------------------------\n", "District American Kitchen and Wine Bar\n", "Predicted Rating: 3.80281696528\n", "Actual User Rating: 4 Avg Rating 3.55263157895\n", "----------------------------------\n", "Los Reyes de la Torta\n", "Predicted Rating: 3.41514298977\n", "Actual User Rating: 4 Avg Rating 4.13157894737\n" ] } ], "prompt_number": 146 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.3** Explain in words why the predicted ratings are lower than the actual ratings. How do the user average rating and restaurant average rating affect this? How does sparsity affect the predicted ratings?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "On average, Vern is a slightly curmudgeonly user within the smalldf dataset. As such, his baseline rating is affected negatively by his user average, as its difference from the overall mean is subtracted from his baseline M and J scores. That means that it's not only a deduction in baseline M, but also in the neighbor/similarity value that gets added onto the baseline M score. So it counts as a double whammy against the Yhat_um. When the recommended restaurants are above the overall average and the similarity is high, this attenuates Vern's grump factor somewhat.\n", "

\n", "Re: sparsity, higher sparsity just means that our universe of items and users is more spread out, and so they're less likely to find each other. With high sparsity, there's less of a chance that we'll have a high n_common for any given item pair, and so we basically have a less reliable base from which to ground our predictions. Sparsity shouldn't have so much of a direct impact on ratings valence, so much as it should on variance and consistency (which could in turn move valences around). \n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Error Analysis\n", "\n", "This next function takes a set of actual ratings, and a set of predicted ratings, and plots the latter against the former. We can use a graph of this kind to see how well or badly we do in our predictions. Since the nearest neighbor models can have alternating positive and negative similarities (the sum of similarity weights in the denominator can get large), the ratings can get very large. Thus we restrict ourselves to be between -10 and 15 in our ratings and calculate the fraction within these bounds. We also plot the line with unit slope, line sehments joining the means, and a filled in area representing one standard deviation from the mean.\n", "\n", "The first argument to `compare_results` is a numpy array of the actual star ratings obtained from the dataframe, while the second argument is the numpy array of the predicted ones. (*Feel free to improve this function for your display*)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def compare_results(stars_actual, stars_predicted, ylow=-10, yhigh=15, title=\"\"):\n", " \"\"\"\n", " plot predicted results against actual results. Takes 2 arguments: a\n", " numpy array of actual ratings and a numpy array of predicted ratings\n", " scatterplots the predictions, a unit slope line, line segments joining the mean,\n", " and a filled in area of the standard deviations.\"\n", " \"\"\"\n", " fig=plt.figure()\n", " df=pd.DataFrame(dict(actual=stars_actual, predicted=stars_predicted))\n", " ax=plt.scatter(df.actual, df.predicted, alpha=0.2, s=30, label=\"predicted\")\n", " plt.ylim([ylow,yhigh])\n", " plt.plot([1,5],[1,5], label=\"slope 1\")\n", " xp=[1,2,3,4,5]\n", " yp=df.groupby('actual').predicted.mean().values\n", " plt.plot(xp,yp,'k', label=\"means\")\n", " sig=df.groupby('actual').predicted.std().values\n", " plt.fill_between(xp, yp - sig, yp + sig, \n", " color='k', alpha=0.2)\n", " plt.xlabel(\"actual\")\n", " plt.ylabel(\"predicted\")\n", " plt.legend(frameon=False)\n", " remove_border()\n", " plt.grid(False)\n", " plt.title(title)\n", " print np.mean(np.abs(df.predicted) < 15)\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 148 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.4** For each review in the data set, obtain a prediction from the entire dataframe `smalldf`. Use the function `compare_results` above to plot the predicted ratings against the observed ones. Make 4 such graphs, at k=3 and k=10, and for reg=3. and reg=15.\n", "\n", "Note that this analysis is not strictly a model check because we are testing on the training set. However, since the user averages would change each time a cross-validation split was done on the set, we would incur the prohibitive expense of redoing the database each time. This would be better done on a cluster, using map-reduce or other techniques. While we explore map-reduce later in this homework, we shall not do any cross-validation.\n", "\n", "Explain the results you get in the graphs in words." ] }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here\n", "predictdf = smalldf.copy()\n", "\n", "# i tried a number of different implementations here, as speed was certainly an issue\n", "# in the end i stuck with brian's numpy vectorization solution from Piazza @1133, \n", "# but from what i can tell there aren't any solutions that are far better than all the (viable) others.\n", "\n", "# \n", "vrating = np.vectorize(rating, excluded=['df','dbase','k','reg'], otypes=[np.float])\n", "pred_3_3 = vrating(df=smalldf, dbase=db, restaurant_id=smalldf['business_id'], user_id=smalldf['user_id'], k=3, reg=3)\n", "pred_3_15 = vrating(df=smalldf, dbase=db, restaurant_id=smalldf['business_id'], user_id=smalldf['user_id'], k=3, reg=15)\n", "pred_10_3 = vrating(df=smalldf, dbase=db, restaurant_id=smalldf['business_id'], user_id=smalldf['user_id'], k=10, reg=3)\n", "pred_10_15 = vrating(df=predictdf, dbase=db, restaurant_id=predictdf['business_id'], user_id=predictdf['user_id'], k=10, reg=15)\n", "\n", "predictdf['predict_3_3'] = pred_3_3\n", "predictdf['predict_3_15'] = pred_3_15\n", "predictdf['predict_10_3'] = pred_10_3\n", "predictdf['predict_10_15'] = pred_10_15\n", "\n", "#predictdf.to_csv('predictdf.csv', index=False)\n", "\n", "#predictdf = pd.read_csv('predictdf.csv')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 149 }, { "cell_type": "code", "collapsed": false, "input": [ "actual = predictdf['stars']\n", "\n", "compare_results(actual, predictdf['predict_3_3'], title='k=3 and reg=3') \n", " \n", "compare_results(actual, predictdf['predict_3_15'], title='k=3 and reg=15')\n", " \n", "compare_results(actual, predictdf['predict_10_3'], title='k=10 and reg=3')\n", " \n", "compare_results(actual, predictdf['predict_10_15'], title='k=10 and reg=15')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.999837793998\n", "0.999675587997" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.993349553933" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.994484995945" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nDRMnTsTTTz+NnJwczJo1CxMmTEBVVRXeeustjB8/PuGYS5cuxbvvvouqqiqMHz8ed999NwBg2LBh\nePvttzFv3jxcdtllGD16NB577DGcdtppnbZvz549eO2111BdXY3PP/8cb7zxBn72s5/B4XAk9XU5\nVooQQqS6Eb1JURQcZ0+JiIjohPT5559j6tSpKC8vR0lJSaqbk1LsEiUiIiJSOQY2IiIiUqXoGLPj\ncdZnTzGwERERkers2bMHzzzzDBRFwaOPPhpbt+1ExTFsRERERCrHChsRERGRyjGwEREREakcAxsR\nERGRyjGwEREREakcAxsRERGRyjGwEREREakcAxsRERGRyjGwEREREakcAxsRERGRyjGwEREREakc\nAxsRERGRyjGwEREREakcAxsREZGKKYrSJ6fe8M033+C6667D9OnTsXz5cowdOxZpaWm49dZb4Xa7\ncccdd2DgwIEYPnw4ysrKAABOpxN33XUXrrvuOpx++um45ppr4PV6AQCBQABz5szBwoULcc899+AX\nv/gFmpubAQCffPIJfv7zn+Ouu+7C008/jQEDBmDAgAFYuXJlrD3ffvst7r77bixatAhnnnkmnnji\niV55nikhjjPH4VMiIqITGIA+OfWGUCgkrrnmGpGZmSnee+89EQ6HxSeffCIURRE33nijaG5uFqFQ\nSEyYMEHMnj1bCCHErFmzRHV1tRBCiIqKCqHT6cSdd94phBBiwYIF4qSTToodf/To0eLBBx8UQggR\nDofFKaecIk4++WTx2WefiWAwKC666CJx+umnx+5/zjnniK1btwohhKisrBTPPPNMrzzPVND1US4k\nIiKioyCESHUTuk2r1aK4uBhpaWm4+OKLAQCTJ08GAIwbNw52ux0AMGnSJCxbtgzr1q3D+vXr8fjj\nj8eOMWXKlFiFbeLEiTAYDADk62Cz2VBeXg4A0Gg0yM7ORmlpKaZOnQoAOP/883HLLbfEjhUIBPDI\nI4/g5ZdfRn5+Pi655JKkPv9kYmAjIiKipDEaje2uMxgMaG5uxsaNG1FSUoKHH364w58dM2YMTj75\nZLz44ovweDxoaWlBJBLp9LEMBgMCgUDs8sMPP4wLLrgA3377LRYtWoRJkyYd+xNKEY5hIyIioj4n\nhIDH44lVzOKFw2EIIbBr1y6MGzcOY8eOxS233IKsrKwePcaUKVOwbt06pKenY8qUKVi4cGEvtb7v\n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\n", "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nP210LKBfVVVVafXq1dqyZYtmz56tyZMna968eUbHsrwtW7bopz/9qSoqKlRZWanS0lIlJSXd8Hy2\npgIAADA5S1wSBQAAsDIKGwAAgMlR2AAAAEyOwgYAAGByFDYAAACTo7ABAACYHIUNAAbQqVOn1Nzc\nbHQMAD6OwgYAA6C9vV1r1qxRfn6+7Ha70XEA+DgKGwBch9Pp1IYNG/r8+pCQED311FP9mAiAP6Ow\nAcB1PPXUUzp48KDRMQBAEoUNgB8pLi7W+vXr9cQTT+i5556TJNntdq1evVpr167VnDlztHPnTtnt\ndh09elSnT5/WM888owsXLigvL08lJSWSpA8//FDh4eHav3+/JGn//v1asWKFSktLtWDBAtXV1Rn2\nNQKwJkts/g4A36SiokLPP/+8mpqa1NraqqioKC1ZskQLFizQpk2blJaWpoiICJWUlOjw4cO66667\ndP78eT355JOSpAkTJshms0mSZs+ereTk5O7fe9WqVVq+fLkWLFig3bt3a/Pmzfrxj39syNcJwJoo\nbAD8QlZWlg4fPiy32629e/fK5XLp9OnTqq+vV1pamiRp6dKlKioqkiS53e5rfo/rPSdJGzduVFpa\nmsrLy/XVV18xwgag33FJFIBfsNlsqqysVElJicaPHy9JOnToUPeoWZeoqKju83srJiZGq1evVnV1\ntTIzM+VyufovOACIwgbAT5w4cUKPP/64iouLlZSUJElKTExUWVmZrly50n3eF198IenGo2ld/vPj\nc+bM0Xe/+13ddddd3/g6AOgLChsAv7B37151dHSos7NTx48flySNGTNGQ4YM0cKFC/XJJ5/oyJEj\n+stf/iLJM9JWXV0tt9sth8OhIUOG6NSpU5Kk48ePq76+Xk1NTXI4HDp16pQ6OjrU0tKif/7zn6qv\nr5fT6eweaaPEAbhdFDYAfmHOnDlyOp3Ky8tTeXm5pk2bptWrV+tPf/qTamtrNX36dP3ud7/TkiVL\nus8/duyYFi9erNDQUD388MMqLy/XyJEj9fHHH6uwsFBnzpxRdHS07r33Xv3whz/UsmXLdP/99+uN\nN97Qnj179OKLL8pms+mPf/wjux0AuC02N//1AwAAMDVG2AAAAEyOwgYAAGByFDYAAACTo7ABAACY\nHIUNAADA5ChsAAAAJkdhAwAAMDkKGwAAgMlR2AAAAEzu/wEUfWo64DGihgAAAABJRU5ErkJggg==\n", "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nAxujHWaofBDBAAAAAElFTkSuQmCC\n", "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nRGdnJ7daLJA777wTFRUV8Hg8WLduHerq6vQeUklTFAVXX301rrvuOjQ1Nc3qe0oisL344ovo6uqC\n1VqoUtLd3Y1nnnlGx1ERza9LLrlk7AAOANTX16O9vV3HEZW++vp62O12AEAqlcKJEyfw9a9/XedR\nlb7h4WG89NJL2LJli95DKQu5XA4jIyP43ve+h56eHlxyySXIZDJ6D6uk7dq1C/v378ehQ4dw0UUX\nYdmyZfjxj3884/eURGDr7++fdBXm8/nQ19en04iItLdnzx5cddVVeg+jLPz617/G6aefjqeffhr/\n93//p/dwSt6dd96J66+/Xu9hlA2LxYLf/OY3OH78OP7zP/8Tv/nNb/DNb35T72GVtN27d8Pj8eA7\n3/kOfvnLX+Lhhx/G3/7t3+KVV16Z9ntKIrB9tG0VMHUtN6JSEYvF8NZbb+G6667Teyhl4fzzz8fj\njz+Oz372s9i6davewylpO3bswKWXXjo2swmALQgXiMlkwtatW/H9738fDz30kN7DKWnRaBQ9PT2o\nqakBAKxbtw4bNmzAk08+Oe33lERga2pqQigUmvBYMBhEc3OzTiMi0ta//du/4Yc//CH7oC6gjo4O\n/OQnP8HQ0BBPimpox44dWLt2LZxOJ5xOJz788EOcc845uOSSS/QeWtm48MILEQwG9R5GSWtoaEAs\nFpvwWGtrK0ZHR6f9npJ4t9+8eTMOHjw44bH9+/ePHUIgKiU7duzA1q1bx45/c6/JwqmoqEB1dTUC\ngYDeQylZr776KhKJxNitvb0d//u//4tHH31U76GVjVwuh56eHr2HUdLOPPNMHD58eML7dyKRmPG0\naEkEtjPOOAPt7e149tlnAUif0Xg8jvPPP1/nkZU+demZSxYL4/7774fT6UQmk0Fvby+ef/55PPLI\nI3oPq2SNjIzg17/+9dj9559/Hn/5l3/JMhNUUl577TXce++9Y+/nP/zhD/H3f//3Oo+qtC1duhTr\n168fWwJNp9N46623ZtxysWDN37VkMpnwxBNP4LbbbsO+ffvw6quv4sknn2TbKo0NDg5ix44dMJlM\neOSRR9Dc3IylS5fqPayS9dRTT+GrX/3qhPqCJpMJ+/fv13FUpe3gwYP46le/ip6eHlx00UVwu934\n9re/rfewiOZVf38/br31Vjz00EM499xzcfrpp+OCCy7Qe1gl76GHHsKNN96I/fv3o6+vDzt27EB9\nff20X8/WVEREREQGVxJLokRERESljIGNiIiIyOAY2IiIiIgMjoGNiIiIyOAY2IiIiIgMjoGNiIiI\nyOAY2IiINPTGG28gHo/rPQwiKnIMbEREGkin07jtttuwbt06DA0N6T0cIipyDGxERFPI5XK49957\n5/z9drsd3/rWt+ZxRERUzhjYiIim8K1vfQsvvvii3sMgIgLAwEZEZWTbtm348Y9/jJtvvhm33347\nAGBoaAi33nor7rjjDmzZsgVPPfUUhoaG8Morr2Dv3r34l3/5Fxw+fBirVq3C9u3bAQC/+93v4HQ6\n8cILLwAAXnjhBdx0003YsWMHLrroIgSDQd3+jkRUmkqi+TsR0cfZv38/vvvd7yIWiyGZTMLtduPK\nK6/ERRddhAceeADt7e2orKzE9u3bsWvXLpx99tk4dOgQvvnNbwIA1q9fD5PJBAA499xz0dDQMPZ7\n33LLLbjhhhtw0UUX4ZlnnsGDDz6Iv/mbv9Hl70lEpYmBjYjKQnd3N3bt2gVFUfDcc88hn89j7969\nCIVCaG9vBwBcddVV2Lp1KwBAUZRJv8dUjwHAfffdh/b2dvT29uLYsWOcYSOiecclUSIqCyaTCX19\nfdi+fTvWrl0LAHjppZfGZs1Ubrd77Otny+fz4dZbb8Xg4CC6urqQz+fnb+BERGBgI6IysXv3bnz9\n61/Htm3bUF9fDwCoq6vDvn37MDAwMPZ1H374IYDpZ9NU4399y5Yt+NKXvoSzzz77Y7+PiGguGNiI\nqCw899xzyGQyyGazeO211wAAy5cvR3V1NS655BK8+eabePnll/Hf//3fAGSmbXBwEIqiYHh4GNXV\n1XjjjTcAAK+99hpCoRBisRiGh4fxxhtvIJPJIJFI4J133kEoFEIulxubaWOII6JTxcBGRGVhy5Yt\nyOVyWLVqFXp7e7Fx40bceuut+K//+i+Mjo7is5/9LP7jP/4DV1555djXv/rqq7jiiivgcDhw9dVX\no7e3F4sXL8brr7+OTZs24a233oLH48Gf/umf4s///M9x/fXX49JLL8Wjjz6KZ599FnfddRdMJhN+\n9rOfsdsBEZ0Sk8JLPyIiIiJD4wwbERERkcExsBEREREZHAMbERERkcExsBEREREZHAMbERERkcEx\nsBEREREZHAMbERERkcExsBEREREZHAMbERERkcH9/22D7cQ+vmSiAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 150 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "1) Predictive variance tends to be high near the bottom of the actual ratings spectrum. This holds true (in proportion, at least), for all variants of k and reg. In other words, when users really don't like an item, predictions become much less precise. I think that's interesting.\n", "

\n", "2) Raising k dramatically increases the overall variance in our predictive model.\u00a0\u00a0This makes sense, as adding neighbors brings in more similarity comparisons, and so increases the probability that we'll deviate from our baseline prediction for a given item.\n", "

\n", "3) Raising our regularizer has a more nuanced effect. It looks something like a 3-way interaction effect with k-neighbors and actual rating.\u00a0\u00a0In short it doesn't do much at lower k, but at higher k it funnels variance into a tighter band at the high end of actual ratings, and widens dispersion at the low end. But that may just be an artifact of this subset of data we're working with. I sat for awhile and came up with all sorts of hypotheses about what it might be telling us about the differential presence of common raters for low and high rated items. I think though in the end I'd want to see the pattern replicated over a number of datasets before I put any faith in it.\n", "\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.5** Outline a process, in words, for choosing the nearest neighbor parameter `k`. For this question fix the regularization parameter `reg` at `3`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "This is basically optimizing the variance-bias tradeoff. \n", "
\n", "With only a few neighbors we don't get a whole lot of information to work from, but as we see above, with too many neighbors our variance goes through the roof. I'd probably just pick a level of variance deemed acceptable by the current literature, and fiddle with my k until I got it as high as I could without freaking out the variance. I'd also want to test that k out over a number of subsets of my data, to make sure that that number of neighbors was producing roughly the same variance-bias ratio across different sets.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Q3 Bayesian Chocolates: Model based recommendations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this part of the homework, you will use your newly minted Bayesian and Gibbs sampler skills to write a recommender that uses Bayesian techniques to impute ratings." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Model-Based Recommendations\n", "\n", "\n", "####A Note on Frequentist and Bayesian Procedures\n", "\n", "In the previous section we implemented a **procedure** (a set of instructions for processing data) for giving recommendations and predicting user ratings for restaurants. This procedure involved a number of arbitrary choices -- for example, the particular measure of similarity between restaurants, or the weighting scheme for constructing a predicted rating. It also gave no sense of uncertainty -- in the case of giving recommendations, there was no statement about how we would expect the ranking from the procedure to compare to the user's true opinions of restaurants, and in the case of predicting ratings, there was no confidence interval for the prediction.\n", "\n", "It is possible in repeated applications of the above procedure to see how it performs in the long run. Based on this long-run performance we could potentially justify certain functional choices and compute measurements of uncertainty. This framework of proposing a procedure first, then evaluating its performance in real or hypothetical replications of the experiment is an example of a *frequentist* approach to a problem. One aspect of the frequentist approach is that the proposed procedure does not necessarily have to be derived from a model (although it often is). While this means that a proposed procedure may be more flexible or robust than a model-based procedure, it also means that there is no natural way to justify certain functional choices or construct uncertainty estimates.\n", "\n", "In contrast, the *Bayesian* approach to a problem always begins with a **probablistic model** for how the data were generated. Assuming this model is true, the posterior distribution over unknown quantities (either parameters to be estimated or unobserved data to be predicted) gives a single coherent expression of what the observed data tell us about the unknowns. By summarizing the posterior distribution, we can derive the exact functional form of a procedure for constructing estimates or predictions. We call a procedure derived from this Bayesian approach a **Bayes rule** (not to be confused with Bayes' Theorem). Using the posterior distribution, we can also give a sense of how uncertain we are about the estimate or prediction we have constructed.\n", "\n", "####Outline for this Problem\n", "\n", "In this section, we construct a **model** of how ratings are generated, and use this model to build a recommendation and ratings prediction system. We will take a Bayesian approach here, and construct our estimates and predictions from summaries of the *posterior distribution* of the model's parameters, which we will compute using a *Gibbs sampler*. We will also give measures of uncertainty based on the posterior distribution. We will evaluate predictions from this approach in the same way we evalutated predictions from the KNN procedure above." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###The Latent Factor Model###\n", "\n", "####Model Overview####\n", "\n", "The central dogma in constructing a recommendation system using collaborative filtering is that *similar users will rate similar restaurants similarly*. In the previous section, we explicitly encoded this idea by using a similarity function to identify similar restaurants. We also assumed that either all users were the same (the global approach) or that only the current user was similar enough to make a recommendation (the user-specific approach). In this section, we will use a model that allows us to identify both similar users and similar restaurants as a function of **latent factors**.\n", "\n", "We can think of latent factors as properties of restaurants (e.g., spiciness of food or price) that users have a positive or negative preference for. We do not observe these factors or the users' preferences directly, but we assume that they affect how users tend to rate restaurants. For example, if a restaurant serves a lot of spicy food and a user dislikes spicy food, then the restaurant would have a high \"spiciness\" factor, and the user would have a strongly negative preference, resulting in a prediction of a low rating. Note that if users have similar preferences, then according to the model, they will behave similarly, and likewise, if restaurants have similar latent factors, they will be rated similarly by similar users. Latent factors thus give us an intuitive way to specify a generative model the obeys the central dogma.\n", "\n", "One issue that comes up with latent factor models is determining how many latent factors to include. There may be a number of different unmeasured properties that affect ratings in different ways -- for example, in addition to the spiciness factor above, there may also be a price factor that affects how users rate a restaurant. We deal with the problem of choosing the number of latent factors to include in the same way we deal with choosing $K$ in a $K$-nearest neighbors problem.\n", "\n", "####Rating Model Specification####\n", "\n", "To make this model concrete, we can write down our probability model as a generative process. First, we define the following quantities:\n", "\n", "Counts:\n", "\n", "* $L$: The number of latent factors.\n", "\n", "* $U$: The number of users.\n", "\n", "* $M$: The number of items (restaurants).\n", "\n", "* $N$: The number of observed ratings.\n", "\n", "Data:\n", "\n", "* $Y_{um}$: The star rating given to restaurant $m$ by user $u$.\n", "* $Y$: The full collection of observed star ratings.\n", "\n", "Item-specific quantities:\n", "\n", "* $\\gamma_m$: An item-specific parameter vector of length $L+1$. The first element of $\\gamma_m$, denoted $\\gamma_m[0]$ is the item-specific bias. The remaining $L$ elements of $\\gamma_m$, denoted $\\gamma_m[1:]$, are the latent factors associated with item $m$.\n", "\n", "* $\\Gamma$: An $M$ by $L+1$ matrix where the $m$th row is $\\gamma_m$.\n", "\n", "User-specific quantities:\n", "\n", "* $\\theta_u$: A user-specific parameter vector of length $L+1$. The first element of $\\theta_u$, denoted $\\theta_u[0]$ is the user-specific bias. The remaining $L$ elements of $\\theta_u$, denoted $\\theta_u[1:]$, are user $u$'s preferences for the latent factors.\n", "\n", "* $\\Theta$: A $U$ by $L+1$ matrix where the $u$th row is $\\theta_u$.\n", "\n", "Global quantities:\n", "\n", "* $\\mu$: The overall ratings mean.\n", "\n", "* $\\sigma$: The residual variance of ratings after the mean, bias terms, and latent factors have been taken into account.\n", "\n", "Using these quantities, we can specify our model for each rating $Y_{um}$ similarly to a linear regression:\n", "\n", "$$Y_{um} = \\mu + \\theta_{u}[0] + \\gamma_{m}[0] + \\theta_{u}[1:]^{\\top}\\gamma_{m}[1:] + \\epsilon_{um}$$\n", "\n", "where\n", "\n", "$$\\epsilon_{um} \\sim N(0, \\sigma).$$\n", "\n", "Note that while this looks like a linear regression, it is of a slightly different form because the latent factor term involves the product of two unknowns. This is like a linear regression where we forgot to measure some covariates.\n", "\n", "We also assume the following priors on the user-specific and item-specific parameters:\n", "\n", "$$\n", "\\begin{align*}\n", "\\gamma_m &\\sim MVN(\\mathbf 0, \\Lambda_\\gamma^{-1})\\\\\n", "\\theta_u &\\sim MVN(\\mathbf 0, \\Lambda_\\theta^{-1}),\n", "\\end{align*}\n", "$$\n", "\n", "where $MVN$ means multivariate normal, $\\mathbf 0$ is vector of length $L+1$ filled with zeros, and $\\Lambda_\\theta^{-1}$ and $\\Lambda_\\gamma^{-1}$ are $L+1 \\times L+1$ covariance matrices. $\\mu$ and $\\sigma$ also have priors, but they are not relevant to your task so we won't write them here.\n", "\n", "#### Goal for this Model####\n", "Using this model, we want to make inference about all of the quantities that, if we knew them, would allow us to sample $Y_{um}$ for any user and any item. These quantities are $\\mu$, $\\sigma$, and the elements of $\\Theta$ and $\\Gamma$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**3.1**: Given the goal specified above, how many quantities (counting a vector of $L$ items as $L$ quantities) are we trying to make inference about? Express your answer in terms of the variables in the \"Counts\" section above." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print 'user count:',smalldf.user_id.drop_duplicates().count()\n", "print 'item count:',smalldf.business_id.drop_duplicates().count()\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "user count: 240\n", "item count: 172\n" ] } ], "prompt_number": 42 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "mu is 1 quantity \n", "
\n", "sigma is 1 quantity\n", "
\n", "theta is L+1(U), where U = 240\n", "
\n", "gamma is L+1(M), where M = 172\n", "

\n", "Total quantities of interest \n", "
\n", "= 1 + 1 + (L+1)(240) + (L+1)(172)\n", "
\n", "= 2 + (L+1)(412)\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Gibbs Sampling from the Posterior###\n", "\n", "Our goal is to compute the **posterior distribution** over the unknowns $\\mu$, $\\sigma$, $\\Gamma$, and $\\Theta$ given $Y$, which reflects how much we know about these quantities given the data we have observed. We write this distribution as $P(\\mu, \\sigma, \\Gamma, \\Theta \\mid Y)$.\n", "\n", "The most general way to learn about the posterior distribution is to sample from it. This can be challenging, particularly in problems that are very high dimensional (see your answer to the question above). One strategy for for sampling from high-dimensional distributions is **Gibbs sampling**, which we discussed in class and lab.\n", "\n", "Gibbs sampling breaks down the posterior probability distribution into blocks of unknowns, and samples iteratively from each block assuming that the values of the other blocks (and the data) are known and fixed. In this case, we will break down the posterior distribution into blocks of $\\mu$, $\\sigma$, each vector $\\gamma_m$, and each vector $\\theta_u$. We have already implemented the draws for $\\mu$ and $\\sigma$. You will need to implement the draws for each $\\gamma_m$ and each $\\theta_u$. Luckily, the structures of these draws are similar, so you will only need to implement two functions.\n", "\n", "First, we'll derive the form of the draws below. Note that you don't need to be able to follow these derivations fully -- you'll just need to be able to use the result at the end.\n", "\n", "####Distribution of $\\gamma_{m'}$ given $Y, \\mu, \\sigma, \\Gamma_{-m'}, \\Theta$####\n", "\n", "Intuitively, this is the distribution of the item-specific parameters for item $m'$, imagining that all of the other unknowns are fixed.\n", "\n", "More precisely, we want to draw from the distribution of $\\gamma_{m'}$ conditional on the data $Y$ and all other unknowns -- that is, $\\mu$, $\\sigma$, all of $\\Theta$, and all of $\\Gamma$ except for $\\gamma_{m'}$, which we denote $\\Gamma_{-m}$.\n", "\n", "Note that in the model specification above, the only places that $\\gamma_{m'}$ appears are in the regression equations for each $Y_{um}$ that involves item $m'$. If we write out just these equations, we get a system of the following form,\n", "\n", "$$Y_{um'} = \\mu + \\theta_{u}[0] + \\gamma_{m'}[0] + \\theta_{u}[1:]^{\\top}\\gamma_{m'}[1:] + \\epsilon_{um'},$$\n", "\n", "with one equation for each $u$ that rated item $m'$. Now, because \n", "\n", "If we move all of the fully known terms to the left-hand side, we obtain the system:\n", "\n", "$$Y_{um'} - \\mu - \\theta_{u}[0] = \\gamma_{m'}[0] + \\theta_{u}[1:]^{\\top}\\gamma_{m'}[1:] + \\epsilon_{um'}.$$\n", "\n", "Notice that, because we assume that $\\theta_{u}$ is known, this equation now fits cleanly into the form of a linear regression, where $\\gamma_{m'}$ is the vector of unknown coefficients. This means that the posterior distribution for $\\gamma_{m'}$ conditional on everything else is the same as the posterior for the coefficients of a Bayesian linear regression of $(Y_{um'} - \\mu - \\theta_{u}[0])$ on $\\theta_{u}[1:]$ and an intercept.\n", "\n", "Let's denote the set of users who rated item $m'$ as $(u_1, \\cdots, u_g)$. Then, we can define the following vector and matrix:\n", "\n", "\\begin{align*}\n", "Y_{m'} = \\left(\\begin{array}{c} Y_{u_1m'}-\\mu-\\theta_{u_1}[0]\\\\ \\vdots \\\\ Y_{u_gm'}-\\mu-\\theta_{u_g}[0]\\end{array}\\right), \\qquad\n", "X_{m'} &= \\left(\\begin{array}{cc} 1 & \\theta_{u_1}[1:]^\\top \\\\ \\vdots & \\vdots \\\\ 1 & \\theta_{u_g}[1:]^\\top\\end{array}\\right),\n", "\\end{align*}\n", "\n", "where $Y_{m'}$ is a vector of length $g$ and $X_{m'}$ is a $g \\times L+1$ matrix.\n", "\n", "The draw from $\\gamma_{m'}$ given everything else then has the form:\n", "$$ \\gamma_{m'} \\mid Y, \\mu, \\sigma, \\Gamma_{-m'}, \\Theta \\sim MVN\\left(Q_{m'}^{-1} \\frac{1}{\\sigma^2}X_{m'}^\\top Y_{m'}, Q_{m'}^{-1}\\right)$$\n", "where\n", "$$ Q_{m'} = \\left(\\frac{1}{\\sigma^2}X_{m'}^\\top X_{m'} + \\Lambda_\\gamma\\right).$$\n", "\n", "#### Distribution of $\\theta_{u'}$ given $Y, \\mu, \\sigma, \\Gamma, \\Theta_{-u'}$####\n", "\n", "Intuitively, this is the distribution of the user-specific parameters for user $u'$, imagining that all of the other unknowns are fixed.\n", "\n", "We can use a very similar argument to the one above. We can denote the set of items rated by user $u'$ as $(m_1, \\cdots, m_g)$ and define the vector and matrix:\n", "\\begin{align*}\n", "Y_{u'} = \\left(\\begin{array}{c} Y_{u'm_1}-\\mu-\\gamma_{m_1}[0] \\\\ \\vdots \\\\ Y_{u'm_g}-\\mu-\\gamma_{m_g}[0]\\end{array}\\right), \\qquad\n", "X_{u'} &= \\left(\\begin{array}{cc} 1 & \\gamma_{m_1}[1:]^\\top \\\\ \\vdots & \\vdots \\\\ 1 & \\gamma_{m_g}[1:]^\\top\\end{array}\\right),\n", "\\end{align*}\n", "\n", "where $Y_{u'}$ is a vector of length $g$ and $X_{u'}$ is a $g \\times L+1$ matrix.\n", "\n", "the draw from $\\theta_{u'}$ given everything else has the form:\n", "$$ \\theta_{u'} \\mid Y, \\mu, \\sigma, \\Gamma, \\Theta_{-u'} \\sim MVN\\left(Q_{u'}^{-1} \\frac{1}{\\sigma^2}X_{u'}^\\top Y_{u'}, Q_{u'}^{-1}\\right)$$\n", "where\n", "$$ Q_{u'}= \\left(\\frac{1}{\\sigma^2}X_{u'}^\\top X_{u'} + \\Lambda_\\theta\\right).$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**3.2** We will only ask you to implement a tiny portion of the Gibbs sampler. Complete the following functions that implement the conditional posterior draws for $\\gamma_m$ and $\\theta_u$ derived above.\n", "\n", "**Hint**: `np.random.multivariate_normal` is a good function to know." ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Function\n", "--------\n", "gamma_m_draw\n", "\n", "Draw a single sample from the conditional posterior distribution\n", "of gamma_m.\n", "\n", "Inputs\n", "-------\n", "X_m: A g-by-L+1 matrix, defined above. \n", "Y_m: A 1D vector of length g, defined above.\n", "sig2: Residual _variance_, as defined above.\n", "Lambda_gamma: Prior precision matrix.\n", "\n", "Outputs\n", "--------\n", "Single draw from conditional posterior, defined above.\n", "\"\"\"\n", "#Item-specific parameters given all else\n", "#your code here\n", "def gamma_m_draw(X_m, Y_m, sig2, Lambda_gamma):\n", " \n", " Q = (1/sig2)*X_m.T.dot(X_m) + Lambda_gamma\n", " \n", " mvn_mean = (1/sig2)*np.linalg.inv(Q).dot(X_m.T).dot(Y_m)\n", " \n", " mvn_cov = np.linalg.inv(Q)\n", " \n", " mvn = np.random.multivariate_normal(mvn_mean, mvn_cov)\n", " \n", " return mvn" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 151 }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Function\n", "--------\n", "theta_u_draw\n", "\n", "Draw a single sample from the conditional posterior distribution\n", "of gamma_m.\n", "\n", "Inputs\n", "-------\n", "X_u: A g-by-L+1 matrix, defined above. \n", "Y_u: A 1D vector of length g, defined above.\n", "sig2: Residual _variance_, as defined above.\n", "Lambda_theta: Prior precision matrix.\n", "\n", "Outputs\n", "--------\n", "Single draw from conditional posterior, defined above.\n", "\"\"\"\n", "#User-specific parameters given all else\n", "#your code here\n", "def theta_u_draw(X_u, Y_u, sig2, Lambda_theta):\n", " \n", " Q = (1/sig2)*X_u.T.dot(X_u) + Lambda_theta\n", " \n", " mvn_mean = (1/sig2)*np.linalg.inv(Q).dot(X_u.T).dot(Y_u)\n", " \n", " mvn_cov = np.linalg.inv(Q)\n", " \n", " mvn = np.random.multivariate_normal(mvn_mean, mvn_cov)\n", " \n", " return mvn" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 44 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is the Gibbs sampler skeleton that your functions fit into. Look over the structure to see how for each draw from the posterior, the sampler iterates through $\\mu$, $\\sigma$, $\\gamma_m$ for each item, and $\\theta_u$ for each user." ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Function\n", "--------\n", "factor_gibbs\n", "\n", "Runs a gibbs sampler to infer mean, variance, user-specific, and item-specific\n", "parameters.\n", "\n", "Inputs\n", "-------\n", "data: A dataframe containing ratings data.\n", "L: Dimension of latent factors.\n", "maxit: Number of samples to draw from posterior.\n", "Lambda_theta_diag: Hyperparameter controlling regularization of Theta.\n", "Lambda_gamma_diag: Hyperparameter controlling regularization of Gamma.\n", "progress: if true, print iteration number every 100 iterations.\n", "\n", "Outputs\n", "--------\n", "Dictionary with elements\n", "mu: Draws of mu. 1D array of length maxiter.\n", "sig2: Draws of sig2, residual _variance_. 1D array of length maxiter.\n", "theta: Draws of Theta. U-by-L-by-maxiter array.\n", "gamma: Draws of Gamma. M-by-L-by-maxiter array.\n", "EY: Draws of fitted values of Y. N-by-maxiter array.\n", "\"\"\"\n", "def factor_gibbs(data, L, maxit, Lambda_theta_diag, Lambda_gamma_diag, progress=True):\n", " data = data.copy()\n", " N = data.shape[0]\n", "\n", " #Create indices that allow us to map users and restaurants to rows\n", " #in parameter vectors.\n", " uusers, uidx = np.unique(data.user_id, return_inverse=True)\n", " uitems, midx = np.unique(data.business_id, return_inverse=True)\n", "\n", " nusers = uusers.size\n", " nitems = uitems.size\n", "\n", " #Add numerical indices to dataframe.\n", " data[\"uidx\"] = uidx\n", " data[\"midx\"] = midx\n", "\n", " #Group observations by user and by business.\n", " ugroups = data.groupby(\"uidx\")\n", " mgroups = data.groupby(\"midx\")\n", "\n", " all_avg = data.stars.mean()\n", " u_avg = ugroups.stars.mean()\n", " m_avg = mgroups.stars.mean()\n", "\n", " #Initialize parameters and set up data structures for\n", " #holding draws.\n", " #Overall mean\n", " mu = all_avg\n", " mu_draws = np.zeros(maxit)\n", " #Residual variance\n", " sig2 = 0.5\n", " sig2_draws = np.zeros(maxit)\n", "\n", " #Matrix of user-specific bias and L latent factors.\n", " theta = np.zeros([nusers, L+1])\n", " theta[:,0] = u_avg-all_avg\n", " theta_draws = np.zeros([nusers, L+1, maxit])\n", "\n", " #Matrix of item-specific bias and L latent factors.\n", " gamma = np.zeros([nitems, L+1])\n", " gamma[:,0] = m_avg-all_avg\n", " gamma_draws = np.zeros([nitems, L+1, maxit])\n", "\n", " #Matrix for holding the expected number of stars\n", " #for each observation at each draw from the posterior.\n", " EY_draws = np.zeros([data.shape[0], maxit])\n", "\n", " #Inverse covariance matrices from the prior on each theta_u\n", " #and gamma_b. These are diagonal, like Ridge regression.\n", " Lambda_theta = np.eye(L+1)*Lambda_theta_diag\n", " Lambda_gamma = np.eye(L+1)*Lambda_gamma_diag\n", "\n", " #Main sampler code\n", " for i in range(maxit):\n", " if i%100==0 and progress:\n", " print i\n", "\n", " #The entire regression equation except for the overall mean.\n", " nomu = np.sum(theta[data.uidx,1:]*gamma[data.midx,1:], axis=1) +\\\n", " theta[data.uidx,0] + gamma[data.midx,0]\n", "\n", " #Compute the expectation of each observation given the current\n", " #parameter values.\n", " EY_draws[:,i]=mu+nomu\n", "\n", " #Draw overall mean from a normal distribution\n", " mu = np.random.normal(np.mean(data.stars-nomu), np.sqrt(sig2/N))\n", " #Draw overall residual variance from a scaled inverse-Chi squared distribution.\n", " sig2 = np.sum(np.power(data.stars-nomu-mu,2))/np.random.chisquare(N-2)\n", " \n", " #For each item\n", " for mi,itemdf in mgroups:\n", " #Gather relevant observations, and subtract out overall mean and\n", " #user-specific biases, which we are holding fixed.\n", " Y_m = itemdf.stars-mu-theta[itemdf.uidx,0]\n", " #Build the regression design matrix implied by holding user factors\n", " #fixed.\n", " X_m = np.hstack((np.ones([itemdf.shape[0],1]),\n", " theta[itemdf.uidx,1:]))\n", " gamma[mi,:] = gamma_m_draw(X_m, Y_m, sig2, Lambda_gamma)\n", " \n", " #For each user\n", " for ui,userdf in ugroups:\n", " #Gather relevant observations, and subtract out overall mean and\n", " #business-specific biases, which we are holding fixed.\n", " Y_u = userdf.stars-mu-gamma[userdf.midx,0]\n", " #Build the regression design matrix implied by holding business factors\n", " #fixed.\n", " X_u = np.hstack((np.ones([userdf.shape[0],1]),\n", " gamma[userdf.midx,1:]))\n", " \n", " theta[ui,:] = theta_u_draw(X_u, Y_u, sig2, Lambda_theta)\n", "\n", " #Record draws\n", " mu_draws[i] = mu\n", " sig2_draws[i] = sig2\n", " theta_draws[:,:,i] = theta\n", " gamma_draws[:,:,i] = gamma\n", "\n", " return {\"mu\": mu_draws, \"sig2\": sig2_draws,\n", " \"theta\": theta_draws, \"gamma\": gamma_draws,\n", " \"EY\": EY_draws}" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 152 }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Posterior Summaries###\n", "\n", "Once you have posterior draws from the sampler, the most natural thing to do is to compute the **posterior mean** of each quantity you are intersted in. To do this, we simply need to take the average value of each quantity across the samples drawn from the sampler. Before taking the average, however, we will want to ignore the first 20-30% of samples because these correspond the **burnin period**, the time during which the sampler is still looking for the main meat of the distribution." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Ok it's time to recommend!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**3.3** Now that you have the Gibbs sampler, draw 1000 samples from the posterior distribution using a two-dimensional latent factor and prior precisions `Lambda_theta_diag` and `Lambda_gamma_diag` both equal to 0.1.\n", "\n", "Compute the posterior mean of the fitted values for each $Y_{um}$, eliminating the first 200 samples. Call these the `prediction`. These constitute our recommendations. True to the bayesian paradigm, we dont just have mean predictions, but entire distributions. But currently we are only interested in the means." ] }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here\n", "gibbs = factor_gibbs(predictdf, 2, 1000, 0.1, 0.1, progress=True)\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0\n", "100" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "200" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "300" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "400" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "500" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "600" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "700" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "800" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "900" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 153 }, { "cell_type": "code", "collapsed": false, "input": [ "prediction = gibbs['EY']\n", "gibbs_means = np.mean(prediction, axis=1, keepdims=False)\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(6165, 1000)\n", "(6165, 19)\n", "(6165,)\n" ] } ], "prompt_number": 154 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the predictions against the observed data.You can use the `compare_results` function defined in the previous section. How do the fitted values compare to those from the KNN procedure?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here\n", "compare_results(predictdf.stars, gibbs_means, title='Gibbs 2-Factor Model Ratings Predictions')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1.0\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAmwAAAGRCAYAAADYce9/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8U/X+P/DXSdKsJildtAVa2rIREFGsTBl+QRRUcMCV\neylerijTq4AM5QKiiANFFGUrqPxE8aosxYsMAWXIBgsilFG6d5s0+/3745hDkqYLWpLC+/l45JGe\nkZNPTtPmlc86AhERGGOMMcZYwJL5uwCMMcYYY6xyHNgYY4wxxgIcBzbGGGOMsQDHgY0xxhhjLMBx\nYGOMMcYYC3Ac2BhjjDHGAhwHNnbLW7duHe677z7ce++9uP/++xEfHw+ZTAaZTIalS5dK+73wwgsY\nMmQIACAlJQUTJ05EXFycz2NarVa8/fbb6NatGz799NNaKWd+fj6Sk5MRHR2NmJgYPPPMMygpKan0\nMUuWLEFcXBxkMhnuuOMOPP7443j88cfx8MMPo2XLlggNDa2VstU2s9mMhQsXonHjxpDJZHj33Xcr\n3PeTTz6BTCZDUFAQ5s6di7y8vBo/3+XLlzFjxgy0bdsWFy9erHL/zz//HE8++aT0fvDmcDjwzjvv\nIDw8HDKZDElJSXjggQfQrl07DBw4ED///HONy+htyJAheOGFF677ONdi1apVaNKkCWQyGe68804M\nGDAAt99+Ox599FHs37+/1p7H1+/l4MGDiIyMREZGxjUf15/njrFrRozdoux2Ow0bNoxiYmJo7969\nHttWrFhBQUFBtHTpUmnd0qVL6T//+Y+0/Nprr5EgCBUe/8qVKyQIAq1evfq6y+p0OumRRx6ht99+\nm9avX0/JyckkCAINHTq0yse++OKLJAgC7dy5s9y2AQMGXHfZiIguXrxYK8fxNnnyZBIEgZo1a0ZO\np9PnPj179iRBEKhz587X9Vxr164lQRCq9VpsNhv17duXevfuXel+Q4cOJZlMRufPnyciorKyMho6\ndCjJ5XLaunVrjcp34cIFj+XZs2fTRx99VKNj1KYpU6aQIAi0a9cuIiIym800fPhwUigU9L///a/W\nnsf793L+/HkaOHAg5efnV/sYgXbuGLsWXMPGblmzZ8/GunXr8PXXX6Nr164e20aNGoWXXnoJ5Dav\n9OjRozFnzhxpuVGjRpUev6rtNbF371488cQTmDRpEh599FF88sknePjhh7F+/XpYLJZKH6vRaAAA\ngiCU2/bkk09ed9k+/vhj7Nix47qP44tOp8Mdd9yB8+fPY/PmzeW2Hz16FPHx8dK+1yMmJqba+yoU\nCjRp0sTj/eGLWq0GEUEul0vL8+bNg9PpxDvvvFPt58vJycGUKVM81s2aNQvPPvtstY9R27Rarcey\nSqXCnDlz4HA48MYbb9Ta83j/XhISErBx48Zq1w4H4rlj7FpwYGO3pIKCAixYsAA9e/ZEly5dfO7z\nwgsvoEWLFh7rHA7HjSieT8OGDfNY7tu3L5xOZ5XNopX5+9//fl1lOnnyJJ5//vnrOkZVxo4dC0EQ\n8P7775fbtmTJEowZM6ZOn7+2RUZGAgCuXLlSrf2tViv+8Y9/ICcnp9w2p9NZq2W7Xq5wlZ2dXefP\nVZ3XXp/OHWNV4cDGbknbt2+H2WzGvffeW+E+er0effr0AQAcO3YMY8aMwV133VVuv59++glt27aF\nVqvFwIEDkZWV5bE9Ly8PgwcPRnBwMFq2bIlNmzZJ2w4dOoQZM2Zg6dKluOuuu/Dee+/5LEv37t3L\n1ZCZzWYkJiYiIiKiWq/ZvTbI6XRi/Pjx0vKpU6cwZswYLFu2DI8//jg++uijcq/xxRdfxJw5c9Cj\nRw988803AIDvv/8excXFWLduHaZMmSLV9n3//fd45plnMHPmTPTp0weTJ0+G1WoFAOzYsQMjRozA\nW2+9hSlTpkCv1+PHH3+ssNzNmzfHgAEDsG3bNpw5c0ZaX1JSgt9//x333HOPz8ft378fo0ePxqxZ\nszBgwAD861//QlFRkbTdarXihRdewIQJE/Daa69h7dq1Ho93Op148803MXHiRPTs2RP33Xcfzp07\nV+k5ro7Dhw8DANq0aeOx/ptvvsGUKVOwePFi9OvXD3v27AEg1q5euXIF586dw5QpU7Bnzx7s2bMH\n//jHPzBo0CAAYi3S3Llz0bZtWxw5cgQDBgyAXq/H0KFDPb5kGI1GPP/883j11VfRpk0byGQydO7c\nWeojuHXrVrzyyitYvHgxmjdvju+++65Gr+3EiRMAgNtvvx1nzpzBtGnT8Le//Q1fffUVwsLC8J//\n/AcA8PXXX2PixIkYMmQIOnTogK1bt0rHqOz3UlRUhHfeeQft27fH7t27pfVZWVmYMWMG5s6di8GD\nB+O5556DzWar1rlz+fTTTzFu3DjMmDEDPXr0wPz586W/mbVr12LAgAFYuHAhZs2ahYYNG6J169bS\n662Nc8dYlfzaIMuYn7z55pskCIJHHzWXU6dO0YoVK2j58uW0fPly2rx5M+Xl5VFycjIlJCRI+338\n8cckCALNmjWLzp07R2vXriWdTkd9+vSR9hEEgXr27En79++nw4cP0z333ENKpZL+/PNPIiLq0aMH\nnThxgoiIMjIy6MMPP6z2axg4cCB98MEHVe43a9YsEgSB7r77brr//vvp//7v/ygmJsbjtXTs2JFe\ne+01IiI6fPgwyeVyunTpEhERbdmyhR577DFp3xkzZlBQUBCZTCbpNbr309u6dSvFx8eT2WwmIqKS\nkhJKTEykJ554goiIjh8/TgaDgXr16kX79u2jSZMm0cmTJ32Wffbs2bRz50764YcfSBAEGjdunLTt\nww8/pOXLl0tlcO9Pdvz4cYqMjKTs7GwiEvucde3ale655x6pL9xTTz1F06dPlx7z1ltvefSVeu21\n12jLli3S9nbt2nn0k0tOTqZevXpVduqlvoauPlS//vortWjRgpo0aUJnzpyR9svLyyOFQiH1pXzn\nnXeoWbNm0vaRI0d6vL7s7Gzq06ePtM7hcND69etJEASaPn06FRYW0oEDB0gmk9G3334rPW7MmDH0\nyiuvEBFRamoqyeVymjVrlrQ9Li6OSkpKiIjo0KFDHo/15npfufpGpqamUqdOnSgsLIxSU1Pp0qVL\n1L17d0pISKCNGzfSokWLaN26dbRnzx6aNm2adJyxY8eSVqul3NxcIqr892I0Gun777/36DtXUlJC\nnTp1orS0NCIiOnPmDAmCIL03kpOTKz13RETLly+npKQkaTkjI4NCQkLoxRdfJCIii8VCDRo0oG7d\nutHhw4fJZDLR3XffTY888sg1nTvGroXC34GRMX9w1TrIZOUrmdu2bYvi4mJ07doVXbt2xc8//wyZ\nTIb4+Hjs2rWr3P4zZ86EXC5HYmIiTp06hXnz5uH48ePo0KEDAGDEiBG4++67AQCrV69GmzZtsHjx\nYrzzzjuwWq2YP38+Vq1ahejoaDz66KPVKv/JkydRUlKCsWPHVvs1v/XWW+jZsycAoLS01OO5Ro0a\nhe7duwMQ+yY5nU5cvHgRsbGxmDp1KhYtWiTtO3nyZLRv317qG+ftlVdewYABA6BSqQCIfctcNSZz\n5sxB+/btERYWhi5duiApKQlJSUmVllsQBPTv3x8tWrTAmjVrMH/+fOh0Oqxbtw7ff/+9z8e88cYb\n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\n0muWjgAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 155 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "This model compares favorably with KNN! \n", "
\n", "We have a tight spread and our predictions hug the x=y slope pretty closely compared to some of the mess we saw with knn (although it's not too dissimilar from the lower-k values - it's just that our variance is reduced on the low end here). They are a bit optimistic on the lower end of the actual ratings though, it looks like in the 1-2 actual ratings range, our means are predicting 1-2 points higher than the ratings actually turn out. We converge with the actual ratings at actual=4.\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Q4 Scaling Up" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All our recommenders suffer from problems having to do with the fact that we subsetted an already sparse user-item matrix. The more items we have, the more items we may find in the vicinity of a given item, and thus we are likely to give a more robust average rating to the given item.\n", "\n", "In this problem we shall use Amazon Elastic Map-Reduce to tackle the entire user-restaurant matrix. We shall do this in two parts: we'll use MRJob locally on your machine to on the smaller data set to calclate the pearson database, and then we'll tackle the entire data set on Amazon.\n", "\n", "The larger set has 35000 users and 4500 items. Computing the 4500X4500 similarity matrix on one machine will be prohibitively expensive. Thus we'll adopt a strategy where we'll split the calculation over multiple machines using the map-reduce paradigm, with mappers and reducers working on multiple machines \n", "\n", "Then we calculate the k-nearest neighbors in the 'space' of the user: this involves a database lookup and an iteration over the items a user has rated. Since the latter is usually not a very large number, this computation can be managed on a front end machine (even if storing the database will take a lot of memory).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll first create subset data frames, which have just those columns which we will send to the map-reduce. We'll also strip out the header and index of the frame. The reason for doing this is: unless we pre-populate the machines on Amazon with software, we can *rely only on the regular python library, numpy, and scipy being there (and at python 2.6)*, and thus we will need to parse the csv file, line by line (`mrjob` uses hadoop's stream protocol and thus needs to be fed line by line)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "subsetoffull=fulldf[['user_id','business_id', 'stars','business_avg','user_avg']]\n", "subsetoffull.to_csv(\"subset-full.csv\", index=False, header=False)\n", "subsetofsmall=smalldf[['user_id','business_id', 'stars','business_avg','user_avg']]\n", "subsetofsmall.to_csv(\"subset-small.csv\", index=False, header=False)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 156 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running mrjob locally\n", "\n", "`mrjob` scripts cannot be run from the ipython notebook, as they fork themselves on execution. Thus you must write the code for mrjob in a separate file which you must submit along with this homework, in the same folder as the python notebook file.\n", "\n", "If you have not done so already (you were supposed to do this as part of HW 0), you will first need to install `mrjob`. The appropriate equivalent of the following incantation should do the job:\n", "\n", " ~/anaconda/bin/pip install mrjob\n", " \n", "\n", " \n", "To familiarize yourself with the structure of an `mrjob` script, please read [this](http://mrjob.readthedocs.org/en/latest/guides/quickstart.html#writing-your-first-job) . Run the examples in that document to familiarize yourself with `mrjob`.\n", "\n", "The kind of script you will be writing is in the section \"Writing your second job\" in that document. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All mrjob tasks use the map-reduce strategy to divide up computation across computers. You should work through the mrjob tutorial to gain familiarity with this, but we\u2019ll also outline the basic process here:\n", "\n", "1. During the first map step, mrjob calls a mapper function with a key (which for the first step is None), and a value (which for the first step is a line of data from an input file). This function does whatever it wants with this data, and yields a key and value. The key is used in step 2 to gather up the values from all the different mappers into groups\n", "\n", "2. mrjob collects the outputs from all the mappers, and gathers them into subsets with the same key value (this is similar to what pandas.groupby does). It passes each of these subsets to a reducer (or \u201ccollector\u201d) function, whose job is to synthesize this list of grouped data into something useful (e.g., computing the mean of all the inputs). It then yields the key and reduced value. \n", "\n", "3. If there are any additional steps, mrjob feeds each output from a reducer function in step 2 to the next mapper. Otherwise, it prints the output.\n", "\n", "The point behind map-reduce is to agree upon a common framework to split up a large computational job into smaller tasks. mrjob then has a lot of freedom to organize how these tasks run in parallel, on many machines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Writing your script" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**4.1** Write a MRJOB script, called `computesim.py`. The object of this script is to take a csv file and return a tuple `(rho, n_common)` as `calculate_similarity` for pairs of restaurants. See `skeleton.py` below for the SPEC of this file. Your job is to fill in those methods. You MUST use this skeleton.\n", "\n", "This script is to be run like so (substitute your own operating system's call):\n", "\n", " ~/anaconda/bin/python computesim.py subset-small.csv > output.small.local.txt\n", "\n", "Thus, when the script below is run in this fashion, mrjob will read the data line-by-line from subset-small.csv, and pass it to the first \"step\".\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Algorithm to calculate pearson similarities\n", "\n", "Here is the description of the algorithm for RestaurantSimilarities.\n", "\n", "Your code will have two steps. Each step will have a mapper and a reducer. These are described in turn here:\n", "\n", "1. `line_mapper` will split the line, yielding the `user_id` as key, and the rest as value. This method's implementation is provided for you.\n", "\n", "2. `users_items_collector` is a reducer. It is passed ALL mapper outputs corresponding to a particular `user_id`. Put these emissions into a list, and re-emit the `user_id` with this list.\n", "\n", "3. `pair_items_mapper` takes the `user_id` and the list. It dosent do anything with the `user_id`, however, it takes every combination (thus len(list) choose 2) of 2 `business_id`s from the passed on list (see combinations in itertools in the python documentation) and sends on the remaining information keyed on the tuple `(restaurant1, restaurant2)`. Be sure to handle the case where the restaurant id's are flipped: include them somehow under the same key.\n", "\n", "4. `calc_sim_collector` is passed ALL sent on list information for the pair of restaurants that was emitted in the previous step. Note that thse will come from different `user_id`s. This sort of collection is key to this style of programming. This list information should now correspond to all the common support of the two restaurants. Use this information to calculate this common support and the pearson similarity. Return the aforementioned tuple by yielding it keyed by the tuple of restaurants. This information will be sent to the output file. The output keys and values will both be in JSON format, separated by a tab.\n", "\n", "The output should be saved in a file via redirection as `output.small.local.txt`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Skeleton File for this problem\n", "\n", "You ca access it [here](https://raw.github.com/cs109/content/master/skeleton.py) or just run the next cell to see it." ] }, { "cell_type": "code", "collapsed": false, "input": [ "#from pygments import highlight\n", "#from pygments.lexers import PythonLexer\n", "#from pygments.formatters import HtmlFormatter\n", "#from IPython.display import HTML\n", "#import urllib\n", "#skelcode = urllib.urlopen(\"https://raw.github.com/cs109/content/master/skeleton.py\").read()\n", "#skelhtml=highlight(skelcode, PythonLexer(), HtmlFormatter())\n", "#HTML(skelhtml)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 157 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Explanation for those funny `yield` keywords\n", "\n", "The functions above \u201cyield\u201d values, and do not \u201creturn\u201d them. They are **generators**. Here is an example:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def upper_generator(words):\n", " for word in words:\n", " yield word.upper()\n", "\n", "words = ['a', 'couple', 'of', 'words', 'to', 'process']\n", "\n", "print upper_generator(words)\n", "print list(upper_generator(words))\n", "for u in upper_generator(words):\n", " print u\n", "\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "['A', 'COUPLE', 'OF', 'WORDS', 'TO', 'PROCESS']\n", "A\n", "COUPLE\n", "OF\n", "WORDS\n", "TO\n", "PROCESS\n" ] } ], "prompt_number": 158 }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can read more [here](http://nedbatchelder.com/text/iter.html). Also see Thu Oct 17th's class video for information about classes and generators." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Include `computesim.py` in your submission in the same folder as the notebook. Uncommenting and running the following cell should **output your code in here**." ] }, { "cell_type": "code", "collapsed": false, "input": [ "thecode = open(\"computesim.py\").read()\n", "thehtml=highlight(thecode, PythonLexer(), HtmlFormatter())\n", "HTML(thehtml)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
from mrjob.job import MRJob\n",
        "from itertools import combinations, permutations\n",
        "from operator import itemgetter\n",
        "from scipy.stats.stats import pearsonr\n",
        "from numpy import isnan\n",
        "\n",
        "class RestaurantSimilarities(MRJob):\n",
        "\n",
        "\tdef steps(self):\n",
        "\t\t"the steps in the map-reduce process"\n",
        "\t\tthesteps = [\n",
        "\t\t\tself.mr(mapper=self.line_mapper, reducer=self.users_items_collector),\n",
        "\t\t\tself.mr(mapper=self.pair_items_mapper, reducer=self.calc_sim_collector)\n",
        "\t\t]\n",
        "\t\treturn thesteps\n",
        "        \n",
        "\tdef line_mapper(self,_,line):\n",
        "    \n",
        "\t\tuser_id,business_id,stars,business_avg,user_avg=line.split(',')\n",
        "\t\tyield user_id, (business_id,stars,business_avg,user_avg)\n",
        "\n",
        "\tdef users_items_collector(self, user_id, values):\n",
        "\n",
        "\t\t# feed values generator into a list comprehension\n",
        "\t\tvalues = [val for val in values]\n",
        "\t\t# yield new values list along with user_id\n",
        "\t\tyield user_id, values\n",
        "\n",
        "\tdef pair_items_mapper(self, user_id, values):\n",
        "\t\n",
        "\t\t# initialize keys list\n",
        "\t\tkeys = []\n",
        "\t\t# feed in vals from generator\n",
        "\t\tvals = [v for v in values]\n",
        "\t\t# sort vals list\n",
        "\t\tvals = sorted(vals, key=itemgetter(0))\n",
        "\t\t\n",
        "\t\t# pull out keys\n",
        "\t\t# NB: we don't really need this step, but it makes for more readable code\n",
        "\t\tfor v in vals:\n",
        "\t\t\tkeys.append(v[0])\n",
        "\t\t\n",
        "\t\t# loop through combination pairs, return keys and values\n",
        "\t\t# NB: I'm actually not sure what's more readable here - we could just do combinations() on vals itself,\n",
        "\t\t#     and then chop it up by sub-indexing in the yield statement.  I discussed this with Brian Feeny (who helped a lot\n",
        "\t\t#     on this assignment!) and I ended up implementing in the way he described, mostly for readability's sake.\n",
        "\t\tfor k, v in zip(combinations(keys,2), combinations(vals,2)):\n",
        "\t\t\tyield k, v\n",
        "\n",
        "\n",
        "\tdef calc_sim_collector(self, key, values):\n",
        "\t\n",
        "\t\t(rest1, rest2), common_ratings = key, values\n",
        "\t\t# this is our n_common counter\n",
        "\t\tn_common = 0\n",
        "\t\t# lists to catch ratings difference scores for both restaurants\n",
        "\t\tr1 = []\n",
        "\t\tr2 = []\n",
        "\t\t\n",
        "\t\t# loop through values, pull out ratings, compute differences, append to lists\n",
        "\t\tfor valset in values:\n",
        "\t\t\n",
        "\t\t\tn_common += 1\n",
        "\t\t\n",
        "\t\t\trest1_stars = float(valset[0][1])\n",
        "\t\t\trest1_user_avg = float(valset[0][3])\n",
        "\t\t\trest2_stars = float(valset[1][1])\n",
        "\t\t\trest2_user_avg = float(valset[1][3])\n",
        "\n",
        "\t\t\tdiff1=rest1_stars-rest1_user_avg\n",
        "\t\t\tdiff2=rest2_stars-rest2_user_avg\n",
        "\n",
        "\t\t\tr1.append(diff1)\n",
        "\t\t\tr2.append(diff2)\n",
        "        \n",
        "        # compute pearson's\n",
        "\t\trho = pearsonr(r1, r2)[0]\n",
        "\t\t# check for NaN, if so return 0\n",
        "\t\trho = rho if (not isnan(rho)) else 0\n",
        "\n",
        "\t\t# yield rest_id tuple as key, rho/ncom tuple as val\n",
        "\t\tyield (rest1, rest2), (rho, n_common)\n",
        "\t\t\n",
        "#Below MUST be there for things to work\n",
        "if __name__ == '__main__':\n",
        "\tRestaurantSimilarities.run()\n",
        "
\n" ], "metadata": {}, "output_type": "pyout", "prompt_number": 159, "text": [ "" ] } ], "prompt_number": 159 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Checking the results\n", "\n", "Let us load the data from the file" ] }, { "cell_type": "code", "collapsed": false, "input": [ "output_small_local=[[json.loads(j) for j in line.strip().split(\"\\t\")] for line in open(\"./output.small.local.txt\")]\n", "output_small_local[0]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 160, "text": [ "[[u'-4A5xmN21zi_TXnUESauUQ', u'-AAig9FG0s8gYE4f8GfowQ'],\n", " [0.384365693729571, 5]]" ] } ], "prompt_number": 160 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will Implement a function `make_database_from_pairs` which takes a dataframe of restaurants `smalldf` and the output parsed in the previous command to create the database like before. By the nature of the map-reduce algorithms these only contain those restaurant pairs with common support. The `Database` constructor initializes the remaining similarities to 0.\n", "\n", "The function will take the dataframe and `bizpairs` obtained by parsing the EMR output file which have the key of business pairs and value the pair of pearson correlation and `n_common`. It will return an instance of the `Database` class.\n", "\n", "This function will take a long time to run on large data sets.\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def make_database_from_pairs(df, bizpairs):\n", " \"\"\"\n", " make the database from the pairs returned from mrjob.\n", " df is the dataframe, smalldf or fulldf.\n", " bizpairs are a list of elements, each of which is a list of two\n", " lists. The first of these lists has the two business id's, while\n", " the second has the similarity and the common support\n", " Returns an instance of the Database class.\n", " \"\"\"\n", " dbase=Database(df)\n", " cache={}\n", " for bp,corrs in bizpairs:\n", " b1,b2=bp\n", " i1=dbase.uniquebizids[b1]\n", " i2=dbase.uniquebizids[b2]\n", " sim,nsup=corrs\n", " dbase.database_sim[i1][i2]=sim\n", " dbase.database_sim[i2][i1]=sim\n", " dbase.database_sup[i1][i2]=nsup\n", " dbase.database_sup[i2][i1]=nsup\n", " if cache.has_key(b1):\n", " nsup1=cache[b1]\n", " else:\n", " nsup1=dbase.df[dbase.df.business_id==b1].user_id.count()\n", " cache[b1]=nsup1\n", " if cache.has_key(b2):\n", " nsup2=cache[b2]\n", " else:\n", " nsup2=dbase.df[dbase.df.business_id==b2].user_id.count()\n", " cache[b2]=nsup2\n", " dbase.database_sim[i1][i1]=1.0\n", " dbase.database_sim[i2][i2]=1.0\n", " dbase.database_sup[i1][i1]=nsup1\n", " dbase.database_sup[i2][i2]=nsup2\n", " return dbase" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 161 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will store the output in variable `db_mrjob_local`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "db_mrjob_local=make_database_from_pairs(smalldf, output_small_local)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 162 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We print a pair to see that our answers are identical." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print db.get(\"zruUQvFySeXyEd7_rQixBg\", \"z3yFuLVrmH-3RJruPEMYKw\")\n", "print db_mrjob_local.get(\"zruUQvFySeXyEd7_rQixBg\", \"z3yFuLVrmH-3RJruPEMYKw\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(0.39904554525734559, 7)\n", "(0.39904554525734542, 7)\n" ] } ], "prompt_number": 163 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets test that our results are overall the same as before" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sums=0.\n", "count=0\n", "for k in db.uniquebizids.keys():\n", " for k2 in db.uniquebizids.keys():\n", " count=count+1\n", " sums=sums+db.get(k,k2)[0]-db_mrjob_local.get(k,k2)[0]\n", "print sums, count" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "-8.65973959208e-15 29584\n" ] } ], "prompt_number": 164 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running on Amazon Elastic Map Reduce(EMR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At this point, we shall shift to running on Amazon EMR. \n", "\n", "------------\n", "\n", "*Read [this document](http://nbviewer.ipython.org/urls/raw.github.com/cs109/content/master/InstructionsForAmazonEMR.ipynb) for instructions on how to set yourself up on Amazon.*\n", "\n", "------------\n", "\n", "#### Reproduce the results with the smaller file on EMR\n", "\n", "Test the smaller file and make sure it has the same results. For example, you could use the incantation:\n", "\n", " ~/anaconda/bin/python computesim.py -r emr --num-ec2-instances 2 subset-small.csv > output.small.emr.txt\n", "\n", "You do **NOT** need to submit any results from that exploration to us.\n", "\n", "**Important**: Please always make sure that your code is bug free, before actually submitting it to amazon. Try to run the job locally first and see if it produces the desired result. Then, if this worked, you are ready to proceed to the cloud. The homework problems are small and your free credit should provide you with a lot of room for running and testing on Amazon. However, it is your responsibility to make sure the jobs terminate properly and do not cause excessive costs.\n", "\n", "You can always monitor your currently running jobs (in the US-East sector) using [this overview at region US-EAST-1](https://console.aws.amazon.com/elasticmapreduce/home?region=us-east-1) of your MapReduce job flows." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Running the larger job" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**4.3** Run the script on the larger file `subset-full.csv`. Use between 4-8 instances on EMR on Amazon. Save the output in `output.full.emr.txt`. Your incantation will be something like:\n", "\n", " ~/anaconda/bin/python computesim.py -r emr --num-ec2-instances 5 subset-full.csv > output.full.emr.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You might elect to [save the file on S3](http://mrjob.readthedocs.org/en/latest/guides/emr-quickstart.html#sending-output-to-a-specific-place) and bring it over manually.\n", "\n", "Try and think about what size job would be best to run on Amazon, given that there is a setup time. There is a way to persistently set up machines (the mrjob documentation provides the details), but then remember you will be billed for that setup and need to monitor it. However, a persistent setup might come useful for your projects." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Loading the full output from EMR" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets load the output in. **CAUTION** The next two cells will also take a lot of time to run and load. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "output_full_emr=[[json.loads(j) for j in l.strip().split(\"\\t\")] for l in open(\"./output.full.emr.txt\")]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 165 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This function will take a very long time to run, on the order of 5 minutes or more, depending on your computer" ] }, { "cell_type": "code", "collapsed": false, "input": [ "dbfull=make_database_from_pairs(fulldf, output_full_emr)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 166 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**4.4** For `testuserid`, once again, print out the ratings using the `bizs` list as before. How have they changed with respect to Question 2? Why might this be?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here\n", "print \"for user\",usernamefromid(fulldf,testuserid), 'avg', fulldf[fulldf.user_id==testuserid].stars.mean() \n", "for biz_id in bizs:\n", " print \"----------------------------------\"\n", " print biznamefromid(fulldf, biz_id)\n", " print \"Predicted Rating:\",rating(fulldf, dbfull, biz_id, testuserid, k=7, reg=3.) \n", " u,a=get_other_ratings(biz_id, testuserid, fulldf)\n", " print \"Actual User Rating:\",u,\"Avg Rating\",a" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "for user Vern avg 3.58227848101\n", "----------------------------------\n", "Local Breeze\n", "Predicted Rating: " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "4.81062901451\n", "Actual User Rating: 5 Avg Rating 3.86363636364\n", "----------------------------------\n", "Carly's Bistro\n", "Predicted Rating: " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "4.79797424984\n", "Actual User Rating: 5 Avg Rating 3.65079365079\n", "----------------------------------\n", "Tee Pee Mexican Food\n", "Predicted Rating: " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "4.16222806092\n", "Actual User Rating: 5 Avg Rating 3.13636363636\n", "----------------------------------\n", "District American Kitchen and Wine Bar" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Predicted Rating: " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "4.25508726374\n", "Actual User Rating: 4 Avg Rating 3.575\n", "----------------------------------\n", "Los Reyes de la Torta\n", "Predicted Rating: " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "4.10716351458\n", "Actual User Rating: 4 Avg Rating 4.24796747967\n" ] } ], "prompt_number": 110 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "These ratings are much closer than before. This is because now we are basing our predicted ratings off of the full dataset - this means a more informed Y_avg, Y_avg_M, Y_avg_J, and, perhaps most importantly, a more stable set of similarity scores.

\n", "All of these values go into constructing our predicted ratings for Vern, and now that we have a massive table of similarities and averages to draw from, it makes sense that our predictive accuracy should improve. I guess that's why Yelp made MRjob!\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**4.5** Outline another `step` (in words) in the mrjob map-reduce class to implement a simple but scalable recommender of the global type that we did in Question 1.5 to 1.7." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "For 1.5 and 1.6 we'd need one more map/reduce pair in our current RestaurantSimilarities class. \n", "
\n", "We need rest_id, shrunken sim, and ncommon for knearest output. We already have sim and ncommon for all pairs of restaurants. So we basically feed in all our data from calc_sim_collector to a new mapper, and put rest1, rest2, sim, and ncommon into a set. We can run shrunk sim on sim values. Then yield: restaurant1 id as key, and 3-tuples of (rest2, shrunk sim, ncommon) as values. \n", "

\n", "The reducer just needs to sort the list of 3-tuples by shrunk sim, per restaurant - we can then output rest1/(rest2,sim,ncom) and pull the top k items.\n", "

\n", "To do 1.8 we'd need a new function, as we've already thrown away user_ids within this map-reduce project. We can just take the fulldf and fulldb now, and run top_recos, but we'd use the restaurant similarities output to loop through instead of pulling out a list from the knearest function. Other than that, we can use the same function as we wrote in 1.8.\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*css tweaks in this cell*\n", "" ] } ], "metadata": {} } ] }