Skip to content

Instantly share code, notes, and snippets.

@rebeccabilbro
Created November 6, 2015 20:08
Show Gist options
  • Save rebeccabilbro/d40599f4ec96aa21dc48 to your computer and use it in GitHub Desktop.
Save rebeccabilbro/d40599f4ec96aa21dc48 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"...welcome back!\n",
"\n",
"\n",
"#TITANIC Part II\n",
"\n",
"##Machine Learning from Disaster: Introduction to Scikit-Learn"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pandas.io.sql as pd_sql\n",
"import sqlite3 as sql\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# re-establish database connection\n",
"con = sql.connect(\"titanic.db\") \n",
"\n",
"# extract everything from the 'training_data' table (or whatever you called it) into a dataframe\n",
"train = pd_sql.read_sql('select * from training_data', con, index_col='index')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>PassengerId</th>\n",
" <th>Survived</th>\n",
" <th>Pclass</th>\n",
" <th>Name</th>\n",
" <th>Sex</th>\n",
" <th>Age</th>\n",
" <th>SibSp</th>\n",
" <th>Parch</th>\n",
" <th>Fare</th>\n",
" <th>Cabin</th>\n",
" <th>Embarked</th>\n",
" </tr>\n",
" <tr>\n",
" <th>index</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Braund, Mr. Owen Harris</td>\n",
" <td>male</td>\n",
" <td>22</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>7.2500</td>\n",
" <td>None</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
" <td>female</td>\n",
" <td>38</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>71.2833</td>\n",
" <td>C85</td>\n",
" <td>C</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>Heikkinen, Miss. Laina</td>\n",
" <td>female</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>7.9250</td>\n",
" <td>None</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
" <td>female</td>\n",
" <td>35</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>53.1000</td>\n",
" <td>C123</td>\n",
" <td>S</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>Allen, Mr. William Henry</td>\n",
" <td>male</td>\n",
" <td>35</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>8.0500</td>\n",
" <td>None</td>\n",
" <td>S</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PassengerId Survived Pclass \\\n",
"index \n",
"0 1 0 3 \n",
"1 2 1 1 \n",
"2 3 1 3 \n",
"3 4 1 1 \n",
"4 5 0 3 \n",
"\n",
" Name Sex Age SibSp \\\n",
"index \n",
"0 Braund, Mr. Owen Harris male 22 1 \n",
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 \n",
"2 Heikkinen, Miss. Laina female 26 0 \n",
"3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 \n",
"4 Allen, Mr. William Henry male 35 0 \n",
"\n",
" Parch Fare Cabin Embarked \n",
"index \n",
"0 0 7.2500 None S \n",
"1 0 71.2833 C85 C \n",
"2 0 7.9250 None S \n",
"3 0 53.1000 C123 S \n",
"4 0 8.0500 None S "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Is it all still here?\n",
"train.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Creating a Model: A Naive Approach \n",
"\n",
"Let's start by creating a model that predicts purely based on gender"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The proportion of passengers who survived is 0.383838383838.\n"
]
}
],
"source": [
"# Set some variables\n",
"number_passengers = train.shape[0] \n",
"number_survived = len(train[train.Survived == 1])\n",
"\n",
"# What proportion of the passengers survived?\n",
"proportion_survived = float(number_survived) / number_passengers\n",
"print 'The proportion of passengers who survived is %s.' % proportion_survived"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The proportion of women who survived is 0.742038216561.\n",
"The proportion of men who survived is 0.188908145581.\n"
]
}
],
"source": [
"# How can we determine what proportion of the women and of the men who survived?\n",
"# Let's start by segregating the men and women\n",
"women = train[train.Sex == \"female\"]\n",
"men = train[train.Sex != \"female\"]\n",
"\n",
"# Determine the proportion of women who survived\n",
"proportion_women_survived = float(len(women[women.Survived == 1])) / len(women)\n",
"print 'The proportion of women who survived is %s.' % proportion_women_survived\n",
"\n",
"# Determine the proportion of men who survived\n",
"proportion_men_survived = float(len(men[men.Survived == 1])) / len(men)\n",
"print 'The proportion of men who survived is %s.' % proportion_men_survived"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we know that women were MUCH more likely to survive, and we could just say that our model is:\n",
"- if female => survived = 1\n",
"- if male => survived = 0\n",
"\n",
"But that means our predictions are going to be wrong sometimes -- for about a quarter of the women and a fifth of the men. Let's use the Python library Scikit-learn to see if we can do a little better!\n",
"\n",
"## Using Scikit-learn\n",
"\n",
"Scikit-Learn is a powerful machine learning library implemented in Python with numeric and scientific computing powerhouses Numpy, Scipy, and matplotlib for extremely fast analysis of small to medium-sized data sets. It is open source, commercially usable and contains many modern machine learning algorithms for classification, regression, clustering, feature extraction, and optimization. For this reason Scikit-Learn is often the first tool in a data scientist's toolkit for machine learning of incoming data sets.\n",
"\n",
"Scikit-learn will expect numeric values and no blanks, so first we need to do a bit more wrangling."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# 'Sex' is stored as a text value. We should convert (or 'map') it into numeric binaries \n",
"# so it will be ready for scikit-learn.\n",
"train['Sex'] = train['Sex'].map({'male': 0,'female': 1})"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Scikit-learn won't be tolerant of the missing values. In the last class, we dropped\n",
"# the 'Ticket' column. Let's also drop the 'Cabin' and 'Embarked' columns\n",
"train = train.drop(['Cabin'], axis=1)\n",
"train = train.drop(['Embarked'], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Let's also drop the 'Name' column for now (though I can think of some interesting \n",
"# data that might be embedded in those salutations...)\n",
"train = train.drop(['Name'], axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, we've got a table of purely numeric data with no null values. We're ready to go."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### LOGISTIC REGRESSION\n",
"\n",
"A logistic regression mathematically calculates the decision boundary between the possibilities. It looks for a straight line that represents a cutoff that most accurately represents the training data."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Load the test data\n",
"test = pd.read_csv(\"../titanic/data/test.csv\") \n",
"test[\"Age\"] = test[\"Age\"].fillna(train[\"Age\"].median())\n",
"\n",
"test.loc[test[\"Sex\"] == \"male\", \"Sex\"] = 0\n",
"test.loc[test[\"Sex\"] == \"female\", \"Sex\"] = 1\n",
"\n",
"test = test.drop(['Cabin'], axis=1)\n",
"test = test.drop(['Embarked'], axis=1)\n",
"test = test.drop(['Name'], axis=1)\n",
"test = test.drop(['Ticket'], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Initialize our algorithm\n",
"lr = LogisticRegression(random_state=1)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Define our predictors\n",
"predictors = [\"Pclass\", \"Sex\", \"Age\", \"SibSp\"]\n",
"expected = train[\"Survived\"]\n",
"\n",
"# Train the algorithm using all the training data\n",
"lr.fit(train[predictors], expected)\n",
"\n",
"# Make predictions using the training set -- where we already know the correct answers\n",
"predicted = lr.predict(train[predictors])"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>PassengerId</th>\n",
" <th>Survived</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>892</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>893</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>894</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>895</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>896</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>897</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>898</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>899</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>900</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>901</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PassengerId Survived\n",
"0 892 0\n",
"1 893 0\n",
"2 894 0\n",
"3 895 0\n",
"4 896 1\n",
"5 897 0\n",
"6 898 1\n",
"7 899 0\n",
"8 900 1\n",
"9 901 0"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Make predictions based on the test data\n",
"predictions = lr.predict(test[predictors])\n",
"\n",
"# Frame your submission for Kaggle\n",
"test_predictions = pd.DataFrame({\n",
" \"PassengerId\": test[\"PassengerId\"],\n",
" \"Survived\": predictions\n",
" })\n",
"test_predictions.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Well that was easy! But how can we find out how well it worked?\n",
"\n",
"### Cross-Validation \n",
"\n",
"For Kaggle, the training samples are constructed by splitting our original dataset into more than one part. But what if certain chunks of our data have more variance than others? We want to ensure that our model performs just as well regardless of the particular way the data are divided up. So let's go back and do some cross-validation splits. \n",
"\n",
"More on cross-validation tools inside Scikit-learn here: \n",
"http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn import cross_validation\n",
"from sklearn.cross_validation import train_test_split"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X = train[[\"Pclass\", \"Sex\", \"Age\", \"SibSp\"]]\n",
"y = train[\"Survived\"]\n",
"X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,y,test_size = 0.2)\n",
"log_reg = lr.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.82681564245810057"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Every estimator has a score method that can judge the quality of the \n",
"# fit (or the prediction) on new data. Bigger is better. \n",
"log_reg.score(X_test, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also ask for a classification report."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.metrics import classification_report"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Perished 0.83 0.90 0.86 106\n",
" Survived 0.83 0.73 0.77 73\n",
"\n",
"avg / total 0.83 0.83 0.82 179\n",
"\n"
]
}
],
"source": [
"expected = y_test\n",
"predicted = log_reg.predict(X_test)\n",
"classificationReport = classification_report(expected, predicted, target_names=[\"Perished\",\"Survived\"])\n",
"print classificationReport"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How do I interpret this report?\n",
" \n",
"Precision is the number of correct positive results divided by the number of all positive results (e.g. how many of the passengers we predicted would survive actually did survive?).\n",
"\n",
"Recall is the number of correct positive results divided by the number of positive results that should have been returned (e.g. how many of the passengers who did survive did we accurately predict would survive?). \n",
"\n",
"The F1 score is a measure of a test's accuracy. It considers both the precision and the recall of the test to compute the score. The F1 score can be interpreted as a weighted average of the precision and recall, where an F1 score reaches its best value at 1 and worst at 0. \n",
"\n",
" precision = true positives / (true positives + false positives)\n",
"\n",
" recall = true positives / (false negatives + true positives)\n",
"\n",
" F1 score = 2 * ((precision * recall) / (precision + recall))\n",
" \n",
"So how well did our Logistic Regression Model do? "
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Make predictions based on the test data\n",
"predictions = log_reg.predict(test[predictors])\n",
"\n",
"# Frame your 2nd submission to Kaggle\n",
"kgl_submission_lr = pd.DataFrame({\n",
" \"PassengerId\": test[\"PassengerId\"],\n",
" \"Survived\": predictions\n",
" })\n",
"kgl_submission_lr.to_csv('lr_model.csv', index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### RANDOM FOREST \n",
"\n",
"Some models will work better than others! Let's try another one. \n",
"\n",
"A random forest is a 'meta estimator'. It will fit a number of decision trees (we'll have to tell it how many) on various sub-samples of the dataset. Then it will use averaging to improve the predictive accuracy and control over-fitting. \n",
"\n",
"Read more about Random Forests here: \n",
"http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.ensemble import RandomForestClassifier"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# We'll select 50 trees and opt for 'out-of-bag' samples to estimate the generalization error.\n",
"rf = RandomForestClassifier(n_estimators=50, oob_score=True) "
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n",
" max_depth=None, max_features='auto', max_leaf_nodes=None,\n",
" min_samples_leaf=1, min_samples_split=2,\n",
" min_weight_fraction_leaf=0.0, n_estimators=50, n_jobs=1,\n",
" oob_score=True, random_state=None, verbose=0, warm_start=False)"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Next split up the data with the 'train test split' method in the Cross Validation module\n",
"X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2)\n",
"\n",
"# ...and then run the 'fit' method to build a forest of trees\n",
"rf.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.77094972067039103"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rf.score(X_test, y_test)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Perished 0.86 0.77 0.81 115\n",
" Survived 0.65 0.77 0.71 64\n",
"\n",
"avg / total 0.78 0.77 0.77 179\n",
"\n"
]
}
],
"source": [
"expected = y_test\n",
"predicted = rf.predict(X_test)\n",
"classificationReport = classification_report(expected, predicted, target_names=[\"Perished\",\"Survived\"])\n",
"print classificationReport"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So how did we do with our Random Forest Classifier? Sometimes visualizations can\n",
"help us to interpret our results. Here is a function that will take our classification\n",
"report and create a color-coded heat map that tells us where our model is strong (deep\n",
"reds) and/or weak (lighter pinks)."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def plot_classification_report(cr, title='Classification report', cmap=plt.cm.Reds):\n",
"\n",
" lines = cr.split('\\n')\n",
" classes = []\n",
" plotMat = []\n",
"\n",
" for line in lines[2 : (len(lines) - 3)]:\n",
" t = line.split()\n",
" classes.append(t[0])\n",
" v = [float(x) for x in t[1: len(t) - 1]]\n",
" plotMat.append(v)\n",
"\n",
" fig, ax = plt.subplots(1)\n",
" fig = plt.imshow(plotMat, interpolation='nearest', cmap=cmap)\n",
" \n",
" for c in range(len(plotMat)+1):\n",
" for r in range(len(classes)):\n",
" try:\n",
" txt = plotMat[r][c]\n",
" ax.text(c,r,plotMat[r][c],va='center',ha='center')\n",
" except IndexError:\n",
" pass\n",
" \n",
" plt.title(title)\n",
" plt.colorbar()\n",
" x_tick_marks = np.arange(3)\n",
" y_tick_marks = np.arange(len(classes))\n",
" plt.xticks(x_tick_marks, ['precision', 'recall', 'f1-score'], rotation=45)\n",
" plt.yticks(y_tick_marks, classes)\n",
" plt.tight_layout()\n",
" plt.ylabel('Classes')\n",
" plt.xlabel('Measures')"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x106bf130>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_classification_report(classificationReport)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Make predictions based on the test data\n",
"predictions = rf.predict(test[predictors])\n",
"\n",
"# Frame your 3rd submission to Kaggle\n",
"kgl_submission_rf = pd.DataFrame({\n",
" \"PassengerId\": test[\"PassengerId\"],\n",
" \"Survived\": predictions\n",
" })\n",
"kgl_submission_rf.to_csv('rf_model.csv', index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### SVM \n",
"\n",
"Support vector machines use points in transformed problem space to separate the classes into groups."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.svm import SVC"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"kernels = ['linear', 'poly', 'rbf']\n",
"\n",
"splits = cross_validation.train_test_split(X,y, test_size=0.2)\n",
"X_train, X_test, y_train, y_test = splits\n",
"\n",
"for kernel in kernels:\n",
" if kernel != 'poly':\n",
" model = SVC(kernel=kernel)\n",
" else:\n",
" model = SVC(kernel=kernel, degree=3)\n",
"\n",
"model.fit(X_train, y_train)\n",
"expected = y_test\n",
"predicted = model.predict(X_test)\n",
"\n",
"SVC_report = classification_report(expected, predicted)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x108b6a30>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_classification_report(SVC_report)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<function matplotlib.pyplot.show>"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAEQCAYAAAC0v9O7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VOX99/H3l60ii4IISgCjSJVag3UBxW3EpUnUurSP\nO61Ka+uuj22tVi1txaqX1OWxWqrUtdVWf/oTNYhKDVjKolWCRURQkE0pmyguSOD7/HFmMnMmC5OQ\nM2eSfF7XNVfmzNyZuXMI88l93+ecr7k7IiIiKe3i7oCIiBQWBYOIiIQoGEREJETBICIiIQoGEREJ\nUTCIiEhIpMFgZn82s5Vm9lYDbe4yswVmVmVm34qyPyIisnVRjxgeAErre9LMyoE93X0QcAFwb8T9\nERGRrYg0GNz9VWBdA02+AzyUbDsT2NHM+kTZJxERaVjcawxFwNKM7WVAv5j6IiIixB8MAJa1rWt0\niIjEqEPM778c6J+x3S/5WIiZKSxERJrA3bP/+N6quEcME4DvA5jZwcDH7r6yrobuXnP77DPntdec\n++93LrvMSSScHj2cPn2cY491rrrKefhhZ/ZsZ+NGD31vS7/96le/ir0PhXLTvtC+0L5o4HbkkU3+\nYI50xGBmjwFHAr3MbCnwK6AjgLuPc/cKMys3s4XAZ8B5ubzu9tvDgQcGtxR3WL4c5syBqiqoqICb\nb4b334dBg6CkJLgNGRJ83WUXsEbnqIhI6xdpMLj7mTm0uaQ53ssM+vULbuXl6ce//BLefjsdGJMm\nBV/N0iGRCozBg2G77ZqjNyIiLVfcawyR22472H//4JbiDh9+GITFnDnw0kswdiwsXAh77FE7MPr2\nLZzRRSKRiLsLBUP7Ik37Ik37YtuZe+Gv65qZ56OfGzfCvHnpwKiqCm6bN4enoUpKYJ99oHPnyLsk\nItI0iQQ2ZQrehMVnBUMOVq4MAiIzMN59F4qLa69d9O9fOKMLkXwx/dLHrtZnpIIh/776CubPrx0Y\nX36ZDotUYOyzD3TpEnePRaJjZrU/mCRv6tz/CobC8d//wltvhQPjnXeCRfHstYvddtPoQloHBUO8\nFAwt0KZNwdRTalSRCoxPP4V99w0Hxr77QteucfdYpHEUDPFSMLQia9akQyIVGm+/HRwFlb3Yvfvu\n0C7u0xFF6qFgiJeCoZWrrg4Om81eu1i3LhhNZAbGvvtC9+5x91hEwXDhhRdSVFTEdddd12C7b37z\nm9xzzz0cccQRzfr+CoY2at262msXc+dC7961F7v32APat4+7x9KWtPVgiJuCQWps3gzvvVd77WLV\nquBIqMypqJIS2HHHuHssrVVrCIbq6mo6dGiZ5/w2dzBo1roFa98evv51+N734Le/hWeegUWLgmtG\njR0L++0XjDKuvjo4v2K33eDEE+G66+Dvfw+Oltq8Oe6fQiRaxcXF3Hzzzeyzzz707NmT888/n40b\nN1JZWUm/fv249dZb2XXXXRk1ahTuzs0338yee+5Jr169OP3001m3Ll1r7J///CfDhw+nR48eDBgw\ngIcffhiAc889l+uvvx6A1atXc8IJJ9CjRw922mmn0LRRcXExkydPBmDjxo1cccUVFBUVUVRUxJVX\nXslXX30FUNO33//+9/Tp04e+ffvy4IMP5mmPKRhapR12gMMOg4sugnHjYPp0WL8eJk+G886DDh3g\nscfg+OODNYqDDoJRo+Cuu6CyEtaujfsnEGlef/3rX3nxxRd57733ePfdd7nxxhsxM1auXMm6detY\nsmQJ48aN46677mLChAlMnTqVDz/8kB49enDxxRcD8MEHH1BeXs7ll1/O6tWrmT17NkOGDAGCv9hT\nJ/mNHTuW/v37s3r1av773//yu9/9rqYfme3GjBnDrFmzqKqqoqqqilmzZnHjjTfWtF25ciWffPIJ\nK1asYPz48Vx88cWsX78+Pzss9kvD5nALuilR+OQT92nT3O+91/3CC90PPdS9Wzf3fv3cy8vdf/EL\n98cec587133Tprh7K4Uqp/+jwWXKtv3WSMXFxT5u3Lia7YqKCh84cKBXVlZ6p06dfOPGjTXPDR48\n2CdPnlyzvWLFCu/YsaNXV1f7TTfd5Keeemqd73Huuef69ddf7+7uN9xwg5900km+cOHCOvuSev2B\nAwf6xIkTa56bNGmSFxcXu7v7K6+84p07d/bNmzfXPN+7d2+fOXNmne9f5/4/8sjU443+zG2ZE2rS\nbLp1g+HDg1vKli3wwQfptYsnn4QbboBly4Ir0GYvdvfqFV//pQWJcQ2if/90PbABAwawYsUKAHbe\neWc6depU89zixYs55ZRTaJdxbHiHDh1YuXIly5YtY4899qj3PTz58/3sZz9j9OjRHHfccQBccMEF\nXH311bXar1ixgt12263OfgHstNNOoX5sv/32bNiwIeefeVsoGKSWdu2C8yZ23x1OOin9+IYNwZFQ\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d52610>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import precision_recall_curve\n",
"precision, recall, thresholds = precision_recall_curve(y_test, predicted) \n",
"decision_threshold = np.append(thresholds, 1)\n",
"\n",
"plt.plot(decision_threshold, precision, color='red') \n",
"plt.plot(decision_threshold, recall, color='blue') \n",
"leg = plt.legend(('precision', 'recall'), frameon=True) \n",
"leg.get_frame().set_edgecolor('k') \n",
"plt.xlabel('decision_threshold') \n",
"plt.ylabel('%') \n",
"plt.show"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Make predictions based on the test data\n",
"predictions = model.predict(test[predictors])\n",
"\n",
"# Frame your 4th submission to Kaggle\n",
"kgl_submission_svm = pd.DataFrame({\n",
" \"PassengerId\": test[\"PassengerId\"],\n",
" \"Survived\": predictions\n",
" })\n",
"kgl_submission_svm.to_csv('svm_model.csv', index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So of the four methods - our naive model, as well as Logistic Regression, Random Forest, and SVM, which one performed the best on this data set?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Resources and Further Reading \n",
"\n",
"This tutorial is based on the Kaggle Competition, \"Predicting Survival Aboard the Titanic\" \n",
"https://www.kaggle.com/c/titanic \n",
"\n",
"As well as the following tutorials: \n",
"https://www.kaggle.com/mlchang/titanic/logistic-model-using-scikit-learn/run/91385 \n",
"https://www.kaggle.com/c/titanic/details/getting-started-with-random-forests \n",
"https://github.com/savarin/pyconuk-introtutorial/tree/master/notebooks \n",
"\n",
"See also: \n",
"http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html \n",
"http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html \n",
"http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html \n",
"http://scikit-learn.org/stable/modules/svm.html "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment