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..63031c3 --- /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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SexLengthDiameterHeightWhole_WeightShucked_WeightVisecra_WeightShell_WeightRings
0M0.4550.3650.0950.51400.22450.10100.15015
1M0.3500.2650.0900.22550.09950.04850.0707
2F0.5300.4200.1350.67700.25650.14150.2109
3M0.4400.3650.1250.51600.21550.11400.15510
4I0.3300.2550.0800.20500.08950.03950.0557
\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.5" + } + }, + "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..42d2323 --- /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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IDnamecategorymain_categorycurrencydeadlinegoallaunchedpledgedstatebackerscountryusd pledgedusd_pledged_realusd_goal_real
01000002330The Songs of Adelaide & AbullahPoetryPublishingGBP2015-10-091000.00002015-08-11 12:12:280.0000failed0GB0.00000.00001533.9500
11000003930Greeting From Earth: ZGAC Arts Capsule For ETNarrative FilmFilm & VideoUSD2017-11-0130000.00002017-09-02 04:43:572421.0000failed15US100.00002421.000030000.0000
21000004038Where is Hank?Narrative FilmFilm & VideoUSD2013-02-2645000.00002013-01-12 00:20:50220.0000failed3US220.0000220.000045000.0000
31000007540ToshiCapital Rekordz Needs Help to Complete AlbumMusicMusicUSD2012-04-165000.00002012-03-17 03:24:111.0000failed1US1.00001.00005000.0000
41000011046Community Film Project: The Art of Neighborhoo...Film & VideoFilm & VideoUSD2015-08-2919500.00002015-07-04 08:35:031283.0000canceled14US1283.00001283.000019500.0000
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IDgoalpledgedbackersusd pledgedusd_pledged_realusd_goal_real
count378661.0000378661.0000378661.0000378661.0000374864.0000378661.0000378661.0000
mean1074731191.988849080.79159682.9793105.61757036.72899058.924145454.4015
std619086204.32261183391.259195636.0100907.185078639.745390973.34311152950.0551
min5971.00000.01000.00000.00000.00000.00000.0100
25%538263516.00002000.000030.00002.000016.980031.00002000.0000
50%1075275634.00005200.0000620.000012.0000394.7200624.33005500.0000
75%1610148624.000016000.00004076.000056.00003034.09004050.000015500.0000
max2147476221.0000100000000.000020338986.2700219382.000020338986.270020338986.2700166361390.7100
\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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
statefailedsuccessful
main_category
Art1413111510
Comics40365842
Crafts57032115
Dance12352338
Design1481410550
Fashion141825593
Film & Video3290423623
Food159696085
Games1600312518
Journalism31371012
Music2175224197
Photography63843305
Publishing2314512300
Technology206166434
Theater37086534
\n", + "
" + ], + "text/plain": [ + "state failed successful\n", + "main_category \n", + "Art 14131 11510\n", + "Comics 4036 5842\n", + "Crafts 5703 2115\n", + "Dance 1235 2338\n", + "Design 14814 10550\n", + "Fashion 14182 5593\n", + "Film & Video 32904 23623\n", + "Food 15969 6085\n", + "Games 16003 12518\n", + "Journalism 3137 1012\n", + "Music 21752 24197\n", + "Photography 6384 3305\n", + "Publishing 23145 12300\n", + "Technology 20616 6434\n", + "Theater 3708 6534" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.crosstab(kickstarter_classify.main_category,kickstarter_classify.state)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also add the success rate for each category." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
statefailedsuccessfulsuccess_rate
main_category
Art14131115100.4489
Comics403658420.5914
Crafts570321150.2705
Dance123523380.6544
Design14814105500.4159
Fashion1418255930.2828
Film & Video32904236230.4179
Food1596960850.2759
Games16003125180.4389
Journalism313710120.2439
Music21752241970.5266
Photography638433050.3411
Publishing23145123000.3470
Technology2061664340.2379
Theater370865340.6380
\n", + "
" + ], + "text/plain": [ + "state failed successful success_rate\n", + "main_category \n", + "Art 14131 11510 0.4489\n", + "Comics 4036 5842 0.5914\n", + "Crafts 5703 2115 0.2705\n", + "Dance 1235 2338 0.6544\n", + "Design 14814 10550 0.4159\n", + "Fashion 14182 5593 0.2828\n", + "Film & Video 32904 23623 0.4179\n", + "Food 15969 6085 0.2759\n", + "Games 16003 12518 0.4389\n", + "Journalism 3137 1012 0.2439\n", + "Music 21752 24197 0.5266\n", + "Photography 6384 3305 0.3411\n", + "Publishing 23145 12300 0.3470\n", + "Technology 20616 6434 0.2379\n", + "Theater 3708 6534 0.6380" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "category_crosstab = pd.crosstab(kickstarter_classify.main_category,kickstarter_classify.state)\n", + "category_crosstab['success_rate'] = category_crosstab.successful/(category_crosstab.successful+category_crosstab.failed)\n", + "category_crosstab" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Comics, music, and dance seem to be the only 3 categories where there are more successful than failed projects. While Film & Video has a success rate lower than 0.5 despite being the most popular category.\n", + "\n", + "Now we will explore the currency variable." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "USD 261511\n", + "GBP 29476\n", + "EUR 14378\n", + "CAD 12375\n", + "AUD 6621\n", + "SEK 1510\n", + "MXN 1411\n", + "NZD 1274\n", + "DKK 929\n", + "CHF 652\n", + "NOK 584\n", + "HKD 477\n", + "SGD 454\n", + "JPY 23\n", + "Name: currency, dtype: int64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "kickstarter_classify.currency.value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Clearly, the most popular currency is the US Dollar." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
statefailedsuccessfulsuccess_rate
currency
AUD461020110.3037
CAD823841370.3343
CHF4651870.2868
DKK5673620.3897
EUR1049638820.2700
GBP17395120810.4099
HKD2612160.4528
JPY1670.3043
MXN10153960.2807
NOK4211630.2791
NZD8264480.3516
SEK10015090.3371
SGD2761780.3921
USD1521321093790.4183
\n", + "
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IDnamecategorymain_categorycurrencydeadlinegoallaunchedpledgedstatebackerscountryusd pledgedusd_pledged_realusd_goal_reallaunched_datedeadline_dateduration
3401001542282You in a novelPublishingPublishingEUR2015-11-091000000.00002015-09-10 23:03:2110.0000failed1IT11.180010.76001076403.09002015-09-10 23:03:212015-11-0959
9711004941506Maori MBT Awareness CentreWebJournalismCAD2017-10-182000000.00002017-08-19 22:13:552242.0000failed19CA1160.67001794.46001600768.37002017-08-19 22:13:552017-10-1859
10421005237669The Old Soul of a LionFilm & VideoFilm & VideoUSD2014-10-143000000.00002014-08-15 20:16:224.0000failed2US4.00004.00003000000.00002014-08-15 20:16:222014-10-1459
11441005820080The Million Pound ShirtFashionFashionGBP2015-11-251000000.00002015-10-21 22:00:0410.0000failed1GB15.470015.05001505185.36002015-10-21 22:00:042015-11-2534
17951009207145** GOLIATH **Product DesignDesignCAD2014-07-213850000.00002014-06-21 22:34:21285.0000failed5CA263.4100264.67003575408.62002014-06-21 22:34:212014-07-2129
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IDgoalpledgedbackersusd pledgedusd_pledged_realusd_goal_realduration
ID1.00000.00190.00090.0008-0.00030.00030.00180.0028
goal0.00191.00000.00800.00480.00640.00600.95260.0227
pledged0.00090.00801.00000.71730.85800.95360.00570.0081
backers0.00080.00480.71731.00000.69750.75230.0052-0.0000
usd pledged-0.00030.00640.85800.69751.00000.90770.00700.0077
usd_pledged_real0.00030.00600.95360.75230.90771.00000.00640.0087
usd_goal_real0.00180.95260.00570.00520.00700.00641.00000.0216
duration0.00280.02270.0081-0.00000.00770.00870.02161.0000
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
usd_goal_realbackersdurationmain_category_Comicsmain_category_Craftsmain_category_Dancemain_category_Designmain_category_Fashionmain_category_Film & Videomain_category_Food...currency_EURcurrency_GBPcurrency_HKDcurrency_JPYcurrency_MXNcurrency_NOKcurrency_NZDcurrency_SEKcurrency_SGDcurrency_USD
01533.95000580000000...0100000000
130000.000015590000010...0000000001
245000.00003440000010...0000000001
35000.00001290000000...0000000001
550000.0000224340000001...0000000001
\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.5" + } + }, + "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..ffcc919 --- /dev/null +++ b/your-code/.ipynb_checkpoints/main-checkpoint.ipynb @@ -0,0 +1,2154 @@ +{ + "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": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
URLURL_LENGTHNUMBER_SPECIAL_CHARACTERSCHARSETSERVERCONTENT_LENGTHWHOIS_COUNTRYWHOIS_STATEPROWHOIS_REGDATEWHOIS_UPDATED_DATE...DIST_REMOTE_TCP_PORTREMOTE_IPSAPP_BYTESSOURCE_APP_PACKETSREMOTE_APP_PACKETSSOURCE_APP_BYTESREMOTE_APP_BYTESAPP_PACKETSDNS_QUERY_TIMESType
0M0_109167iso-8859-1nginx263.0NoneNone10/10/2015 18:21None...02700910115383292.01
1B0_2314166UTF-8Apache/2.4.1015087.0NoneNoneNoneNone...741230171912651230170.00
2B0_911166us-asciiMicrosoft-HTTPAPI/2.0324.0NoneNoneNoneNone...000000000.00
3B0_113176ISO-8859-1nginx162.0USAK7/10/1997 4:0012/09/2013 0:45...22338123937187844380398.00
4B0_403176UTF-8None124140.0USTX12/05/1996 0:0011/04/2017 0:00...25427861621298894586614.00
\n", + "

5 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " URL URL_LENGTH NUMBER_SPECIAL_CHARACTERS CHARSET \\\n", + "0 M0_109 16 7 iso-8859-1 \n", + "1 B0_2314 16 6 UTF-8 \n", + "2 B0_911 16 6 us-ascii \n", + "3 B0_113 17 6 ISO-8859-1 \n", + "4 B0_403 17 6 UTF-8 \n", + "\n", + " SERVER CONTENT_LENGTH WHOIS_COUNTRY WHOIS_STATEPRO \\\n", + "0 nginx 263.0 None None \n", + "1 Apache/2.4.10 15087.0 None None \n", + "2 Microsoft-HTTPAPI/2.0 324.0 None None \n", + "3 nginx 162.0 US AK \n", + "4 None 124140.0 US TX \n", + "\n", + " WHOIS_REGDATE WHOIS_UPDATED_DATE ... DIST_REMOTE_TCP_PORT REMOTE_IPS \\\n", + "0 10/10/2015 18:21 None ... 0 2 \n", + "1 None None ... 7 4 \n", + "2 None None ... 0 0 \n", + "3 7/10/1997 4:00 12/09/2013 0:45 ... 22 3 \n", + "4 12/05/1996 0:00 11/04/2017 0:00 ... 2 5 \n", + "\n", + " APP_BYTES SOURCE_APP_PACKETS REMOTE_APP_PACKETS SOURCE_APP_BYTES \\\n", + "0 700 9 10 1153 \n", + "1 1230 17 19 1265 \n", + "2 0 0 0 0 \n", + "3 3812 39 37 18784 \n", + "4 4278 61 62 129889 \n", + "\n", + " REMOTE_APP_BYTES APP_PACKETS DNS_QUERY_TIMES Type \n", + "0 832 9 2.0 1 \n", + "1 1230 17 0.0 0 \n", + "2 0 0 0.0 0 \n", + "3 4380 39 8.0 0 \n", + "4 4586 61 4.0 0 \n", + "\n", + "[5 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "websites.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "URL object\n", + "URL_LENGTH int64\n", + "NUMBER_SPECIAL_CHARACTERS int64\n", + "CHARSET object\n", + "SERVER object\n", + "CONTENT_LENGTH float64\n", + "WHOIS_COUNTRY object\n", + "WHOIS_STATEPRO object\n", + "WHOIS_REGDATE object\n", + "WHOIS_UPDATED_DATE object\n", + "TCP_CONVERSATION_EXCHANGE int64\n", + "DIST_REMOTE_TCP_PORT int64\n", + "REMOTE_IPS int64\n", + "APP_BYTES int64\n", + "SOURCE_APP_PACKETS int64\n", + "REMOTE_APP_PACKETS int64\n", + "SOURCE_APP_BYTES int64\n", + "REMOTE_APP_BYTES int64\n", + "APP_PACKETS int64\n", + "DNS_QUERY_TIMES float64\n", + "Type int64\n", + "dtype: object" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "websites.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "URL 0\n", + "URL_LENGTH 0\n", + "NUMBER_SPECIAL_CHARACTERS 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", + "TCP_CONVERSATION_EXCHANGE 0\n", + "DIST_REMOTE_TCP_PORT 0\n", + "REMOTE_IPS 0\n", + "APP_BYTES 0\n", + "SOURCE_APP_PACKETS 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": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "websites.isnull().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "websites.CONTENT_LENGTH.fillna(websites.CONTENT_LENGTH.mean(), inplace= True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1779, 21)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "websites.dropna(axis=0, inplace= True)\n", + "websites.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Parece que la columna Type es la que marca la maliciosidad (1). Los tipos de las columnas parecen estar bien**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Next, evaluate if the columns in this dataset are strongly correlated.\n", + "\n", + "In the Mushroom supervised learning lab we did recently, we mentioned we are concerned if our dataset has strongly correlated columns because if it is the case we need to choose certain ML algorithms instead of others. We need to evaluate this for our dataset now.\n", + "\n", + "Luckily, most of the columns in this dataset are ordinal which makes things a lot easier for us. In the next cells below, evaluate the level of collinearity of the data.\n", + "\n", + "We provide some general directions for you to consult in order to complete this step:\n", + "\n", + "1. You will create a correlation matrix using the numeric columns in the dataset.\n", + "\n", + "1. Create a heatmap using `seaborn` to visualize which columns have high collinearity.\n", + "\n", + "1. Comment on which columns you might need to remove due to high collinearity." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
URL_LENGTHNUMBER_SPECIAL_CHARACTERSCONTENT_LENGTHTCP_CONVERSATION_EXCHANGEDIST_REMOTE_TCP_PORTREMOTE_IPSAPP_BYTESSOURCE_APP_PACKETSREMOTE_APP_PACKETSSOURCE_APP_BYTESREMOTE_APP_BYTESAPP_PACKETSDNS_QUERY_TIMESType
URL_LENGTH1.0000000.9180980.089079-0.038159-0.039696-0.046174-0.026416-0.041967-0.033481-0.014628-0.026652-0.041967-0.0684530.162641
NUMBER_SPECIAL_CHARACTERS0.9180981.0000000.143235-0.037323-0.042554-0.046961-0.023896-0.039939-0.030467-0.014276-0.024079-0.039939-0.0500670.281150
CONTENT_LENGTH0.0890790.1432351.0000000.064390-0.0001100.0034860.0026360.0604230.0723250.0838060.0025070.060423-0.032435-0.064130
TCP_CONVERSATION_EXCHANGE-0.038159-0.0373230.0643901.0000000.5551800.3310570.4573240.9977980.9908710.8655850.4587050.9977980.349877-0.040276
DIST_REMOTE_TCP_PORT-0.039696-0.042554-0.0001100.5551801.0000000.2101980.7802430.5586010.5911730.3133330.7812160.5586010.259919-0.082999
REMOTE_IPS-0.046174-0.0469610.0034860.3310570.2101981.0000000.0231240.3610870.3047120.1716600.0253220.3610870.548413-0.078801
APP_BYTES-0.026416-0.0238960.0026360.4573240.7802430.0231241.0000000.4458280.4690100.0744560.9999920.4458280.012208-0.011281
SOURCE_APP_PACKETS-0.041967-0.0399390.0604230.9977980.5586010.3610870.4458281.0000000.9893000.8574960.4474531.0000000.410876-0.034509
REMOTE_APP_PACKETS-0.033481-0.0304670.0723250.9908710.5911730.3047120.4690100.9893001.0000000.8805500.4704120.9893000.355648-0.033029
SOURCE_APP_BYTES-0.014628-0.0142760.0838060.8655850.3133330.1716600.0744560.8574960.8805501.0000000.0753190.8574960.215227-0.043949
REMOTE_APP_BYTES-0.026652-0.0240790.0025070.4587050.7812160.0253220.9999920.4474530.4704120.0753191.0000000.4474530.016201-0.011024
APP_PACKETS-0.041967-0.0399390.0604230.9977980.5586010.3610870.4458281.0000000.9893000.8574960.4474531.0000000.410876-0.034509
DNS_QUERY_TIMES-0.068453-0.050067-0.0324350.3498770.2599190.5484130.0122080.4108760.3556480.2152270.0162010.4108761.0000000.068606
Type0.1626410.281150-0.064130-0.040276-0.082999-0.078801-0.011281-0.034509-0.033029-0.043949-0.011024-0.0345090.0686061.000000
\n", + "
" + ], + "text/plain": [ + " URL_LENGTH NUMBER_SPECIAL_CHARACTERS \\\n", + "URL_LENGTH 1.000000 0.918098 \n", + "NUMBER_SPECIAL_CHARACTERS 0.918098 1.000000 \n", + "CONTENT_LENGTH 0.089079 0.143235 \n", + "TCP_CONVERSATION_EXCHANGE -0.038159 -0.037323 \n", + "DIST_REMOTE_TCP_PORT -0.039696 -0.042554 \n", + "REMOTE_IPS -0.046174 -0.046961 \n", + "APP_BYTES -0.026416 -0.023896 \n", + "SOURCE_APP_PACKETS -0.041967 -0.039939 \n", + "REMOTE_APP_PACKETS -0.033481 -0.030467 \n", + "SOURCE_APP_BYTES -0.014628 -0.014276 \n", + "REMOTE_APP_BYTES -0.026652 -0.024079 \n", + "APP_PACKETS -0.041967 -0.039939 \n", + "DNS_QUERY_TIMES -0.068453 -0.050067 \n", + "Type 0.162641 0.281150 \n", + "\n", + " CONTENT_LENGTH TCP_CONVERSATION_EXCHANGE \\\n", + "URL_LENGTH 0.089079 -0.038159 \n", + "NUMBER_SPECIAL_CHARACTERS 0.143235 -0.037323 \n", + "CONTENT_LENGTH 1.000000 0.064390 \n", + "TCP_CONVERSATION_EXCHANGE 0.064390 1.000000 \n", + "DIST_REMOTE_TCP_PORT -0.000110 0.555180 \n", + "REMOTE_IPS 0.003486 0.331057 \n", + "APP_BYTES 0.002636 0.457324 \n", + "SOURCE_APP_PACKETS 0.060423 0.997798 \n", + "REMOTE_APP_PACKETS 0.072325 0.990871 \n", + "SOURCE_APP_BYTES 0.083806 0.865585 \n", + "REMOTE_APP_BYTES 0.002507 0.458705 \n", + "APP_PACKETS 0.060423 0.997798 \n", + "DNS_QUERY_TIMES -0.032435 0.349877 \n", + "Type -0.064130 -0.040276 \n", + "\n", + " DIST_REMOTE_TCP_PORT REMOTE_IPS APP_BYTES \\\n", + "URL_LENGTH -0.039696 -0.046174 -0.026416 \n", + "NUMBER_SPECIAL_CHARACTERS -0.042554 -0.046961 -0.023896 \n", + "CONTENT_LENGTH -0.000110 0.003486 0.002636 \n", + "TCP_CONVERSATION_EXCHANGE 0.555180 0.331057 0.457324 \n", + "DIST_REMOTE_TCP_PORT 1.000000 0.210198 0.780243 \n", + "REMOTE_IPS 0.210198 1.000000 0.023124 \n", + "APP_BYTES 0.780243 0.023124 1.000000 \n", + "SOURCE_APP_PACKETS 0.558601 0.361087 0.445828 \n", + "REMOTE_APP_PACKETS 0.591173 0.304712 0.469010 \n", + "SOURCE_APP_BYTES 0.313333 0.171660 0.074456 \n", + "REMOTE_APP_BYTES 0.781216 0.025322 0.999992 \n", + "APP_PACKETS 0.558601 0.361087 0.445828 \n", + "DNS_QUERY_TIMES 0.259919 0.548413 0.012208 \n", + "Type -0.082999 -0.078801 -0.011281 \n", + "\n", + " SOURCE_APP_PACKETS REMOTE_APP_PACKETS \\\n", + "URL_LENGTH -0.041967 -0.033481 \n", + "NUMBER_SPECIAL_CHARACTERS -0.039939 -0.030467 \n", + "CONTENT_LENGTH 0.060423 0.072325 \n", + "TCP_CONVERSATION_EXCHANGE 0.997798 0.990871 \n", + "DIST_REMOTE_TCP_PORT 0.558601 0.591173 \n", + "REMOTE_IPS 0.361087 0.304712 \n", + "APP_BYTES 0.445828 0.469010 \n", + "SOURCE_APP_PACKETS 1.000000 0.989300 \n", + "REMOTE_APP_PACKETS 0.989300 1.000000 \n", + "SOURCE_APP_BYTES 0.857496 0.880550 \n", + "REMOTE_APP_BYTES 0.447453 0.470412 \n", + "APP_PACKETS 1.000000 0.989300 \n", + "DNS_QUERY_TIMES 0.410876 0.355648 \n", + "Type -0.034509 -0.033029 \n", + "\n", + " SOURCE_APP_BYTES REMOTE_APP_BYTES APP_PACKETS \\\n", + "URL_LENGTH -0.014628 -0.026652 -0.041967 \n", + "NUMBER_SPECIAL_CHARACTERS -0.014276 -0.024079 -0.039939 \n", + "CONTENT_LENGTH 0.083806 0.002507 0.060423 \n", + "TCP_CONVERSATION_EXCHANGE 0.865585 0.458705 0.997798 \n", + "DIST_REMOTE_TCP_PORT 0.313333 0.781216 0.558601 \n", + "REMOTE_IPS 0.171660 0.025322 0.361087 \n", + "APP_BYTES 0.074456 0.999992 0.445828 \n", + "SOURCE_APP_PACKETS 0.857496 0.447453 1.000000 \n", + "REMOTE_APP_PACKETS 0.880550 0.470412 0.989300 \n", + "SOURCE_APP_BYTES 1.000000 0.075319 0.857496 \n", + "REMOTE_APP_BYTES 0.075319 1.000000 0.447453 \n", + "APP_PACKETS 0.857496 0.447453 1.000000 \n", + "DNS_QUERY_TIMES 0.215227 0.016201 0.410876 \n", + "Type -0.043949 -0.011024 -0.034509 \n", + "\n", + " DNS_QUERY_TIMES Type \n", + "URL_LENGTH -0.068453 0.162641 \n", + "NUMBER_SPECIAL_CHARACTERS -0.050067 0.281150 \n", + "CONTENT_LENGTH -0.032435 -0.064130 \n", + "TCP_CONVERSATION_EXCHANGE 0.349877 -0.040276 \n", + "DIST_REMOTE_TCP_PORT 0.259919 -0.082999 \n", + "REMOTE_IPS 0.548413 -0.078801 \n", + "APP_BYTES 0.012208 -0.011281 \n", + "SOURCE_APP_PACKETS 0.410876 -0.034509 \n", + "REMOTE_APP_PACKETS 0.355648 -0.033029 \n", + "SOURCE_APP_BYTES 0.215227 -0.043949 \n", + "REMOTE_APP_BYTES 0.016201 -0.011024 \n", + "APP_PACKETS 0.410876 -0.034509 \n", + "DNS_QUERY_TIMES 1.000000 0.068606 \n", + "Type 0.068606 1.000000 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "corr = websites.corr()\n", + "corr" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.heatmap(corr);" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "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": 12, + "metadata": {}, + "outputs": [], + "source": [ + "webmens = websites.drop(['SOURCE_APP_BYTES', 'REMOTE_APP_BYTES', 'URL_LENGTH', 'TCP_CONVERSATION_EXCHANGE', 'SOURCE_APP_PACKETS', 'REMOTE_APP_PACKETS'], axis=1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
URLNUMBER_SPECIAL_CHARACTERSCHARSETSERVERCONTENT_LENGTHWHOIS_COUNTRYWHOIS_STATEPROWHOIS_REGDATEWHOIS_UPDATED_DATEDIST_REMOTE_TCP_PORTREMOTE_IPSAPP_BYTESAPP_PACKETSDNS_QUERY_TIMESType
0M0_1097iso-8859-1nginx263.000000NoneNone10/10/2015 18:21None0270092.01
1B0_23146UTF-8Apache/2.4.1015087.000000NoneNoneNoneNone741230170.00
2B0_9116us-asciiMicrosoft-HTTPAPI/2.0324.000000NoneNoneNoneNone00000.00
3B0_1136ISO-8859-1nginx162.000000USAK7/10/1997 4:0012/09/2013 0:452233812398.00
4B0_4036UTF-8None124140.000000USTX12/05/1996 0:0011/04/2017 0:00254278614.00
................................................
1776M4_4816UTF-8Apache11726.927761ESBarcelona17/09/2008 0:002/09/2016 0:0000000.01
1777M4_4117UTF-8Apache11726.927761ESBarcelona17/09/2008 0:002/09/2016 0:0000000.01
1778B0_16234utf-8Apache/2.2.16 (Debian)8904.000000USFL15/02/1999 0:0015/07/2015 0:00266631874.00
1779B0_115234ISO-8859-1cloudflare-nginx11726.927761USCA1/04/1998 0:009/12/2016 0:0000000.00
1780B0_67640utf-8Microsoft-IIS/8.524435.000000USWisconsin14/11/2008 0:0020/11/2013 0:006112314256.00
\n", + "

1779 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " URL NUMBER_SPECIAL_CHARACTERS CHARSET SERVER \\\n", + "0 M0_109 7 iso-8859-1 nginx \n", + "1 B0_2314 6 UTF-8 Apache/2.4.10 \n", + "2 B0_911 6 us-ascii Microsoft-HTTPAPI/2.0 \n", + "3 B0_113 6 ISO-8859-1 nginx \n", + "4 B0_403 6 UTF-8 None \n", + "... ... ... ... ... \n", + "1776 M4_48 16 UTF-8 Apache \n", + "1777 M4_41 17 UTF-8 Apache \n", + "1778 B0_162 34 utf-8 Apache/2.2.16 (Debian) \n", + "1779 B0_1152 34 ISO-8859-1 cloudflare-nginx \n", + "1780 B0_676 40 utf-8 Microsoft-IIS/8.5 \n", + "\n", + " CONTENT_LENGTH WHOIS_COUNTRY WHOIS_STATEPRO WHOIS_REGDATE \\\n", + "0 263.000000 None None 10/10/2015 18:21 \n", + "1 15087.000000 None None None \n", + "2 324.000000 None None None \n", + "3 162.000000 US AK 7/10/1997 4:00 \n", + "4 124140.000000 US TX 12/05/1996 0:00 \n", + "... ... ... ... ... \n", + "1776 11726.927761 ES Barcelona 17/09/2008 0:00 \n", + "1777 11726.927761 ES Barcelona 17/09/2008 0:00 \n", + "1778 8904.000000 US FL 15/02/1999 0:00 \n", + "1779 11726.927761 US CA 1/04/1998 0:00 \n", + "1780 24435.000000 US Wisconsin 14/11/2008 0:00 \n", + "\n", + " WHOIS_UPDATED_DATE DIST_REMOTE_TCP_PORT REMOTE_IPS APP_BYTES \\\n", + "0 None 0 2 700 \n", + "1 None 7 4 1230 \n", + "2 None 0 0 0 \n", + "3 12/09/2013 0:45 22 3 3812 \n", + "4 11/04/2017 0:00 2 5 4278 \n", + "... ... ... ... ... \n", + "1776 2/09/2016 0:00 0 0 0 \n", + "1777 2/09/2016 0:00 0 0 0 \n", + "1778 15/07/2015 0:00 2 6 6631 \n", + "1779 9/12/2016 0:00 0 0 0 \n", + "1780 20/11/2013 0:00 6 11 2314 \n", + "\n", + " APP_PACKETS DNS_QUERY_TIMES Type \n", + "0 9 2.0 1 \n", + "1 17 0.0 0 \n", + "2 0 0.0 0 \n", + "3 39 8.0 0 \n", + "4 61 4.0 0 \n", + "... ... ... ... \n", + "1776 0 0.0 1 \n", + "1777 0 0.0 1 \n", + "1778 87 4.0 0 \n", + "1779 0 0.0 0 \n", + "1780 25 6.0 0 \n", + "\n", + "[1779 rows x 15 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webmens" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "corr2 = webmens.corr()\n", + "sns.heatmap(corr2);\n" + ] + }, + { + "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": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Está hecho arriba. emos eliminado la fila de server hemos sustituido en la longitud por la media\n" + ] + }, + { + "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": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Your code here\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "URL 0\n", + "NUMBER_SPECIAL_CHARACTERS 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", + "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": [ + "webmens.isnull().sum()" + ] + }, + { + "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": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Examine missing values in each column\n" + ] + }, + { + "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": 19, + "metadata": {}, + "outputs": [], + "source": [ + "webmens.WHOIS_COUNTRY = webmens.WHOIS_COUNTRY.apply(lambda x: x.upper().replace('CYPRUS', 'CY').replace('UNITED KINGDOM', 'GB')\n", + " .replace(\"[U'GB'; U'UK']\", 'GB'))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'LU', 'UG', 'PH', 'TR', 'CZ', 'AT', 'SI', 'IL', 'BR', 'IN', 'IE', 'UK', 'NONE', 'SE', 'RU', 'CN', 'CH', 'AU', 'PK', 'TH', 'NO', 'BY', 'UY', 'KY', 'PA', 'ES', 'KG', 'DE', 'BS', 'HK', 'JP', 'US', 'AE', 'CA', 'BE', 'CY', 'KR', 'SC', 'IT', 'NL', 'LV', 'UA', 'FR', 'GB'}\n" + ] + } + ], + "source": [ + "print(set(webmens.WHOIS_COUNTRY))" + ] + }, + { + "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 1105\n", + "NONE 306\n", + "CA 83\n", + "ES 63\n", + "AU 35\n", + "GB 25\n", + "PA 21\n", + "JP 11\n", + "UK 10\n", + "IN 10\n", + "CN 10\n", + "Name: WHOIS_COUNTRY, dtype: int64" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webmens.WHOIS_COUNTRY.value_counts()[:11]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "US 1105\n", + "NONE 306\n", + "CA 83\n", + "ES 63\n", + "AU 35\n", + "GB 25\n", + "PA 21\n", + "JP 11\n", + "UK 10\n", + "IN 10\n", + "CN 10\n", + "CZ 9\n", + "FR 9\n", + "CH 6\n", + "RU 6\n", + "NL 6\n", + "KR 5\n", + "AT 4\n", + "PH 4\n", + "BS 4\n", + "SE 4\n", + "SC 3\n", + "BE 3\n", + "TR 3\n", + "HK 3\n", + "DE 3\n", + "KY 3\n", + "IL 2\n", + "BR 2\n", + "UY 2\n", + "UA 2\n", + "NO 2\n", + "CY 2\n", + "KG 2\n", + "SI 2\n", + "LV 1\n", + "AE 1\n", + "BY 1\n", + "TH 1\n", + "UG 1\n", + "IT 1\n", + "PK 1\n", + "IE 1\n", + "LU 1\n", + "Name: WHOIS_COUNTRY, dtype: int64" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webmens.WHOIS_COUNTRY.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.simplefilter(action=\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "webmens.reset_index(inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "countrylist = ['US', 'CA', 'ES', 'AU', 'GB', 'PA', 'JP', 'IN', 'UK', 'CN']" + ] + }, + { + "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": 26, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "\n", + "for i in range(len(webmens)):\n", + " if str(webmens.WHOIS_COUNTRY[i]) not in countrylist:\n", + " webmens.WHOIS_COUNTRY[i] = 'OTHER'\n", + " \n" + ] + }, + { + "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": 27, + "metadata": {}, + "outputs": [], + "source": [ + "webless = webmens.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": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "index int64\n", + "URL object\n", + "NUMBER_SPECIAL_CHARACTERS int64\n", + "CHARSET object\n", + "SERVER object\n", + "CONTENT_LENGTH float64\n", + "WHOIS_COUNTRY object\n", + "DIST_REMOTE_TCP_PORT int64\n", + "REMOTE_IPS int64\n", + "APP_BYTES int64\n", + "APP_PACKETS int64\n", + "DNS_QUERY_TIMES float64\n", + "Type int64\n", + "dtype: object" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webless.dtypes\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": 29, + "metadata": {}, + "outputs": [], + "source": [ + "webless = webless.drop(['URL'], axis=1)\n" + ] + }, + { + "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": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ISO-8859',\n", + " 'ISO-8859-1',\n", + " 'None',\n", + " 'UTF-8',\n", + " 'iso-8859-1',\n", + " 'us-ascii',\n", + " 'utf-8',\n", + " 'windows-1251',\n", + " 'windows-1252'}" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "set(webless.CHARSET)" + ] + }, + { + "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": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Apache', 'Microsoft', 'Other', 'nginx'}" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "set(webless.SERVER)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Think Hard](../think-hard.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Podrias sustituir por el sistema operativo o algo asin**\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": 32, + "metadata": {}, + "outputs": [], + "source": [ + "servers = ['Microsoft', 'Apache', 'nginx']\n", + "for i in range(len(webless)):\n", + " for j in range(len(servers)):\n", + " if servers[j] in webless.SERVER[i]:\n", + " webless.SERVER[i] = servers[j]\n", + " if ('Microsoft' not in webless.SERVER[i]) & ('Apache' not in webless.SERVER[i]) & ('nginx' not in webless.SERVER[i]):\n", + " webless.SERVER[i] = 'Other'\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Apache 642\n", + "Other 504\n", + "nginx 435\n", + "Microsoft 198\n", + "Name: SERVER, dtype: int64" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webless.SERVER.value_counts()\n" + ] + }, + { + "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": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "index int64\n", + "NUMBER_SPECIAL_CHARACTERS int64\n", + "CHARSET object\n", + "SERVER object\n", + "CONTENT_LENGTH float64\n", + "WHOIS_COUNTRY object\n", + "DIST_REMOTE_TCP_PORT int64\n", + "REMOTE_IPS int64\n", + "APP_BYTES int64\n", + "APP_PACKETS int64\n", + "DNS_QUERY_TIMES float64\n", + "Type int64\n", + "dtype: object" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webless.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['index', 'NUMBER_SPECIAL_CHARACTERS', 'CONTENT_LENGTH',\n", + " 'DIST_REMOTE_TCP_PORT', 'REMOTE_IPS', 'APP_BYTES', 'APP_PACKETS',\n", + " 'DNS_QUERY_TIMES', 'Type', 'CHARSET_ISO-8859-1', 'CHARSET_None',\n", + " 'CHARSET_UTF-8', 'CHARSET_iso-8859-1', 'CHARSET_us-ascii',\n", + " 'CHARSET_utf-8', 'CHARSET_windows-1251', 'CHARSET_windows-1252',\n", + " 'SERVER_Microsoft', 'SERVER_Other', 'SERVER_nginx', 'WHOIS_COUNTRY_CA',\n", + " 'WHOIS_COUNTRY_CN', 'WHOIS_COUNTRY_ES', 'WHOIS_COUNTRY_GB',\n", + " 'WHOIS_COUNTRY_IN', 'WHOIS_COUNTRY_JP', 'WHOIS_COUNTRY_OTHER',\n", + " 'WHOIS_COUNTRY_PA', 'WHOIS_COUNTRY_UK', 'WHOIS_COUNTRY_US'],\n", + " dtype='object')" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "website_dummy = pd.get_dummies(webless, columns= ['CHARSET', 'SERVER', 'WHOIS_COUNTRY'], drop_first=True)\n", + "website_dummy.columns" + ] + }, + { + "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": 35, + "metadata": {}, + "outputs": [], + "source": [ + "# Your code here\n" + ] + }, + { + "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": 66, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split as tts\n", + "\n", + "\n", + "X=website_dummy.drop(columns=['Type'])\n", + "\n", + "y=website_dummy.Type\n", + "\n", + "X_train, X_test, y_train, y_test = tts(X, y, test_size=0.2, train_size=0.8, random_state=42)\n" + ] + }, + { + "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": 68, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "logreg=LogisticRegression()\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": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression()" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logreg.fit(X_train, y_train)\n", + "logreg\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": 75, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.metrics import accuracy_score\n", + "from sklearn.metrics import r2_score\n", + "y_pred=logreg.predict(X_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[308, 7],\n", + " [ 27, 14]])" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "confusion_matrix(y_test, y_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9044943820224719" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy_score(y_test, y_pred, normalize=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What are your thoughts on the performance of the model? Write your conclusions below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Es un modelo bastante acertado con pocos falsos negativos y positivos**\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": 80, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.neighbors import KNeighborsClassifier\n", + "neigh = KNeighborsClassifier(n_neighbors=3)\n", + "\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": 82, + "metadata": {}, + "outputs": [], + "source": [ + "neigh.fit(X_train, y_train)\n", + "y_pred=neigh.predict(X_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[305, 10],\n", + " [ 20, 21]])" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "confusion_matrix(y_test, y_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9157303370786517" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy_score(y_test, y_pred, normalize=True) #Es mas acertado!" + ] + }, + { + "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": 85, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[307, 8],\n", + " [ 20, 21]])" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "neigh = KNeighborsClassifier(n_neighbors=5)\n", + "neigh.fit(X_train, y_train)\n", + "y_pred=neigh.predict(X_test)\n", + "confusion_matrix(y_test, y_pred)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9213483146067416" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy_score(y_test, y_pred, normalize=True) #Es mas acertado!" + ] + }, + { + "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": "markdown", + "metadata": {}, + "source": [ + "**Si hay mas aciertos, y además hay menos falsos positivos**\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": 45, + "metadata": {}, + "outputs": [], + "source": [ + "# Your code here" + ] + } + ], + "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.5" + } + }, + "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..63031c3 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.5" } }, "nbformat": 4, diff --git a/your-code/Supervised Learning Guided Lesson.ipynb b/your-code/Supervised Learning Guided Lesson.ipynb index 2552a77..42d2323 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.5" } }, "nbformat": 4, diff --git a/your-code/main.ipynb b/your-code/main.ipynb index 8a1bbee..ffcc919 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,344 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
URLURL_LENGTHNUMBER_SPECIAL_CHARACTERSCHARSETSERVERCONTENT_LENGTHWHOIS_COUNTRYWHOIS_STATEPROWHOIS_REGDATEWHOIS_UPDATED_DATE...DIST_REMOTE_TCP_PORTREMOTE_IPSAPP_BYTESSOURCE_APP_PACKETSREMOTE_APP_PACKETSSOURCE_APP_BYTESREMOTE_APP_BYTESAPP_PACKETSDNS_QUERY_TIMESType
0M0_109167iso-8859-1nginx263.0NoneNone10/10/2015 18:21None...02700910115383292.01
1B0_2314166UTF-8Apache/2.4.1015087.0NoneNoneNoneNone...741230171912651230170.00
2B0_911166us-asciiMicrosoft-HTTPAPI/2.0324.0NoneNoneNoneNone...000000000.00
3B0_113176ISO-8859-1nginx162.0USAK7/10/1997 4:0012/09/2013 0:45...22338123937187844380398.00
4B0_403176UTF-8None124140.0USTX12/05/1996 0:0011/04/2017 0:00...25427861621298894586614.00
\n", + "

5 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " URL URL_LENGTH NUMBER_SPECIAL_CHARACTERS CHARSET \\\n", + "0 M0_109 16 7 iso-8859-1 \n", + "1 B0_2314 16 6 UTF-8 \n", + "2 B0_911 16 6 us-ascii \n", + "3 B0_113 17 6 ISO-8859-1 \n", + "4 B0_403 17 6 UTF-8 \n", + "\n", + " SERVER CONTENT_LENGTH WHOIS_COUNTRY WHOIS_STATEPRO \\\n", + "0 nginx 263.0 None None \n", + "1 Apache/2.4.10 15087.0 None None \n", + "2 Microsoft-HTTPAPI/2.0 324.0 None None \n", + "3 nginx 162.0 US AK \n", + "4 None 124140.0 US TX \n", + "\n", + " WHOIS_REGDATE WHOIS_UPDATED_DATE ... DIST_REMOTE_TCP_PORT REMOTE_IPS \\\n", + "0 10/10/2015 18:21 None ... 0 2 \n", + "1 None None ... 7 4 \n", + "2 None None ... 0 0 \n", + "3 7/10/1997 4:00 12/09/2013 0:45 ... 22 3 \n", + "4 12/05/1996 0:00 11/04/2017 0:00 ... 2 5 \n", + "\n", + " APP_BYTES SOURCE_APP_PACKETS REMOTE_APP_PACKETS SOURCE_APP_BYTES \\\n", + "0 700 9 10 1153 \n", + "1 1230 17 19 1265 \n", + "2 0 0 0 0 \n", + "3 3812 39 37 18784 \n", + "4 4278 61 62 129889 \n", + "\n", + " REMOTE_APP_BYTES APP_PACKETS DNS_QUERY_TIMES Type \n", + "0 832 9 2.0 1 \n", + "1 1230 17 0.0 0 \n", + "2 0 0 0.0 0 \n", + "3 4380 39 8.0 0 \n", + "4 4586 61 4.0 0 \n", + "\n", + "[5 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "websites.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "URL object\n", + "URL_LENGTH int64\n", + "NUMBER_SPECIAL_CHARACTERS int64\n", + "CHARSET object\n", + "SERVER object\n", + "CONTENT_LENGTH float64\n", + "WHOIS_COUNTRY object\n", + "WHOIS_STATEPRO object\n", + "WHOIS_REGDATE object\n", + "WHOIS_UPDATED_DATE object\n", + "TCP_CONVERSATION_EXCHANGE int64\n", + "DIST_REMOTE_TCP_PORT int64\n", + "REMOTE_IPS int64\n", + "APP_BYTES int64\n", + "SOURCE_APP_PACKETS int64\n", + "REMOTE_APP_PACKETS int64\n", + "SOURCE_APP_BYTES int64\n", + "REMOTE_APP_BYTES int64\n", + "APP_PACKETS int64\n", + "DNS_QUERY_TIMES float64\n", + "Type int64\n", + "dtype: object" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "websites.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "URL 0\n", + "URL_LENGTH 0\n", + "NUMBER_SPECIAL_CHARACTERS 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", + "TCP_CONVERSATION_EXCHANGE 0\n", + "DIST_REMOTE_TCP_PORT 0\n", + "REMOTE_IPS 0\n", + "APP_BYTES 0\n", + "SOURCE_APP_PACKETS 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": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "websites.isnull().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "# Your code here\n" + "websites.CONTENT_LENGTH.fillna(websites.CONTENT_LENGTH.mean(), inplace= True)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(1779, 21)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Your comment here" + "websites.dropna(axis=0, inplace= True)\n", + "websites.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Parece que la columna Type es la que marca la maliciosidad (1). Los tipos de las columnas parecen estar bien**" ] }, { @@ -102,16 +426,431 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
URL_LENGTHNUMBER_SPECIAL_CHARACTERSCONTENT_LENGTHTCP_CONVERSATION_EXCHANGEDIST_REMOTE_TCP_PORTREMOTE_IPSAPP_BYTESSOURCE_APP_PACKETSREMOTE_APP_PACKETSSOURCE_APP_BYTESREMOTE_APP_BYTESAPP_PACKETSDNS_QUERY_TIMESType
URL_LENGTH1.0000000.9180980.089079-0.038159-0.039696-0.046174-0.026416-0.041967-0.033481-0.014628-0.026652-0.041967-0.0684530.162641
NUMBER_SPECIAL_CHARACTERS0.9180981.0000000.143235-0.037323-0.042554-0.046961-0.023896-0.039939-0.030467-0.014276-0.024079-0.039939-0.0500670.281150
CONTENT_LENGTH0.0890790.1432351.0000000.064390-0.0001100.0034860.0026360.0604230.0723250.0838060.0025070.060423-0.032435-0.064130
TCP_CONVERSATION_EXCHANGE-0.038159-0.0373230.0643901.0000000.5551800.3310570.4573240.9977980.9908710.8655850.4587050.9977980.349877-0.040276
DIST_REMOTE_TCP_PORT-0.039696-0.042554-0.0001100.5551801.0000000.2101980.7802430.5586010.5911730.3133330.7812160.5586010.259919-0.082999
REMOTE_IPS-0.046174-0.0469610.0034860.3310570.2101981.0000000.0231240.3610870.3047120.1716600.0253220.3610870.548413-0.078801
APP_BYTES-0.026416-0.0238960.0026360.4573240.7802430.0231241.0000000.4458280.4690100.0744560.9999920.4458280.012208-0.011281
SOURCE_APP_PACKETS-0.041967-0.0399390.0604230.9977980.5586010.3610870.4458281.0000000.9893000.8574960.4474531.0000000.410876-0.034509
REMOTE_APP_PACKETS-0.033481-0.0304670.0723250.9908710.5911730.3047120.4690100.9893001.0000000.8805500.4704120.9893000.355648-0.033029
SOURCE_APP_BYTES-0.014628-0.0142760.0838060.8655850.3133330.1716600.0744560.8574960.8805501.0000000.0753190.8574960.215227-0.043949
REMOTE_APP_BYTES-0.026652-0.0240790.0025070.4587050.7812160.0253220.9999920.4474530.4704120.0753191.0000000.4474530.016201-0.011024
APP_PACKETS-0.041967-0.0399390.0604230.9977980.5586010.3610870.4458281.0000000.9893000.8574960.4474531.0000000.410876-0.034509
DNS_QUERY_TIMES-0.068453-0.050067-0.0324350.3498770.2599190.5484130.0122080.4108760.3556480.2152270.0162010.4108761.0000000.068606
Type0.1626410.281150-0.064130-0.040276-0.082999-0.078801-0.011281-0.034509-0.033029-0.043949-0.011024-0.0345090.0686061.000000
\n", + "
" + ], + "text/plain": [ + " URL_LENGTH NUMBER_SPECIAL_CHARACTERS \\\n", + "URL_LENGTH 1.000000 0.918098 \n", + "NUMBER_SPECIAL_CHARACTERS 0.918098 1.000000 \n", + "CONTENT_LENGTH 0.089079 0.143235 \n", + "TCP_CONVERSATION_EXCHANGE -0.038159 -0.037323 \n", + "DIST_REMOTE_TCP_PORT -0.039696 -0.042554 \n", + "REMOTE_IPS -0.046174 -0.046961 \n", + "APP_BYTES -0.026416 -0.023896 \n", + "SOURCE_APP_PACKETS -0.041967 -0.039939 \n", + "REMOTE_APP_PACKETS -0.033481 -0.030467 \n", + "SOURCE_APP_BYTES -0.014628 -0.014276 \n", + "REMOTE_APP_BYTES -0.026652 -0.024079 \n", + "APP_PACKETS -0.041967 -0.039939 \n", + "DNS_QUERY_TIMES -0.068453 -0.050067 \n", + "Type 0.162641 0.281150 \n", + "\n", + " CONTENT_LENGTH TCP_CONVERSATION_EXCHANGE \\\n", + "URL_LENGTH 0.089079 -0.038159 \n", + "NUMBER_SPECIAL_CHARACTERS 0.143235 -0.037323 \n", + "CONTENT_LENGTH 1.000000 0.064390 \n", + "TCP_CONVERSATION_EXCHANGE 0.064390 1.000000 \n", + "DIST_REMOTE_TCP_PORT -0.000110 0.555180 \n", + "REMOTE_IPS 0.003486 0.331057 \n", + "APP_BYTES 0.002636 0.457324 \n", + "SOURCE_APP_PACKETS 0.060423 0.997798 \n", + "REMOTE_APP_PACKETS 0.072325 0.990871 \n", + "SOURCE_APP_BYTES 0.083806 0.865585 \n", + "REMOTE_APP_BYTES 0.002507 0.458705 \n", + "APP_PACKETS 0.060423 0.997798 \n", + "DNS_QUERY_TIMES -0.032435 0.349877 \n", + "Type -0.064130 -0.040276 \n", + "\n", + " DIST_REMOTE_TCP_PORT REMOTE_IPS APP_BYTES \\\n", + "URL_LENGTH -0.039696 -0.046174 -0.026416 \n", + "NUMBER_SPECIAL_CHARACTERS -0.042554 -0.046961 -0.023896 \n", + "CONTENT_LENGTH -0.000110 0.003486 0.002636 \n", + "TCP_CONVERSATION_EXCHANGE 0.555180 0.331057 0.457324 \n", + "DIST_REMOTE_TCP_PORT 1.000000 0.210198 0.780243 \n", + "REMOTE_IPS 0.210198 1.000000 0.023124 \n", + "APP_BYTES 0.780243 0.023124 1.000000 \n", + "SOURCE_APP_PACKETS 0.558601 0.361087 0.445828 \n", + "REMOTE_APP_PACKETS 0.591173 0.304712 0.469010 \n", + "SOURCE_APP_BYTES 0.313333 0.171660 0.074456 \n", + "REMOTE_APP_BYTES 0.781216 0.025322 0.999992 \n", + "APP_PACKETS 0.558601 0.361087 0.445828 \n", + "DNS_QUERY_TIMES 0.259919 0.548413 0.012208 \n", + "Type -0.082999 -0.078801 -0.011281 \n", + "\n", + " SOURCE_APP_PACKETS REMOTE_APP_PACKETS \\\n", + "URL_LENGTH -0.041967 -0.033481 \n", + "NUMBER_SPECIAL_CHARACTERS -0.039939 -0.030467 \n", + "CONTENT_LENGTH 0.060423 0.072325 \n", + "TCP_CONVERSATION_EXCHANGE 0.997798 0.990871 \n", + "DIST_REMOTE_TCP_PORT 0.558601 0.591173 \n", + "REMOTE_IPS 0.361087 0.304712 \n", + "APP_BYTES 0.445828 0.469010 \n", + "SOURCE_APP_PACKETS 1.000000 0.989300 \n", + "REMOTE_APP_PACKETS 0.989300 1.000000 \n", + "SOURCE_APP_BYTES 0.857496 0.880550 \n", + "REMOTE_APP_BYTES 0.447453 0.470412 \n", + "APP_PACKETS 1.000000 0.989300 \n", + "DNS_QUERY_TIMES 0.410876 0.355648 \n", + "Type -0.034509 -0.033029 \n", + "\n", + " SOURCE_APP_BYTES REMOTE_APP_BYTES APP_PACKETS \\\n", + "URL_LENGTH -0.014628 -0.026652 -0.041967 \n", + "NUMBER_SPECIAL_CHARACTERS -0.014276 -0.024079 -0.039939 \n", + "CONTENT_LENGTH 0.083806 0.002507 0.060423 \n", + "TCP_CONVERSATION_EXCHANGE 0.865585 0.458705 0.997798 \n", + "DIST_REMOTE_TCP_PORT 0.313333 0.781216 0.558601 \n", + "REMOTE_IPS 0.171660 0.025322 0.361087 \n", + "APP_BYTES 0.074456 0.999992 0.445828 \n", + "SOURCE_APP_PACKETS 0.857496 0.447453 1.000000 \n", + "REMOTE_APP_PACKETS 0.880550 0.470412 0.989300 \n", + "SOURCE_APP_BYTES 1.000000 0.075319 0.857496 \n", + "REMOTE_APP_BYTES 0.075319 1.000000 0.447453 \n", + "APP_PACKETS 0.857496 0.447453 1.000000 \n", + "DNS_QUERY_TIMES 0.215227 0.016201 0.410876 \n", + "Type -0.043949 -0.011024 -0.034509 \n", + "\n", + " DNS_QUERY_TIMES Type \n", + "URL_LENGTH -0.068453 0.162641 \n", + "NUMBER_SPECIAL_CHARACTERS -0.050067 0.281150 \n", + "CONTENT_LENGTH -0.032435 -0.064130 \n", + "TCP_CONVERSATION_EXCHANGE 0.349877 -0.040276 \n", + "DIST_REMOTE_TCP_PORT 0.259919 -0.082999 \n", + "REMOTE_IPS 0.548413 -0.078801 \n", + "APP_BYTES 0.012208 -0.011281 \n", + "SOURCE_APP_PACKETS 0.410876 -0.034509 \n", + "REMOTE_APP_PACKETS 0.355648 -0.033029 \n", + "SOURCE_APP_BYTES 0.215227 -0.043949 \n", + "REMOTE_APP_BYTES 0.016201 -0.011024 \n", + "APP_PACKETS 0.410876 -0.034509 \n", + "DNS_QUERY_TIMES 1.000000 0.068606 \n", + "Type 0.068606 1.000000 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "corr = websites.corr()\n", + "corr" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ - "# Your code here\n" + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.heatmap(corr);" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -133,29 +872,346 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ - "# Your code here\n" + "webmens = websites.drop(['SOURCE_APP_BYTES', 'REMOTE_APP_BYTES', 'URL_LENGTH', 'TCP_CONVERSATION_EXCHANGE', 'SOURCE_APP_PACKETS', 'REMOTE_APP_PACKETS'], axis=1)\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Your comment here" + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
URLNUMBER_SPECIAL_CHARACTERSCHARSETSERVERCONTENT_LENGTHWHOIS_COUNTRYWHOIS_STATEPROWHOIS_REGDATEWHOIS_UPDATED_DATEDIST_REMOTE_TCP_PORTREMOTE_IPSAPP_BYTESAPP_PACKETSDNS_QUERY_TIMESType
0M0_1097iso-8859-1nginx263.000000NoneNone10/10/2015 18:21None0270092.01
1B0_23146UTF-8Apache/2.4.1015087.000000NoneNoneNoneNone741230170.00
2B0_9116us-asciiMicrosoft-HTTPAPI/2.0324.000000NoneNoneNoneNone00000.00
3B0_1136ISO-8859-1nginx162.000000USAK7/10/1997 4:0012/09/2013 0:452233812398.00
4B0_4036UTF-8None124140.000000USTX12/05/1996 0:0011/04/2017 0:00254278614.00
................................................
1776M4_4816UTF-8Apache11726.927761ESBarcelona17/09/2008 0:002/09/2016 0:0000000.01
1777M4_4117UTF-8Apache11726.927761ESBarcelona17/09/2008 0:002/09/2016 0:0000000.01
1778B0_16234utf-8Apache/2.2.16 (Debian)8904.000000USFL15/02/1999 0:0015/07/2015 0:00266631874.00
1779B0_115234ISO-8859-1cloudflare-nginx11726.927761USCA1/04/1998 0:009/12/2016 0:0000000.00
1780B0_67640utf-8Microsoft-IIS/8.524435.000000USWisconsin14/11/2008 0:0020/11/2013 0:006112314256.00
\n", + "

1779 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " URL NUMBER_SPECIAL_CHARACTERS CHARSET SERVER \\\n", + "0 M0_109 7 iso-8859-1 nginx \n", + "1 B0_2314 6 UTF-8 Apache/2.4.10 \n", + "2 B0_911 6 us-ascii Microsoft-HTTPAPI/2.0 \n", + "3 B0_113 6 ISO-8859-1 nginx \n", + "4 B0_403 6 UTF-8 None \n", + "... ... ... ... ... \n", + "1776 M4_48 16 UTF-8 Apache \n", + "1777 M4_41 17 UTF-8 Apache \n", + "1778 B0_162 34 utf-8 Apache/2.2.16 (Debian) \n", + "1779 B0_1152 34 ISO-8859-1 cloudflare-nginx \n", + "1780 B0_676 40 utf-8 Microsoft-IIS/8.5 \n", + "\n", + " CONTENT_LENGTH WHOIS_COUNTRY WHOIS_STATEPRO WHOIS_REGDATE \\\n", + "0 263.000000 None None 10/10/2015 18:21 \n", + "1 15087.000000 None None None \n", + "2 324.000000 None None None \n", + "3 162.000000 US AK 7/10/1997 4:00 \n", + "4 124140.000000 US TX 12/05/1996 0:00 \n", + "... ... ... ... ... \n", + "1776 11726.927761 ES Barcelona 17/09/2008 0:00 \n", + "1777 11726.927761 ES Barcelona 17/09/2008 0:00 \n", + "1778 8904.000000 US FL 15/02/1999 0:00 \n", + "1779 11726.927761 US CA 1/04/1998 0:00 \n", + "1780 24435.000000 US Wisconsin 14/11/2008 0:00 \n", + "\n", + " WHOIS_UPDATED_DATE DIST_REMOTE_TCP_PORT REMOTE_IPS APP_BYTES \\\n", + "0 None 0 2 700 \n", + "1 None 7 4 1230 \n", + "2 None 0 0 0 \n", + "3 12/09/2013 0:45 22 3 3812 \n", + "4 11/04/2017 0:00 2 5 4278 \n", + "... ... ... ... ... \n", + "1776 2/09/2016 0:00 0 0 0 \n", + "1777 2/09/2016 0:00 0 0 0 \n", + "1778 15/07/2015 0:00 2 6 6631 \n", + "1779 9/12/2016 0:00 0 0 0 \n", + "1780 20/11/2013 0:00 6 11 2314 \n", + "\n", + " APP_PACKETS DNS_QUERY_TIMES Type \n", + "0 9 2.0 1 \n", + "1 17 0.0 0 \n", + "2 0 0.0 0 \n", + "3 39 8.0 0 \n", + "4 61 4.0 0 \n", + "... ... ... ... \n", + "1776 0 0.0 1 \n", + "1777 0 0.0 1 \n", + "1778 87 4.0 0 \n", + "1779 0 0.0 0 \n", + "1780 25 6.0 0 \n", + "\n", + "[1779 rows x 15 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webmens" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ - "# Print heatmap again\n" + "corr2 = webmens.corr()\n", + "sns.heatmap(corr2);\n" ] }, { @@ -169,11 +1225,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ - "# Your code here\n" + "# Está hecho arriba. emos eliminado la fila de server hemos sustituido en la longitud por la media\n" ] }, { @@ -187,7 +1243,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -196,11 +1252,37 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Your comment here" + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "URL 0\n", + "NUMBER_SPECIAL_CHARACTERS 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", + "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": [ + "webmens.isnull().sum()" ] }, { @@ -214,7 +1296,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -256,11 +1338,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ - "# Your code here\n" + "webmens.WHOIS_COUNTRY = webmens.WHOIS_COUNTRY.apply(lambda x: x.upper().replace('CYPRUS', 'CY').replace('UNITED KINGDOM', 'GB')\n", + " .replace(\"[U'GB'; U'UK']\", 'GB'))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'LU', 'UG', 'PH', 'TR', 'CZ', 'AT', 'SI', 'IL', 'BR', 'IN', 'IE', 'UK', 'NONE', 'SE', 'RU', 'CN', 'CH', 'AU', 'PK', 'TH', 'NO', 'BY', 'UY', 'KY', 'PA', 'ES', 'KG', 'DE', 'BS', 'HK', 'JP', 'US', 'AE', 'CA', 'BE', 'CY', 'KR', 'SC', 'IT', 'NL', 'LV', 'UA', 'FR', 'GB'}\n" + ] + } + ], + "source": [ + "print(set(webmens.WHOIS_COUNTRY))" ] }, { @@ -278,11 +1378,125 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "US 1105\n", + "NONE 306\n", + "CA 83\n", + "ES 63\n", + "AU 35\n", + "GB 25\n", + "PA 21\n", + "JP 11\n", + "UK 10\n", + "IN 10\n", + "CN 10\n", + "Name: WHOIS_COUNTRY, dtype: int64" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webmens.WHOIS_COUNTRY.value_counts()[:11]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "US 1105\n", + "NONE 306\n", + "CA 83\n", + "ES 63\n", + "AU 35\n", + "GB 25\n", + "PA 21\n", + "JP 11\n", + "UK 10\n", + "IN 10\n", + "CN 10\n", + "CZ 9\n", + "FR 9\n", + "CH 6\n", + "RU 6\n", + "NL 6\n", + "KR 5\n", + "AT 4\n", + "PH 4\n", + "BS 4\n", + "SE 4\n", + "SC 3\n", + "BE 3\n", + "TR 3\n", + "HK 3\n", + "DE 3\n", + "KY 3\n", + "IL 2\n", + "BR 2\n", + "UY 2\n", + "UA 2\n", + "NO 2\n", + "CY 2\n", + "KG 2\n", + "SI 2\n", + "LV 1\n", + "AE 1\n", + "BY 1\n", + "TH 1\n", + "UG 1\n", + "IT 1\n", + "PK 1\n", + "IE 1\n", + "LU 1\n", + "Name: WHOIS_COUNTRY, dtype: int64" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webmens.WHOIS_COUNTRY.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ - "# Your code here\n" + "import warnings\n", + "warnings.simplefilter(action=\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "webmens.reset_index(inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "countrylist = ['US', 'CA', 'ES', 'AU', 'GB', 'PA', 'JP', 'IN', 'UK', 'CN']" ] }, { @@ -294,13 +1508,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "scrolled": true }, "outputs": [], "source": [ - "# Your code here\n" + "\n", + "for i in range(len(webmens)):\n", + " if str(webmens.WHOIS_COUNTRY[i]) not in countrylist:\n", + " webmens.WHOIS_COUNTRY[i] = 'OTHER'\n", + " \n" ] }, { @@ -316,11 +1534,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ - "# Your code here\n" + "webless = webmens.drop(['WHOIS_STATEPRO', 'WHOIS_REGDATE', 'WHOIS_UPDATED_DATE'], axis=1)\n" ] }, { @@ -334,11 +1552,35 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Your code here\n" + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "index int64\n", + "URL object\n", + "NUMBER_SPECIAL_CHARACTERS int64\n", + "CHARSET object\n", + "SERVER object\n", + "CONTENT_LENGTH float64\n", + "WHOIS_COUNTRY object\n", + "DIST_REMOTE_TCP_PORT int64\n", + "REMOTE_IPS int64\n", + "APP_BYTES int64\n", + "APP_PACKETS int64\n", + "DNS_QUERY_TIMES float64\n", + "Type int64\n", + "dtype: object" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webless.dtypes\n" ] }, { @@ -350,11 +1592,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ - "# Your code here\n" + "webless = webless.drop(['URL'], axis=1)\n" ] }, { @@ -366,11 +1608,30 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Your code here" + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ISO-8859',\n", + " 'ISO-8859-1',\n", + " 'None',\n", + " 'UTF-8',\n", + " 'iso-8859-1',\n", + " 'us-ascii',\n", + " 'utf-8',\n", + " 'windows-1251',\n", + " 'windows-1252'}" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "set(webless.CHARSET)" ] }, { @@ -384,11 +1645,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'Apache', 'Microsoft', 'Other', 'nginx'}" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Your code here\n" + "set(webless.SERVER)\n" ] }, { @@ -399,12 +1671,10 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "# Your comment here\n" + "**Podrias sustituir por el sistema operativo o algo asin**\n" ] }, { @@ -418,22 +1688,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ - "# Your code here\n" + "servers = ['Microsoft', 'Apache', 'nginx']\n", + "for i in range(len(webless)):\n", + " for j in range(len(servers)):\n", + " if servers[j] in webless.SERVER[i]:\n", + " webless.SERVER[i] = servers[j]\n", + " if ('Microsoft' not in webless.SERVER[i]) & ('Apache' not in webless.SERVER[i]) & ('nginx' not in webless.SERVER[i]):\n", + " webless.SERVER[i] = 'Other'\n", + " \n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "metadata": { "scrolled": false }, - "outputs": [], - "source": [ - "# Count `SERVER` value counts here\n" + "outputs": [ + { + "data": { + "text/plain": [ + "Apache 642\n", + "Other 504\n", + "nginx 435\n", + "Microsoft 198\n", + "Name: SERVER, dtype: int64" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webless.SERVER.value_counts()\n" ] }, { @@ -445,11 +1737,64 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Your code here\n" + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "index int64\n", + "NUMBER_SPECIAL_CHARACTERS int64\n", + "CHARSET object\n", + "SERVER object\n", + "CONTENT_LENGTH float64\n", + "WHOIS_COUNTRY object\n", + "DIST_REMOTE_TCP_PORT int64\n", + "REMOTE_IPS int64\n", + "APP_BYTES int64\n", + "APP_PACKETS int64\n", + "DNS_QUERY_TIMES float64\n", + "Type int64\n", + "dtype: object" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "webless.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['index', 'NUMBER_SPECIAL_CHARACTERS', 'CONTENT_LENGTH',\n", + " 'DIST_REMOTE_TCP_PORT', 'REMOTE_IPS', 'APP_BYTES', 'APP_PACKETS',\n", + " 'DNS_QUERY_TIMES', 'Type', 'CHARSET_ISO-8859-1', 'CHARSET_None',\n", + " 'CHARSET_UTF-8', 'CHARSET_iso-8859-1', 'CHARSET_us-ascii',\n", + " 'CHARSET_utf-8', 'CHARSET_windows-1251', 'CHARSET_windows-1252',\n", + " 'SERVER_Microsoft', 'SERVER_Other', 'SERVER_nginx', 'WHOIS_COUNTRY_CA',\n", + " 'WHOIS_COUNTRY_CN', 'WHOIS_COUNTRY_ES', 'WHOIS_COUNTRY_GB',\n", + " 'WHOIS_COUNTRY_IN', 'WHOIS_COUNTRY_JP', 'WHOIS_COUNTRY_OTHER',\n", + " 'WHOIS_COUNTRY_PA', 'WHOIS_COUNTRY_UK', 'WHOIS_COUNTRY_US'],\n", + " dtype='object')" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "website_dummy = pd.get_dummies(webless, columns= ['CHARSET', 'SERVER', 'WHOIS_COUNTRY'], drop_first=True)\n", + "website_dummy.columns" ] }, { @@ -461,7 +1806,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -479,13 +1824,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 66, "metadata": {}, "outputs": [], "source": [ - "from sklearn.model_selection import train_test_split\n", + "from sklearn.model_selection import train_test_split as tts\n", + "\n", + "\n", + "X=website_dummy.drop(columns=['Type'])\n", + "\n", + "y=website_dummy.Type\n", "\n", - "# Your code here:\n" + "X_train, X_test, y_train, y_test = tts(X, y, test_size=0.2, train_size=0.8, random_state=42)\n" ] }, { @@ -499,12 +1849,12 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 68, "metadata": {}, "outputs": [], "source": [ - "# Your code here:\n", - "\n" + "from sklearn.linear_model import LogisticRegression\n", + "logreg=LogisticRegression()\n" ] }, { @@ -516,12 +1866,23 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 71, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression()" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Your code here:\n", - "\n" + "logreg.fit(X_train, y_train)\n", + "logreg\n" ] }, { @@ -533,12 +1894,55 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 75, "metadata": {}, "outputs": [], "source": [ - "# Your code here:\n", - "\n" + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.metrics import accuracy_score\n", + "from sklearn.metrics import r2_score\n", + "y_pred=logreg.predict(X_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[308, 7],\n", + " [ 27, 14]])" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "confusion_matrix(y_test, y_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9044943820224719" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy_score(y_test, y_pred, normalize=True)" ] }, { @@ -549,12 +1953,10 @@ ] }, { - "cell_type": "code", - "execution_count": 4, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "# Your conclusions here:\n", + "**Es un modelo bastante acertado con pocos falsos negativos y positivos**\n", "\n" ] }, @@ -569,11 +1971,13 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 80, "metadata": {}, "outputs": [], "source": [ - "# Your code here:\n", + "from sklearn.neighbors import KNeighborsClassifier\n", + "neigh = KNeighborsClassifier(n_neighbors=3)\n", + "\n", "\n" ] }, @@ -586,12 +1990,53 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 82, "metadata": {}, "outputs": [], "source": [ - "# Your code here:\n", - "\n" + "neigh.fit(X_train, y_train)\n", + "y_pred=neigh.predict(X_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[305, 10],\n", + " [ 20, 21]])" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "confusion_matrix(y_test, y_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9157303370786517" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy_score(y_test, y_pred, normalize=True) #Es mas acertado!" ] }, { @@ -605,12 +2050,46 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 85, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([[307, 8],\n", + " [ 20, 21]])" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Your code here:\n", - "\n" + "neigh = KNeighborsClassifier(n_neighbors=5)\n", + "neigh.fit(X_train, y_train)\n", + "y_pred=neigh.predict(X_test)\n", + "confusion_matrix(y_test, y_pred)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9213483146067416" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy_score(y_test, y_pred, normalize=True) #Es mas acertado!" ] }, { @@ -621,12 +2100,10 @@ ] }, { - "cell_type": "code", - "execution_count": 8, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "# Your conclusions here:\n", + "**Si hay mas aciertos, y además hay menos falsos positivos**\n", "\n" ] }, @@ -645,7 +2122,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "metadata": {}, "outputs": [], "source": [ @@ -669,7 +2146,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.8.5" } }, "nbformat": 4,