lab11 August 5, 2021 [1]: # Initialize Otter import otter grader = otter.Notebook("lab11.ipynb") 1 Lab 11 Decision Trees and Random Forests In this assignment, we will have you train a multi-class...

1 answer below »
Only need help on Question 1c. Thanks!


lab11 August 5, 2021 [1]: # Initialize Otter import otter grader = otter.Notebook("lab11.ipynb") 1 Lab 11 Decision Trees and Random Forests In this assignment, we will have you train a multi-class classifier with three different models (one- vs-rest logistic regression, decision tree, random forest) and compare the accuracies and decision boundaries created by each. We’ll be looking at a dataset of per-game stats for all NBA players in the 2018-19 season. This dataset comes from basketball-reference.com. 1.0.1 Due Date This assignment is due on Saturday, July 31st at 11:59 pm PDT. 1.0.2 Collaboration Policy Data science is a collaborative activity. While you may talk with others about this assignment, we ask that you write your solutions individually. If you discuss the assignment with others, please include their names in the cell below. Collaborators: list names here 1.0.3 Lab Walkthrough Video In addition to the lab notebook, we have also released a prerecorded walk-through video of the lab. We encourage you to reference this video as you work through the lab. Run the cell below to display the video. [2]: from IPython.display import YouTubeVideo YouTubeVideo("K9iWroWKAVo", list = 'PLQCcNQgUcDfpZ1FqfNkS_uzlUkY-RJysT',␣ ↪→listType = 'playlist') [2]: 1 https://www.basketball-reference.com/ [3]: import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap import seaborn as sns from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn import tree # ignore the warning you might get from importing ensemble from sklearn from sklearn import ensemble [4]: nba_data = pd.read_csv("nba18-19.csv") nba_data.head(5) [4]: Rk Player Pos Age Tm G GS MP FG FGA … \ 0 1 Álex Abrines\abrinal01 SG 25 OKC 31 2 19.0 1.8 5.1 … 1 2 Quincy Acy\acyqu01 PF 28 PHO 10 0 12.3 0.4 1.8 … 2 3 Jaylen Adams\adamsja01 PG 22 ATL 34 1 12.6 1.1 3.2 … 3 4 Steven Adams\adamsst01 C 25 OKC 80 80 33.4 6.0 10.1 … 4 5 Bam Adebayo\adebaba01 C 21 MIA 82 28 23.3 3.4 5.9 … 2 FT% ORB DRB TRB AST STL BLK TOV PF PTS 0 0.923 0.2 1.4 1.5 0.6 0.5 0.2 0.5 1.7 5.3 1 0.700 0.3 2.2 2.5 0.8 0.1 0.4 0.4 2.4 1.7 2 0.778 0.3 1.4 1.8 1.9 0.4 0.1 0.8 1.3 3.2 3 0.500 4.9 4.6 9.5 1.6 1.5 1.0 1.7 2.6 13.9 4 0.735 2.0 5.3 7.3 2.2 0.9 0.8 1.5 2.5 8.9 [5 rows x 30 columns] Our goal will be to predict a player’s position given several other features. The 5 positions in basketball are PG, SG, SF, PF, and C (which stand for point guard, shooting guard, small forward, power forward, and center). This information is contained in the Pos column. [5]: nba_data['Pos'].value_counts() [5]: SG 176 PF 147 PG 139 C 120 SF 118 PF-SF 2 SF-SG 2 SG-SF 1 C-PF 1 PF-C 1 SG-PF 1 Name: Pos, dtype: int64 While we could set out to try and perform 5-class classification, the results (and visualizations) are slightly more interesting if we try and categorize players into 1 of 3 categories: guard, forward, and center. The below code will take the Pos column of our dataframe and use it to create a new column Pos3 that consist of values G, F, and C (which stand for guard, forward, and center). [6]: def basic_position(pos): if 'F' in pos: return 'F' elif 'G' in pos: return 'G' return 'C' nba_data['Pos3'] = nba_data['Pos'].apply(basic_position) nba_data['Pos3'].value_counts() [6]: G 315 F 273 C 120 Name: Pos3, dtype: int64 3 Furthermore, since there are many players in the NBA (in the 2018-19 season there were 530 unique players), our visualizations can get noisy and messy. Let’s restrict our data to only contain rows for players that averaged 10 or more points per game. [7]: nba_data = nba_data[nba_data['PTS'] > 10] Now, let’s look at a scatterplot of Rebounds (TRB) vs. Assists (AST). [8]: sns.scatterplot(data = nba_data, x = 'AST', y = 'TRB', hue = 'Pos3'); As you can see, when using just rebounds and assists as our features, we see pretty decent cluster separation. That is, Centers, Forwards, and Guards appear in different regions of the plot. 1.1 Question 1: Evaluating Split Quality We will explore different ways to evaluate split quality for classification and regression trees in this question. 1.1.1 Question 1a In lecture we defined the entropy S of a node as: S = − ∑ C pC log2 pC where pC is the proportion of data points in a node with label C. This function helped us determine the unpredictability of a node in a decision tree. 4 Implement the entropy function, which outputs the entropy of a node with a given set of labels. The labels parameter is a list of labels in our dataset. For example, labels could be ['G', 'G', 'F', 'F', 'C', 'C']. [9]: def entropy(labels): unique_labels, counts =np.unique(labels, return_counts= True) pc = counts/ sum(counts) e = - np.sum(pc * np.log2(pc)) return e entropy(nba_data['Pos3']) [9]: 1.521555567956027 [10]: grader.check("q1a") [10]: q1a results: All test cases passed! 1.1.2 Question 1b The decision tree visualizations in lecture contained nodes with a gini parameter. This depicts the node’s Gini impurity, which is the chance that a sample would be misclassified if randomly assigned at this point. Gini impurity is a popular alternative to entropy for determining the best split at a node, and it is in fact the default criterion for scikit-learn’s DecisionTreeClassifier. We can calculate the Gini impurity of a node with the formula (pC is the proportion of data points in a node with label C): G = 1− ∑ C pC 2 Note that no logarithms are involved in the calculation of Gini impurity, which can make it faster to compute compared to entropy. Implement the gini_impurity function, which outputs the Gini impurity of a node with a given set of labels. The labels parameter is defined similarly to the previous part. [11]: def gini_impurity(labels): unique_labels, counts =np.unique(labels, return_counts= True) pc = counts/ sum(counts) g = 1 - np.sum(pc ** 2) return g gini_impurity(nba_data['Pos3']) [11]: 0.6383398017253514 [12]: grader.check("q1b") 5 [12]: q1b results: All test cases passed! As an optional exercise in probability, try to think of a way to derive the formula for Gini impurity. It usually does not make sense to use entropy and Gini impurity for regression trees because the response variable is continuous. However, we can use the variance of the response values in a node as an alternative to entropy and Gini impurity. Recall that the variance is defined as: σ2 = 1 N N∑ i=1 (xi − µ)2 where µ is the mean, N is the total number of data points, and xi is the value of each data point. Here we define variance as we have previously done in the course [13]: def variance(values): return np.mean((values - np.mean(values)) ** 2) variance(nba_data['PTS']) [13]: 21.023148263588652 1.1.3 Question 1c In lecture, we used weighted entropy as a loss function to help us determine the best split. Recall that the weighted entropy is given by: L = N1S(X) +N2S(Y ) N1 +N2 N1 is the number of samples in the left node X, and N2 is the number of samples in the right node Y . This notion of a weighted average can be extended to other metrics such as Gini impurity and variance simply by changing the S (entropy) function to G (Gini impurity) or σ2 (variance). First, implement the weighted_metric function. The left parameter is a list of labels or values in the left node X, and the right parameter is a list of labels or values in the right node Y . The metric parameter is a function which can be entropy, gini_impurity, or variance. For entropy and gini_impurity, you may assume that left and right contain discrete labels. For variance, you may assume that left and right contain continuous values. Then, assign we_pos3_age_30 to the weighted entropy (in the Pos3 column) of a split that partitions nba_data into two groups: a group with players who are 30 years old or older and a group with players who are younger than 30 years old. [1]: def weighted_metric(left, right, metric): n1, S_X, n2, S_Y = len(left), metric(left), len(right), metric(right) return ((n1 * S_X) + (n2 * S_Y))/ (n1 + n2) 6 we_pos3_age_30 = weighted_metric(nba_data[nba_data['Age'] >= 30]['Pos3'],␣ ↪→nba_data[nba_data]) we_pos3_age_30 --------------------------------------------------------------------------- NameError Traceback (most recent call last) /tmp/ipykernel_40/4124766125.py in 3 return ((n1 * S_X) + (n2 * S_Y))/ (n1 + n2) 4 ----> 5 we_pos3_age_30 = weighted_metric(nba_data[nba_data['Age'] >=␣ ↪→30]['Pos3'], nba_data[nba_data]) 6 we_pos3_age_30 NameError: name 'nba_data' is not defined [2]: grader.check("q1c") --------------------------------------------------------------------------- NameError Traceback (most recent call last) /tmp/ipykernel_40/2855975128.py in ----> 1 grader.check("q1c") NameError: name 'grader' is not defined We will not go over the entire decision tree fitting process in this assignment, but you now have the basic tools to fit a decision tree. As an optional exercise, try to think about how you would extend these tools to fit a decision tree from scratch. 1.2 Question 2: Classification Let’s switch gears to classification with the NBA dataset. 1.3 One-vs-Rest Logistic Regression We only discussed binary logistic regression in class, but there is a natural extension to binary logistic regression called one-vs-rest logistic regression for multiclass classification. In essence, one- vs-rest logistic regression simply builds one binary logistic regression classifier for each of the N classes (in this scenario N = 3). We then predict the class corresponding to the classifier that gives the highest probability among the N classes. Before using logistic regression, let’s first split nba_data into a training set and test set. [3]: nba_train, nba_test = train_test_split(nba_data, test_size=0.25,␣ ↪→random_state=100) nba_train = nba_train.sort_values(by='Pos') nba_test = nba_test.sort_values(by='Pos') 7 --------------------------------------------------------------------------- NameError Traceback (most recent call last) /tmp/ipykernel_40/2288098315.py in ----> 1 nba_train, nba_test = train_test_split(nba_data, test_size=0.25,␣ ↪→random_state=100) 2 nba_train = nba_train.sort_values(by='Pos') 3 nba_test = nba_test.sort_values(by='Pos') NameError: name 'train_test_split' is not defined 1.3.1 Question 2a In the cell below, set logistic_regression_model to be a one-vs-rest logistic regression model. Then, fit that model using the AST and TRB columns (in that order) from nba_train as our features, and Pos3 as our response variable. Remember, sklearn.linear_model.LogisticRegression has already been imported for you. There is an optional parameter multi_class you need to specify in order to make your model a multi-class one-vs-rest classifier. See the documentation for more details. [4]: logistic_regression_model = LogisticRegression(multi_class='ovr') logistic_regression_model.fit(nba_train[['AST', 'TRB']], nba_train['Pos3']) --------------------------------------------------------------------------- NameError Traceback (most recent call last) /tmp/ipykernel_40/1347373509.py in ----> 1 logistic_regression_model = LogisticRegression(multi_class='ovr') 2 logistic_regression_model.fit(nba_train[['AST',
Answered Same DayAug 05, 2021

Answer To: lab11 August 5, 2021 [1]: # Initialize Otter import otter grader = otter.Notebook("lab11.ipynb") 1...

Swapnil answered on Aug 06 2021
141 Votes
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"deletable": false,
"editable": false
},
"outputs": [],
"source": [
"import otter\n",
"grader = otter.Notebook()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"nbgrader": {
"grade": false,
"grade_id": "imports",
"locked": true,
"schema_version": 2,
"solution": false
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.colors import ListedColormap\n",
"import seaborn as sns\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn import tree\n",
"from sklearn import ensemble"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"
RkPlayerPosAgeTmGGSMPFGFGA...FT%ORBDRBTRBASTSTLBLKTOVPFPTS
01Álex Abrines\\abrinal01SG25OKC31219.01.85.1...0.9230.21.41.50.60.50.20.51.75.3
12Quincy Acy\\acyqu01PF28PHO10012.30.41.8...0.7000.32.22.50.80.10.40.42.41.7
23Jaylen Adams\\adamsja01PG22ATL34112.61.13.2...0.7780.31.41.81.90.40.10.81.33.2
34Steven Adams\\adamsst01C25OKC808033.46.010.1...0.5004.94.69.51.61.51.01.72.613.9
45Bam Adebayo\\adebaba01C21MIA822823.33.45.9...0.7352.05.37.32.20.90.81.52.58.9
\n",
"

5 rows × 30 columns

\n",
"
"
],
"text/plain": [
" Rk Player Pos Age Tm G GS MP FG FGA ... \\\n",
"0 1 Álex Abrines\\abrinal01 SG 25 OKC 31 2 19.0 1.8 5.1 ... \n",
"1 2 Quincy Acy\\acyqu01 PF 28 PHO 10 0 12.3 0.4 1.8 ... \n",
"2 3 Jaylen Adams\\adamsja01 PG 22 ATL 34 1 12.6 1.1 3.2 ... \n",
"3 4 Steven Adams\\adamsst01 C 25 OKC 80 80 33.4 6.0 10.1 ... \n",
"4 5 Bam Adebayo\\adebaba01 C 21 MIA 82 28 23.3 3.4 5.9 ... \n",
"\n",
" FT% ORB DRB TRB AST STL BLK TOV PF PTS \n",
"0 0.923 0.2 1.4 1.5 0.6 0.5 0.2 0.5 1.7 5.3 \n",
"1 0.700 0.3 2.2 2.5 0.8 0.1 0.4 0.4 2.4 1.7 \n",
"2 0.778 0.3 1.4 1.8 1.9 0.4 0.1 0.8 1.3 3.2 \n",
"3 0.500 4.9 4.6 9.5 1.6 1.5 1.0 1.7 2.6 13.9 \n",
"4 0.735 2.0 5.3 7.3 2.2 0.9 0.8 1.5 2.5 8.9 \n",
"\n",
"[5 rows x 30 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nba_data = pd.read_csv(\"nba18-19.csv\")\n",
"nba_data.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SG 176\n",
"PF 147\n",
"PG 139\n",
"C 120\n",
"SF 118\n",
"SF-SG 2\n",
"PF-SF 2\n",
"PF-C 1\n",
"SG-PF 1\n",
"C-PF 1\n",
"SG-SF 1\n",
"Name: Pos, dtype: int64"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nba_data['Pos'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"G 315\n",
"F 273\n",
"C 120\n",
"Name: Pos3, dtype: int64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def basic_position(pos):\n",
" if 'F' in pos:\n",
" return 'F'\n",
" elif 'G' in pos:\n",
" return 'G'\n",
" return 'C'\n",
"\n",
"\n",
"nba_data['Pos3'] = nba_data['Pos'].apply(basic_position)\n",
"nba_data['Pos3'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"nba_data = nba_data[nba_data['PTS'] > 10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, let's look at a scatterplot of Rebounds (`TRB`) vs. Assists (`AST`)."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.scatterplot(data = nba_data, x = 'AST', y = 'TRB', hue = 'Pos3');"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1.5215555679560273"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def entropy(labels):\n",
" labels = labels.value_counts().to_numpy()\n",
" labels = labels / np.sum(labels)\n",
" return -1 * np.sum(labels * np.log(labels) / np.log(2))\n",
"\n",
"entropy(nba_data['Pos3'])"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"deletable": false,
"editable": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
"

All tests passed!

\n",
" \n",
" "
],
"text/plain": [
"\n",
" All tests passed!\n",
" "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grader.check(\"q1a\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.6383398017253514"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def gini_impurity(labels):\n",
" labels = labels.value_counts().to_numpy()\n",
" labels = labels / np.sum(labels)\n",
" return 1 - np.sum(labels**2)\n",
"\n",
"gini_impurity(nba_data['Pos3'])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"deletable": false,
"editable": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
"

All tests passed!

\n",
" \n",
" "
],
"text/plain": [
"\n",
" All tests passed!\n",
" "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grader.check(\"q1b\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"21.023148263588652"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def variance(values):\n",
" return np.mean((values - np.mean(values))**2)\n",
" \n",
"variance(nba_data['PTS'])"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"deletable": false,
"editable": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
"

All tests passed!

\n",
" \n",
" "
],
"text/plain": [
"\n",
" All tests passed!\n",
" "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grader.check(\"q1c\")"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1.521489768014793"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def weighted_metric(left, right, metric):\n",
" return ((len(left) * metric(left) + len(right) * metric(right))\n",
" / (len(left) + len(right)))\n",
"\n",
"we_pos3_age_30 = weighted_metric(\n",
" nba_data[nba_data[\"Age\"] < 30][\"Pos3\"],\n",
" nba_data[nba_data[\"Age\"] >= 30][\"Pos3\"],\n",
" entropy)\n",
"we_pos3_age_30"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"deletable": false,
"editable": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
"

All tests passed!

\n",
" \n",
" "
],
"text/plain": [
"\n",
" All tests passed!\n",
" "
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grader.check(\"q1c\")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"nba_train, nba_test = train_test_split(nba_data, test_size=0.25, random_state=100)\n",
"nba_train = nba_train.sort_values(by='Pos')\n",
"nba_test = nba_test.sort_values(by='Pos')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
" intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
" multi_class='ovr', n_jobs=None, penalty='l2',\n",
" random_state=None, solver='lbfgs', tol=0.0001, verbose=0,\n",
" warm_start=False)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"logistic_regression_model = LogisticRegression(multi_class=\"ovr\")\n",
"logistic_regression_model.fit(X=nba_train[[\"AST\", \"TRB\"]], y=nba_train[\"Pos3\"])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"deletable": false,
"editable": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
"

All tests passed!

\n",
" \n",
" "
],
"text/plain": [
"\n",
" All tests passed!\n",
" "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grader.check(\"q2a\")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"
ASTTRBPos3Predicted (OVRLR) Pos3
6551.48.6CC
6442.010.2CC
7030.84.5CF
6521.67.2CF
1651.47.5CC
1222.48.4CC
3537.310.8CC
3671.48.6CC
4081.24.9CF
1613.912.0CC
6473.412.4CC
3084.26.7CG
3623.011.4CC
1463.68.2CC
2334.47.9CC
\n",
"
"
],
"text/plain": [
" AST TRB Pos3 Predicted (OVRLR) Pos3\n",
"655 1.4 8.6 C C\n",
"644 2.0 10.2 C C\n",
"703 0.8 4.5 C F\n",
"652 1.6 7.2 C F\n",
"165 1.4 7.5 C C\n",
"122 2.4 8.4 C C\n",
"353 7.3 10.8 C C\n",
"367 1.4 8.6 C C\n",
"408 1.2 4.9 C F\n",
"161 3.9 12.0 C C\n",
"647 3.4 12.4 C C\n",
"308 4.2 6.7 C G\n",
"362 3.0 11.4 C C\n",
"146 3.6 8.2 C C\n",
"233 4.4 7.9 C C"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nba_train['Predicted (OVRLR) Pos3'] = logistic_regression_model.predict(nba_train[['AST', 'TRB']])\n",
"nba_train[['AST', 'TRB', 'Pos3', 'Predicted (OVRLR) Pos3']].head(15)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"0.7964071856287425"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr_training_accuracy = logistic_regression_model.score(nba_train[['AST', 'TRB']], nba_train['Pos3'])\n",
"lr_training_accuracy"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.6428571428571429"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr_test_accuracy = logistic_regression_model.score(nba_test[['AST', 'TRB']], nba_test['Pos3'])\n",
"lr_test_accuracy"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png":...
SOLUTION.PDF

Answer To This Question Is Available To Download

Related Questions & Answers

More Questions »

Submit New Assignment

Copy and Paste Your Assignment Here