{ "metadata": { "name": "", "signature": "sha256:b4c1dc378241c5c25f85bb3d6a74cf898d5a3bd9899dbefb7d701a3a93502fa4" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Addressing selection bias in social media data for estimating county health statistics\n", "\n", "In [prior work](http://tapilab.github.io/public%20health/2014/04/26/twcounty/), we estimated many county health statistics from Twitter activity.\n", "\n", "In this work, we adjust for the sample bias of Twitter by reweighting data by gender and race. We show improvements in held-out prediction accuracy using this approach.\n", "\n", "This was presented at [JSM 2014](http://www.amstat.org/meetings/jsm/2014/)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Classify users as male or female based on first names based on Census name frequency.\n", "from collections import defaultdict\n", "import re\n", "import requests\n", "\n", "def names2dict(url):\n", " \"\"\" Fetch data from census and parse into dict mapping name to frequency. \"\"\"\n", " names = defaultdict(lambda: 0)\n", " for line in requests.get(url).text.split('\\n'):\n", " parts = line.lower().split()\n", " if len(parts) >= 2:\n", " names[parts[0]] = float(parts[1])\n", " return names\n", "\n", "def getCensusNames():\n", " \"\"\" Fetch census name data and remove ambiguous names. \"\"\"\n", " males = names2dict('http://www.census.gov/genealogy/www/data/1990surnames/dist.male.first')\n", " females = names2dict('http://www.census.gov/genealogy/www/data/1990surnames/dist.female.first')\n", " print len(set(males.keys() + females.keys())), 'total names'\n", " eps = 10. # keep names that are eps times more frequent in one gender than the other.\n", " tokeep = []\n", " for name in set(males.keys() + females.keys()):\n", " mscore = males[name]\n", " fscore = females[name]\n", " if mscore == 0 or fscore == 0 or mscore / fscore > eps or fscore / mscore > eps:\n", " tokeep.append(name)\n", " print 'keeping', len(tokeep)\n", " m = set([n for n in tokeep if males[n] > females[n]])\n", " f = set([n for n in tokeep if females[n] > males[n]])\n", " return m, f\n", "\n", "males, females = getCensusNames()\n", "print 'found', len(males), 'males and', len(females), 'females'\n", "\n", "def labelGender(tweet, males, females):\n", " \"\"\" Classify a tweet as male (m) female (f) or neutral (n) based on first token in name field. \"\"\"\n", " name = tweet['user']['name'].lower().split()\n", " if len(name) == 0:\n", " name = ['']\n", " name = re.findall('\\w+', name[0])\n", " if len(name) == 0:\n", " name = ''\n", " else:\n", " name = name[0]\n", " if name in males:\n", " tweet['user']['gender'] = 'm'\n", " elif name in females:\n", " tweet['user']['gender'] = 'f'\n", " else:\n", " tweet['user']['gender'] = 'n'\n", " return tweet\n", "\n", "print 'John is', labelGender({'user':{'name':'John smith'}}, males, females)['user']['gender']\n", "print 'Jane is', labelGender({'user':{'name':'jane doe'}}, males, females)['user']['gender']\n", "print 'kris is', labelGender({'user':{'name':'Kris doe'}}, males, females)['user']['gender']" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "5163 total names\n", "keeping 5008\n", "found 1048 males and 3960 females\n", "John is m\n", "Jane is f\n", "kris is n\n" ] } ], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "def labelRace(tweet):\n", " \n", " desc = tweet['user']['description']\n", " if not desc:\n", " desc = ''\n", " toks = set(re.findall('\\w+', desc.lower()))\n", " \n", " if len(set(['african', 'black', 'aa', 'sbm', 'sbf']) & toks) > 0:\n", " tweet['user']['race'] = 'b'\n", " print 'black:', desc\n", " elif len(set(['latin', 'latino', 'latina', 'hispanic']) & toks) > 0:\n", " tweet['user']['race'] = 'l'\n", " print 'latino:', desc\n", " else:\n", " tweet['user']['race'] = 'n'\n", " return tweet\n", "\n", "print 'John is', labelRace({'user':{'description':'african-american'}})['user']['race']\n", "print 'Jane is', labelRace({'user':{'description':'black man'}})['user']['race']\n", "print 'kris is', labelRace({'user':{'description':'a latino'}})['user']['race']\n", "print 'foo is', labelRace({'user':{'description':'blah'}})['user']['race']" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "John is black: african-american\n", "b\n", "Jane is black: black man\n", "b\n", "kris is latino: a latino\n", "l\n", "foo is n\n" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline\n", "# Train a race classifier based on description field.\n", "import glob\n", "import io\n", "import json\n", "import os\n", "import re\n", "\n", "import numpy as np\n", "\n", "from sklearn.cross_validation import KFold\n", "from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import classification_report, precision_recall_curve\n", "from sklearn.preprocessing import label_binarize, scale\n", "\n", "from twutil import preprocess\n", "\n", "def print_top_feats_cl(m, feature_names, labels, n=10):\n", " for i, coef in enumerate(m.coef_):\n", " srted = np.argsort(coef)\n", " topi = srted[::-1][:n]\n", " boti = srted[:n]\n", " print 'label=', labels[i]\n", " print 'pos:' + ' '.join('%s (%.2g)' % (n, c) for n, c in zip(feature_names[topi], coef[topi]))\n", " print 'neg:' + ' '.join('%s (%.2g)' % (n, c) for n, c in zip(feature_names[boti], coef[boti]))\n", "\n", "def prec_rec(truths_bin, probs, races):\n", " truths_bin = np.array(truths_bin)\n", " probs = np.array(probs)\n", " precision = dict()\n", " recall = dict()\n", " for i in range(len(races)):\n", " precision[i], recall[i], _ = precision_recall_curve(truths_bin[:, i],\n", " probs[:, i])\n", " \n", " # Plot Precision-Recall curve for each class\n", " for i in range(len(races)):\n", " plot(recall[i], precision[i], label=races[i])\n", " xlabel('Recall')\n", " ylabel('Precision')\n", " legend(loc=\"lower right\")\n", " \n", "def prec_rec_afro_hisp(truths_bin, probs, races):\n", " truths_bin = np.array(truths_bin)\n", " probs = np.array(probs)\n", " truths_ah = np.array(truths_bin[:, 0] + truths_bin[:, 1])\n", " probs_ah = np.array([max(i, j) for i, j in zip(probs[:, 0], probs[:, 1])])\n", " precision, recall, _ = precision_recall_curve(truths_ah, probs_ah)\n", " plot(recall, precision)\n", " xlabel('Recall')\n", " ylabel('Precision')\n", " legend(loc=\"lower right\")\n", " plt.savefig('race.pdf', bbox_inches='tight')\n", " \n", "def read_race_data(race_path, tzer, races):\n", " tokens = []\n", " labels = []\n", " for fname in glob.glob(race_path + '/*.*'):\n", " label = os.path.splitext(os.path.basename(fname))[0]\n", " for line in io.open(fname, encoding='utf8'):\n", " js = json.loads(line)\n", " toks = tzer.do_tokenize(js['description'])\n", " if len(toks) > 0:\n", " labels.append(races.index(label))\n", " tokens.append(' '.join(toks))\n", " return tokens, labels\n", "\n", "races = ['black', 'latin', 'white']\n", "\n", "def train_race_clf():\n", " print 'training race classifier'\n", " tzer = preprocess.Tokenizer(fields='description', retain_punc_toks=False, collapse_digits=True)\n", " tokens, labels = read_race_data('/data/twcounty/labeled_users/race', tzer, races)\n", " vec = TfidfVectorizer(token_pattern='\\S+', min_df=2, binary=True)\n", " X = vec.fit_transform(tokens) \n", " y = np.array(labels)\n", " print 'vocab size=', len(vec.get_feature_names())\n", "\n", " cv = KFold(len(y), 10, shuffle=True, random_state=123456)\n", " m = LogisticRegression(class_weight='auto')\n", " preds = []\n", " truths = []\n", " probs = [] \n", " y_bin = label_binarize(y, classes=range(len(races)))\n", " truths_bin = []\n", " for train, test in cv:\n", " m.fit(X[train], y[train])\n", " preds.extend(m.predict(X[test]))\n", " truths.extend(y[test])\n", " probs.extend(m.predict_proba(X[test]))\n", " truths_bin.extend(y_bin[test])\n", " \n", " print classification_report(truths, preds, target_names=races)\n", " m.fit(X, y)\n", " m.tzer = tzer\n", " m.vec = vec\n", " print_top_feats_cl(m, np.array(vec.get_feature_names()), races, 5)\n", " # What is precision of classifications with probability > .5?\n", " threshold = 0.5\n", " y_filtered = [i for i, pred in enumerate(preds) if probs[i][pred] > threshold]\n", " print len(y_filtered), 'retained of', len(preds), 'total using threshold', threshold\n", " print classification_report(np.array(truths)[y_filtered], np.array(preds)[y_filtered], target_names=races)\n", " prec_rec_afro_hisp(truths_bin, probs, races)\n", " return m\n", " \n", " \n", "def label_race_clf(tweet, clf):\n", " desc = tweet['user']['description']\n", " if not desc:\n", " desc = ''\n", " preds = clf.predict_proba(clf.vec.transform([' '.join(clf.tzer.do_tokenize(desc))]))[0]\n", " if max(preds) > 0.5:\n", " # print 'predicting', races[np.argmax(preds)], 'for', tweet['user']['screen_name'], desc\n", " tweet['user']['race'] = races[np.argmax(preds)]\n", " else:\n", " tweet['user']['race'] = 'n'\n", " return tweet\n", "\n", "race_clf = train_race_clf()\n", "print 'John is', label_race_clf({'user':{'description':'r.i.p.', 'screen_name':'john'}}, race_clf)['user']['race']\n", "print 'Jane is', label_race_clf({'user':{'description':'que', 'screen_name':'jane'}}, race_clf)['user']['race']\n", "print 'Joe is', label_race_clf({'user':{'description':'like', 'screen_name':'joe'}}, race_clf)['user']['race']\n", "print 'Jesse is', label_race_clf({'user':{'description':'asdf', 'screen_name':'jesse'}}, race_clf)['user']['race']" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n", "training race classifier\n", "vocab size=" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 766\n", " precision recall f1-score support\n", "\n", " black 0.53 0.47 0.50 263\n", " latin 0.81 0.51 0.62 157\n", " white 0.56 0.72 0.63 324\n", "\n", "avg / total 0.60 0.59 0.58 744\n", "\n", "label= black\n", "pos:for (1.5) r.i.p (1.3) money (1.2) live (1.2) team (1.1)\n", "neg:de (-1.4) y (-1.1) la (-0.89) like (-0.86) and (-0.81)\n", "label= latin\n", "pos:de (3.1) y (2.5) que (1.6) un (1.5) en (1.5)\n", "neg:for (-1.5) of (-1.3) the (-1.1) and (-1) you (-1)\n", "label= white\n", "pos:and (1.4) like (1.2) 9/9 (0.95) not (0.94) am (0.83)\n", "neg:de (-1.8) y (-1.3) live (-1) me (-1) instagram (-0.98)\n", "245 retained of 744 total using threshold 0.5\n", " precision recall f1-score support\n", "\n", " black 0.52 0.48 0.50 71\n", " latin 0.96 0.76 0.84 86\n", " white 0.60 0.76 0.67 88\n", "\n", "avg / total 0.70 0.68 0.68 245\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "John is" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " black\n", "Jane is latin\n", "Joe is white\n", "Jesse is n\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 173 }, { "cell_type": "code", "collapsed": false, "input": [ "# Read in Twitter json files, classifying each by gender and/or race.\n", "from collections import Counter\n", "import io\n", "import glob\n", "import json\n", "import os\n", "import re\n", "import sys\n", "import tok.unicode_props\n", "\n", "import tweet\n", "import json2tsv\n", "\n", "JSON_D='/data/twcounty/json/' # Directory containing one json file per county, named according to FIPS.\n", " \n", "def iter_jsons(f):\n", " \"\"\" Iterate tweet json objects from a file, appending county information from file name.\"\"\"\n", " fp = io.open(f, mode='rt', encoding='utf8')\n", " county = os.path.basename(f)\n", " count = 0 \n", " for line in fp:\n", " try:\n", " line = re.sub('\\t', ' ', line)\n", " js = json.loads(line)\n", " if json2tsv.valid_line(js):\n", " js['county'] = county\n", " yield js\n", " count += 1\n", " if count >= 10000: # FIXME: limiting to first 1000 users per county for testing.\n", " return\n", " except:\n", " pass\n", "\n", "def iter_files(path):\n", " \"\"\" Iterate tweets in directory of json files. \"\"\"\n", " fcount = 1\n", " for fname in glob.glob(path + '/*'):\n", " print 'parsing', fname, '(#', fcount, ')'\n", " fcount += 1\n", " for js in iter_jsons(fname):\n", " yield js\n", "\n", "def iter_gender(jss):\n", " for js in jss:\n", " labelGender(js, males, females)\n", " yield js\n", "\n", "def iter_race(jss, race_clf):\n", " for js in jss:\n", " label_race_clf(js, race_clf)\n", " yield js\n", "\n", "def iter_tokenize(jss):\n", " all_users = set()\n", " for js in jss:\n", " if not js['user']['description']:\n", " js['user']['description'] = ' '\n", " tw = tweet.Tweet(js['county'], js['id'], js['user']['screen_name'],\n", " json2tsv.tokenize(js['text'], tokenizer),\n", " json2tsv.tokenize(js['user']['description'], tokenizer))\n", " tw.gender = js['user']['gender']\n", " tw.race = js['user']['race']\n", " if tw.screen_name not in all_users:\n", " county2gender[js['county']][tw.gender] += 1\n", " county2race[js['county']][tw.race] += 1\n", " all_users.add(tw.screen_name)\n", " gender_counts.update([tw.gender])\n", " race_counts.update([tw.race])\n", " yield tw\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "def do_featurize(feats, words, prefix, alpha, unigrams=True, liwc=False, perma=False):\n", " lexi = tsv2feats.lexicons(words, liwc, perma)\n", " if unigrams:\n", " lexi.extend(words)\n", " for t in lexi:\n", " feats[alpha[prefix + t]] += 1\n", " return feats\n", "\n", "\n", "# def featurize(tw, alpha, unigrams, liwc, perma):\n", "# feats = defaultdict(lambda: 0)\n", "# if tw.text:\n", "# do_featurize(feats, tw.text.split(' '), '', alpha, unigrams, liwc, perma)\n", "# if tw.gender != 'n':\n", "# do_featurize(feats, tw.text.split(' '), tw.gender + \"_\", alpha, unigrams, liwc, perma)\n", "# if tw.description:\n", "# do_featurize(feats, tw.description.split(' '), 'd=', alpha, unigrams, liwc, perma)\n", "# if tw.gender != 'n':\n", "# do_featurize(feats, tw.description.split(' '), tw.gender + '_d=', alpha, unigrams, liwc, perma)\n", "# return feats\n", "\n", "def featurize(tw, alpha, unigrams, liwc, perma):\n", " \"\"\"\n", " >>> alpha = defaultdict(lambda: len(alpha))\n", " >>> feats = featurize(tweet.Tweet('cty1', '123', 'joe', 'i', 'abject'), alpha, True, True, True)\n", " >>> all(feats[alpha[word]] == 1 for word in [u'd=P-', u'Pronoun', u'I', u'Self', 'i', 'd=abject'])\n", " True\n", " \"\"\"\n", " feats = defaultdict(lambda: 0)\n", " if tw.text:\n", " toks = tw.text.split(' ')\n", " do_featurize(feats, toks, '', alpha, unigrams, liwc, perma)\n", " if tw.race != 'n':\n", " do_featurize(feats, toks, 'race=' + tw.race + \"_\", alpha, unigrams, liwc, perma)\n", " if tw.gender != 'n':\n", " do_featurize(feats, toks, 'gender=' + tw.gender + \"_\", alpha, unigrams, liwc, perma)\n", " if tw.description:\n", " toks = tw.description.split(' ')\n", " do_featurize(feats, toks, 'd=', alpha, unigrams, liwc, perma)\n", " if tw.gender != 'n':\n", " do_featurize(feats, toks, 'gender=' + tw.gender + '_d=', alpha, unigrams, liwc, perma)\n", " if tw.race != 'n':\n", " do_featurize(feats, toks, 'race=' + tw.race + '_d=', alpha, unigrams, liwc, perma)\n", " return feats\n", "\n", "def read_tweets(tweets, user_norm=False, unigrams=True, liwc=False, perma=False):\n", " alpha = defaultdict(lambda: len(alpha))\n", " # county -> tweets\n", " tweets_by_county = defaultdict(lambda: defaultdict(lambda: 0))\n", " users_by_county = defaultdict(lambda: set())\n", " tweets_by_user = defaultdict(lambda: defaultdict(lambda: set()))\n", " i = 0\n", " for tw in tweets:\n", " users_by_county[tw.county].add(tw.screen_name)\n", " feats = featurize(tw, alpha, unigrams, liwc, perma)\n", " for k, v in feats.iteritems():\n", " if user_norm:\n", " if k not in tweets_by_user[tw.county][tw.screen_name]:\n", " tweets_by_county[tw.county][k] += 1\n", " tweets_by_user[tw.county][tw.screen_name].add(k)\n", " else:\n", " tweets_by_county[tw.county][k] += v\n", " i += 1\n", " return tsv2feats.default_dict_to_dict(tweets_by_county), users_by_county, alpha" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "# READ DATA\n", "# Parse all json files. This takes a while.\n", "import data\n", "import expt\n", "import tsv2feats\n", "\n", "tokenizer = tok.unicode_props.UP_Tiny(1)\n", "\n", "gender_counts = Counter()\n", "race_counts = Counter()\n", "county2race = defaultdict(lambda: {'black': 0., 'latin': 0., 'white':0., 'n': 0.})\n", "county2gender = defaultdict(lambda: {'m': 0., 'f': 0., 'n':0.})\n", "race_clf = train_race_clf()\n", "\n", "features_og, users_by_county_og, alpha_og = tsv2feats.read_tweets(iter_tokenize(iter_race(iter_gender(iter_files(JSON_D)), race_clf)),\n", " user_norm=True, unigrams=False, liwc=True, perma=True)\n", "features_og_gender, users_by_county_og_gender, alpha_og_gender = read_tweets(iter_tokenize(iter_race(iter_gender(iter_files(JSON_D)), race_clf)), user_norm=True, unigrams=False, liwc=True, perma=True)\n", "print 'genders:', gender_counts\n", "print 'races:', race_counts\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "training race classifier\n", " precision recall f1-score support\n", "\n", " black 0.53 0.47 0.50 263\n", " latin 0.81 0.51 0.62 157\n", " white 0.56 0.72 0.63 324\n", "\n", "avg / total 0.60 0.59 0.58 744\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "label= black\n", "pos:for (1.5) r.i.p (1.3) money (1.2) live (1.2) team (1.1)\n", "neg:de (-1.4) y (-1.1) la (-0.89) like (-0.86) and (-0.81)\n", "label= latin\n", "pos:de (3.1) y (2.5) que (1.6) un (1.5) en (1.5)\n", "neg:for (-1.5) of (-1.3) the (-1.1) and (-1) you (-1)\n", "label= white\n", "pos:and (1.4) like (1.2) 9/9 (0.95) not (0.94) am (0.83)\n", "neg:de (-1.8) y (-1.3) live (-1) me (-1) instagram (-0.98)\n", "245 retained of 744 total using threshold 0.5\n", " precision recall f1-score support\n", "\n", " black 0.52 0.48 0.50 71\n", " latin 0.96 0.76 0.84 86\n", " white 0.60 0.76 0.67 88\n", "\n", "avg / total 0.70 0.68 0.68 245\n", "\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/01073 (# 1 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/04013 (# 2 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/04019 (# 3 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06001 (# 4 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06013 (# 5 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06019 (# 6 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06029 (# 7 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06037 (# 8 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06059 (# 9 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06065 (# 10 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06067 (# 11 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06071 (# 12 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06073 (# 13 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06075 (# 14 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06077 (# 15 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06081 (# 16 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06085 (# 17 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06111 (# 18 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/08041 (# 19 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/09001 (# 20 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/09003 (# 21 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/09009 (# 22 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12011 (# 23 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12031 (# 24 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12057 (# 25 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12086 (# 26 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12095 (# 27 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12099 (# 28 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12103 (# 29 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/13067 (# 30 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/13089 (# 31 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/13121 (# 32 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/13135 (# 33 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/15003 (# 34 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/17031 (# 35 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/17043 (# 36 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/17097 (# 37 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/17197 (# 38 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/18097 (# 39 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/21111 (# 40 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/24005 (# 41 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/24031 (# 42 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/24033 (# 43 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/24510 (# 44 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25009 (# 45 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25017 (# 46 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25021 (# 47 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25025 (# 48 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25027 (# 49 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/26099 (# 50 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/26125 (# 51 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/26163 (# 52 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/27053 (# 53 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/29095 (# 54 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/29189 (# 55 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/32003 (# 56 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34003 (# 57 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34013 (# 58 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34017 (# 59 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34023 (# 60 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34025 (# 61 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/35001 (# 62 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36005 (# 63 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36029 (# 64 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36047 (# 65 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36055 (# 66 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36059 (# 67 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36061 (# 68 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36081 (# 69 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36103 (# 70 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36119 (# 71 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/37119 (# 72 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/37183 (# 73 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/39035 (# 74 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/39049 (# 75 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/39061 (# 76 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/40109 (# 77 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/41051 (# 78 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/42003 (# 79 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/42017 (# 80 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/42091 (# 81 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/42101 (# 82 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/44007 (# 83 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/47037 (# 84 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/47157 (# 85 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48029 (# 86 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48085 (# 87 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48113 (# 88 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48121 (# 89 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48141 (# 90 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48201 (# 91 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48215 (# 92 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48439 (# 93 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48453 (# 94 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/49035 (# 95 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/51059 (# 96 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/53033 (# 97 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/53053 (# 98 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/53061 (# 99 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/55079 (# 100 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/01073 (# 1 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/04013 (# 2 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/04019 (# 3 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06001 (# 4 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06013 (# 5 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06019 (# 6 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06029 (# 7 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06037 (# 8 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06059 (# 9 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06065 (# 10 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06067 (# 11 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06071 (# 12 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06073 (# 13 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06075 (# 14 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06077 (# 15 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06081 (# 16 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06085 (# 17 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/06111 (# 18 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/08041 (# 19 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/09001 (# 20 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/09003 (# 21 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/09009 (# 22 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12011 (# 23 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12031 (# 24 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12057 (# 25 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12086 (# 26 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12095 (# 27 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12099 (# 28 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/12103 (# 29 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/13067 (# 30 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/13089 (# 31 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/13121 (# 32 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/13135 (# 33 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/15003 (# 34 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/17031 (# 35 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/17043 (# 36 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/17097 (# 37 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/17197 (# 38 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/18097 (# 39 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/21111 (# 40 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/24005 (# 41 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/24031 (# 42 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/24033 (# 43 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/24510 (# 44 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25009 (# 45 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25017 (# 46 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25021 (# 47 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25025 (# 48 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/25027 (# 49 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/26099 (# 50 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/26125 (# 51 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/26163 (# 52 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/27053 (# 53 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/29095 (# 54 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/29189 (# 55 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/32003 (# 56 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34003 (# 57 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34013 (# 58 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34017 (# 59 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34023 (# 60 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/34025 (# 61 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/35001 (# 62 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36005 (# 63 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36029 (# 64 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36047 (# 65 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36055 (# 66 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36059 (# 67 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36061 (# 68 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36081 (# 69 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36103 (# 70 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/36119 (# 71 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/37119 (# 72 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/37183 (# 73 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/39035 (# 74 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/39049 (# 75 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/39061 (# 76 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/40109 (# 77 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/41051 (# 78 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/42003 (# 79 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/42017 (# 80 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/42091 (# 81 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/42101 (# 82 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/44007 (# 83 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/47037 (# 84 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/47157 (# 85 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48029 (# 86 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48085 (# 87 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48113 (# 88 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48121 (# 89 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48141 (# 90 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48201 (# 91 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48215 (# 92 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48439 (# 93 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/48453 (# 94 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/49035 (# 95 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/51059 (# 96 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/53033 (# 97 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/53053 (# 98 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/53061 (# 99 )\n", "parsing" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " /data/twcounty/json/55079 (# 100 )\n", "genders:" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " Counter({'n': 1031916, 'f': 540666, 'm': 422118})\n", "races: Counter({'n': 1358642, 'white': 385108, 'black': 200316, 'latin': 50634})\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "def norm_by_demo(tweets_by_county, users_by_county, alpha, include_og_feature, include_race, include_gender):\n", " \"\"\" Consider various normalization strategies using gender/race info.\"\"\"\n", " alpha = defaultdict(lambda: len(alpha), alpha)\n", " rev_alpha = tsv2feats.reverse_dict(alpha)\n", " for cty_id in tweets_by_county:\n", " nusers = len(users_by_county[cty_id])\n", " features = tweets_by_county[cty_id]\n", " for feature, value in features.items():\n", " feat_name = rev_alpha[feature]\n", " # Divide by the number of that race (m,f,n), which prefixes the feature\n", " if feat_name[0:5] == 'race=':\n", " if include_race:\n", " if county2race[cty_id][feat_name[5:10]] == 0:\n", " county2race[cty_id][feat_name[5:10]] = 1.\n", " features[feature] = 1. * value / county2race[cty_id][feat_name[5:10]]\n", " else:\n", " features[feature] = 0.\n", " elif feat_name[0:7] == 'gender=':\n", " if include_gender:\n", " features[feature] = 1. * value / county2gender[cty_id][feat_name[7:8]]\n", " else:\n", " features[feature] = 0.\n", " else:\n", " if include_og_feature:\n", " features[feature] = 1. * value / nusers \n", " else:\n", " features[feature] = 0.\n", " # return alpha\n", "\n", "def compute_reweighting():\n", " targets, target_alpha = expt.read_targets('/data/twcounty/targets.tsv', county2gender.keys())\n", " female_idx = target_alpha.index('Female')\n", " female_true = dict((fips, target[female_idx]) for fips, target in targets.iteritems())\n", " female_pred = dict((fips, 100. * v['f'] / (v['m'] + v['f'])) for fips, v in county2gender.iteritems())\n", " female_wt = dict((fips, female_true[fips] / female_pred[fips]) for fips in county2gender)\n", "\n", " afro_idx = target_alpha.index('Afro-hispanic')\n", " afro_true = dict((fips, target[afro_idx]) for fips, target in targets.iteritems())\n", " afro_pred = dict((fips, 100. * (v['black'] + v['latin']) / (v['black'] + v['latin'] + v['white'])) for fips, v in county2race.iteritems())\n", " afro_wt = dict((fips, afro_true[fips] / afro_pred[fips]) for fips in county2gender)\n", " return female_wt, afro_wt\n", "\n", "def norm_by_demo_reweight(tweets_by_county, users_by_county, alpha, include_og_feature, include_race, include_gender):\n", " \"\"\" Consider various reweighting strategies using gender/race info.\"\"\"\n", " female_wt, afro_wt = compute_reweighting()\n", "\n", " alpha = defaultdict(lambda: len(alpha), alpha)\n", " rev_alpha = tsv2feats.reverse_dict(alpha)\n", " for cty_id in tweets_by_county:\n", " nusers = len(users_by_county[cty_id])\n", " features = tweets_by_county[cty_id]\n", " for feature, value in features.items():\n", " feat_name = rev_alpha[feature]\n", " # If race or gender is known, reweight\n", " if feat_name[0:5] == 'race=':\n", " if include_race:\n", " if county2race[cty_id][feat_name[5:10]] == 0:\n", " county2race[cty_id][feat_name[5:10]] = 1.\n", " if feat_name[5:10] == 'black' or feat_name[5:10] == 'latin':\n", " wt = afro_wt[cty_id]\n", " else:\n", " wt = 1.\n", " #wt = 1. / afro_wt[cty_id]\n", " features[alpha[feat_name[11:]]] += (wt * features[feature] - features[feature])\n", " features[feature] = 0.\n", " elif feat_name[0:7] == 'gender=':\n", " if include_gender:\n", " if feat_name[7:8] == 'f':\n", " wt = female_wt[cty_id]\n", " else:\n", " wt = 1.\n", " #wt = 1. / female_wt[cty_id]\n", " features[alpha[feat_name[9:]]] += (wt * features[feature] - features[feature])\n", " features[feature] = 0.\n", " # Now that we've reweighted, normalize as usual.\n", " tsv2feats.norm_by_user(tweets_by_county, users_by_county, alpha)\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 152 }, { "cell_type": "code", "collapsed": false, "input": [ "def get_results(train_folds, test_folds, m, vocab, target_name, coords):\n", " \"\"\" Write prediction results to disk. \"\"\"\n", " target_name = expt.fmt_target(target_name)\n", " train_results = expt.evaluate(train_folds, coords)\n", " test_results = expt.evaluate(test_folds, coords)\n", " # print('%20s:\\ttrain\\t%s' % (target_name[:20], expt.fmt_eval(train_results, ['smape_m', 'correl', 'correl_a'])))\n", " # print('%20s:\\ttest\\t%s' % (target_name[:20], expt.fmt_eval(test_results, ['smape_m', 'correl', 'correl_a'])))\n", " return test_results" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "import copy\n", "import numpy as np\n", "\n", "from scipy.stats import pearsonr\n", "from sklearn import linear_model\n", "from sklearn.feature_selection import f_regression, SelectKBest\n", "\n", "def print_top_feats(m, feature_names, n=10):\n", " srted = np.argsort(m.coef_)\n", " topi = srted[::-1][:n]\n", " boti = srted[:n]\n", " print 'pos:' + ' '.join('%s (%.2g)' % (n, c) for n, c in zip(feature_names[topi], m.coef_[topi]))\n", " print 'neg:' + ' '.join('%s (%.2g)' % (n, c) for n, c in zip(feature_names[boti], m.coef_[boti]))\n", "\n", "def avg_results(all_results):\n", " \"\"\" Average all_results. \"\"\"\n", " result = {}\n", " for key in all_results[0].keys():\n", " result[key] = np.mean([d[key] for d in all_results])\n", " return result\n", "\n", "def myridge(x, y, train, test, alpha=1):\n", " fsel = SelectKBest(f_regression, k=min(160, len(x[0])))\n", " m = linear_model.Ridge(alpha)\n", " xtrain = fsel.fit_transform(x[train], y[train])\n", " xtest = fsel.transform(x[test])\n", " m.fit(xtrain, y[train])\n", " return (m, m.predict(xtrain), m.predict(xtest), fsel)\n", " #m.fit(x[train], y[train])\n", " #return (m, m.predict(x[train]), m.predict(x[test]))\n", "\n", "def run_expt(features_og, users_by_county_og, alpha_og, use_race, use_gender, use_og_feature, ridge_alpha):\n", " features = copy.deepcopy(features_og)\n", " users_by_county = copy.deepcopy(users_by_county_og)\n", " alpha = copy.deepcopy(alpha_og)\n", " features, alpha = tsv2feats.filter_by_count(features, alpha, min_df=20)\n", " if use_gender or use_race:\n", " norm_by_demo_reweight(features, users_by_county, alpha, include_og_feature=use_og_feature, include_race=use_race, include_gender=use_gender)\n", " else:\n", " tsv2feats.norm_by_user(features, users_by_county, alpha)\n", " features = tsv2feats.densify(features, alpha) # default_dict_to_dict(features)\n", " # print('last 10 features from first county: %s' % features.values()[0][-10:])\n", " # print('last 10 words from alpha: %s' % alpha.keys()[-10:])\n", " county_data = data.Data(None, features, alpha)\n", " coords = expt.read_coords('/data/twcounty/stats2/counties/counties.top100.bounding.txt')\n", " counties = county_data.features\n", " data_alpha = np.array(sorted(county_data.alpha.keys(), key=lambda k: county_data.alpha[k]))\n", " targets, target_alpha = expt.read_targets('/data/twcounty/targets.tsv', counties.keys())\n", " states = expt.read_states('/data/twcounty/states.tsv', counties.keys())\n", " \n", " \n", " cv = expt.make_state_cv(counties, states, 5)\n", " X, Y = expt.to_matrices(counties, targets)\n", " county_ids = np.array(sorted(counties))\n", " all_results = []\n", " all_smapes = []\n", " for yi, ylabel in enumerate(target_alpha):\n", " y = Y[:, yi]\n", " # XX = fsel.fit_transform(X, y)\n", " train_folds = []\n", " test_folds = []\n", " for train, test in cv:\n", " m, train_pred, test_pred, fsel = myridge(X, y, train, test, alpha=ridge_alpha)\n", " train_folds.append((y[train], train_pred, county_ids[train]))\n", " test_folds.append((y[test], test_pred, county_ids[test]))\n", " m, train_pred, test_pred, fsel = myridge(X, y, range(len(y)), range(len(y)), alpha=ridge_alpha)\n", " #fvals, pvals = expt.feature_correls(X, y, [coords[cty] for cty in county_ids])\n", " all_results.append(get_results(train_folds, test_folds, m, data_alpha, ylabel, coords))\n", " smapes = [expt.smape(t[0], t[1]) for t in test_folds]\n", " all_smapes.append(smapes)\n", " # smapes = [pearsonr(t[0], t[1])[0] for t in test_folds]\n", " # all_smapes.append(smapes)\n", " if ylabel in ['% Obese', '% No Social-Emotional Support', 'Teen Birth Rate']:\n", " print ylabel, 'features:'\n", " print_top_feats(m, np.array(data_alpha[fsel.get_support(True)]))\n", " summary = avg_results(all_results)\n", " print(u'\\t'.join(str(k) for k in sorted(summary.keys())) + '\\n')\n", " print(u'\\t'.join(str(summary[k]) for k in sorted(summary.keys())) + '\\n')\n", " return target_alpha, np.array(all_smapes)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 131 }, { "cell_type": "code", "collapsed": false, "input": [ "targets, gender_results = run_expt(features_og_gender, users_by_county_og_gender, alpha_og_gender, use_gender=True, use_og_feature=True, use_race=True, ridge_alpha=.1)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "% Obese features:\n", "pos:Othref (7.5) Social (6.8) d=Posfeel (5.4) Negate (5.4) You (5.3) d=School (5) d=Social (4.4) Self (4.2) d=You (4.1) d=Posemo (4)\n", "neg:Preps (-7.5) d=Motion (-6.4) d=Job (-4.1) d=Incl (-4) d=Achieve (-3.9) P+ (-3.7) d=Preps (-3.5) Posemo (-3.3) d=Senses (-3.2) d=Up (-3)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (38) d=Relig (37) d=Self (36) d=Metaph (35) Negate (32) d=Home (29) d=Pronoun (24) d=Affect (22) d=Posemo (22) d=Present (22)\n", "neg:Preps (-21) d=Cogmech (-19) Cogmech (-18) Incl (-17) Occup (-15) Present (-15) d=Othref (-14) d=Cause (-14) d=Senses (-14) d=Social (-14)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (17) Article (9) d=Article (7.2) Preps (6.8) d=Time (6.7) Pronoun (6.7) Self (6.2) I (5.8) d=Up (5.6) d=Home (5.6)\n", "neg:d=Relig (-9.1) d=Metaph (-9) d=Sports (-9) d=School (-8.1) Excl (-8) Insight (-6) Achieve (-5.6) Motion (-5.6) Tentat (-5.2) You (-4.9)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.405863005572\t0.0551069655178\t3641.86245907\t1149.2435922\t0.0846598559351\t0.015804393834\n", "\n" ] } ], "prompt_number": 154 }, { "cell_type": "code", "collapsed": false, "input": [ "targets, og_results = run_expt(features_og, users_by_county_og, alpha_og, use_race=False, use_gender=False, use_og_feature=True, ridge_alpha=.1)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "% Obese features:\n", "pos:Othref (7) d=School (6.8) Social (5.4) d=Posfeel (4.7) d=Social (4.7) Self (4.6) I (4.5) You (4.4) Negate (4.3) d=Relig (4.3)\n", "neg:Preps (-6.8) d=Motion (-6) P+ (-4.5) Article (-4) Posemo (-3.9) d=Incl (-3.7) d=Job (-3.4) d=Achieve (-3.4) d=Up (-3.4) Anger (-2.9)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Relig (45) d=Metaph (42) d=I (33) d=Self (28) d=Posemo (19) d=Present (17) d=Home (17) d=Posfeel (17) Othref (17) d=Leisure (17)\n", "neg:Article (-32) d=Othref (-27) Occup (-23) d=Cogmech (-21) Preps (-19) Time (-19) Present (-19) Incl (-18) Achieve (-18) Physcal (-17)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (10) d=Occup (5.3) Other (4.9) Preps (4.7) d=Time (4.4) d=Leisure (4.1) d=Up (3.7) d=Music (3.4) d=Job (3.2) d=Space (3.1)\n", "neg:Article (-8.5) Negate (-8.3) You (-8) Present (-5.7) Achieve (-5.7) Time (-5.3) Occup (-5.2) d=You (-5.2) d=Metaph (-5.1) d=Relig (-5)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.282496541688\t0.127283925635\t4482.95334488\t1758.82312904\t0.0901934834871\t0.0165386842068\n", "\n" ] } ], "prompt_number": 133 }, { "cell_type": "code", "collapsed": false, "input": [ "# Search for best alpha\n", "def avg_results_alpha(my_results):\n", " return np.mean([np.mean(r) for r in my_results])\n", "\n", "def best_alpha(features_og_gender, users_by_county_og_gender, alpha_og_gender,\n", " use_gender, use_race, use_og_feature):\n", " \"\"\" Hill climb to find best alpha. \"\"\"\n", " values = [.1 * (i+1) for i in range(25)]\n", " i = len(values) / 2\n", " print 'ALPHA=', values[i], 'i=', i\n", " direction = -1\n", " _, my_results = run_expt(features_og_gender, users_by_county_og_gender, alpha_og_gender, use_gender=use_gender, use_race=use_race, use_og_feature=use_og_feature, ridge_alpha=values[i])\n", " while True:\n", " newi = i + direction\n", " if newi >= 0 and newi < len(values):\n", " print 'ALPHA=', values[newi], 'i=', newi\n", " t, new_results = run_expt(features_og_gender, users_by_county_og_gender, alpha_og_gender, use_gender=use_gender, use_race=use_race, use_og_feature=use_og_feature, ridge_alpha=values[newi])\n", " if avg_results_alpha(new_results) < avg_results_alpha(my_results):\n", " i = newi\n", " print 'accepting new alpha'\n", " my_results = new_results\n", " continue\n", " else:\n", " direction *= -1\n", " newi = i + direction\n", " print 'ALPHA=', values[newi], 'i=', newi\n", " t, new_results = run_expt(features_og_gender, users_by_county_og_gender, alpha_og_gender, use_gender=use_gender, use_race=use_race, use_og_feature=use_og_feature, ridge_alpha=values[newi])\n", " if avg_results_alpha(new_results) < avg_results_alpha(my_results):\n", " i = newi\n", " print 'accepting new alpha'\n", " my_results = new_results\n", " continue\n", " # No better direction. Stop.\n", " print 'stopping.'\n", " return values[i], avg_results_alpha(my_results)\n", "\n", "print best_alpha(features_og_gender, users_by_county_og_gender, alpha_og_gender, use_gender=True, use_race=True, use_og_feature=True)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "ALPHA= 1.3 i= 12\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (2) Social (2) I (1.9) Self (1.8) d=School (1.8) Pronoun (1.8) d=Social (1.6) d=I (1.6) Present (1.5) You (1.5)\n", "neg:d=Job (-0.75) d=Incl (-0.59) d=Preps (-0.48) d=Achieve (-0.37) d=TV (-0.33) Preps (-0.32) d=Music (-0.3) d=E+ (-0.27) d=Senses (-0.27) d=Time (-0.26)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (17) d=Self (17) d=Pronoun (13) d=Present (11) d=Relig (9.3) d=Metaph (9.1) d=Motion (9.1) d=Preps (6.8) d=Affect (6.8) d=Posemo (6.5)\n", "neg:Occup (-3) Incl (-2.7) Achieve (-2.2) Time (-1.7) Preps (-1.6) Job (-1.5) Inhib (-1.4) d=Cause (-1.3) Physcal (-1.3) d=Othref (-1.2)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (5) d=Article (2.5) d=Pronoun (2.4) d=Self (2.3) d=Incl (2.2) Preps (2) d=I (1.9) d=Cogmech (1.7) d=Affect (1.7) d=Present (1.6)\n", "neg:d=Sports (-1.6) You (-1.5) Excl (-1.5) Discrep (-1.5) d=School (-1.4) Tentat (-1.4) Motion (-1.3) Insight (-1.3) Past (-1.2) Future (-1.1)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.300960944365\t0.103153274186\t3650.15387542\t1289.67887266\t0.0894398710209\t0.0171663775915\n", "\n", "ALPHA= 1.2 i= 11\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (2.1) Social (2) I (2) Self (1.9) d=School (1.9) Pronoun (1.8) d=Social (1.7) d=I (1.7) You (1.6) Present (1.5)\n", "neg:d=Job (-0.8) d=Incl (-0.66) d=Preps (-0.57) Preps (-0.41) d=Achieve (-0.41) d=TV (-0.35) d=Music (-0.32) d=Senses (-0.3) d=Time (-0.29) d=E+ (-0.29)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (18) d=Self (17) d=Pronoun (14) d=Present (11) d=Relig (9.8) d=Metaph (9.6) d=Motion (9.4) d=Affect (7) d=Preps (6.9) d=Posemo (6.7)\n", "neg:Occup (-3.2) Incl (-3) Achieve (-2.4) Preps (-1.9) Time (-1.9) Job (-1.6) Inhib (-1.5) d=Cause (-1.5) Physcal (-1.4) d=Othref (-1.4)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (5.3) d=Article (2.7) d=Pronoun (2.5) d=Self (2.4) d=Incl (2.3) Preps (2.1) d=I (1.9) d=Cogmech (1.8) d=Affect (1.7) d=Time (1.7)\n", "neg:d=Sports (-1.8) Excl (-1.6) You (-1.6) Discrep (-1.6) d=School (-1.5) Tentat (-1.4) Motion (-1.4) Insight (-1.4) Past (-1.2) Future (-1.2)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.305281676627\t0.0993053470661\t3639.56337604\t1282.57070421\t0.0892133894468\t0.0171560906803\n", "\n", "accepting new alpha\n", "ALPHA= 1.1 i= 10\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (2.2) Social (2.1) I (2) Self (2) d=School (1.9) Pronoun (1.8) d=Social (1.7) d=I (1.7) You (1.6) Present (1.6)\n", "neg:d=Job (-0.86) d=Incl (-0.74) d=Preps (-0.66) Preps (-0.53) d=Achieve (-0.45) d=TV (-0.38) d=Music (-0.35) d=Senses (-0.33) d=Time (-0.32) d=Up (-0.32)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (19) d=Self (18) d=Pronoun (14) d=Present (12) d=Relig (10) d=Metaph (10) d=Motion (9.8) d=Affect (7.3) d=Posemo (7) d=Preps (7)\n", "neg:Occup (-3.5) Incl (-3.4) Achieve (-2.6) Preps (-2.4) Time (-2.2) Job (-1.7) Physcal (-1.6) d=Cause (-1.6) Inhib (-1.6) d=Othref (-1.6)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (5.6) d=Article (2.8) d=Pronoun (2.6) d=Self (2.4) d=Incl (2.4) Preps (2.2) d=I (2) d=Cogmech (1.9) d=Affect (1.8) d=Time (1.8)\n", "neg:d=Sports (-1.9) Excl (-1.8) You (-1.7) Discrep (-1.7) d=School (-1.6) Tentat (-1.5) Motion (-1.5) Insight (-1.5) Past (-1.3) Future (-1.3)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.309851061798\t0.0956972765867\t3629.30460562\t1275.08881906\t0.0889800093106\t0.017147438922\n", "\n", "accepting new alpha\n", "ALPHA= 1.0 i= 9\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (2.3) Social (2.2) I (2.1) d=School (2) Self (2) Pronoun (1.9) d=Social (1.8) d=I (1.7) You (1.7) Present (1.6)\n", "neg:d=Job (-0.94) d=Incl (-0.83) d=Preps (-0.78) Preps (-0.66) d=Achieve (-0.51) d=TV (-0.41) d=Senses (-0.38) d=Music (-0.37) d=Time (-0.36) d=Up (-0.36)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (20) d=Self (19) d=Pronoun (15) d=Present (12) d=Relig (11) d=Metaph (11) d=Motion (10) d=Affect (7.6) d=Posemo (7.4) d=Preps (7)\n", "neg:Incl (-3.8) Occup (-3.8) Preps (-2.9) Achieve (-2.8) Time (-2.4) Physcal (-1.8) d=Othref (-1.8) Job (-1.8) d=Cause (-1.8) Inhib (-1.7)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (5.9) d=Article (3) d=Pronoun (2.7) d=Incl (2.6) d=Self (2.6) Preps (2.4) d=I (2) d=Cogmech (2) d=Time (1.9) d=Affect (1.9)\n", "neg:d=Sports (-2.1) Excl (-1.9) You (-1.9) Discrep (-1.8) d=School (-1.8) Tentat (-1.6) Motion (-1.6) Insight (-1.6) Past (-1.4) Future (-1.4)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.314717619281\t0.0923836455669\t3619.49019503\t1267.1769492\t0.0887306931273\t0.0171332586801\n", "\n", "accepting new alpha\n", "ALPHA= 0.9 i= 8\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (2.4) Social (2.3) I (2.2) d=School (2.1) Self (2.1) Pronoun (1.9) d=Social (1.8) You (1.8) d=I (1.8) d=Sports (1.6)\n", "neg:d=Job (-1) d=Incl (-0.94) d=Preps (-0.91) Preps (-0.82) d=Achieve (-0.57) d=TV (-0.44) d=Senses (-0.43) d=Up (-0.42) d=Time (-0.41) d=Music (-0.4)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (21) d=Self (20) d=Pronoun (15) d=Present (13) d=Relig (12) d=Metaph (12) d=Motion (11) d=Affect (8) d=Posemo (7.8) d=R+ (7.1)\n", "neg:Incl (-4.2) Occup (-4.1) Preps (-3.5) Achieve (-3) Time (-2.8) d=Othref (-2.1) Physcal (-2.1) d=Cause (-2) Job (-1.9) Inhib (-1.8)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (6.3) d=Article (3.2) d=Pronoun (2.8) d=Incl (2.7) d=Self (2.7) Preps (2.6) d=I (2.1) d=Cogmech (2.1) d=Time (2.1) d=Affect (2)\n", "neg:d=Sports (-2.3) Excl (-2) You (-2) d=School (-2) Discrep (-1.9) Tentat (-1.8) Motion (-1.7) Insight (-1.7) Past (-1.6) d=Relig (-1.5)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.319945488704\t0.0894377413522\t3610.26766628\t1258.76300637\t0.0884664963472\t0.0171154151644\n", "\n", "accepting new alpha\n", "ALPHA= 0.8 i= 7\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (2.6) Social (2.4) I (2.2) d=School (2.2) Self (2.2) Pronoun (2) You (2) d=Social (1.9) d=I (1.9) d=Sports (1.7)\n", "neg:d=Job (-1.1) d=Preps (-1.1) d=Incl (-1.1) Preps (-1) d=Achieve (-0.65) d=Senses (-0.49) d=Up (-0.48) d=TV (-0.48) d=Time (-0.47) P+ (-0.44)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (22) d=Self (21) d=Pronoun (16) d=Present (13) d=Relig (13) d=Metaph (12) d=Motion (11) d=Affect (8.4) d=Posemo (8.2) d=R+ (7.6)\n", "neg:Incl (-4.8) Occup (-4.5) Preps (-4.3) Achieve (-3.3) Time (-3.1) d=Othref (-2.5) Physcal (-2.4) d=Cause (-2.3) Job (-2.1) Present (-2.1)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (6.8) d=Article (3.4) d=Pronoun (3) d=Incl (2.9) d=Self (2.8) Preps (2.8) d=Time (2.3) d=Cogmech (2.2) d=I (2.2) Article (2.2)\n", "neg:d=Sports (-2.5) Excl (-2.2) d=School (-2.2) You (-2.1) Discrep (-2.1) Tentat (-1.9) Motion (-1.9) Insight (-1.9) Past (-1.7) d=Relig (-1.7)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.325621750952\t0.0869604500546\t3601.83576381\t1249.75233025\t0.0881856864126\t0.017087287212\n", "\n", "accepting new alpha\n", "ALPHA= 0.7 i= 6\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (2.8) Social (2.6) I (2.3) d=School (2.3) Self (2.3) You (2.1) Pronoun (2) d=Social (2) d=I (2) d=Sports (1.8)\n", "neg:Preps (-1.3) d=Preps (-1.3) d=Job (-1.2) d=Incl (-1.2) d=Achieve (-0.75) d=Senses (-0.58) d=Up (-0.57) d=Time (-0.53) d=TV (-0.53) P+ (-0.52)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (23) d=Self (22) d=Pronoun (17) d=Relig (14) d=Present (14) d=Metaph (13) d=Motion (12) d=Affect (8.9) d=Posemo (8.8) d=R+ (8)\n", "neg:Incl (-5.4) Preps (-5.2) Occup (-4.9) Achieve (-3.7) Time (-3.6) d=Othref (-2.9) Physcal (-2.8) Present (-2.7) d=Cause (-2.6) Job (-2.3)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (7.4) d=Article (3.7) d=Pronoun (3.2) d=Incl (3) Preps (3) d=Self (2.9) d=Time (2.5) Article (2.4) d=Cogmech (2.4) d=Affect (2.3)\n", "neg:d=Sports (-2.8) d=School (-2.5) Excl (-2.5) You (-2.3) Discrep (-2.2) Tentat (-2.1) Insight (-2.1) Motion (-2.1) d=Relig (-1.9) d=Metaph (-1.9)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.331868437732\t0.08509525174\t3594.4719712\t1240.01696816\t0.0878843485626\t0.0170584288631\n", "\n", "accepting new alpha\n", "ALPHA= 0.6 i= 5\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (3) Social (2.8) d=School (2.5) I (2.5) Self (2.4) You (2.3) Pronoun (2.1) d=Social (2.1) d=I (2.1) Negate (1.8)\n", "neg:Preps (-1.6) d=Preps (-1.5) d=Incl (-1.4) d=Job (-1.4) d=Achieve (-0.87) d=Senses (-0.68) d=Up (-0.67) Article (-0.64) P+ (-0.62) d=Time (-0.62)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (25) d=Self (24) d=Pronoun (18) d=Relig (15) d=Metaph (15) d=Present (14) d=Motion (12) d=Affect (9.5) d=Posemo (9.4) d=Home (8.8)\n", "neg:Preps (-6.3) Incl (-6.3) Occup (-5.5) Achieve (-4.1) Time (-4.1) d=Othref (-3.5) Present (-3.5) Physcal (-3.3) d=Cause (-3.1) Cogmech (-2.9)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (8) d=Article (4) d=Pronoun (3.4) Preps (3.3) d=Incl (3.2) d=Self (3.1) Article (2.8) d=Time (2.7) d=Cogmech (2.6) d=Affect (2.5)\n", "neg:d=Sports (-3.2) d=School (-2.8) Excl (-2.7) You (-2.5) Discrep (-2.5) Insight (-2.3) Tentat (-2.3) Motion (-2.3) d=Relig (-2.3) d=Metaph (-2.2)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.338863186845\t0.0840557112805\t3588.58172653\t1229.37809376\t0.0875584266482\t0.0170223398469\n", "\n", "accepting new alpha\n", "ALPHA= 0.5 i= 4\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (3.3) Social (3) d=School (2.7) I (2.6) Self (2.5) You (2.5) d=Social (2.2) Pronoun (2.2) d=I (2.2) Negate (2.1)\n", "neg:Preps (-2) d=Preps (-1.8) d=Incl (-1.6) d=Job (-1.6) d=Achieve (-1) d=Senses (-0.82) d=Up (-0.81) Article (-0.79) P+ (-0.76) d=Time (-0.73)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (27) d=Self (25) d=Pronoun (19) d=Relig (17) d=Metaph (16) d=Present (15) d=Motion (13) d=Affect (10) d=Posemo (10) Negate (10)\n", "neg:Preps (-7.7) Incl (-7.3) Occup (-6.2) Time (-4.7) Achieve (-4.7) Present (-4.4) d=Othref (-4.3) Physcal (-3.9) Cogmech (-3.8) d=Cause (-3.7)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (8.9) d=Article (4.3) Preps (3.7) d=Pronoun (3.6) d=Incl (3.4) d=Self (3.3) Article (3.2) d=Time (3) d=Cogmech (2.8) d=Affect (2.7)\n", "neg:d=Sports (-3.6) d=School (-3.2) Excl (-3.1) You (-2.7) Discrep (-2.7) d=Relig (-2.7) d=Metaph (-2.6) Insight (-2.6) Motion (-2.5) Tentat (-2.5)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.346876841528\t0.0801537863633\t3584.79329516\t1217.57643202\t0.0871872298688\t0.016965148548\n", "\n", "accepting new alpha\n", "ALPHA= 0.4 i= 3\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (3.7) Social (3.4) d=School (2.9) You (2.8) I (2.8) Self (2.7) d=Social (2.4) Negate (2.4) d=I (2.3) Pronoun (2.3)\n", "neg:Preps (-2.6) d=Preps (-2.1) d=Incl (-1.9) d=Job (-1.9) d=Achieve (-1.3) d=Up (-1) d=Senses (-1) Article (-0.99) P+ (-0.97) d=Time (-0.87)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (29) d=Self (27) d=Pronoun (20) d=Relig (19) d=Metaph (19) d=Present (16) d=Motion (14) Negate (12) d=Home (12) d=Posemo (11)\n", "neg:Preps (-9.5) Incl (-8.6) Occup (-7) Present (-5.7) Time (-5.5) Achieve (-5.4) d=Othref (-5.3) Cogmech (-5) Physcal (-4.7) d=Cause (-4.5)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (9.9) d=Article (4.8) Preps (4.2) d=Pronoun (3.9) Article (3.8) d=Incl (3.6) d=Self (3.5) d=Time (3.5) d=Cogmech (3.1) d=Affect (2.9)\n", "neg:d=Sports (-4.3) d=School (-3.8) Excl (-3.5) d=Relig (-3.3) d=Metaph (-3.3) You (-3.1) Discrep (-3) Insight (-3) Motion (-2.9) Tentat (-2.9)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.356346887614\t0.0748736013706\t3584.15995138\t1204.22266845\t0.086744010756\t0.0168819372168\n", "\n", "accepting new alpha\n", "ALPHA= 0.3 i= 2\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (4.3) Social (3.9) You (3.3) d=School (3.2) I (3) Self (3) Negate (2.9) d=Social (2.7) d=I (2.5) Pronoun (2.4)\n", "neg:Preps (-3.4) d=Preps (-2.5) d=Incl (-2.4) d=Job (-2.2) d=Achieve (-1.6) d=Motion (-1.4) d=Up (-1.3) d=Senses (-1.3) P+ (-1.3) Article (-1.3)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (32) d=Self (30) d=Relig (22) d=Metaph (22) d=Pronoun (21) d=Present (17) Negate (15) d=Motion (14) d=Home (14) d=Posemo (13)\n", "neg:Preps (-12) Incl (-10) Occup (-8.3) Present (-7.5) d=Othref (-6.9) Cogmech (-6.9) Time (-6.6) Achieve (-6.5) Physcal (-5.9) d=Cogmech (-5.9)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (11) d=Article (5.4) Preps (4.8) Article (4.6) d=Pronoun (4.2) d=Time (4.1) d=Incl (3.8) d=Self (3.8) d=Cogmech (3.4) Pronoun (3.4)\n", "neg:d=Sports (-5.1) d=School (-4.6) d=Relig (-4.2) Excl (-4.2) d=Metaph (-4.2) Insight (-3.5) Discrep (-3.5) You (-3.4) Motion (-3.4) Tentat (-3.3)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.368034859058\t0.0713672510742\t3588.65918635\t1188.7248746\t0.0862249469647\t0.0167315364176\n", "\n", "accepting new alpha\n", "ALPHA= 0.2 i= 1\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (5.3) Social (4.7) You (4) d=School (3.8) Negate (3.7) Self (3.4) I (3.3) d=Posfeel (3.3) d=Social (3.2) d=Relig (2.8)\n", "neg:Preps (-4.8) d=Preps (-3) d=Incl (-3) d=Job (-2.9) d=Motion (-2.6) d=Achieve (-2.3) P+ (-1.9) d=Senses (-1.8) d=Up (-1.8) Article (-1.6)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (35) d=Self (33) d=Relig (27) d=Metaph (26) d=Pronoun (23) Negate (20) d=Present (19) d=Home (19) d=Posemo (16) d=Affect (16)\n", "neg:Preps (-16) Incl (-13) Occup (-10) Cogmech (-10) Present (-10) d=Cogmech (-9.8) d=Othref (-9.5) Achieve (-8.3) d=Cause (-8.2) Time (-8.1)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (13) d=Article (6.1) Article (6.1) Preps (5.7) d=Time (5) d=Pronoun (4.7) Pronoun (4.5) d=Self (4.2) d=Music (4.1) d=Up (4)\n", "neg:d=Sports (-6.5) d=School (-5.9) d=Relig (-5.8) d=Metaph (-5.7) Excl (-5.4) Insight (-4.4) Motion (-4.1) Discrep (-4) Tentat (-4) You (-4)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.383413322143\t0.0716615962788\t3602.77079661\t1170.2902801\t0.0855592313586\t0.0164657780642\n", "\n", "accepting new alpha\n", "ALPHA= 0.1 i= 0\n", "% Obese" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:Othref (7.5) Social (6.8) d=Posfeel (5.4) Negate (5.4) You (5.3) d=School (5) d=Social (4.4) Self (4.2) d=You (4.1) d=Posemo (4)\n", "neg:Preps (-7.5) d=Motion (-6.4) d=Job (-4.1) d=Incl (-4) d=Achieve (-3.9) P+ (-3.7) d=Preps (-3.5) Posemo (-3.3) d=Senses (-3.2) d=Up (-3)\n", "Teen Birth Rate" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=I (38) d=Relig (37) d=Self (36) d=Metaph (35) Negate (32) d=Home (29) d=Pronoun (24) d=Affect (22) d=Posemo (22) d=Present (22)\n", "neg:Preps (-21) d=Cogmech (-19) Cogmech (-18) Incl (-17) Occup (-15) Present (-15) d=Othref (-14) d=Cause (-14) d=Senses (-14) d=Social (-14)\n", "% No Social-Emotional Support" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " features:\n", "pos:d=Preps (17) Article (9) d=Article (7.2) Preps (6.8) d=Time (6.7) Pronoun (6.7) Self (6.2) I (5.8) d=Up (5.6) d=Home (5.6)\n", "neg:d=Relig (-9.1) d=Metaph (-9) d=Sports (-9) d=School (-8.1) Excl (-8) Insight (-6) Achieve (-5.6) Motion (-5.6) Tentat (-5.2) You (-4.9)\n", "correl\tcorrel_a\tmse_m\tmse_std\tsmape_m\tsmape_std\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "0.405863005572\t0.0551069655178\t3641.86245907\t1149.2435922\t0.0846598559351\t0.015804393834\n", "\n", "accepting new alpha\n", "stopping.\n", "(0.1, 0.084659855935110925)\n" ] } ], "prompt_number": 153 }, { "cell_type": "code", "collapsed": false, "input": [ "smape alpha use_gender use_race use_og\n", ".0969 .3 t t t\n", ".0973 .4 f t t\n", ".1002 .4 f t f\n", ".0934 .2 t f t\n", ".0938 .2 t f f" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "import expt\n", "import texify_results\n", "def pct_impr(old, new):\n", " return 100. * (old - new) / old\n", "\n", "improvements = []\n", "impr_err = []\n", "target_pr = []\n", "for target, gender_r, og_r in sorted(zip(targets, gender_results, og_results),\n", " key=lambda x:np.mean(pct_impr(x[2], x[1]))):\n", " if target not in ['Female', 'Afro-hispanic', '< 18', '65 and over', 'med_income']:\n", " imprs = pct_impr(og_r, gender_r)\n", " print texify_results.label_map[expt.fmt_target(target)], ',', np.mean(imprs), ',', np.std(imprs), ',', np.mean(og_r), np.mean(gender_r)\n", " improvements.append(np.mean(imprs))\n", " impr_err.append(np.std(imprs) / sqrt(len(imprs)) / 2)\n", " target_pr.append(target)\n", " \n", "y_pos = np.arange(len(target_pr))\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "ax.tick_params(axis='both', labelsize='8')\n", "plt.barh(y_pos, improvements, xerr=impr_err, align='center', alpha=0.8)\n", "plt.yticks(y_pos, target_pr)\n", "plt.xlabel('% SMAPE improvement')\n", "plt.savefig('reweight.pdf', bbox_inches='tight')\n", "print 'mean improvement=', np.mean(improvements)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Limited Healthy Food , -6.26279572115 , 6.93896446375 , 0.214646412436 0.226660249318\n", "Mentally Unhealthy , -2.08727121601 , 5.68961384446 , 0.0580400336468 0.0594413361465\n", "Fast Food , -1.81737974757 , 12.922370719 , 0.0435062579698 0.042696507462\n", "HS Grad Rate , -1.50370699275 , 10.1212643892 , 0.0494309003943 0.0496813996087\n", "Ambulatory Care , -1.20239435188 , 7.06271106102 , 0.092579423776 0.0935698241963\n", "Diabetes , 0.00792246146076 , 5.86056128401 , 0.0140222322401 0.0140941136597\n", "Smokers , 0.039391319165 , 3.52615899627 , 0.088470914613 0.088462521781\n", "Inactivity , 1.06660491389 , 9.2598487747 , 0.0762597405436 0.0750767465762\n", "Obesity , 1.41736608513 , 8.83139016646 , 0.0615182155071 0.0599816194404\n", "Unhealthy Days , 1.57933731872 , 7.85652812864 , 0.0596104137037 0.0589839787721\n", "Unemployment , 1.65451596891 , 4.05028841082 , 0.0987429762632 0.0969544778624\n", "Violent Crime , 1.68805845014 , 7.75576279914 , 0.193001841866 0.18729774036\n", "Primary Care , 3.71832686037 , 3.73799012902 , 0.115055082879 0.11074972733\n", "Dentist Access , 4.47868457842 , 4.46103922432 , 0.099925851381 0.0954952799169\n", "Vehicle Mortality , 5.34952762684 , 4.31578010832 , 0.130339067332 0.123610982561\n", "Drinking , 5.38334259047 , 6.95457134261 , 0.0547361201709 0.0518692878232\n", "Mammography , 6.42192674886 , 4.76670420921 , 0.030333243509 0.0283411792913\n", "Rec Facilities , 7.76448617285 , 4.97222874805 , 0.145277692888 0.134613345379\n", "Chlamydia , 7.80493552958 , 5.00276863781 , 0.195793207447 0.179428079436\n", "Poor Health , 7.85704314545 , 3.47779478975 , 0.0886478321782 0.0814051135286\n", "Child Poverty , 7.97424929683 , 10.055518589 , 0.142176729761 0.131564642329\n", "Teen Births , 9.24079506023 , 10.656015431 , 0.153350168343 0.139505892289\n", "Low Birth Weight , 9.34022580426 , 8.63520070302 , 0.0550947681135 0.0505328749649\n", "Single Parent , 9.5974883603 , 4.03828953063 , 0.105568591986 0.0949545712506\n", "College , 11.522968503 , 4.35019460909 , 0.0496563987303 0.0436829074588\n", "No Insurance , 11.6452729405 , 6.54422839575 , 0.110324377552 0.0978085532269\n", "No socio-emotional support , 13.3285569481 , 10.642594913 , 0.0661920354153 0.0572465090837\n", "mean improvement=" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 4.29657328348\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nuBYAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 158 }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline --no-import-all\n", "\n", "import spatial\n", "# Plot discrepancy between estimated %female and census\n", "# Print gender by county.\n", "targets, target_alpha = expt.read_targets('/data/twcounty/targets.tsv', county2gender.keys())\n", "female_idx = target_alpha.index('Female')\n", "female_true = dict((fips, target[female_idx]) for fips, target in targets.iteritems())\n", "female_pred = dict((fips, 100. * v['f'] / (v['m'] + v['f'])) for fips, v in county2gender.iteritems())\n", "\n", "coords = expt.read_coords('/data/twcounty/stats2/counties/counties.top100.bounding.txt')\n", "\n", "truths = []\n", "errs = []\n", "preds = []\n", "coords_fips = []\n", "for fips, f_true in sorted(female_true.items(), key=lambda x: x[1]):\n", " truths.append(f_true)\n", " errs.append(female_pred[fips] - f_true)\n", " preds.append(female_pred[fips])\n", " coords_fips = coords[fips]\n", "\n", "# Plot truth vs error.\n", "scatter(truths, errs)\n", "axhline(y=0)\n", "xlabel(\"% Female (truth)\")\n", "ylabel(\"Error (Predicted - Truth)\")\n", "\n", "# Plot truth vs predicted.\n", "figure()\n", "scatter(truths,preds)\n", "ylabel(\"% Female (predicted)\", size=18)\n", "xlabel(\"% Female (truth)\", size=18)\n", "title('r=%.2f' % pearsonr(truths, preds)[0], size=18)\n", "plt.savefig('gender-scatter.pdf', bbox_inches='tight')\n", "\n", "from scipy.stats import pearsonr\n", "print 'correlation is', pearsonr(truths, preds)\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n", "correlation is" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " (0.022023865153150676, 0.82782176638194449)\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 182 }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline --no-import-all\n", "from scipy.stats import pearsonr\n", "import spatial\n", "# Plot discrepancy between estimated race and census\n", "targets, target_alpha = expt.read_targets('/data/twcounty/targets.tsv', county2race.keys())\n", "race_idx = target_alpha.index('Afro-hispanic')\n", "race_true = dict((fips, target[race_idx]) for fips, target in targets.iteritems())\n", "race_pred = dict((fips, 100. * (v['black'] + v['latin']) / (v['black'] + v['latin'] + v['white'])) for fips, v in county2race.iteritems())\n", "\n", "coords = expt.read_coords('/data/twcounty/stats2/counties/counties.top100.bounding.txt')\n", "\n", "truths = []\n", "errs = []\n", "preds = []\n", "coords_fips = []\n", "for fips, f_true in sorted(race_true.items(), key=lambda x: x[1]):\n", " if race_pred[fips] > 70:\n", " print fips, f_true, race_pred[fips], county2race[fips]\n", " else:\n", " truths.append(f_true)\n", " errs.append(race_pred[fips] - f_true)\n", " preds.append(race_pred[fips])\n", " coords_fips = coords[fips]\n", "\n", "# Plot truth vs error.\n", "scatter(truths, errs)\n", "axhline(y=0)\n", "xlabel(\"% Afro-hispanic (truth)\")\n", "ylabel(\"Error (Predicted - Truth)\")\n", "\n", "# Plot truth vs predicted.\n", "figure()\n", "scatter(truths,preds)\n", "ylabel(\"% Afro-hispanic (predicted)\", size='18')\n", "xlabel(\"% Afro-hispanic(truth)\", size='18')\n", "title('r=%.2f' % pearsonr(truths, preds)[0], size=18)\n", "plt.savefig('race-scatter.pdf', bbox_inches='tight')\n", "\n", "print 'correlation is', pearsonr(truths, preds)" ], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }