{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#CBA Classification Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Motivation/Background\n", "\n", "The game of basketball is growing in popularity around the world, and China is a main driver in that. In fact, they have two professional leagues, a major and a minor that employ about 400 total players. Their main, major league is the Chinese Basketball Association (CBA), which is currently comprised of 18 teams, a number that has been growing in recent years to accomodate the surge in demand.\n", "\n", "This league is becoming increasingly relevant to the overall development of global talent, as players from the United States are now going over and taking advantage of the opportunities for playing time and earning power. With more and more talented, foreign players combining with the improving domestic scene, the CBA is primed for a significant increase in business/revenue as talent attracts spending and spectators. Additionally, the CBA's lack of a players' salary cap further magnifies the earning potential for its players, allowing the consumer market to fully dictate players' value.\n", "\n", "With this growing collection of quality players, I believe it's important to analyze and better understand this league to identify those who could potentially be valuable in the NBA." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Import and process data\n", "\n", "Import data, try to classify players as foreign or domestic based on attributes/on-court performance \n", "Y = pop off ['nationality'] \n", "X = everything other than ['sys_id', 'season', 'player', 'team', 'birth_city', 'draft_status'] from info \n", "\n", "Keep all calculated columns for now, address during feature selection \n", "Classification -- kfolds cross validate modeling with logistic regression, random forest, SVC, adaboost, gradientboost \n", "Clustering -- knn \n", "\n", "Build ROC curve \n", "\n", "Preliminary dimensions: \n", "stats.shape = 774 x 64 \n", "stats_final.shape = 708 x 64 \n", "\n", "\n", "Found data integrity issues:\n", "\n", "1. 'Wei Liu' player_season_advanced, player_season_misc -- FIXED, dropped inconsistencies\n", "2. Issues from player_season_info -- FIXED, updated \n", " \"Xiaowei Zhang\",\"2012\" -- traded b/w SDS & GFD \n", " \"Tal Co\",\"2012\" -- absent \n", " \"YoBo Xia\",\"2012\" -- absent \n", " \"Mike Efevberha\",\"2014\" -- absent \n", " \"Jerel McNeal\",\"2014\" -- listed under wrong team \n", "3. Missing ht/wt \n", "4. 33 players missing nationality from 2014 -- FIXED, dropped " ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "import sqlite3 as sql" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "db_read = 'data/cba.sqlite'" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "sql_query = '''SELECT tot.*, adv.*, misc.*, info.ht, info.wt, info.nationality\n", "FROM team_info_realgm tinfo\n", "JOIN player_season_totals tot\n", "ON tinfo.team_id = tot.team\n", "JOIN player_season_advanced adv\n", "ON tot.player = adv.player AND tot.season = adv.season AND tinfo.team_id = adv.team\n", "JOIN player_season_misc misc\n", "ON tot.player = misc.player AND tot.season = misc.season AND tinfo.team_id = misc.team\n", "JOIN player_season_info info\n", "ON tot.player = info.player AND tot.season = info.season AND tinfo.team = info.team'''\n", "\n", "with sql.connect(db_read) as con:\n", " df = pd.read_sql(sql_query, con)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "stats = df.T.drop_duplicates().T" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "stats.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "(774, 64)" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "cols_retained = stats.columns - ['sys_id', 'season', 'player', 'team', 'birth_city', 'draft_status']\n", "stats = stats[cols_retained]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Convert ht to inches" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ht_inches = []\n", "for height in stats['ht']:\n", " h = height.split('-')\n", " if h[0] and h[1]:\n", " ht = 12.0 * float(h[0]) + 1.0 * float(h[1])\n", " ht_inches.append(ht)\n", " else:\n", " ht_inches.append('')\n", "stats['ht'] = ht_inches" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "stats = stats.convert_objects(convert_numeric=True)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Process missing 'wt' & 'ht'" ] }, { "cell_type": "code", "collapsed": false, "input": [ "stats = stats.fillna(stats.mean()[['ht' , 'wt']])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "# [(type(stats[col]), col) for col in stats.columns]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "# [(stats[col].dtype, col) for col in stats.columns]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "# [(stats[col].isnull().sum(), col) for col in stats.columns]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "stats.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "(774, 60)" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Process 'nationality' column" ] }, { "cell_type": "code", "collapsed": false, "input": [ "stats['nationality'].value_counts()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "China 573\n", "United States 126\n", "- 33\n", "Taiwan 13\n", "Jordan 7\n", "Syria 3\n", "Puerto Rico 3\n", "Iran 3\n", "Palestine 2\n", "Ivory Coast 2\n", "Democratic Republic of the Congo 2\n", "Netherlands 1\n", "Lebanon 1\n", "Senegal 1\n", "Australia 1\n", "Nigeria 1\n", "France 1\n", "Panama 1\n", "dtype: int64" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "stats['nationality'] = stats['nationality'].replace(to_replace='-', value=np.nan)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "stats = stats.dropna(subset=['nationality'])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "#domestic for China, Taiwan, Hong Kong, non-domestic for anything else\n", "#1 for domestic, 0 for foreign\n", "stats['domestic'] = stats['nationality'].apply(lambda x: 1 if x in ['China', 'Taiwan', 'Hong Kong'] else 0)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "stats['nationality_class'] = stats['nationality'].apply(lambda x: x if x in ['China', 'United States'] else \"Other\")" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "stats['nationality_class'].value_counts()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "China 573\n", "United States 126\n", "Other 42\n", "dtype: int64" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####stats with no pos column -- Currently not used" ] }, { "cell_type": "code", "collapsed": false, "input": [ "stats_nopos = stats.drop(['pos'], axis=1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "stats_nopos = stats_nopos.dropna()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####stats dropping the records with NaN values" ] }, { "cell_type": "code", "collapsed": false, "input": [ "stats.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "(741, 62)" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "stats = stats.dropna()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Process/binarize positional values" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pos_binarized = pd.get_dummies(stats['pos'], prefix='pos')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "stats_final = pd.concat([stats, pos_binarized], axis=1).drop(['pos'], axis=1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Feature Selection\n", "Reduce collinearity, this is essential for logistic regression. \n", "PCA -- Downside is that it removes all interpretability of original features " ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.preprocessing import StandardScaler\n", "from sklearn.decomposition import PCA" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "y_nat = stats_final.pop('nationality').values\n", "y_nat_class = stats_final.pop('nationality_class').values\n", "y_dom = stats_final.pop('domestic').values\n", "x = stats_final.values" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "y_nat = y_nat.astype(str)\n", "y_nat_class = y_nat_class.astype(str)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "feature_names = stats_final.columns.values" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "scaler = StandardScaler()\n", "x_scaled = scaler.fit_transform(x)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "def show_exp_var(decomper, data):\n", " var_exp = []\n", " for n in xrange(1, 63+1):\n", " dc = decomper(n_components=n)\n", " dc.fit(data)\n", " var_exp.append(dc.explained_variance_.sum())\n", " plt.figure(figsize=(16,10))\n", " plt.grid(b=True, which='major', color='black', linestyle='-')\n", " plt.plot(np.array(var_exp))\n", " plt.tight_layout()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "show_exp_var(PCA, x_scaled)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAABHgAAALKCAYAAABJIOYHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XuYlWWhPuBnAZ7PuFFom42ZlAc01DR3GZjCNtuYpGlp\nSR4qs52ZFpbbcjpYmLat3JX+SCmpPGSWxyxRhzQzNUTNRG0H7lQkE1EUFYH1++MLATkNMDPvrFn3\nfV3ftda31mJ4hl6TeXwPtXq9Xg8AAAAADatX6QAAAAAArBkFDwAAAECDU/AAAAAANDgFDwAAAECD\nU/AAAAAANDgFDwAAAECDa1fBM2vWrBxyyCHZfvvts8MOO+T2229Pa2trttpqqwwePDiDBw/O9ddf\n39lZAQAAAFiGWr1er6/sQ6NGjcqQIUNy9NFHZ968eXn++efzrW99KxtttFFOOumkrsgJAAAAwHL0\nWdkHnnnmmdxyyy350Y9+VP2CPn2yySabJEna0Q0BAAAA0MlWukRr6tSp6devX4466qjsuuuu+chH\nPpI5c+YkSc4999zssssuOeaYYzJr1qxODwsAAADA0lZa8MybNy+TJk3K8ccfn0mTJmWDDTbImDFj\ncvzxx2fq1KmZPHlyBgwYkJNPPrkr8gIAAADwKitdorXVVltlq622ylve8pYkySGHHJIxY8akX79+\nr3zm2GOPzYgRI5b6tRtvvHFmz57dgXEBAAAAer5tt902f/nLX9r9+ZUWPP37989rX/vaPPTQQxk4\ncGAmTJiQHXfcMU888UT69++fJPnFL36RQYMGLfVrZ8+ebZ8eutzQoUPT1tZWOgZNyNijBOOOUow9\nSjDuKMG4o5RarbZKn19pwZNUe+0cccQRmTt3brbddttceOGFOeGEEzJ58uTUarVss802Of/881cr\nMAAAAABrpl0Fzy677JI777xzidcuuuiiTgkEAAAAwKpZ6SbL0GhaWlpKR6BJGXuUYNxRirFHCcYd\nJRh3NAoFDz2O/wOmFGOPEow7SjH2KMG4owTjjkah4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAA\ngAan4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAAgAan4AEAAABocAoe\nAAAAgAan4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAAgAan4AEAAABo\ncAoeAAAAgAan4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAAgAan4AEA\nAABocAoeAAAAgAan4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAAgAan\n4AEAAABocAoeAAAAgAan4AEAAABocAoeAAAAgAbXp3QAAACgedTri64FC5a8Xv3aq+9nz04efXTJ\nX//qr7ei+3p9UYbF8yzvteW9v7zvi57psceSO+8s9/tvtlnyhjeU+/1pHAoeAABYQ/V6Mm9eMndu\ndb300qLnr37t5Zerzy68Xn2/rNdefT9//sofl/fewrJk/vzVf74m18IipFevJa9abeX3zz2XXHLJ\novdqtUXXyu4XvrZQrbb082W9trz3l2Vl79OYHnssmTy53O//zncmZ55Z7vencSh4AABoWPPmJS+8\nkLz4YvW4+PMVPS4sW156afnX8t5fVmkzd27Sp0+y9tqLrnXWWfJ+4bXWWtXVp8+S16tfW9Zn+vRJ\n1luveuzde+nHZb22rM8sLE1W9fmy7lflWrx4WR2trdUFXcm4o1EoeAAA6HD1elV+PP98dc2Zs+j5\nwvtXX8t7fVnvLSxr6vWq8FhvvWTdddv/uLB82Wij5F/+pbp/9bWwpFnee6++Fp8dAgBdTcEDANDE\nFixYVLo899yyr2W9d/vtyd13L13aLH7fp0+y/vrJBhsseS18bf31l3y+wQZJv35Lv76sa2FRs9Za\npf8EAaB7UPAAADSger2axfLMM0tes2Yt/dqy3ltY1LzwQlWYbLhhdW2wwaLny7pe+9rqM089lRx5\n5JLlzKtLHOULAHQdBQ8AQCHz51dly9NPV+XL008v+XxFr82aVe1jsskm1bXppoueL361tCz7vY02\nqgqb9ddfvaVF06cnBx3U4X8kAMBqUvAAAKyBer1amjRzZlW8zJy56Fr8flnvPfdcVbRstll1bbrp\nko+bbZb8678u/dqmm1bXuuuW/u4BgO5CwQMAsJgXXkiefDL5xz+WfHz1a//4x6LSplevpG/fRddm\nmy15v/XWS7+32WbJxhtXJxIBAKwpBQ8A0KPNm1eVMk88kcyYUV0Lny+rvJk3r9rot1+/6nSlxR/f\n/OZF95tvXl2bbVZt+AsAUJKCBwBoOPPnV4XM4mXN8h6ffrqaMdO/f7LlloseX/OaZJddli5yNtyw\n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\noOdS8AA9Rr2eTJhQFTszZy4qdpyKBQAA9HQKHqBHaGtLTjsteeqp5ItfTA49VLEDAAA0DwUP0ND+\n9KfklFOSKVOSL385ef/7FTsAAEDzsSMF0JAefTQ55phk332Tf//35IEHkiOOUO4AAADNScEDNJRn\nnklOPTXZZZdkyy2Thx5KTjghWXvt0skAAADKUfAADWHu3OQ730kGDkyeeCK5557ka19LNtmkdDIA\nAIDy7MEDdGv1enLZZdWsnTe9qTola9Cg0qkAAAC6FwUP0G21tSWjRycLFiRjxybvfGfpRAAAAN2T\nggfodu6/vzoZ689/Ts44IznssKSXBaUAAADL5UcmoNt47LHk2GOTffZJ9tuvOhnrAx9Q7gAAAKyM\nH5uA4ubMSU4/Pdl55+Rf/qU6GevEE5N11imdDAAAoDFYogUUU68nP/tZ8tnPJnvtldx9d7L11qVT\nAQAANB4FD1DEPfckn/pUMmtWMn588o53lE4EAADQuCzRArrUU08lxx+fDB+evP/9yR//qNwBAABY\nUwoeoEvMm5d897vJ9tsnvXtXGygfd1z1HAAAgDVjiRbQ6drakhNOqDZQvvHGZNCg0okAAAB6FgUP\n0GkeeST5zGeSO+9Mzj47OfjgpFYrnQoAAKDnsUQL6HBz5iStrcmuuyY77ZT8+c/JIYcodwAAADqL\nGTxAh6nXk8svr44932OPZNKk5HWvK50KAACg51PwAB3iT39KPvnJ6pSsH/4wGTq0dCIAAIDmYYkW\nsEaefTY5+eTkne+slmFNmqTcAQAA6GoKHmC11OvJxRdXx54//XQ1g+cTn0j6mBcIAADQ5fwoBqyy\nP/85+c//TGbOTH72s+Tf/q10IgAAgOZmBg/Qbs89l4wenQwZkowcmdx1l3IHAACgO1DwACtVryeX\nXVYtx5oxY9GGypZjAQAAdA9+PANWaMqUqsyZMSP56U+TvfcunQgAAIBXM4MHWKbnn08+//nk7W9P\n3v3u6nQs5Q4AAED3pOABllCvJz//ebUc629/S+67LznxRMuxAAAAurN2/cjW0tKSjTfeOL17985a\na62VO+64I62trfnBD36Qfv36JUm+/vWvZ//99+/UsEDnevjhajnWo48m48dXmykDAADQ/bWr4KnV\namlra0vfvn2XeO2kk07KSSed1GnhgK7x0kvJ17+e/M//VMuyTjghWWut0qkAAABor3YvuqjX6+16\n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\nfn1+//vf59FHH83OnTuH+xhIktxxxx1Zv379255btWpVFi1alF27dmXhwoV2QzHsxo4dm9WrV+eV\nV17J888/n4ceeig7d+7Ue9TUuHHjsmHDhnR0dOSll17Khg0bsnnzZn1H3axZsyazZ8/uv7Kv96i1\nSqWSjRs3ZseOHdm6dWsSfUd9fOUrX8knP/nJ7Ny5My+99FIuuugivUdNfehDH8qOHTuyY8eObNu2\nLePHj88tt9wy5L4b9oBn69atueCCC9LS0pKxY8fmc5/7XH7+858P9zGQJPnoRz+ayZMnv+25devW\npb29PUnS3t6eJ554oojSGMGam5vT2tqaJJkwYUJmzZqVPXv26D1qbvz48UmSo0ePpqenJ5MnT9Z3\n1MVrr72WX/3qV7nrrrvy1u1+vUc9/O9tEvqOWnv99dfz7LPP5s4770ySnH766Zk4caLeo26efvrp\nXHDBBZk+ffqQ+27YA549e/Zk+vTp/Y+nTZuWPXv2DPcx8I7279+fpqamJElTU1P2799fcEWMZNVq\nNTt27Mj8+fP1HjXX29ub1tbWNDU19V8T1HfUw1e/+tV873vfy5gxf/9fR71HrVUqlXz84x/PZZdd\nlh/84AdJ9B2119nZmXPOOSd33HFHPvzhD+eLX/xiDh8+rPeom8ceeyy33357kqH/zhv2gOetsV1o\nBJVKRU9SM4cOHcqSJUuyZs2anHHGGW97Te9RC2PGjElHR0dee+21PPPMM9mwYcPbXtd31MIvf/nL\nTJkyJW1tbSdMU7xF71ELzz33XHbs2JEnn3wyDz30UJ599tm3va7vqIXjx49n+/bt+dKXvpTt27fn\n/e9//wnXYvQetXL06NH84he/yGc/+9kTXhtM3w17wHPuueemq6ur/3FXV1emTZs23MfAO2pqasq+\nffuSJHv37s2UKVMKroiR6NixY1myZEmWLl2am2++OYneo34mTpyYG2+8Mdu2bdN31Nxvf/vbrFu3\nLjNnzsztt9+e3/zmN1m6dKneo+amTp2aJDnnnHNyyy23ZOvWrfqOmps2bVqmTZuWyy+/PEly6623\nZvv27WlubtZ71NyTTz6ZSy+9NOecc06Sof99MewBz2WXXZY//vGPqVarOXr0aH72s5/lpptuGu5j\n4B3ddNNNWbt2bZJk7dq1/X98w3Dp6+vLsmXLMnv27Nxzzz39z+s9aunAgQP935xw5MiRPPXUU2lr\na9N31Nx9992Xrq6udHZ25rHHHsvHPvax/OQnP9F71NRf//rX/OUvf0mSHD58OL/+9a8zd+5cfUfN\nNTc3Z/r06dm1a1eSN/ehzJkzJ4sXL9Z71Nyjjz7afz0rGfrfF5W+d5q1PQVPPvlk7rnnnvT09GTZ\nsmX9X+UKw+3222/Ppk2bcuDAgTQ1NeXb3/52Pv3pT+e2227L7t2709LSkscffzyTJk0qulRGkM2b\nN+fqq6/OvHnz+sck77///lxxxRV6j5p5+eWX097ent7e3vT29mbp0qX5+te/noMHD+o76mbTpk35\n/ve/n3Xr1uk9aqqzszO33HJLkjevzHz+85/PihUr9B118eKLL+auu+7K0aNHc/755+dHP/pRenp6\n9B41dfjw4cyYMSOdnZ396x+G+juvJgEPAAAAAPUz7Fe0AAAAAKgvAQ8AAABAyQl4AAAAAEpOwAMA\nAABQcgIeAAAAgJIT8AAAAACUnIAHAAAAoOQEPAAAAAAl9z+n0Okhx0N9GgAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "pca = PCA(n_components=30)\n", "x_reduced = pca.fit_transform(x_scaled)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 33 }, { "cell_type": "code", "collapsed": false, "input": [ "x_reduced.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "(708, 30)" ] } ], "prompt_number": 34 }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Modeling!!\n", "Binary classification -- Domestic vs nondomestic" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.cross_validation import train_test_split\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n", "from sklearn.metrics import confusion_matrix, recall_score, precision_score, f1_score, roc_curve, roc_auc_score\n", "from sklearn.grid_search import GridSearchCV" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 35 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Cross Validation Splitting -- Reduced feature set" ] }, { "cell_type": "code", "collapsed": false, "input": [ "xtrain, xtest, ytrain, ytest = train_test_split(x_reduced, y_dom, random_state=13)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "def get_scores(x, y, model):\n", " print \"model:\", model\n", " print \"cf matrix:\\n\", confusion_matrix(y, model.predict(x))\n", " print \"accuracy:\", model.score(x, y)\n", " print \"precision (tp/tp+fp):\", precision_score(y, model.predict(x))\n", " print \"recall (tp/p):\", recall_score(y, model.predict(x))\n", " print \"f1:\", f1_score(y, model.predict(x))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 37 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Basic Logistic Classification with reduced feature set (\"x\" 30 features)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "lg = LogisticRegression()\n", "lg.fit(xtrain, ytrain)\n", "get_scores(xtest, ytest, lg)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "model: LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, penalty=l2, random_state=None, tol=0.0001)\n", "cf matrix:\n", "[[ 32 6]\n", " [ 3 136]]\n", "accuracy: 0.949152542373\n", "precision (tp/tp+fp): 0.957746478873\n", "recall (tp/p): 0.978417266187\n", "f1: 0.967971530249\n" ] } ], "prompt_number": 38 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Random Forest Classification with reduced feature set (\"x\" 30 features); Grid Search for Optimal Parameters" ] }, { "cell_type": "code", "collapsed": false, "input": [ "rf = RandomForestClassifier(n_jobs=-1)\n", "pg = {'n_estimators': np.arange(10, 101, 10), 'criterion': ['gini', 'entropy']}\n", "gs = GridSearchCV(rf, param_grid=pg, scoring='f1')\n", "gs.fit(x_reduced, y_dom)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ "GridSearchCV(cv=None,\n", " estimator=RandomForestClassifier(bootstrap=True, compute_importances=None,\n", " criterion='gini', max_depth=None, max_features='auto',\n", " min_density=None, min_samples_leaf=1, min_samples_split=2,\n", " n_estimators=10, n_jobs=-1, oob_score=False, random_state=None,\n", " verbose=0),\n", " fit_params={}, iid=True, loss_func=None, n_jobs=1,\n", " param_grid={'n_estimators': array([ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]), 'criterion': ['gini', 'entropy']},\n", " pre_dispatch='2*n_jobs', refit=True, score_func=None, scoring='f1',\n", " verbose=0)" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "gs.grid_scores_" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "[mean: 0.94650, std: 0.00770, params: {'n_estimators': 10, 'criterion': 'gini'},\n", " mean: 0.95059, std: 0.00822, params: {'n_estimators': 20, 'criterion': 'gini'},\n", " mean: 0.95230, std: 0.00825, params: {'n_estimators': 30, 'criterion': 'gini'},\n", " mean: 0.95322, std: 0.00174, params: {'n_estimators': 40, 'criterion': 'gini'},\n", " mean: 0.95698, std: 0.00050, params: {'n_estimators': 50, 'criterion': 'gini'},\n", " mean: 0.95352, std: 0.00861, params: {'n_estimators': 60, 'criterion': 'gini'},\n", " mean: 0.95668, std: 0.00510, params: {'n_estimators': 70, 'criterion': 'gini'},\n", " mean: 0.95793, std: 0.00901, params: {'n_estimators': 80, 'criterion': 'gini'},\n", " mean: 0.95968, std: 0.00621, params: {'n_estimators': 90, 'criterion': 'gini'},\n", " mean: 0.95877, std: 0.00832, params: {'n_estimators': 100, 'criterion': 'gini'},\n", " mean: 0.95086, std: 0.01082, params: {'n_estimators': 10, 'criterion': 'entropy'},\n", " mean: 0.95370, std: 0.00508, params: {'n_estimators': 20, 'criterion': 'entropy'},\n", " mean: 0.94830, std: 0.00633, params: {'n_estimators': 30, 'criterion': 'entropy'},\n", " mean: 0.95825, std: 0.00299, params: {'n_estimators': 40, 'criterion': 'entropy'},\n", " mean: 0.95886, std: 0.00603, params: {'n_estimators': 50, 'criterion': 'entropy'},\n", " mean: 0.96230, std: 0.00530, params: {'n_estimators': 60, 'criterion': 'entropy'},\n", " mean: 0.95098, std: 0.00386, params: {'n_estimators': 70, 'criterion': 'entropy'},\n", " mean: 0.95654, std: 0.00300, params: {'n_estimators': 80, 'criterion': 'entropy'},\n", " mean: 0.95728, std: 0.00831, params: {'n_estimators': 90, 'criterion': 'entropy'},\n", " mean: 0.95553, std: 0.00428, params: {'n_estimators': 100, 'criterion': 'entropy'}]" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "gs.best_params_" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "{'criterion': 'entropy', 'n_estimators': 60}" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "rf = RandomForestClassifier(n_jobs=-1, n_estimators=60, criterion='gini')\n", "rf.fit(xtrain, ytrain)\n", "get_scores(xtest, ytest, rf)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "model: RandomForestClassifier(bootstrap=True, compute_importances=None,\n", " criterion=gini, max_depth=None, max_features=auto,\n", " min_density=None, min_samples_leaf=1, min_samples_split=2,\n", " n_estimators=60, n_jobs=-1, oob_score=False, random_state=None,\n", " verbose=0)\n", "cf matrix:\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "[[ 31 7]\n", " [ 4 135]]\n", "accuracy:" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 0.937853107345\n", "precision (tp/tp+fp):" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 0.950704225352\n", "recall (tp/p):" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 0.971223021583\n", "f1:" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 0.960854092527\n" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "rf.classes_" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 43, "text": [ "array([0, 1])" ] } ], "prompt_number": 43 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Random Forest Classification with full, unscaled feature set (\"x\" 63 features)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# xtrain_full, xtest_full, ytrain_full, ytest_full = train_test_split(x, y_dom, random_state=13)\n", "xtrain_full, xtest_full, ytrain_full, ytest_full = train_test_split(x, y_dom)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 61 }, { "cell_type": "code", "collapsed": false, "input": [ "rf_full = RandomForestClassifier(n_jobs=-1, n_estimators=60, criterion='gini')\n", "rf_full.fit(xtrain_full, ytrain_full)\n", "get_scores(xtest_full, ytest_full, rf_full)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "model: RandomForestClassifier(bootstrap=True, compute_importances=None,\n", " criterion=gini, max_depth=None, max_features=auto,\n", " min_density=None, min_samples_leaf=1, min_samples_split=2,\n", " n_estimators=60, n_jobs=-1, oob_score=False, random_state=None,\n", " verbose=0)\n", "cf matrix:\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "[[ 32 3]\n", " [ 4 138]]\n", "accuracy:" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 0.960451977401\n", "precision (tp/tp+fp):" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 0.978723404255\n", "recall (tp/p):" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 0.971830985915\n", "f1:" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 0.975265017668\n" ] } ], "prompt_number": 62 }, { "cell_type": "code", "collapsed": false, "input": [ "rf_full.feature_importances_" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 63, "text": [ "array([ 0.00000000e+00, 7.61751267e-03, 3.13574587e-02,\n", " 2.64774026e-03, 2.61600500e-03, 6.54577299e-03,\n", " 4.76293559e-03, 1.54990354e-02, 4.55698688e-03,\n", " 1.03682349e-02, 3.59508890e-02, 2.87579205e-02,\n", " 3.00913479e-02, 4.47696216e-03, 5.57373914e-03,\n", " 1.19521081e-02, 4.42461778e-03, 3.33032693e-03,\n", " 4.42995269e-03, 1.87947330e-03, 1.68992817e-02,\n", " 4.21984947e-02, 5.50119292e-03, 4.52364876e-02,\n", " 4.51412110e-03, 5.18549984e-02, 1.72402778e-02,\n", " 4.33524412e-03, 1.24089454e-02, 7.50654866e-02,\n", " 8.54232169e-02, 4.40645106e-03, 6.91914957e-03,\n", " 7.27429653e-03, 3.12880746e-03, 4.80652787e-03,\n", " 5.59911784e-03, 1.10449361e-02, 7.30903352e-02,\n", " 4.30476116e-03, 6.44953096e-03, 4.96497938e-03,\n", " 2.64860891e-02, 5.20678231e-03, 3.73270872e-03,\n", " 2.82547750e-03, 5.21704728e-03, 4.78211955e-03,\n", " 1.18011311e-02, 6.07522336e-03, 1.06799876e-03,\n", " 2.98982527e-02, 5.60596590e-03, 1.52757282e-01,\n", " 6.29450397e-03, 7.24529133e-03, 1.22050948e-02,\n", " 6.38227075e-03, 9.90651661e-04, 7.29441914e-04,\n", " 0.00000000e+00, 1.51123175e-04, 1.03988413e-03])" ] } ], "prompt_number": 63 }, { "cell_type": "code", "collapsed": false, "input": [ "feature_ranks = [feature_names[i] for i in np.argsort(rf_full.feature_importances_)[::-1]]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 64 }, { "cell_type": "code", "collapsed": false, "input": [ "feature_ranks" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 65, "text": [ "['usgpct',\n", " 'hob',\n", " 'high_game',\n", " 'per',\n", " 'fta',\n", " 'fic',\n", " 'fgm',\n", " 'dbl_dbl',\n", " '_40_pts',\n", " 'drbpct',\n", " 'trbpct',\n", " 'drb',\n", " 'pts',\n", " 'ftm',\n", " 'fga',\n", " 'astpct',\n", " 'gp',\n", " 'ws',\n", " 'ediff',\n", " 'tov',\n", " 'ows',\n", " 'blkpct',\n", " '_20_reb',\n", " 'min',\n", " 'win_pct',\n", " 'l',\n", " 'ast',\n", " 'ppr',\n", " 'wt',\n", " 'w',\n", " 'tovpct',\n", " 'tspct',\n", " 'ortg',\n", " 'dws',\n", " 'fgpct',\n", " 'stlpct',\n", " 'reb',\n", " 'pps',\n", " 'orbpct',\n", " 'total_s_pct',\n", " 'ast_to',\n", " 'blk',\n", " 'ft_fga',\n", " 'drtg',\n", " 'fg3m',\n", " 'efgpct',\n", " 'ht',\n", " 'ftpct',\n", " 'pf',\n", " 'stl',\n", " 'fg3a',\n", " 'orb',\n", " 'stl_to',\n", " '_5_blk',\n", " '_5_stl',\n", " 'fg3pct',\n", " 'tpl_dbl',\n", " 'pos_SG',\n", " 'pos_C',\n", " 'pos_PF',\n", " 'pos_SF',\n", " 'pos_PG',\n", " '_20_ast']" ] } ], "prompt_number": 65 }, { "cell_type": "code", "collapsed": false, "input": [ "feature_indices = np.arange(len(feature_names))\n", "fig = plt.figure(figsize=(16,10))\n", "ax = fig.add_axes([0, 0, 1, 1])\n", "ax.set_title(\"Feature Importance in Classifying Domestic vs Foreign CBA Players\")\n", "ax.barh(feature_indices, np.sort(rf_full.feature_importances_)[::-1], align=\"center\")\n", "ax.set_yticks(feature_indices)\n", "ax.set_yticklabels(feature_ranks)\n", "ax.autoscale()\n", "fig.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n54qPj5fNZlNUVJT27Nlz0XmlpaXq1auXMjIyZLFYNHz4cFVWVkqSCgsLlZiYqOjoaPXv319Op1Mz\nZsxQbm6ubDabVq9e3dR3AwAAAAAAALhdstnA/v37NWTIEJWUlGjNmjV67bXXtGHDBh0+fFj9+vXT\np59+qt27d2vOnDlat26dJKmyslJt2rRR+/bt9dVXX+mhhx5SYWGhSktLlZaWppKSkovea/Lkyerf\nv78eeughVVdXq7q6WoGBgRfMKy0tVY8ePVRQUKCEhASNGTNGFotFkyZNUu/evbVq1SrFxsaqoqJC\nHTp00IoVK1RUVKT58+df/CWYTDq3vdLbaHoAAAAAAABwNbRIs4G6N8jPz9dDDz0kk8mkLl26KDk5\nWYWFhQoODq73N1VVVZo4caJ27NihgIAAffnll00KJiEhQb/97W/1zTffKD09XTfffHODc7t166aE\nhARJUkZGhubPn6/Bgwfr+uuvV2xsrCQpKCjI/QyXflFZda7ttQMAAAAAAABG5HA45HA4PLrmZXXt\nvFjm7mLdLl955RVdf/31Wr58uc6ePXvRqrKLGTlypPr376/33ntPd911l1577TWlpKQ0GMt5Lper\n0a6bTevImdWkGAEAAAAAAOD77Ha77Ha7+3N2dnaz17zkGWlms1nl5eWSpFtvvVW5ubmqqanR4cOH\n9fHHHysuLk5BQUHuOZLkdDp13XXXSZJef/11nT17tknBfP311+revbsmTZqkYcOGNbgFVJIOHDig\nrVu3SpJWrlyppKQkhYeH69ChQ9q+fbskqby8XGfPnq33DAAAAAAAAMCVuGQi7dprr1ViYqKsVqu2\nbt2qyMhIRUVFKTU1VbNnz1aXLl0UFRWlgIAARUdHa968eXriiSe0bNkyRUdHa/fu3e4tllLj1WGr\nVq1SRESEbDabPv/8c/3yl79scG54eLgWLlwoi8Wi48ePa/z48Wrbtq1yc3M1adIkRUdHa/DgwTp9\n+rRSUlK0a9cumg0AAAAAAADgil2y2YAvulTTgstFswEAAAAAAAD/1iLNBnxV0849u6wVPbze5TOb\nw7wdAgAAAAAAABrglYq0DRs2aNq0afW+69Gjh9asWVPvux9++EEDBw684O83b96ssDDPJZ08kZEE\nAAAAAACA7/JE/sfnt3YGBQWpoqKi2eu89NJLeu655y76m+er266c2Rwmp/Oot8MAAAAAAADwK36f\n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\n9VJWVpYeeuihMufExcVp2LBhOnfunB566CFFRERcZbS0Uvu2ixsAAAAAAADMyDCMa+aeKqLKE2kb\nN27UsmXLtHLlSp09e1Z2u12PPPKI3nzzTTVq1Ejff/+9GjdurO+++04NGza86ji/TrI5HA75+Fw+\nUzUxMVHr16/XihUrlJqaqmeeeUaDBw++wohpLt4ZAAAAAAAAqgubzSabzeZ8nZ6e7vKYVb5G2qRJ\nk/TNN9/o66+/1t///nfde++9evPNNyVJPXr00MKFCyVJCxcuvKy6rDSHw6GPP/5YJ06c0JkzZ/Th\nhx+qQ4cOql+/vgoLC53nHT58WA0aNNBjjz2mxx57zDnlEwAAAAAAALgRHlkjrbTSlWXjx49X3759\nNX/+fDVv3lyZmZnXvC4+Pl69e/fWkSNHNHjwYEVHR0uSOnTooLCwMHXv3l2hoaGaMmWKatWqJavV\n6kzaAQAAAAAAADfC4ijdNtNEMjIylJOTo5kzZ7o81oVknim/BsCLWGTSP0cAAAAAABOwWFz/d6fH\nK9IqqjzNCG5wRDeOBeBGWa2Bng4BAAAAAIBrqtSKtOPHj6tLly6Xvb927VoFBQWVa4zVq1dr/Pjx\nZd5r2bKllixZ4pYYJfdkJAEAAAAAAFB9uSP/Y9qpne7k3so2AGZltQbKbs/3dBgAAAAAgErgjkRa\nlXftvCQ9PV3Tpk1TUlKScnJyLjuekZGh0aNHl3u8+vXrS5IMw1BKSsoVz2nevLny86/2j2QHGxtb\nDd8KC08IAAAAAICr8Vgi7XputEqsPOdTeQYAAAAAAICKqtJE2sSJExUcHKzExER98cUXzvcXLVqk\nqKgohYWFKTs7u1xjff3110pISFB4eLheeOGFMsfsdrseeOABtWrVSiNHjmT9MwAAAAAAALisyhJp\nOTk5Wrx4sXbu3KmVK1eWSZidOXNG27dv16xZszRs2DBJum7y66mnntKoUaO0a9cuNWnSpMyxLVu2\n6K9//av27dungwcP6v3333f/DQEAAAAAAKBGuamqPmj9+vXq1auX/Pz85Ofnpx49ejiPDRgwQJKU\nmJgou92ugoKC6463ceNGffDBB5KkQYMGady4cc5j8fHxat68uXPsrKws9e7d+zojppXat13cAAAA\nAAAAYEaGYcgwDLeOWWWJtBvpjODj41qhXOm10BwORznHS3PpMwEAAAAAAFB92Gw22Ww25+v09HSX\n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\nAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 66 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Analysis\n", "\n", "Based on the strong precision/recall/accuracy performance of the logistic and random forest classifiers, it appears there are indeed features that can predict whether a player is domestic or foreign. \n", "\n", "Assuming the foreign players are indeed more talented and more impactful, the top results make intuitive sense.\n", "\n", "1. \"usgpct\" (Usage %) -- \n", "2. \"hob\" (Hands on buckets) -- \n", "3. \"per\" (Player Efficiency Rating) -- \n", "4. \"high_game\" (Most points scored in a game) -- \n", "5. \"pts\" -- \n", "6. \"fic\" (Floor Impact Counter) -- \n", "\n", "For a summary of the statistics, please reference the following:\n", "\n", "\n", "It is also important to note that many of these top features are in fact calculated, rather than observed, statistics.\n", "\n", "~~During the feature selection process when PCA was used to address collinearity issues, the features were transformed and no longer provide insight into what differences separate domestic and non-domestic players.~~\n", "\n", "~~To investigate this further, I will revisit the feature selection process and attempt to manually select features using VIF (variable inflation factors) and the feature correlation matrix. By doing this, I can potentially use logistic regression and retain the meaning from the feature set.~~" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Feature Analysis/Selection Part II\n", "\n", "####VIF & Correlation Matrix (Pearson Coefficients) on full feature set (\"x\" 64 features)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from statsmodels.stats.outliers_influence import variance_inflation_factor" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 46 }, { "cell_type": "code", "collapsed": false, "input": [ "vif = [variance_inflation_factor(x_scaled, col) for col in xrange(x_scaled.shape[1])]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 47 }, { "cell_type": "code", "collapsed": false, "input": [ "zip(vif, feature_names)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 48, "text": [ "[(nan, '_20_ast'),\n", " (2.3232646413884468, '_20_reb'),\n", " (3.099973924140988, '_40_pts'),\n", " (2.5583691874867571, '_5_blk'),\n", " (3.2826153029391079, '_5_stl'),\n", " (190036935.48370814, 'ast'),\n", " (8.2032827384218852, 'ast_to'),\n", " (17.978150577641646, 'astpct'),\n", " (19124656.985708512, 'blk'),\n", " (4.8911542003284083, 'blkpct'),\n", " (13.717477282514521, 'dbl_dbl'),\n", " (inf, 'drb'),\n", " (518.93282127926705, 'drbpct'),\n", " (21129.564180145786, 'drtg'),\n", " (21377.576159298682, 'dws'),\n", " (346061.19871661032, 'ediff'),\n", " (86.736913551758022, 'efgpct'),\n", " (74.464553355393164, 'fg3a'),\n", " (1069.3081439950811, 'fg3m'),\n", " (160256.93698674868, 'fg3pct'),\n", " (1904161358.7764828, 'fga'),\n", " (40434.534043811895, 'fgm'),\n", " (81245.066394499881, 'fgpct'),\n", " (3338961506.4996514, 'fic'),\n", " (11.081218981979251, 'ft_fga'),\n", " (73638132.87765573, 'fta'),\n", " (3730.3210419056595, 'ftm'),\n", " (228885.57379329094, 'ftpct'),\n", " (inf, 'gp'),\n", " (10.256000365408415, 'high_game'),\n", " (27.118818234214988, 'hob'),\n", " (7.9971082754363625, 'ht'),\n", " (inf, 'l'),\n", " (48.10307546446689, 'min'),\n", " (inf, 'orb'),\n", " (230.81040424653685, 'orbpct'),\n", " (287639.38165621378, 'ortg'),\n", " (83465.746619397309, 'ows'),\n", " (30.100700172182293, 'per'),\n", " (36924926.888011456, 'pf'),\n", " (10.560570393422465, 'ppr'),\n", " (76.475391471295495, 'pps'),\n", " (6519203798.0495596, 'pts'),\n", " (inf, 'reb'),\n", " (42019635.050169773, 'stl'),\n", " (4.1066018150601806, 'stl_to'),\n", " (4.7900846441743417, 'stlpct'),\n", " (724672.55940323207, 'total_s_pct'),\n", " (90452664.394567743, 'tov'),\n", " (2.7081295157277996, 'tovpct'),\n", " (1.689207276032876, 'tpl_dbl'),\n", " (1161.9775733693359, 'trbpct'),\n", " (65.065564699399644, 'tspct'),\n", " (13.404526175881928, 'usgpct'),\n", " (inf, 'w'),\n", " (4.1287363801882559, 'win_pct'),\n", " (155021.14855930192, 'ws'),\n", " (2.9694097757938884, 'wt'),\n", " (inf, 'pos_C'),\n", " (inf, 'pos_PF'),\n", " (inf, 'pos_PG'),\n", " (inf, 'pos_SF'),\n", " (inf, 'pos_SG')]" ] } ], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "corr_matrix = pd.DataFrame(x_scaled, columns=feature_names).corr().abs()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 49 }, { "cell_type": "code", "collapsed": false, "input": [ "corr_top = corr_matrix.unstack().order(ascending=False)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "corr_top[corr_top != 1][:750:2]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "pts fgm 0.992658\n", " fga 0.987447\n", "ftm fta 0.987418\n", "reb drb 0.985903\n", "fg3m fg3a 0.984703\n", "fgm fga 0.981999\n", "ortg ediff 0.970763\n", "tspct efgpct 0.960869\n", "fic fgm 0.959132\n", "ws ows 0.954628\n", "pts fic 0.951468\n", "ws fic 0.945673\n", "fgpct efgpct 0.943900\n", "reb orb 0.942665\n", "tspct pps 0.936179\n", "...\n", "stlpct stl 0.514828\n", "w fga 0.511142\n", " tov 0.511094\n", "wt orbpct 0.510350\n", "ws blk 0.508952\n", "ows fg3a 0.506598\n", "fic fg3m 0.505807\n", "tov l 0.505148\n", "gp fta 0.505010\n", "fic drbpct 0.504449\n", "ows ediff 0.503364\n", "fic fg3a 0.501707\n", "orb gp 0.500524\n", "ortg hob 0.500017\n", "ws ortg 0.498958\n", "Length: 375, dtype: float64" ] } ], "prompt_number": 51 }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Manual Feature Selection (stats_pruned)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#no values/information in this feature\n", "stats_pruned = stats_final.drop('_20_ast', axis=1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "# y = stats_pruned.pop('nationality').values\n", "x = stats_pruned.values" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 53 }, { "cell_type": "code", "collapsed": false, "input": [ "scaler = StandardScaler()\n", "x_pruned = scaler.fit_transform(x)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 54 }, { "cell_type": "code", "collapsed": false, "input": [ "feature_names_pruned = stats_pruned.columns.values" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 55 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 55 } ], "metadata": {} } ] }