diff --git a/your-code/.ipynb_checkpoints/More Supervised Learning Models-checkpoint.ipynb b/your-code/.ipynb_checkpoints/More Supervised Learning Models-checkpoint.ipynb
new file mode 100755
index 0000000..60701d9
--- /dev/null
+++ b/your-code/.ipynb_checkpoints/More Supervised Learning Models-checkpoint.ipynb
@@ -0,0 +1,383 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# More Supervised Learning Models\n",
+ "\n",
+ "\n",
+ "**Lesson Goals**\n",
+ "\n",
+ "In this lesson we will expand our repertoire of supervised learning models by introducing naive bayes and k-nearest neighbors. These are two supervised learning models that are typically used for classification problems.\n",
+ "\n",
+ "\n",
+ "**Introduction**\n",
+ "\n",
+ "So far, we have discovered a few models for supervised learning. In this lesson, we will explore two different classification models. Naive Bayes is a probabilistic model for classification. K Nearest Neighbors is a model that makes a prediction based on the observations closest to it. Both models make certain assumptions for us to consider them.\n",
+ "\n",
+ "\n",
+ "# Naive Bayes\n",
+ "\n",
+ "You may recall Bayes Theorem for conditional probability. This theorem states that the probability of A given B is the probability of the intersection of A and B divided by the probability of B.\n",
+ "\n",
+ "We use this rule to create a general model. Say we would like to make a revenue prediction for our e-commerce site. Using Bayes Theorem, we can make a prediction of a customer making a purchase given the version of the website they see and the customer group they are in.\n",
+ "\n",
+ "It is important to note that the Naive Bayes algorithm makes a conditional independence assumption. This means that the effect of a single predictor on the outcome is independent on the values of the other predictor variables. This is a simplifying assumption that cannot always be made in some scenarios. Therefore, we should try to see if making this assumption may or may not work with our data.\n",
+ "\n",
+ "To calculate the probability of a customer making a purchase given that they are a millennial and looking at site version 1. We are using the model to compute probabilities and compare them. Therefore, we don't care about the denominator. We then get rid of the denominator and change our equation from being equal to, to being proportional to the probability of a purchase given customer group and site version."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Gaussian Naive Bayes\n",
+ "\n",
+ "Instead of looking at a probability distribution table, we can make the assumption that our likelihood comes from a Gaussian (or normal) distribution.\n",
+ "\n",
+ "To examine the code in Scikit-Learn, we will look at the famous Iris dataset. This dataset was first introduced by Ronald Fisher in 1936 and is used in many classification examples. The Iris dataset contains 4 features for Iris flowers (petal length, petal width, sepal length, and sepal width). The measurements in these variables are used to classify the type of Iris flower. We will import the dataset from Scikit-Learn and then fit the GaussianNB model to the data.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[5.1, 3.5, 1.4, 0.2],\n",
+ " [4.9, 3. , 1.4, 0.2],\n",
+ " [4.7, 3.2, 1.3, 0.2],\n",
+ " [4.6, 3.1, 1.5, 0.2],\n",
+ " [5. , 3.6, 1.4, 0.2],\n",
+ " [5.4, 3.9, 1.7, 0.4],\n",
+ " [4.6, 3.4, 1.4, 0.3],\n",
+ " [5. , 3.4, 1.5, 0.2],\n",
+ " [4.4, 2.9, 1.4, 0.2],\n",
+ " [4.9, 3.1, 1.5, 0.1]])"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn import datasets\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "\n",
+ "iris = datasets.load_iris()\n",
+ "iris.data[:10]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The iris dataset contains the features in the data section and the classification in the target.\n",
+ "\n",
+ "Next, we will initialize the GaussianNB model and fit the model. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "gnb = GaussianNB()\n",
+ "y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can then generate predictions and compare the predictions with the observed data.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[50, 0, 0],\n",
+ " [ 0, 47, 3],\n",
+ " [ 0, 3, 47]])"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn import metrics\n",
+ "\n",
+ "y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)\n",
+ "metrics.confusion_matrix(iris.target, y_pred)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The accuracy of a model is measured by how many observations are classified correctly. All the data correctly classified appears in a confusion matrix along the diagonal. So out of 150 observations, only 6 are incorrectly classified.\n",
+ "\n",
+ "\n",
+ "\n",
+ "# K-Nearest Neighbors\n",
+ "\n",
+ "This algorithm is based on the idea that observations in a \"neighorbood\" will have the same classification. We typically decide whether observations are considered neighbors by a distance metric of our choice. Two common choices for distance metrics are Euclidean distance (defined as the sum of squared distances) or L1 distance (defined as the sum of the absolute value of the distances). We look at the labels of all the observations in the \"neighborhood\" and assign the most common label (the mode) to the observation that we are trying to predict.\n",
+ "\n",
+ "Our choice of k is defined by us. We can test different models with multiple values of k and select the model with the highest accuracy. This is the most common way to optimize k.\n",
+ "\n",
+ "**Advantages and Disadvantages of K-Nearest Neighbors**\n",
+ "\n",
+ "The main advantage is that while we can train a model and then apply it to new data, we do not have to perform this process. We can use the k closest observations with known labels to predict the label of the new observations and make predictions on the fly. However, this means that every time we make a prediction, we have to compute the distance between the observation and all labeled data. This can be computationally intensive and a disadvantage of this algorithm."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**K-Nearest Neighbors with Scikit-Learn**\n",
+ "\n",
+ "We are able to apply a K-Nearest Neighbors model to our data using the KNeighborsClassifier in Scikit-Learn. In the example below, we will use the abalone data from the UCI dataset repository. This data contains 8 features describing different abalone observations. Using these features, we are able to predict the sex of the abalone (Male, Female, or Infant).\n",
+ "\n",
+ "We'll start by loading the data and examining it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
Sex
\n",
+ "
Length
\n",
+ "
Diameter
\n",
+ "
Height
\n",
+ "
Whole_Weight
\n",
+ "
Shucked_Weight
\n",
+ "
Visecra_Weight
\n",
+ "
Shell_Weight
\n",
+ "
Rings
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
M
\n",
+ "
0.455
\n",
+ "
0.365
\n",
+ "
0.095
\n",
+ "
0.5140
\n",
+ "
0.2245
\n",
+ "
0.1010
\n",
+ "
0.150
\n",
+ "
15
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
M
\n",
+ "
0.350
\n",
+ "
0.265
\n",
+ "
0.090
\n",
+ "
0.2255
\n",
+ "
0.0995
\n",
+ "
0.0485
\n",
+ "
0.070
\n",
+ "
7
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
F
\n",
+ "
0.530
\n",
+ "
0.420
\n",
+ "
0.135
\n",
+ "
0.6770
\n",
+ "
0.2565
\n",
+ "
0.1415
\n",
+ "
0.210
\n",
+ "
9
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
M
\n",
+ "
0.440
\n",
+ "
0.365
\n",
+ "
0.125
\n",
+ "
0.5160
\n",
+ "
0.2155
\n",
+ "
0.1140
\n",
+ "
0.155
\n",
+ "
10
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
I
\n",
+ "
0.330
\n",
+ "
0.255
\n",
+ "
0.080
\n",
+ "
0.2050
\n",
+ "
0.0895
\n",
+ "
0.0395
\n",
+ "
0.055
\n",
+ "
7
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Sex Length Diameter Height Whole_Weight Shucked_Weight Visecra_Weight \\\n",
+ "0 M 0.455 0.365 0.095 0.5140 0.2245 0.1010 \n",
+ "1 M 0.350 0.265 0.090 0.2255 0.0995 0.0485 \n",
+ "2 F 0.530 0.420 0.135 0.6770 0.2565 0.1415 \n",
+ "3 M 0.440 0.365 0.125 0.5160 0.2155 0.1140 \n",
+ "4 I 0.330 0.255 0.080 0.2050 0.0895 0.0395 \n",
+ "\n",
+ " Shell_Weight Rings \n",
+ "0 0.150 15 \n",
+ "1 0.070 7 \n",
+ "2 0.210 9 \n",
+ "3 0.155 10 \n",
+ "4 0.055 7 "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "abalone_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'\n",
+ "abalone_cols = ['Sex', 'Length', 'Diameter', 'Height', 'Whole_Weight', \n",
+ " 'Shucked_Weight', 'Visecra_Weight', 'Shell_Weight', 'Rings']\n",
+ "abalone = pd.read_csv(abalone_url, names=abalone_cols)\n",
+ "abalone.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we will load the KNeighborsClassifier from Scikit-Learn and create a model with k=3. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
+ " metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n",
+ " weights='uniform')"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.neighbors import KNeighborsClassifier\n",
+ "\n",
+ "# We create a list of all feature columns.\n",
+ "cols = [x for x in abalone.columns.values if x != 'Sex']\n",
+ "\n",
+ "neighbor_model = KNeighborsClassifier(n_neighbors=3)\n",
+ "neighbor_model.fit(abalone[cols], abalone['Sex']) \n",
+ "KNeighborsClassifier()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now that we have created our model, we will create a single observation and predict the sex of this observation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['I']\n"
+ ]
+ }
+ ],
+ "source": [
+ "import numpy as np\n",
+ "\n",
+ "obs = np.array([[0.5, 0.3, 0.05, 0.6, 0.2, 0.1, 0.1, 8]])\n",
+ "print(neighbor_model.predict(obs))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/your-code/.ipynb_checkpoints/Supervised Learning Guided Lesson-checkpoint.ipynb b/your-code/.ipynb_checkpoints/Supervised Learning Guided Lesson-checkpoint.ipynb
new file mode 100755
index 0000000..96c49b0
--- /dev/null
+++ b/your-code/.ipynb_checkpoints/Supervised Learning Guided Lesson-checkpoint.ipynb
@@ -0,0 +1,2333 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Supervised Learning Guided Lesson\n",
+ "\n",
+ "\n",
+ "**Lesson Goals**\n",
+ "\n",
+ "In this guided lesson, we will analyze a machine learning problem from start to finish and compare the performance of a few algorithms.\n",
+ "\n",
+ "\n",
+ "**Introduction**\n",
+ "\n",
+ "Many times as a data scientist or analyst, you are asked to perform classification tasks. In this lesson, we will evaluate a Kickstarter dataset. Perhaps we would like to find out what makes a kickstarter project successful. This analysis will lead us closer to making recommendations that will improve the chances of getting funded.\n",
+ "\n",
+ "\n",
+ "**The data**\n",
+ "\n",
+ "The kickstarter dataset is provided on Kaggle. It contains 15 columns and over 300,000 rows. Let's do some exploratory data analysis to find out more about our data.\n",
+ "\n",
+ "We start with our imports:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's also set a format for floats to improve readability."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "pd.options.display.float_format = '{:.4f}'.format"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we'll read our dataset with pandas:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "kickstarter = pd.read_csv('../ks-projects-201801.csv')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's start by looking at the shape of our data and the column types."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(378661, 15)"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kickstarter.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "ID int64\n",
+ "name object\n",
+ "category object\n",
+ "main_category object\n",
+ "currency object\n",
+ "deadline object\n",
+ "goal float64\n",
+ "launched object\n",
+ "pledged float64\n",
+ "state object\n",
+ "backers int64\n",
+ "country object\n",
+ "usd pledged float64\n",
+ "usd_pledged_real float64\n",
+ "usd_goal_real float64\n",
+ "dtype: object"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kickstarter.dtypes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we will evaluate all columns using the head function. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
ID
\n",
+ "
name
\n",
+ "
category
\n",
+ "
main_category
\n",
+ "
currency
\n",
+ "
deadline
\n",
+ "
goal
\n",
+ "
launched
\n",
+ "
pledged
\n",
+ "
state
\n",
+ "
backers
\n",
+ "
country
\n",
+ "
usd pledged
\n",
+ "
usd_pledged_real
\n",
+ "
usd_goal_real
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
1000002330
\n",
+ "
The Songs of Adelaide & Abullah
\n",
+ "
Poetry
\n",
+ "
Publishing
\n",
+ "
GBP
\n",
+ "
2015-10-09
\n",
+ "
1000.0000
\n",
+ "
2015-08-11 12:12:28
\n",
+ "
0.0000
\n",
+ "
failed
\n",
+ "
0
\n",
+ "
GB
\n",
+ "
0.0000
\n",
+ "
0.0000
\n",
+ "
1533.9500
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
1000003930
\n",
+ "
Greeting From Earth: ZGAC Arts Capsule For ET
\n",
+ "
Narrative Film
\n",
+ "
Film & Video
\n",
+ "
USD
\n",
+ "
2017-11-01
\n",
+ "
30000.0000
\n",
+ "
2017-09-02 04:43:57
\n",
+ "
2421.0000
\n",
+ "
failed
\n",
+ "
15
\n",
+ "
US
\n",
+ "
100.0000
\n",
+ "
2421.0000
\n",
+ "
30000.0000
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
1000004038
\n",
+ "
Where is Hank?
\n",
+ "
Narrative Film
\n",
+ "
Film & Video
\n",
+ "
USD
\n",
+ "
2013-02-26
\n",
+ "
45000.0000
\n",
+ "
2013-01-12 00:20:50
\n",
+ "
220.0000
\n",
+ "
failed
\n",
+ "
3
\n",
+ "
US
\n",
+ "
220.0000
\n",
+ "
220.0000
\n",
+ "
45000.0000
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
1000007540
\n",
+ "
ToshiCapital Rekordz Needs Help to Complete Album
\n",
+ "
Music
\n",
+ "
Music
\n",
+ "
USD
\n",
+ "
2012-04-16
\n",
+ "
5000.0000
\n",
+ "
2012-03-17 03:24:11
\n",
+ "
1.0000
\n",
+ "
failed
\n",
+ "
1
\n",
+ "
US
\n",
+ "
1.0000
\n",
+ "
1.0000
\n",
+ "
5000.0000
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
1000011046
\n",
+ "
Community Film Project: The Art of Neighborhoo...
\n",
+ "
Film & Video
\n",
+ "
Film & Video
\n",
+ "
USD
\n",
+ "
2015-08-29
\n",
+ "
19500.0000
\n",
+ "
2015-07-04 08:35:03
\n",
+ "
1283.0000
\n",
+ "
canceled
\n",
+ "
14
\n",
+ "
US
\n",
+ "
1283.0000
\n",
+ "
1283.0000
\n",
+ "
19500.0000
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ID name \\\n",
+ "0 1000002330 The Songs of Adelaide & Abullah \n",
+ "1 1000003930 Greeting From Earth: ZGAC Arts Capsule For ET \n",
+ "2 1000004038 Where is Hank? \n",
+ "3 1000007540 ToshiCapital Rekordz Needs Help to Complete Album \n",
+ "4 1000011046 Community Film Project: The Art of Neighborhoo... \n",
+ "\n",
+ " category main_category currency deadline goal \\\n",
+ "0 Poetry Publishing GBP 2015-10-09 1000.0000 \n",
+ "1 Narrative Film Film & Video USD 2017-11-01 30000.0000 \n",
+ "2 Narrative Film Film & Video USD 2013-02-26 45000.0000 \n",
+ "3 Music Music USD 2012-04-16 5000.0000 \n",
+ "4 Film & Video Film & Video USD 2015-08-29 19500.0000 \n",
+ "\n",
+ " launched pledged state backers country usd pledged \\\n",
+ "0 2015-08-11 12:12:28 0.0000 failed 0 GB 0.0000 \n",
+ "1 2017-09-02 04:43:57 2421.0000 failed 15 US 100.0000 \n",
+ "2 2013-01-12 00:20:50 220.0000 failed 3 US 220.0000 \n",
+ "3 2012-03-17 03:24:11 1.0000 failed 1 US 1.0000 \n",
+ "4 2015-07-04 08:35:03 1283.0000 canceled 14 US 1283.0000 \n",
+ "\n",
+ " usd_pledged_real usd_goal_real \n",
+ "0 0.0000 1533.9500 \n",
+ "1 2421.0000 30000.0000 \n",
+ "2 220.0000 45000.0000 \n",
+ "3 1.0000 5000.0000 \n",
+ "4 1283.0000 19500.0000 "
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kickstarter.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We should also look at the summary statistics for all the numeric columns using the describe function. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
ID
\n",
+ "
goal
\n",
+ "
pledged
\n",
+ "
backers
\n",
+ "
usd pledged
\n",
+ "
usd_pledged_real
\n",
+ "
usd_goal_real
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
count
\n",
+ "
378661.0000
\n",
+ "
378661.0000
\n",
+ "
378661.0000
\n",
+ "
378661.0000
\n",
+ "
374864.0000
\n",
+ "
378661.0000
\n",
+ "
378661.0000
\n",
+ "
\n",
+ "
\n",
+ "
mean
\n",
+ "
1074731191.9888
\n",
+ "
49080.7915
\n",
+ "
9682.9793
\n",
+ "
105.6175
\n",
+ "
7036.7289
\n",
+ "
9058.9241
\n",
+ "
45454.4015
\n",
+ "
\n",
+ "
\n",
+ "
std
\n",
+ "
619086204.3226
\n",
+ "
1183391.2591
\n",
+ "
95636.0100
\n",
+ "
907.1850
\n",
+ "
78639.7453
\n",
+ "
90973.3431
\n",
+ "
1152950.0551
\n",
+ "
\n",
+ "
\n",
+ "
min
\n",
+ "
5971.0000
\n",
+ "
0.0100
\n",
+ "
0.0000
\n",
+ "
0.0000
\n",
+ "
0.0000
\n",
+ "
0.0000
\n",
+ "
0.0100
\n",
+ "
\n",
+ "
\n",
+ "
25%
\n",
+ "
538263516.0000
\n",
+ "
2000.0000
\n",
+ "
30.0000
\n",
+ "
2.0000
\n",
+ "
16.9800
\n",
+ "
31.0000
\n",
+ "
2000.0000
\n",
+ "
\n",
+ "
\n",
+ "
50%
\n",
+ "
1075275634.0000
\n",
+ "
5200.0000
\n",
+ "
620.0000
\n",
+ "
12.0000
\n",
+ "
394.7200
\n",
+ "
624.3300
\n",
+ "
5500.0000
\n",
+ "
\n",
+ "
\n",
+ "
75%
\n",
+ "
1610148624.0000
\n",
+ "
16000.0000
\n",
+ "
4076.0000
\n",
+ "
56.0000
\n",
+ "
3034.0900
\n",
+ "
4050.0000
\n",
+ "
15500.0000
\n",
+ "
\n",
+ "
\n",
+ "
max
\n",
+ "
2147476221.0000
\n",
+ "
100000000.0000
\n",
+ "
20338986.2700
\n",
+ "
219382.0000
\n",
+ "
20338986.2700
\n",
+ "
20338986.2700
\n",
+ "
166361390.7100
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ID goal pledged backers usd pledged \\\n",
+ "count 378661.0000 378661.0000 378661.0000 378661.0000 374864.0000 \n",
+ "mean 1074731191.9888 49080.7915 9682.9793 105.6175 7036.7289 \n",
+ "std 619086204.3226 1183391.2591 95636.0100 907.1850 78639.7453 \n",
+ "min 5971.0000 0.0100 0.0000 0.0000 0.0000 \n",
+ "25% 538263516.0000 2000.0000 30.0000 2.0000 16.9800 \n",
+ "50% 1075275634.0000 5200.0000 620.0000 12.0000 394.7200 \n",
+ "75% 1610148624.0000 16000.0000 4076.0000 56.0000 3034.0900 \n",
+ "max 2147476221.0000 100000000.0000 20338986.2700 219382.0000 20338986.2700 \n",
+ "\n",
+ " usd_pledged_real usd_goal_real \n",
+ "count 378661.0000 378661.0000 \n",
+ "mean 9058.9241 45454.4015 \n",
+ "std 90973.3431 1152950.0551 \n",
+ "min 0.0000 0.0100 \n",
+ "25% 31.0000 2000.0000 \n",
+ "50% 624.3300 5500.0000 \n",
+ "75% 4050.0000 15500.0000 \n",
+ "max 20338986.2700 166361390.7100 "
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kickstarter.describe()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "1-What does all this information tell us?\n",
+ "\n",
+ " We can see which columns don't contain useful information for our predictions:\n",
+ " The ID column contains a unique identifier for each row and will not be useful for prediction.\n",
+ " \n",
+ " The name column also contains a unique identifier. Since our analysis is currently a quantitative one, we will not be using the information in this column. We might be interested in the information in this column if we were to perform natural language processing on the names.\n",
+ " \n",
+ " The category column contains highly detailed classification information. To use this information, we will need to generate dummy variables from this column. We might be creating too many dummy variables by using this column. Our goal is not to create an overcomplicated model. Therefore, we will most likely not be using the information in this column (unless our model proves to be very inaccurate without this information).\n",
+ " \n",
+ " There are multiple columns containing information about the total amount pledged. These columns may prove to be highly correlated. Therefore, we should probably only keep one.\n",
+ " \n",
+ " There seems to be a close relationship between country and currency. We should consider dropping one of those columns as well.\n",
+ "\n",
+ "2-The date columns (launched and deadline) will be transformed into a column measuring the length of the campaign in days.\n",
+ "\n",
+ "3-The backers and goal columns are highly skewed. We will evaluate whether we should drop the outliers in these columns or keep them.\n",
+ "\n",
+ "\n",
+ "**Exploring the Variables**\n",
+ "\n",
+ "Since we intend to predict the state variable, we will start with this variable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "failed 197719\n",
+ "successful 133956\n",
+ "canceled 38779\n",
+ "undefined 3562\n",
+ "live 2799\n",
+ "suspended 1846\n",
+ "Name: state, dtype: int64"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kickstarter.state.value_counts()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can evaluate the percent of projects in each group as well by setting normalize to True in the function. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "failed 0.5222\n",
+ "successful 0.3538\n",
+ "canceled 0.1024\n",
+ "undefined 0.0094\n",
+ "live 0.0074\n",
+ "suspended 0.0049\n",
+ "Name: state, dtype: float64"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kickstarter.state.value_counts(normalize=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "It seems that about 52% of projects while about 35% have succeeded. The rest have classifications that really aren't relevant for our analysis. Therefore, we should remove these rows from our data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "failed 0.5961\n",
+ "successful 0.4039\n",
+ "Name: state, dtype: float64"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kickstarter_classify = kickstarter[kickstarter.state.isin(['failed', 'successful'])]\n",
+ "kickstarter_classify.state.value_counts(normalize=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we have a split of about 40% successful and 60% failed projects. Note that we assigned the filtered data to a new variable. It is always good practice to keep the old data around and assign transformed data to a new variable while performing exploratory data analysis. This reduces the chance of losing previous iterations of our data in case we make a mistake in our code.\n",
+ "\n",
+ "Next we look at the main_category column. We use the value_counts function to evaluate how many projects are in each category. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Film & Video 56527\n",
+ "Music 45949\n",
+ "Publishing 35445\n",
+ "Games 28521\n",
+ "Technology 27050\n",
+ "Art 25641\n",
+ "Design 25364\n",
+ "Food 22054\n",
+ "Fashion 19775\n",
+ "Theater 10242\n",
+ "Comics 9878\n",
+ "Photography 9689\n",
+ "Crafts 7818\n",
+ "Journalism 4149\n",
+ "Dance 3573\n",
+ "Name: main_category, dtype: int64"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kickstarter_classify.main_category.value_counts()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "It seems like the most popular category is Film & Video while the least popular category is Dance.\n",
+ "\n",
+ "We can use the crosstab function to see how successful projects are in each category. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ "state failed successful success_rate\n",
+ "currency \n",
+ "AUD 4610 2011 0.3037\n",
+ "CAD 8238 4137 0.3343\n",
+ "CHF 465 187 0.2868\n",
+ "DKK 567 362 0.3897\n",
+ "EUR 10496 3882 0.2700\n",
+ "GBP 17395 12081 0.4099\n",
+ "HKD 261 216 0.4528\n",
+ "JPY 16 7 0.3043\n",
+ "MXN 1015 396 0.2807\n",
+ "NOK 421 163 0.2791\n",
+ "NZD 826 448 0.3516\n",
+ "SEK 1001 509 0.3371\n",
+ "SGD 276 178 0.3921\n",
+ "USD 152132 109379 0.4183"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "currency_crosstab = pd.crosstab(kickstarter_classify.currency,kickstarter_classify.state)\n",
+ "currency_crosstab['success_rate'] = currency_crosstab.successful/(currency_crosstab.successful+currency_crosstab.failed)\n",
+ "currency_crosstab"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "It seems that none of the currencies seem to break the 50% success rate. However, it looks like it does make a difference which currency you use since some are more successful than others.\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Visualizing the Data\n",
+ "\n",
+ "It would be useful to see the distribution of project length for both successful and failed projects. To do this, we will transform the variable and then plot a side-by-side histogram.\n",
+ "\n",
+ "First, we will transform the variable. Currently the date variables are stored as text. We saw this in the output of the dtypes function. Therefore, the first step in finding the project duration is to convert both columns to a datetime type. After this conversion, we will find the difference between the columns, round it to days, and then assign this data to a new column. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "kick_classify=kickstarter_classify.copy()\n",
+ "kick_classify['launched_date'] = pd.to_datetime(kick_classify.launched)\n",
+ "kick_classify['deadline_date'] = pd.to_datetime(kick_classify.deadline)\n",
+ "kick_classify['duration'] = (kick_classify.deadline_date - kick_classify.launched_date).dt.days"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Initially, we plot the histogram of all durations.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "kick_classify.duration.hist();"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The majority of projects last around a month.\n",
+ "\n",
+ "Let's plot the successful and failed projects side by side to see if their distributions differ."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "kick_classify.duration.hist(by=kick_classify.state);"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The majority of both failed and successful projects last about a month.\n",
+ "\n",
+ "Next up is the goal in real US Dollar."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "kick_classify.usd_goal_real.hist();"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "It seems like there is an outlier that is preventing us to see the distribution.\n",
+ "\n",
+ "Perhaps if we increase the number of bins, this should give us a better picture of the distribution."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "kick_classify.usd_goal_real.hist(bins=100);"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "It looks like this still isn't enough to give us a more granular view of the distribution.\n",
+ "\n",
+ "Let's try to evaluate how many outliers there are and whether they are intentional or perhaps they should be removed.\n",
+ "\n",
+ "First, let's look at the largest value."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "166361390.71"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "max(kick_classify.usd_goal_real)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The max value is about $166 million dollars.\n",
+ "\n",
+ "Let's look at the projects asking for more than a million dollars in real USD goal."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
ID
\n",
+ "
name
\n",
+ "
category
\n",
+ "
main_category
\n",
+ "
currency
\n",
+ "
deadline
\n",
+ "
goal
\n",
+ "
launched
\n",
+ "
pledged
\n",
+ "
state
\n",
+ "
backers
\n",
+ "
country
\n",
+ "
usd pledged
\n",
+ "
usd_pledged_real
\n",
+ "
usd_goal_real
\n",
+ "
launched_date
\n",
+ "
deadline_date
\n",
+ "
duration
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
340
\n",
+ "
1001542282
\n",
+ "
You in a novel
\n",
+ "
Publishing
\n",
+ "
Publishing
\n",
+ "
EUR
\n",
+ "
2015-11-09
\n",
+ "
1000000.0000
\n",
+ "
2015-09-10 23:03:21
\n",
+ "
10.0000
\n",
+ "
failed
\n",
+ "
1
\n",
+ "
IT
\n",
+ "
11.1800
\n",
+ "
10.7600
\n",
+ "
1076403.0900
\n",
+ "
2015-09-10 23:03:21
\n",
+ "
2015-11-09
\n",
+ "
59
\n",
+ "
\n",
+ "
\n",
+ "
971
\n",
+ "
1004941506
\n",
+ "
Maori MBT Awareness Centre
\n",
+ "
Web
\n",
+ "
Journalism
\n",
+ "
CAD
\n",
+ "
2017-10-18
\n",
+ "
2000000.0000
\n",
+ "
2017-08-19 22:13:55
\n",
+ "
2242.0000
\n",
+ "
failed
\n",
+ "
19
\n",
+ "
CA
\n",
+ "
1160.6700
\n",
+ "
1794.4600
\n",
+ "
1600768.3700
\n",
+ "
2017-08-19 22:13:55
\n",
+ "
2017-10-18
\n",
+ "
59
\n",
+ "
\n",
+ "
\n",
+ "
1042
\n",
+ "
1005237669
\n",
+ "
The Old Soul of a Lion
\n",
+ "
Film & Video
\n",
+ "
Film & Video
\n",
+ "
USD
\n",
+ "
2014-10-14
\n",
+ "
3000000.0000
\n",
+ "
2014-08-15 20:16:22
\n",
+ "
4.0000
\n",
+ "
failed
\n",
+ "
2
\n",
+ "
US
\n",
+ "
4.0000
\n",
+ "
4.0000
\n",
+ "
3000000.0000
\n",
+ "
2014-08-15 20:16:22
\n",
+ "
2014-10-14
\n",
+ "
59
\n",
+ "
\n",
+ "
\n",
+ "
1144
\n",
+ "
1005820080
\n",
+ "
The Million Pound Shirt
\n",
+ "
Fashion
\n",
+ "
Fashion
\n",
+ "
GBP
\n",
+ "
2015-11-25
\n",
+ "
1000000.0000
\n",
+ "
2015-10-21 22:00:04
\n",
+ "
10.0000
\n",
+ "
failed
\n",
+ "
1
\n",
+ "
GB
\n",
+ "
15.4700
\n",
+ "
15.0500
\n",
+ "
1505185.3600
\n",
+ "
2015-10-21 22:00:04
\n",
+ "
2015-11-25
\n",
+ "
34
\n",
+ "
\n",
+ "
\n",
+ "
1795
\n",
+ "
1009207145
\n",
+ "
** GOLIATH **
\n",
+ "
Product Design
\n",
+ "
Design
\n",
+ "
CAD
\n",
+ "
2014-07-21
\n",
+ "
3850000.0000
\n",
+ "
2014-06-21 22:34:21
\n",
+ "
285.0000
\n",
+ "
failed
\n",
+ "
5
\n",
+ "
CA
\n",
+ "
263.4100
\n",
+ "
264.6700
\n",
+ "
3575408.6200
\n",
+ "
2014-06-21 22:34:21
\n",
+ "
2014-07-21
\n",
+ "
29
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ID name category main_category \\\n",
+ "340 1001542282 You in a novel Publishing Publishing \n",
+ "971 1004941506 Maori MBT Awareness Centre Web Journalism \n",
+ "1042 1005237669 The Old Soul of a Lion Film & Video Film & Video \n",
+ "1144 1005820080 The Million Pound Shirt Fashion Fashion \n",
+ "1795 1009207145 ** GOLIATH ** Product Design Design \n",
+ "\n",
+ " currency deadline goal launched pledged state \\\n",
+ "340 EUR 2015-11-09 1000000.0000 2015-09-10 23:03:21 10.0000 failed \n",
+ "971 CAD 2017-10-18 2000000.0000 2017-08-19 22:13:55 2242.0000 failed \n",
+ "1042 USD 2014-10-14 3000000.0000 2014-08-15 20:16:22 4.0000 failed \n",
+ "1144 GBP 2015-11-25 1000000.0000 2015-10-21 22:00:04 10.0000 failed \n",
+ "1795 CAD 2014-07-21 3850000.0000 2014-06-21 22:34:21 285.0000 failed \n",
+ "\n",
+ " backers country usd pledged usd_pledged_real usd_goal_real \\\n",
+ "340 1 IT 11.1800 10.7600 1076403.0900 \n",
+ "971 19 CA 1160.6700 1794.4600 1600768.3700 \n",
+ "1042 2 US 4.0000 4.0000 3000000.0000 \n",
+ "1144 1 GB 15.4700 15.0500 1505185.3600 \n",
+ "1795 5 CA 263.4100 264.6700 3575408.6200 \n",
+ "\n",
+ " launched_date deadline_date duration \n",
+ "340 2015-09-10 23:03:21 2015-11-09 59 \n",
+ "971 2017-08-19 22:13:55 2017-10-18 59 \n",
+ "1042 2014-08-15 20:16:22 2014-10-14 59 \n",
+ "1144 2015-10-21 22:00:04 2015-11-25 34 \n",
+ "1795 2014-06-21 22:34:21 2014-07-21 29 "
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kick_classify[kick_classify.usd_goal_real > 1000000].head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "These seem to be legitimate projects.\n",
+ "\n",
+ "Let's look at the success breakdown:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "failed 829\n",
+ "successful 11\n",
+ "Name: state, dtype: int64"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kick_classify[kick_classify.usd_goal_real > 1000000].state.value_counts()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Only 11 projects of the 840 projects asking for more than a million dollars were successful. Since the data seems legitimate and not erroneously entered, we will keep these rows in the dataset.\n",
+ "\n",
+ "The next step is to look at the correlation between the numeric variables to determine that there are no highly correlated variables."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
ID
\n",
+ "
goal
\n",
+ "
pledged
\n",
+ "
backers
\n",
+ "
usd pledged
\n",
+ "
usd_pledged_real
\n",
+ "
usd_goal_real
\n",
+ "
duration
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
ID
\n",
+ "
1.0000
\n",
+ "
0.0019
\n",
+ "
0.0009
\n",
+ "
0.0008
\n",
+ "
-0.0003
\n",
+ "
0.0003
\n",
+ "
0.0018
\n",
+ "
0.0028
\n",
+ "
\n",
+ "
\n",
+ "
goal
\n",
+ "
0.0019
\n",
+ "
1.0000
\n",
+ "
0.0080
\n",
+ "
0.0048
\n",
+ "
0.0064
\n",
+ "
0.0060
\n",
+ "
0.9526
\n",
+ "
0.0227
\n",
+ "
\n",
+ "
\n",
+ "
pledged
\n",
+ "
0.0009
\n",
+ "
0.0080
\n",
+ "
1.0000
\n",
+ "
0.7173
\n",
+ "
0.8580
\n",
+ "
0.9536
\n",
+ "
0.0057
\n",
+ "
0.0081
\n",
+ "
\n",
+ "
\n",
+ "
backers
\n",
+ "
0.0008
\n",
+ "
0.0048
\n",
+ "
0.7173
\n",
+ "
1.0000
\n",
+ "
0.6975
\n",
+ "
0.7523
\n",
+ "
0.0052
\n",
+ "
-0.0000
\n",
+ "
\n",
+ "
\n",
+ "
usd pledged
\n",
+ "
-0.0003
\n",
+ "
0.0064
\n",
+ "
0.8580
\n",
+ "
0.6975
\n",
+ "
1.0000
\n",
+ "
0.9077
\n",
+ "
0.0070
\n",
+ "
0.0077
\n",
+ "
\n",
+ "
\n",
+ "
usd_pledged_real
\n",
+ "
0.0003
\n",
+ "
0.0060
\n",
+ "
0.9536
\n",
+ "
0.7523
\n",
+ "
0.9077
\n",
+ "
1.0000
\n",
+ "
0.0064
\n",
+ "
0.0087
\n",
+ "
\n",
+ "
\n",
+ "
usd_goal_real
\n",
+ "
0.0018
\n",
+ "
0.9526
\n",
+ "
0.0057
\n",
+ "
0.0052
\n",
+ "
0.0070
\n",
+ "
0.0064
\n",
+ "
1.0000
\n",
+ "
0.0216
\n",
+ "
\n",
+ "
\n",
+ "
duration
\n",
+ "
0.0028
\n",
+ "
0.0227
\n",
+ "
0.0081
\n",
+ "
-0.0000
\n",
+ "
0.0077
\n",
+ "
0.0087
\n",
+ "
0.0216
\n",
+ "
1.0000
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ID goal pledged backers usd pledged \\\n",
+ "ID 1.0000 0.0019 0.0009 0.0008 -0.0003 \n",
+ "goal 0.0019 1.0000 0.0080 0.0048 0.0064 \n",
+ "pledged 0.0009 0.0080 1.0000 0.7173 0.8580 \n",
+ "backers 0.0008 0.0048 0.7173 1.0000 0.6975 \n",
+ "usd pledged -0.0003 0.0064 0.8580 0.6975 1.0000 \n",
+ "usd_pledged_real 0.0003 0.0060 0.9536 0.7523 0.9077 \n",
+ "usd_goal_real 0.0018 0.9526 0.0057 0.0052 0.0070 \n",
+ "duration 0.0028 0.0227 0.0081 -0.0000 0.0077 \n",
+ "\n",
+ " usd_pledged_real usd_goal_real duration \n",
+ "ID 0.0003 0.0018 0.0028 \n",
+ "goal 0.0060 0.9526 0.0227 \n",
+ "pledged 0.9536 0.0057 0.0081 \n",
+ "backers 0.7523 0.0052 -0.0000 \n",
+ "usd pledged 0.9077 0.0070 0.0077 \n",
+ "usd_pledged_real 1.0000 0.0064 0.0087 \n",
+ "usd_goal_real 0.0064 1.0000 0.0216 \n",
+ "duration 0.0087 0.0216 1.0000 "
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kick_classify.corr()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The most correlated variables are USD pledged and USD pledged real and goal and USD goal real. Pledged and backers are moderately correlated with a correlation of 0.7173. Since the more backers we have, the more pledged money we have, we are better off removing that variable as well.\n",
+ "\n",
+ "Before creating our model, we should ensure that there is no missing data. Some models will not produce a meaningful result with missing data. If there is a significant amount of missing data, then we should come up with a meaningful strategy to address the missing data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "ID 0\n",
+ "name 3\n",
+ "category 0\n",
+ "main_category 0\n",
+ "currency 0\n",
+ "deadline 0\n",
+ "goal 0\n",
+ "launched 0\n",
+ "pledged 0\n",
+ "state 0\n",
+ "backers 0\n",
+ "country 0\n",
+ "usd pledged 210\n",
+ "usd_pledged_real 0\n",
+ "usd_goal_real 0\n",
+ "launched_date 0\n",
+ "deadline_date 0\n",
+ "duration 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kick_classify.isnull().sum(axis = 0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The only variable containing missing data is the amount of pledged dollars. This confirms that we should remove this column.\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Preparing the Data\n",
+ "\n",
+ "At this point we will start to prepare the data for applying ML algorithms to the data.\n",
+ "\n",
+ "The first step is to pick only the columns that we decided to keep as well as separating the data to predictor (x) and response (y) variables. We use the get dummies function on the response variables to convert them from categorical values to a variable containing zeros and ones. We use the drop_first option to ensure that we only get one column (since for n values, the drop_first option will create n-1 variable) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "kickstarter_variables = kick_classify[['usd_goal_real', 'backers', 'main_category', 'duration', 'currency']]\n",
+ "kickstarter_y = pd.get_dummies(data=kickstarter_classify['state'], drop_first=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The next step in our data processing is to convert the categorical variables to dummy variables using the get_dummies function. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
usd_goal_real
\n",
+ "
backers
\n",
+ "
duration
\n",
+ "
main_category_Comics
\n",
+ "
main_category_Crafts
\n",
+ "
main_category_Dance
\n",
+ "
main_category_Design
\n",
+ "
main_category_Fashion
\n",
+ "
main_category_Film & Video
\n",
+ "
main_category_Food
\n",
+ "
...
\n",
+ "
currency_EUR
\n",
+ "
currency_GBP
\n",
+ "
currency_HKD
\n",
+ "
currency_JPY
\n",
+ "
currency_MXN
\n",
+ "
currency_NOK
\n",
+ "
currency_NZD
\n",
+ "
currency_SEK
\n",
+ "
currency_SGD
\n",
+ "
currency_USD
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
1533.9500
\n",
+ "
0
\n",
+ "
58
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
...
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
30000.0000
\n",
+ "
15
\n",
+ "
59
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
...
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
45000.0000
\n",
+ "
3
\n",
+ "
44
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
...
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
5000.0000
\n",
+ "
1
\n",
+ "
29
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
...
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
5
\n",
+ "
50000.0000
\n",
+ "
224
\n",
+ "
34
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
...
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 30 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " usd_goal_real backers duration main_category_Comics \\\n",
+ "0 1533.9500 0 58 0 \n",
+ "1 30000.0000 15 59 0 \n",
+ "2 45000.0000 3 44 0 \n",
+ "3 5000.0000 1 29 0 \n",
+ "5 50000.0000 224 34 0 \n",
+ "\n",
+ " main_category_Crafts main_category_Dance main_category_Design \\\n",
+ "0 0 0 0 \n",
+ "1 0 0 0 \n",
+ "2 0 0 0 \n",
+ "3 0 0 0 \n",
+ "5 0 0 0 \n",
+ "\n",
+ " main_category_Fashion main_category_Film & Video main_category_Food ... \\\n",
+ "0 0 0 0 ... \n",
+ "1 0 1 0 ... \n",
+ "2 0 1 0 ... \n",
+ "3 0 0 0 ... \n",
+ "5 0 0 1 ... \n",
+ "\n",
+ " currency_EUR currency_GBP currency_HKD currency_JPY currency_MXN \\\n",
+ "0 0 1 0 0 0 \n",
+ "1 0 0 0 0 0 \n",
+ "2 0 0 0 0 0 \n",
+ "3 0 0 0 0 0 \n",
+ "5 0 0 0 0 0 \n",
+ "\n",
+ " currency_NOK currency_NZD currency_SEK currency_SGD currency_USD \n",
+ "0 0 0 0 0 0 \n",
+ "1 0 0 0 0 1 \n",
+ "2 0 0 0 0 1 \n",
+ "3 0 0 0 0 1 \n",
+ "5 0 0 0 0 1 \n",
+ "\n",
+ "[5 rows x 30 columns]"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "kickstarter_x = pd.get_dummies(data=kickstarter_variables, columns=['main_category', 'currency'], drop_first=True)\n",
+ "kickstarter_x.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Using the head function shows us that we have increased the number of columns from the 5 that we initially selected to 30 columns total.\n",
+ "\n",
+ "The final step in the processing phase is to separate the data into test and train datasets. We do this to ensure that our model performs well even on the data that was not used for training. This is how we reduce overfitting. We randomly select 80% of the data for the training dataset and the remaining 20% is used for the test dataset."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = train_test_split(kickstarter_x, kickstarter_y.values, test_size=0.2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Creating the Model\n",
+ "\n",
+ "Since this is a classification problem, there are a number of algorithms at our disposal. Logistic regression is a good choice for our problem. Another good choice is random forest. SVM is also a suitable option for this type of problem. However, due to how SVM is implemented in scikit-learn, it is not recommended to use this algorithm on data with more than 10000 rows. Therefore, we will avoid using this algorithm for now, even though it is otherwise a good choice for this type of problem.\n",
+ "\n",
+ "\n",
+ "**Logistic Regression**\n",
+ "\n",
+ "First we generate our model and then we will proceed to evaluate it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.linear_model import LogisticRegression\n",
+ "\n",
+ "y_train=y_train.reshape(len(y_train),)\n",
+ "\n",
+ "ks_model = LogisticRegression(solver='lbfgs', max_iter=200).fit(X_train, y_train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "One way to evaluate the model is using a confusion matrix. The confusion matrix specifies how many observations were correctly classified and how many were incorrectly classified.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[37681, 1858],\n",
+ " [ 4533, 22263]])"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.metrics import confusion_matrix\n",
+ "\n",
+ "y_pred_test = ks_model.predict(X_test)\n",
+ "confusion_matrix(y_test, y_pred_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The first entry in our matrix is the number of observations correctly classified as 0 (or failure). The second entry in the matrix are all entries incorrectly classified as 1 (or success). These observations are actually zeros but our algorithm classified them as 1. The third entry contains the count of all observations incorrectly classified as zero (or failure). The last entry contains the count of observations correctly classified as 1. Our goal is to maximize the first and last entries (the correctly classified observations) and minimize the incorrectly classified information. As we can see, out of 66335 observations, 60048 (or 90.5%) are correctly classified.\n",
+ "\n",
+ "We have previously looked at the ROC curve. Recall that this curve is a measure of describing how well our algorithm classifies the data. The better our classification algorithm, the larger the area under the curve (also known as AUC=Area Under the Curve).\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import warnings\n",
+ "warnings.filterwarnings(\"ignore\", category=RuntimeWarning) \n",
+ "\n",
+ "from sklearn import metrics\n",
+ "\n",
+ "y_pred_proba = ks_model.predict_proba(X_test)[::,1]\n",
+ "fpr, tpr, _ = metrics.roc_curve(y_test, y_pred_proba)\n",
+ "auc = metrics.roc_auc_score(y_test, y_pred_proba)\n",
+ "\n",
+ "plt.plot(fpr,tpr);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9568587216249149"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "auc"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The area under the curve is over 0.95. This is a decent number, but perhaps we could do better with a different algorithm.\n",
+ "\n",
+ "\n",
+ "**Random Forest**\n",
+ "\n",
+ "Random forest is an ensemble algorithm. This means that it resamples the data multiple times and generates a decision tree from each sample. We then think of the trees as a group of algorithms. We base our decision on the outcome of the majority of algorithms in the ensemble."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "\n",
+ "ks_rf = RandomForestClassifier(n_estimators=100).fit(X_train, y_train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here is our confusion matrix:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[36889, 2650],\n",
+ " [ 2437, 24359]])"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_pred_test_rf = ks_rf.predict(X_test)\n",
+ "confusion_matrix(y_test, y_pred_test_rf)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's plot the ROC curve for the random forest that we have generated."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "y_pred_proba_rf = ks_rf.predict_proba(X_test)[::,1]\n",
+ "fpr, tpr, _ = metrics.roc_curve(y_test, y_pred_proba_rf)\n",
+ "auc = metrics.roc_auc_score(y_test, y_pred_proba_rf)\n",
+ "\n",
+ "plt.plot(fpr,tpr);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9745193821360216"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "auc"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "While our AUC was already high, we have improved the score using the random forest algorithm."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/your-code/.ipynb_checkpoints/main-checkpoint.ipynb b/your-code/.ipynb_checkpoints/main-checkpoint.ipynb
new file mode 100755
index 0000000..9f41d9d
--- /dev/null
+++ b/your-code/.ipynb_checkpoints/main-checkpoint.ipynb
@@ -0,0 +1,2501 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Before your start:\n",
+ "- Read the README.md file\n",
+ "- Comment as much as you can and use the resources in the README.md file\n",
+ "- Happy learning!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import your libraries:\n",
+ "\n",
+ "%matplotlib inline\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this lab, we will explore a dataset that describes websites with different features and labels them either benign or malicious . We will use supervised learning algorithms to figure out what feature patterns malicious websites are likely to have and use our model to predict malicious websites.\n",
+ "\n",
+ "# Challenge 1 - Explore The Dataset\n",
+ "\n",
+ "Let's start by exploring the dataset. First load the data file:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "websites = pd.read_csv('../website.csv')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Explore the data from an bird's-eye view.\n",
+ "\n",
+ "You should already been very familiar with the procedures now so we won't provide the instructions step by step. Reflect on what you did in the previous labs and explore the dataset.\n",
+ "\n",
+ "Things you'll be looking for:\n",
+ "\n",
+ "* What the dataset looks like?\n",
+ "* What are the data types?\n",
+ "* Which columns contain the features of the websites?\n",
+ "* Which column contains the feature we will predict? What is the code standing for benign vs malicious websites?\n",
+ "* Do we need to transform any of the columns from categorical to ordinal values? If so what are these columns?\n",
+ "\n",
+ "Feel free to add additional cells for your explorations. Make sure to comment what you find out."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.heatmap(websites.corr())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your comment here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Challenge 2 - Remove Column Collinearity.\n",
+ "\n",
+ "From the heatmap you created, you should have seen at least 3 columns that can be removed due to high collinearity. Remove these columns from the dataset.\n",
+ "\n",
+ "Note that you should remove as few columns as you can. You don't have to remove all the columns at once. But instead, try removing one column, then produce the heatmap again to determine if additional columns should be removed. As long as the dataset no longer contains columns that are correlated for over 90%, you can stop. Also, keep in mind when two columns have high collinearity, you only need to remove one of them but not both.\n",
+ "\n",
+ "In the cells below, remove as few columns as you can to eliminate the high collinearity in the dataset. Make sure to comment on your way so that the instructional team can learn about your thinking process which allows them to give feedback. At the end, print the heatmap again."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here\n",
+ "websites.drop(['SOURCE_APP_PACKETS','NUMBER_SPECIAL_CHARACTERS','APP_BYTES','TCP_CONVERSATION_EXCHANGE','SOURCE_APP_PACKETS'], axis=1, inplace = True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your comment here"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Print heatmap again\n",
+ "sns.heatmap(websites.corr())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Challenge 3 - Handle Missing Values\n",
+ "\n",
+ "The next step would be handling missing values. **We start by examining the number of missing values in each column, which you will do in the next cell.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "URL 0\n",
+ "URL_LENGTH 0\n",
+ "CHARSET 0\n",
+ "SERVER 1\n",
+ "CONTENT_LENGTH 812\n",
+ "WHOIS_COUNTRY 0\n",
+ "WHOIS_STATEPRO 0\n",
+ "WHOIS_REGDATE 0\n",
+ "WHOIS_UPDATED_DATE 0\n",
+ "DIST_REMOTE_TCP_PORT 0\n",
+ "REMOTE_IPS 0\n",
+ "REMOTE_APP_PACKETS 0\n",
+ "SOURCE_APP_BYTES 0\n",
+ "REMOTE_APP_BYTES 0\n",
+ "APP_PACKETS 0\n",
+ "DNS_QUERY_TIMES 1\n",
+ "Type 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Your code here\n",
+ "websites.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If you remember in the previous labs, we drop a column if the column contains a high proportion of missing values. After dropping those problematic columns, we drop the rows with missing values.\n",
+ "\n",
+ "#### In the cells below, handle the missing values from the dataset. Remember to comment the rationale of your decisions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here\n",
+ "websites = websites.dropna(axis = 0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your comment here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Again, examine the number of missing values in each column. \n",
+ "\n",
+ "If all cleaned, proceed. Otherwise, go back and do more cleaning."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "URL 0\n",
+ "URL_LENGTH 0\n",
+ "CHARSET 0\n",
+ "SERVER 0\n",
+ "CONTENT_LENGTH 0\n",
+ "WHOIS_COUNTRY 0\n",
+ "WHOIS_STATEPRO 0\n",
+ "WHOIS_REGDATE 0\n",
+ "WHOIS_UPDATED_DATE 0\n",
+ "DIST_REMOTE_TCP_PORT 0\n",
+ "REMOTE_IPS 0\n",
+ "REMOTE_APP_PACKETS 0\n",
+ "SOURCE_APP_BYTES 0\n",
+ "REMOTE_APP_BYTES 0\n",
+ "APP_PACKETS 0\n",
+ "DNS_QUERY_TIMES 0\n",
+ "Type 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Examine missing values in each column\n",
+ "websites.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Challenge 4 - Handle `WHOIS_*` Categorical Data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "There are several categorical columns we need to handle. These columns are:\n",
+ "\n",
+ "* `URL`\n",
+ "* `CHARSET`\n",
+ "* `SERVER`\n",
+ "* `WHOIS_COUNTRY`\n",
+ "* `WHOIS_STATEPRO`\n",
+ "* `WHOIS_REGDATE`\n",
+ "* `WHOIS_UPDATED_DATE`\n",
+ "\n",
+ "How to handle string columns is always case by case. Let's start by working on `WHOIS_COUNTRY`. Your steps are:\n",
+ "\n",
+ "1. List out the unique values of `WHOIS_COUNTRY`.\n",
+ "1. Consolidate the country values with consistent country codes. For example, the following values refer to the same country and should use consistent country code:\n",
+ " * `CY` and `Cyprus`\n",
+ " * `US` and `us`\n",
+ " * `SE` and `se`\n",
+ " * `GB`, `United Kingdom`, and `[u'GB'; u'UK']`\n",
+ "\n",
+ "#### In the cells below, fix the country values as intructed above."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "US 589\n",
+ "None 208\n",
+ "CA 45\n",
+ "AU 16\n",
+ "GB 15\n",
+ "PA 10\n",
+ "CH 6\n",
+ "IN 6\n",
+ "UK 6\n",
+ "JP 6\n",
+ "[u'GB'; u'UK'] 5\n",
+ "AT 4\n",
+ "KR 3\n",
+ "FR 3\n",
+ "TR 3\n",
+ "CN 3\n",
+ "BS 2\n",
+ "UA 2\n",
+ "NO 2\n",
+ "BR 2\n",
+ "UY 2\n",
+ "NL 2\n",
+ "HK 2\n",
+ "IL 2\n",
+ "us 2\n",
+ "DE 2\n",
+ "Cyprus 2\n",
+ "BE 2\n",
+ "SC 2\n",
+ "AE 1\n",
+ "CZ 1\n",
+ "IE 1\n",
+ "SI 1\n",
+ "se 1\n",
+ "BY 1\n",
+ "SE 1\n",
+ "KY 1\n",
+ "RU 1\n",
+ "IT 1\n",
+ "PH 1\n",
+ "United Kingdom 1\n",
+ "UG 1\n",
+ "Name: WHOIS_COUNTRY, dtype: int64"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Your code here\n",
+ "websites['WHOIS_COUNTRY'].value_counts()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ ":4: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " websites.WHOIS_COUNTRY[websites.WHOIS_COUNTRY.str.contains(\"UK\")] = 'United Kingdom'\n"
+ ]
+ }
+ ],
+ "source": [
+ "websites['WHOIS_COUNTRY'] = websites['WHOIS_COUNTRY'].replace('Cyprus','CY')\n",
+ "websites['WHOIS_COUNTRY'] = websites['WHOIS_COUNTRY'].replace('us','US')\n",
+ "websites['WHOIS_COUNTRY'] = websites['WHOIS_COUNTRY'].replace('se','SE')\n",
+ "websites.WHOIS_COUNTRY[websites.WHOIS_COUNTRY.str.contains(\"UK\")] = 'United Kingdom'\n",
+ "websites['WHOIS_COUNTRY'] = websites['WHOIS_COUNTRY'].replace('GB','United Kingdom')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "US 591\n",
+ "None 208\n",
+ "CA 45\n",
+ "United Kingdom 27\n",
+ "AU 16\n",
+ "PA 10\n",
+ "IN 6\n",
+ "JP 6\n",
+ "CH 6\n",
+ "AT 4\n",
+ "CN 3\n",
+ "FR 3\n",
+ "KR 3\n",
+ "TR 3\n",
+ "BS 2\n",
+ "SE 2\n",
+ "HK 2\n",
+ "NO 2\n",
+ "BR 2\n",
+ "UY 2\n",
+ "NL 2\n",
+ "SC 2\n",
+ "IL 2\n",
+ "DE 2\n",
+ "CY 2\n",
+ "BE 2\n",
+ "UA 2\n",
+ "AE 1\n",
+ "CZ 1\n",
+ "IE 1\n",
+ "SI 1\n",
+ "BY 1\n",
+ "UG 1\n",
+ "RU 1\n",
+ "IT 1\n",
+ "PH 1\n",
+ "KY 1\n",
+ "Name: WHOIS_COUNTRY, dtype: int64"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "websites['WHOIS_COUNTRY'].value_counts()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Since we have fixed the country values, can we convert this column to ordinal now?\n",
+ "\n",
+ "Not yet. If you reflect on the previous labs how we handle categorical columns, you probably remember we ended up dropping a lot of those columns because there are too many unique values. Too many unique values in a column is not desirable in machine learning because it makes prediction inaccurate. But there are workarounds under certain conditions. One of the fixable conditions is:\n",
+ "\n",
+ "#### If a limited number of values account for the majority of data, we can retain these top values and re-label all other rare values.\n",
+ "\n",
+ "The `WHOIS_COUNTRY` column happens to be this case. You can verify it by print a bar chart of the `value_counts` in the next cell to verify:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "US 591\n",
+ "None 208\n",
+ "CA 45\n",
+ "United Kingdom 27\n",
+ "AU 16\n",
+ "PA 10\n",
+ "IN 6\n",
+ "JP 6\n",
+ "CH 6\n",
+ "AT 4\n",
+ "CN 3\n",
+ "FR 3\n",
+ "KR 3\n",
+ "TR 3\n",
+ "BS 2\n",
+ "SE 2\n",
+ "HK 2\n",
+ "NO 2\n",
+ "BR 2\n",
+ "UY 2\n",
+ "NL 2\n",
+ "SC 2\n",
+ "IL 2\n",
+ "DE 2\n",
+ "CY 2\n",
+ "BE 2\n",
+ "UA 2\n",
+ "AE 1\n",
+ "CZ 1\n",
+ "IE 1\n",
+ "SI 1\n",
+ "BY 1\n",
+ "UG 1\n",
+ "RU 1\n",
+ "IT 1\n",
+ "PH 1\n",
+ "KY 1\n",
+ "Name: WHOIS_COUNTRY, dtype: int64"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Your code here\n",
+ "\n",
+ "websites['WHOIS_COUNTRY'].value_counts()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### After verifying, now let's keep the top 10 values of the column and re-label other columns with `OTHER`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['US',\n",
+ " 'None',\n",
+ " 'CA',\n",
+ " 'United Kingdom',\n",
+ " 'AU',\n",
+ " 'PA',\n",
+ " 'IN',\n",
+ " 'JP',\n",
+ " 'CH',\n",
+ " 'AT',\n",
+ " 'CN']"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Your code here\n",
+ "\n",
+ "top10_country = pd.DataFrame(websites['WHOIS_COUNTRY'].value_counts().nlargest(11)).reset_index()\n",
+ "country10 = list(top10_country['index'])\n",
+ "country10"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now since `WHOIS_COUNTRY` has been re-labelled, we don't need `WHOIS_STATEPRO` any more because the values of the states or provinces may not be relevant any more. We'll drop this column.\n",
+ "\n",
+ "In addition, we will also drop `WHOIS_REGDATE` and `WHOIS_UPDATED_DATE`. These are the registration and update dates of the website domains. Not of our concerns.\n",
+ "\n",
+ "#### In the next cell, drop `['WHOIS_STATEPRO', 'WHOIS_REGDATE', 'WHOIS_UPDATED_DATE']`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here\n",
+ "websites['WHOIS_COUNTRY'] = websites['WHOIS_COUNTRY'].apply(lambda x: 'OTHER' if x not in country10 else x)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['None', 'US', 'United Kingdom', 'OTHER', 'AU', 'CA', 'PA', 'IN',\n",
+ " 'JP', 'AT', 'CN', 'CH'], dtype=object)"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "websites['WHOIS_COUNTRY'].unique()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "websites =websites.drop(['WHOIS_STATEPRO', 'WHOIS_REGDATE', 'WHOIS_UPDATED_DATE'], axis = 1)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Challenge 5 - Handle Remaining Categorical Data & Convert to Ordinal\n",
+ "\n",
+ "Now print the `dtypes` of the data again. Besides `WHOIS_COUNTRY` which we already fixed, there should be 3 categorical columns left: `URL`, `CHARSET`, and `SERVER`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Int64Index: 967 entries, 0 to 1780\n",
+ "Data columns (total 14 columns):\n",
+ " # Column Non-Null Count Dtype \n",
+ "--- ------ -------------- ----- \n",
+ " 0 URL 967 non-null object \n",
+ " 1 URL_LENGTH 967 non-null int64 \n",
+ " 2 CHARSET 967 non-null object \n",
+ " 3 SERVER 967 non-null object \n",
+ " 4 CONTENT_LENGTH 967 non-null float64\n",
+ " 5 WHOIS_COUNTRY 967 non-null object \n",
+ " 6 DIST_REMOTE_TCP_PORT 967 non-null int64 \n",
+ " 7 REMOTE_IPS 967 non-null int64 \n",
+ " 8 REMOTE_APP_PACKETS 967 non-null int64 \n",
+ " 9 SOURCE_APP_BYTES 967 non-null int64 \n",
+ " 10 REMOTE_APP_BYTES 967 non-null int64 \n",
+ " 11 APP_PACKETS 967 non-null int64 \n",
+ " 12 DNS_QUERY_TIMES 967 non-null float64\n",
+ " 13 Type 967 non-null int64 \n",
+ "dtypes: float64(2), int64(8), object(4)\n",
+ "memory usage: 113.3+ KB\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Your code here\n",
+ "websites.info()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### `URL` is easy. We'll simply drop it because it has too many unique values that there's no way for us to consolidate."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here\n",
+ "websites = websites.drop(['URL'], axis = 1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Print the unique value counts of `CHARSET`. You see there are only a few unique values. So we can keep it as it is."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['iso-8859-1', 'UTF-8', 'us-ascii', 'ISO-8859-1', 'utf-8', 'None',\n",
+ " 'windows-1251', 'ISO-8859'], dtype=object)"
+ ]
+ },
+ "execution_count": 51,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Your code here\n",
+ "websites.CHARSET.unique()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "websites['CHARSET'] = websites['CHARSET'].apply(lambda x: x.upper())\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`SERVER` is a little more complicated. Print its unique values and think about how you can consolidate those values.\n",
+ "\n",
+ "#### Before you think of your own solution, don't read the instructions that come next."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['nginx', 'Apache/2.4.10', 'Microsoft-HTTPAPI/2.0', 'None',\n",
+ " 'Apache/2', 'Apache/2.2.15 (Red Hat)',\n",
+ " 'Apache/2.4.23 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4',\n",
+ " 'Apache/2.2.22', 'Apache/2.4.7 (Ubuntu)', 'Apache',\n",
+ " 'Apache/2.4.12 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4',\n",
+ " 'Oracle-iPlanet-Web-Server/7.0', 'nginx/1.6.2', 'Heptu web server',\n",
+ " 'Microsoft-IIS/7.5', 'nginx/1.12.0',\n",
+ " 'Apache/2.4.25 (cPanel) OpenSSL/1.0.1e-fips mod_bwlimited/1.4',\n",
+ " 'tsa_c', 'Apache/2.2.22 (Debian)', 'Apache/2.4.25',\n",
+ " 'Apache/2.4.25 (Amazon) PHP/7.0.14', 'GSE',\n",
+ " 'Apache/2.4.23 (Unix) OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4',\n",
+ " 'Apache/2.4.25 (Amazon) OpenSSL/1.0.1k-fips',\n",
+ " 'Apache/2.2.22 (Ubuntu)',\n",
+ " 'Apache/2.4.18 (Unix) OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4',\n",
+ " 'Apache/2.4.6 (CentOS) PHP/5.6.8', 'AmazonS3', 'ATS',\n",
+ " 'Apache/2.2.27 (CentOS)', 'CherryPy/3.6.0',\n",
+ " 'Apache/2.2.15 (CentOS)', 'KHL',\n",
+ " 'Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9 PHP/5.4.16 mod_jk/1.2.40',\n",
+ " 'Apache/2.2.3 (CentOS)', 'Apache/2.4', 'Apache/2.2.31 (Amazon)',\n",
+ " 'Apache/2.4.10 (Debian)', 'Apache/2.4.12 (Ubuntu)',\n",
+ " 'Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips mod_bwlimited/1.4',\n",
+ " 'mw2232.codfw.wmnet', 'Sucuri/Cloudproxy', 'Apache/2.4.23 (Unix)',\n",
+ " 'cloudflare-nginx', 'Apache/2.0.52 (Red Hat)',\n",
+ " 'Apache/1.3.31 (Unix) PHP/4.3.9 mod_perl/1.29 rus/PL30.20',\n",
+ " 'Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 PHP/5.2.10',\n",
+ " 'ATS/5.3.0', 'Apache/2.2.3 (Red Hat)', 'nginx/1.4.3',\n",
+ " 'Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips mod_bwlimited/1.4 PHP/5.4.35',\n",
+ " 'Apache/2.2.14 (FreeBSD) mod_ssl/2.2.14 OpenSSL/0.9.8y DAV/2 PHP/5.2.12 with Suhosin-Patch',\n",
+ " 'nginx/1.8.0',\n",
+ " 'Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8e-fips-rhel5',\n",
+ " 'Microsoft-IIS/8.0', 'Apache/2.4.18 (Ubuntu)',\n",
+ " 'Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 mod_apreq2-20090110/2.8.0 mod_perl/2.0.10 Perl/v5.24.1',\n",
+ " 'Apache/2.2.20 (Unix)', 'nginx/1.11.10', 'Yippee-Ki-Yay',\n",
+ " 'mw2165.codfw.wmnet', 'Apache/2.2.23 (Amazon)', 'LiteSpeed',\n",
+ " 'Proxy Pandeiro UOL', 'openresty/1.11.2.2', 'Apache-Coyote/1.1',\n",
+ " 'mw2225.codfw.wmnet', 'nginx/1.1.19', 'Varnish',\n",
+ " 'Microsoft-IIS/8.5', 'Apache/2.4.6 (CentOS)', 'barista/5.1.3',\n",
+ " 'nginx/1.11.2', 'Apache/2.4.25 (Debian)', 'ECD (fll/0790)',\n",
+ " 'nginx/1.10.3',\n",
+ " 'Apache/2.4.25 (FreeBSD) OpenSSL/1.0.1s-freebsd PHP/5.6.30',\n",
+ " 'mw2239.codfw.wmnet', 'mw2255.codfw.wmnet',\n",
+ " 'Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/1.0.1e-fips mod_bwlimited/1.4 mod_fcgid/2.3.9',\n",
+ " 'nginx/1.13.0',\n",
+ " 'Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4',\n",
+ " 'Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16',\n",
+ " 'nginx/1.11.3', 'lighttpd', 'mw2230.codfw.wmnet',\n",
+ " 'Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips', 'AkamaiGHost',\n",
+ " 'PWS/8.2.0.7', 'nginx/1.2.1',\n",
+ " 'Apache/2.2.16 (Unix) mod_ssl/2.2.16 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4',\n",
+ " 'Play', 'Apache/2.2.11 (Unix) PHP/5.2.6', 'Scratch Web Server',\n",
+ " 'nginx/1.4.6 (Ubuntu)', 'marrakesh 1.12.2', 'nginx/0.8.35',\n",
+ " 'squid/3.3.8', 'nginx/1.8.1', 'Nginx (OpenBSD)',\n",
+ " 'Zope/(2.13.16; python 2.6.8; linux2) ZServer/1.1',\n",
+ " 'Apache/2.2.26 (Unix) mod_ssl/2.2.26 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4 PHP/5.4.26',\n",
+ " 'Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8e-fips-rhel5 PHP/5.3.10',\n",
+ " 'Apache/2.2.27 (Unix) OpenAM Web Agent/4.0.1-1 mod_ssl/2.2.27 OpenSSL/1.0.1p PHP/5.3.28',\n",
+ " 'Apache/2.2.32',\n",
+ " 'Apache/2.4.6 (Unix) mod_jk/1.2.37 PHP/5.5.1 OpenSSL/1.0.1g mod_fcgid/2.3.9',\n",
+ " 'mw2106.codfw.wmnet', 'Microsoft-IIS/7.0',\n",
+ " 'Aeria Games & Entertainment',\n",
+ " 'Apache/2.4.10 (Debian) PHP/5.6.30-0+deb8u1 mod_perl/2.0.9dev Perl/v5.20.2',\n",
+ " 'mw2173.codfw.wmnet',\n",
+ " 'Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9 Communique/4.2.0',\n",
+ " 'Apache/2.2.15 (CentOS) DAV/2 mod_ssl/2.2.15 OpenSSL/1.0.1e-fips PHP/5.3.3',\n",
+ " 'Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/7.0.14', 'Server',\n",
+ " 'Apache/2.4.6 (Unix) mod_jk/1.2.37', 'Cowboy',\n",
+ " 'Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8a',\n",
+ " 'Apache/2.4.10 (Ubuntu)', 'mw2257.codfw.wmnet', 'DMS/1.0.42',\n",
+ " 'Application-Server', 'mw2177.codfw.wmnet', 'lighttpd/1.4.28',\n",
+ " 'mw2197.codfw.wmnet',\n",
+ " 'Apache/2.2.31 (FreeBSD) PHP/5.4.15 mod_ssl/2.2.31 OpenSSL/1.0.2d DAV/2',\n",
+ " 'Apache/2.2.26 (Unix) mod_ssl/2.2.26 OpenSSL/1.0.1e-fips DAV/2 mod_bwlimited/1.4',\n",
+ " '294', 'Microsoft-IIS/6.0', 'www.lexisnexis.com 9999',\n",
+ " 'nginx/0.8.38', 'mw2238.codfw.wmnet', 'XXXXXXXXXXXXXXXXXXXXXX',\n",
+ " 'Pizza/pepperoni', 'MI', 'Roxen/5.4.98-r2', 'nginx/1.10.1',\n",
+ " 'mw2180.codfw.wmnet', 'nginx/1.9.13', 'nginx/1.7.12',\n",
+ " 'Apache/2.0.63 (Unix) mod_ssl/2.0.63 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 PHP/5.3.6',\n",
+ " 'Boston.com Frontend', 'My Arse',\n",
+ " 'Apache/2.4.17 (Unix) OpenSSL/1.0.1e-fips PHP/5.6.19',\n",
+ " 'Microsoft-IIS/7.5; litigation_essentials.lexisnexis.com 9999',\n",
+ " 'Apache/2.2.16 (Debian)'], dtype=object)"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Your code here\n",
+ "websites.SERVER.unique()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your comment here\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Although there are so many unique values in the `SERVER` column, there are actually only 3 main server types: `Microsoft`, `Apache`, and `nginx`. Just check if each `SERVER` value contains any of those server types and re-label them. For `SERVER` values that don't contain any of those substrings, label with `Other`.\n",
+ "\n",
+ "At the end, your `SERVER` column should only contain 4 unique values: `Microsoft`, `Apache`, `nginx`, and `Other`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here\n",
+ "websites['SERVER'] = websites['SERVER'].fillna('Other')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ ":2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " websites['SERVER'][websites.SERVER.str.contains('Apache')] = 'Apache'\n",
+ ":3: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " websites['SERVER'][websites.SERVER.str.contains('Microsoft')] = 'Microsoft'\n",
+ ":4: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " websites['SERVER'][websites.SERVER.str.contains('nginx')] = 'nginx'\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Count `SERVER` value counts here\n",
+ "websites['SERVER'][websites.SERVER.str.contains('Apache')] = 'Apache'\n",
+ "websites['SERVER'][websites.SERVER.str.contains('Microsoft')] = 'Microsoft'\n",
+ "websites['SERVER'][websites.SERVER.str.contains('nginx')] = 'nginx'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "websites['SERVER'] = websites['SERVER'].apply(lambda x: 'Other' if (x != 'Apache') & (x != 'Microsoft') & (x != 'nginx') else x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "OK, all our categorical data are fixed now. **Let's convert them to ordinal data using Pandas' `get_dummies` function ([documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html)).** Make sure you drop the categorical columns by passing `drop_first=True` to `get_dummies` as we don't need them any more. **Also, assign the data with dummy values to a new variable `website_dummy`.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Int64Index: 967 entries, 0 to 1780\n",
+ "Data columns (total 13 columns):\n",
+ " # Column Non-Null Count Dtype \n",
+ "--- ------ -------------- ----- \n",
+ " 0 URL_LENGTH 967 non-null int64 \n",
+ " 1 CHARSET 967 non-null object \n",
+ " 2 SERVER 967 non-null object \n",
+ " 3 CONTENT_LENGTH 967 non-null float64\n",
+ " 4 WHOIS_COUNTRY 967 non-null object \n",
+ " 5 DIST_REMOTE_TCP_PORT 967 non-null int64 \n",
+ " 6 REMOTE_IPS 967 non-null int64 \n",
+ " 7 REMOTE_APP_PACKETS 967 non-null int64 \n",
+ " 8 SOURCE_APP_BYTES 967 non-null int64 \n",
+ " 9 REMOTE_APP_BYTES 967 non-null int64 \n",
+ " 10 APP_PACKETS 967 non-null int64 \n",
+ " 11 DNS_QUERY_TIMES 967 non-null float64\n",
+ " 12 Type 967 non-null int64 \n",
+ "dtypes: float64(2), int64(8), object(3)\n",
+ "memory usage: 105.8+ KB\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Your code here\n",
+ "websites.info()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now, inspect `website_dummy` to make sure the data and types are intended - there shouldn't be any categorical columns at this point."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here\n",
+ "website_dummy = websites.filter(['CHARSET','SERVER','WHOIS_COUNTRY'], axis=1)\n",
+ "website_dummy = pd.get_dummies(website_dummy, drop_first=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
CHARSET_ISO-8859-1
\n",
+ "
CHARSET_NONE
\n",
+ "
CHARSET_US-ASCII
\n",
+ "
CHARSET_UTF-8
\n",
+ "
CHARSET_WINDOWS-1251
\n",
+ "
SERVER_Microsoft
\n",
+ "
SERVER_Other
\n",
+ "
SERVER_nginx
\n",
+ "
WHOIS_COUNTRY_AU
\n",
+ "
WHOIS_COUNTRY_CA
\n",
+ "
WHOIS_COUNTRY_CH
\n",
+ "
WHOIS_COUNTRY_CN
\n",
+ "
WHOIS_COUNTRY_IN
\n",
+ "
WHOIS_COUNTRY_JP
\n",
+ "
WHOIS_COUNTRY_None
\n",
+ "
WHOIS_COUNTRY_OTHER
\n",
+ "
WHOIS_COUNTRY_PA
\n",
+ "
WHOIS_COUNTRY_US
\n",
+ "
WHOIS_COUNTRY_United Kingdom
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " CHARSET_ISO-8859-1 CHARSET_NONE CHARSET_US-ASCII CHARSET_UTF-8 \\\n",
+ "0 1 0 0 0 \n",
+ "1 0 0 0 1 \n",
+ "2 0 0 1 0 \n",
+ "3 1 0 0 0 \n",
+ "4 0 0 0 1 \n",
+ "\n",
+ " CHARSET_WINDOWS-1251 SERVER_Microsoft SERVER_Other SERVER_nginx \\\n",
+ "0 0 0 0 1 \n",
+ "1 0 0 0 0 \n",
+ "2 0 1 0 0 \n",
+ "3 0 0 0 1 \n",
+ "4 0 0 1 0 \n",
+ "\n",
+ " WHOIS_COUNTRY_AU WHOIS_COUNTRY_CA WHOIS_COUNTRY_CH WHOIS_COUNTRY_CN \\\n",
+ "0 0 0 0 0 \n",
+ "1 0 0 0 0 \n",
+ "2 0 0 0 0 \n",
+ "3 0 0 0 0 \n",
+ "4 0 0 0 0 \n",
+ "\n",
+ " WHOIS_COUNTRY_IN WHOIS_COUNTRY_JP WHOIS_COUNTRY_None \\\n",
+ "0 0 0 1 \n",
+ "1 0 0 1 \n",
+ "2 0 0 1 \n",
+ "3 0 0 0 \n",
+ "4 0 0 0 \n",
+ "\n",
+ " WHOIS_COUNTRY_OTHER WHOIS_COUNTRY_PA WHOIS_COUNTRY_US \\\n",
+ "0 0 0 0 \n",
+ "1 0 0 0 \n",
+ "2 0 0 0 \n",
+ "3 0 0 1 \n",
+ "4 0 0 1 \n",
+ "\n",
+ " WHOIS_COUNTRY_United Kingdom \n",
+ "0 0 \n",
+ "1 0 \n",
+ "2 0 \n",
+ "3 0 \n",
+ "4 0 "
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "website_dummy.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "websites_final = pd.concat([websites, website_dummy], axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "websites_final = websites_final.drop(columns = ['CHARSET','SERVER','WHOIS_COUNTRY'], axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 73,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Int64Index: 967 entries, 0 to 1780\n",
+ "Data columns (total 29 columns):\n",
+ " # Column Non-Null Count Dtype \n",
+ "--- ------ -------------- ----- \n",
+ " 0 URL_LENGTH 967 non-null int64 \n",
+ " 1 CONTENT_LENGTH 967 non-null float64\n",
+ " 2 DIST_REMOTE_TCP_PORT 967 non-null int64 \n",
+ " 3 REMOTE_IPS 967 non-null int64 \n",
+ " 4 REMOTE_APP_PACKETS 967 non-null int64 \n",
+ " 5 SOURCE_APP_BYTES 967 non-null int64 \n",
+ " 6 REMOTE_APP_BYTES 967 non-null int64 \n",
+ " 7 APP_PACKETS 967 non-null int64 \n",
+ " 8 DNS_QUERY_TIMES 967 non-null float64\n",
+ " 9 Type 967 non-null int64 \n",
+ " 10 CHARSET_ISO-8859-1 967 non-null uint8 \n",
+ " 11 CHARSET_NONE 967 non-null uint8 \n",
+ " 12 CHARSET_US-ASCII 967 non-null uint8 \n",
+ " 13 CHARSET_UTF-8 967 non-null uint8 \n",
+ " 14 CHARSET_WINDOWS-1251 967 non-null uint8 \n",
+ " 15 SERVER_Microsoft 967 non-null uint8 \n",
+ " 16 SERVER_Other 967 non-null uint8 \n",
+ " 17 SERVER_nginx 967 non-null uint8 \n",
+ " 18 WHOIS_COUNTRY_AU 967 non-null uint8 \n",
+ " 19 WHOIS_COUNTRY_CA 967 non-null uint8 \n",
+ " 20 WHOIS_COUNTRY_CH 967 non-null uint8 \n",
+ " 21 WHOIS_COUNTRY_CN 967 non-null uint8 \n",
+ " 22 WHOIS_COUNTRY_IN 967 non-null uint8 \n",
+ " 23 WHOIS_COUNTRY_JP 967 non-null uint8 \n",
+ " 24 WHOIS_COUNTRY_None 967 non-null uint8 \n",
+ " 25 WHOIS_COUNTRY_OTHER 967 non-null uint8 \n",
+ " 26 WHOIS_COUNTRY_PA 967 non-null uint8 \n",
+ " 27 WHOIS_COUNTRY_US 967 non-null uint8 \n",
+ " 28 WHOIS_COUNTRY_United Kingdom 967 non-null uint8 \n",
+ "dtypes: float64(2), int64(8), uint8(19)\n",
+ "memory usage: 101.0 KB\n"
+ ]
+ }
+ ],
+ "source": [
+ "websites_final.info()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Challenge 6 - Modeling, Prediction, and Evaluation\n",
+ "\n",
+ "We'll start off this section by splitting the data to train and test. **Name your 4 variables `X_train`, `X_test`, `y_train`, and `y_test`. Select 80% of the data for training and 20% for testing.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 82,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "# Your code here:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "websites = websites.drop(columns = ['CHARSET','SERVER','WHOIS_COUNTRY'], axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 79,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Int64Index: 967 entries, 0 to 1780\n",
+ "Data columns (total 10 columns):\n",
+ " # Column Non-Null Count Dtype \n",
+ "--- ------ -------------- ----- \n",
+ " 0 URL_LENGTH 967 non-null int64 \n",
+ " 1 CONTENT_LENGTH 967 non-null float64\n",
+ " 2 DIST_REMOTE_TCP_PORT 967 non-null int64 \n",
+ " 3 REMOTE_IPS 967 non-null int64 \n",
+ " 4 REMOTE_APP_PACKETS 967 non-null int64 \n",
+ " 5 SOURCE_APP_BYTES 967 non-null int64 \n",
+ " 6 REMOTE_APP_BYTES 967 non-null int64 \n",
+ " 7 APP_PACKETS 967 non-null int64 \n",
+ " 8 DNS_QUERY_TIMES 967 non-null float64\n",
+ " 9 Type 967 non-null int64 \n",
+ "dtypes: float64(2), int64(8)\n",
+ "memory usage: 83.1 KB\n"
+ ]
+ }
+ ],
+ "source": [
+ "websites.info()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 83,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'tts' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mX\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwebsites\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcolumns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'DNS_QUERY_TIMES'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX_test\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_test\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrain_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrandom_state\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m42\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m: name 'tts' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "y = websites['DNS_QUERY_TIMES']\n",
+ "X = websites.drop(columns = ['DNS_QUERY_TIMES'], axis = 1)\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = tts(X, y, test_size=0.2, train_size=0.8, random_state=42)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### In this lab, we will try two different models and compare our results.\n",
+ "\n",
+ "The first model we will use in this lab is logistic regression. We have previously learned about logistic regression as a classification algorithm. In the cell below, load `LogisticRegression` from scikit-learn and initialize the model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here:\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, fit the model to our training data. We have already separated our data into 4 parts. Use those in your model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here:\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "finally, import `confusion_matrix` and `accuracy_score` from `sklearn.metrics` and fit our testing data. Assign the fitted data to `y_pred` and print the confusion matrix as well as the accuracy score"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here:\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "What are your thoughts on the performance of the model? Write your conclusions below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your conclusions here:\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Our second algorithm is is K-Nearest Neighbors. \n",
+ "\n",
+ "Though is it not required, we will fit a model using the training data and then test the performance of the model using the testing data. Start by loading `KNeighborsClassifier` from scikit-learn and then initializing and fitting the model. We'll start off with a model where k=3."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here:\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To test your model, compute the predicted values for the testing sample and print the confusion matrix as well as the accuracy score."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here:\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### We'll create another K-Nearest Neighbors model with k=5. \n",
+ "\n",
+ "Initialize and fit the model below and print the confusion matrix and the accuracy score."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here:\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Did you see an improvement in the confusion matrix when increasing k to 5? Did you see an improvement in the accuracy score? Write your conclusions below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your conclusions here:\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Bonus Challenge - Feature Scaling\n",
+ "\n",
+ "Problem-solving in machine learning is iterative. You can improve your model prediction with various techniques (there is a sweetspot for the time you spend and the improvement you receive though). Now you've completed only one iteration of ML analysis. There are more iterations you can conduct to make improvements. In order to be able to do that, you will need deeper knowledge in statistics and master more data analysis techniques. In this bootcamp, we don't have time to achieve that advanced goal. But you will make constant efforts after the bootcamp to eventually get there.\n",
+ "\n",
+ "However, now we do want you to learn one of the advanced techniques which is called *feature scaling*. The idea of feature scaling is to standardize/normalize the range of independent variables or features of the data. This can make the outliers more apparent so that you can remove them. This step needs to happen during Challenge 6 after you split the training and test data because you don't want to split the data again which makes it impossible to compare your results with and without feature scaling. For general concepts about feature scaling, click [here](https://en.wikipedia.org/wiki/Feature_scaling). To read deeper, click [here](https://medium.com/greyatom/why-how-and-when-to-scale-your-features-4b30ab09db5e).\n",
+ "\n",
+ "In the next cell, attempt to improve your model prediction accuracy by means of feature scaling. A library you can utilize is `sklearn.preprocessing.RobustScaler` ([documentation](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.RobustScaler.html)). You'll use the `RobustScaler` to fit and transform your `X_train`, then transform `X_test`. You will use logistic regression to fit and predict your transformed data and obtain the accuracy score in the same way. Compare the accuracy score with your normalized data with the previous accuracy data. Is there an improvement?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Your code here"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "clase",
+ "language": "python",
+ "name": "clase"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/your-code/More Supervised Learning Models.ipynb b/your-code/More Supervised Learning Models.ipynb
index a0ecf5b..60701d9 100755
--- a/your-code/More Supervised Learning Models.ipynb
+++ b/your-code/More Supervised Learning Models.ipynb
@@ -375,7 +375,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.7.2"
+ "version": "3.8.8"
}
},
"nbformat": 4,
diff --git a/your-code/Supervised Learning Guided Lesson.ipynb b/your-code/Supervised Learning Guided Lesson.ipynb
index 2552a77..96c49b0 100755
--- a/your-code/Supervised Learning Guided Lesson.ipynb
+++ b/your-code/Supervised Learning Guided Lesson.ipynb
@@ -2325,7 +2325,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.7.2"
+ "version": "3.8.8"
}
},
"nbformat": 4,
diff --git a/your-code/main.ipynb b/your-code/main.ipynb
index 8a1bbee..9f41d9d 100755
--- a/your-code/main.ipynb
+++ b/your-code/main.ipynb
@@ -12,7 +12,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -37,7 +37,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -65,20 +65,525 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"metadata": {},
- "outputs": [],
- "source": [
- "# Your code here\n"
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "