diff --git a/Titanic2.ipynb b/Titanic2.ipynb new file mode 100644 index 0000000..2490f24 --- /dev/null +++ b/Titanic2.ipynb @@ -0,0 +1,615 @@ +{ + "nbformat": 4, + "metadata": { + "language_info": { + "pygments_lexer": "ipython2", + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "version": "2.7.11", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python" + }, + "kernelspec": { + "name": "python2", + "language": "python", + "display_name": "Python 2 with Spark 1.6" + } + }, + "cells": [ + { + "source": "# Titanic Machine Learning", + "metadata": { + "collapsed": true + }, + "cell_type": "markdown" + }, + { + "source": "### 2nd version with more accurate feature engineering\n[Source](https://www.kaggle.com/c/titanic)", + "metadata": {}, + "cell_type": "markdown" + }, + { + "source": "In my first version, I used index_col = 0 when using read_csv which made PassengerId into the index column, which is something I should have avoided doing", + "metadata": {}, + "cell_type": "markdown" + }, + { + "outputs": [ + { + "output_type": "execute_result", + "execution_count": 387, + "data": { + "text/plain": " PassengerId Survived Pclass \\\n0 1 0 3 \n1 2 1 1 \n2 3 1 3 \n3 4 1 1 \n4 5 0 3 \n\n Name Sex Age SibSp \\\n0 Braund, Mr. Owen Harris male 22 1 \n1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 \n2 Heikkinen, Miss. Laina female 26 0 \n3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 \n4 Allen, Mr. William Henry male 35 0 \n\n Parch Ticket Fare Cabin Embarked \n0 0 A/5 21171 7.2500 NaN S \n1 0 PC 17599 71.2833 C85 C \n2 0 STON/O2. 3101282 7.9250 NaN S \n3 0 113803 53.1000 C123 S \n4 0 373450 8.0500 NaN S ", + "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
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale2210A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female3810PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale2600STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female351011380353.1000C123S
4503Allen, Mr. William Henrymale35003734508.0500NaNS
\n
" + }, + "metadata": {} + } + ], + "source": "# The code was removed by DSX for sharing.", + "execution_count": 387, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "# Machine Learning Algorithms\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.linear_model import LinearRegression\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.naive_bayes import GaussianNB\nfrom sklearn.svm import SVC, LinearSVC\nfrom sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\nfrom sklearn import metrics\n\nfrom sklearn.preprocessing import Imputer, Normalizer, scale\nfrom sklearn.cross_validation import train_test_split, StratifiedKFold\nfrom sklearn.feature_selection import RFECV", + "execution_count": 388, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "output_type": "execute_result", + "execution_count": 389, + "data": { + "text/plain": " PassengerId Pclass Name Sex \\\n0 892 3 Kelly, Mr. James male \n1 893 3 Wilkes, Mrs. James (Ellen Needs) female \n2 894 2 Myles, Mr. Thomas Francis male \n3 895 3 Wirz, Mr. Albert male \n4 896 3 Hirvonen, Mrs. Alexander (Helga E Lindqvist) female \n\n Age SibSp Parch Ticket Fare Cabin Embarked \n0 34.5 0 0 330911 7.8292 NaN Q \n1 47.0 1 0 363272 7.0000 NaN S \n2 62.0 0 0 240276 9.6875 NaN Q \n3 27.0 0 0 315154 8.6625 NaN S \n4 22.0 1 1 3101298 12.2875 NaN S ", + "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
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
\n
" + }, + "metadata": {} + } + ], + "source": "df_test = pd.read_csv(get_object_storage_file_with_credentials_cb005406ee1149a2b0dc70050eb302d1('DefaultProjectminholeecaibmcom', 'titanic_test.csv'),\n header=0, dtype={'Age': np.float64})\ndf_test.head()", + "execution_count": 389, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "#Combining both training and test dataset\nfull_data = [df_data , df_test]", + "execution_count": 390, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "import seaborn as sns\n\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt\n\n#Allow chained assignment\npd.options.mode.chained_assignment = None\n\n#Configure\n%matplotlib inline\nmpl.style.use( 'ggplot' )\nsns.set_style( 'white' )\nplt.rcParams[ 'figure.figsize' ] = 8 , 6", + "execution_count": 391, + "cell_type": "code", + "metadata": { + "collapsed": true + } + }, + { + "outputs": [ + { + "text": "\nInt64Index: 891 entries, 0 to 890\nData columns (total 12 columns):\nPassengerId 891 non-null int64\nSurvived 891 non-null int64\nPclass 891 non-null int64\nName 891 non-null object\nSex 891 non-null object\nAge 714 non-null float64\nSibSp 891 non-null int64\nParch 891 non-null int64\nTicket 891 non-null object\nFare 891 non-null float64\nCabin 204 non-null object\nEmbarked 889 non-null object\ndtypes: float64(2), int64(5), object(5)\nmemory usage: 90.5+ KB\nNone\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "print df_data.info()", + "execution_count": 392, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "output_type": "execute_result", + "execution_count": 393, + "data": { + "text/plain": " Pclass Survived\n0 1 0.629630\n1 2 0.472826\n2 3 0.242363", + "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
PclassSurvived
010.629630
120.472826
230.242363
\n
" + }, + "metadata": {} + } + ], + "source": "#Make sure to double square bracket if passing more than one feature\ndf_data[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean()", + "execution_count": 393, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "output_type": "execute_result", + "execution_count": 394, + "data": { + "text/plain": " Sex Survived\n0 female 0.742038\n1 male 0.188908", + "text/html": "
\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
SexSurvived
0female0.742038
1male0.188908
\n
" + }, + "metadata": {} + } + ], + "source": "df_data[['Sex', 'Survived']].groupby(['Sex'], as_index=False).mean()", + "execution_count": 394, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": " FamSize Survived\n0 1 0.303538\n1 2 0.552795\n2 3 0.578431\n3 4 0.724138\n4 5 0.200000\n5 6 0.136364\n6 7 0.333333\n7 8 0.000000\n8 11 0.000000\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "#Checking out if there is a correlation between family size and survival rate\nfor data in full_data:\n data['FamSize'] = data['SibSp'] + data['Parch'] + 1\nprint df_data[['FamSize','Survived']].groupby(['FamSize'], as_index=False).mean()", + "execution_count": 395, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": " FamSize<=4 Survived\n0 0 0.161290\n1 1 0.400483\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "for data in full_data:\n data['FamSize<=4'] = (data['FamSize'] <= 4).astype(int)\n\nprint df_data[['FamSize<=4' , 'Survived']].groupby(['FamSize<=4'], as_index=False).mean()", + "execution_count": 396, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "output_type": "execute_result", + "execution_count": 397, + "data": { + "text/plain": " PassengerId Survived Pclass \\\n0 1 0 3 \n1 2 1 1 \n2 3 1 3 \n3 4 1 1 \n4 5 0 3 \n\n Name Sex Age SibSp \\\n0 Braund, Mr. Owen Harris male 22 1 \n1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 \n2 Heikkinen, Miss. Laina female 26 0 \n3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 \n4 Allen, Mr. William Henry male 35 0 \n\n Parch Ticket Fare Cabin Embarked FamSize FamSize<=4 Alone \n0 0 A/5 21171 7.2500 NaN S 2 1 0 \n1 0 PC 17599 71.2833 C85 C 2 1 0 \n2 0 STON/O2. 3101282 7.9250 NaN S 1 1 1 \n3 0 113803 53.1000 C123 S 2 1 0 \n4 0 373450 8.0500 NaN S 1 1 1 ", + "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
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedFamSizeFamSize<=4Alone
0103Braund, Mr. Owen Harrismale2210A/5 211717.2500NaNS210
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female3810PC 1759971.2833C85C210
2313Heikkinen, Miss. Lainafemale2600STON/O2. 31012827.9250NaNS111
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female351011380353.1000C123S210
4503Allen, Mr. William Henrymale35003734508.0500NaNS111
\n
" + }, + "metadata": {} + } + ], + "source": "for i in range(2):\n full_data[i]['Alone'] = (full_data[i]['FamSize']==1).astype(int)\n\ndf_data['Alone'] = (df_data['FamSize']==1).astype(int)\n\ndf_data.head()\n#df_test.head()", + "execution_count": 397, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": " Alone Survived\n0 0 0.505650\n1 1 0.303538\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "print df_data[['Alone', 'Survived']].groupby(['Alone'], as_index=False).mean()", + "execution_count": 398, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": "S 644\nC 168\nQ 77\nName: Embarked, dtype: int64\n2\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "print df_data['Embarked'].value_counts()\nprint df_data['Embarked'].isnull().sum()\n#Since there are only 2 null cells, we will fill it in with the majority which is 'S' for Southampton\ndf_data['Embarked'].fillna('S', inplace=True)", + "execution_count": 399, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": " Embarked Survived\n0 C 0.553571\n1 Q 0.389610\n2 S 0.339009\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "print df_data[['Embarked', 'Survived']].groupby(['Embarked'], as_index=False).mean()", + "execution_count": 400, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": " CategoryFare Survived\n0 [0, 7.854] 0.217877\n1 (7.854, 10.5] 0.201087\n2 (10.5, 21.679] 0.424419\n3 (21.679, 39.688] 0.444444\n4 (39.688, 512.329] 0.642045\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "#We will use median for Fare, because mean is misleading due to extremely high cost tickets\ndf_data['Fare'].fillna(df_data['Fare'].median(), inplace=True)\ndf_data['CategoryFare'] = pd.qcut(df_data['Fare'], 5)\nprint (df_data[['CategoryFare', 'Survived']].groupby(['CategoryFare'], as_index=False).mean())\n\ndf_test['Fare'].fillna(df_test['Fare'].median(), inplace=True)", + "execution_count": 401, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": " sample Survived\n0 0 0.382609\n1 1 0.384266\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "df_copy = df_data.copy()\nlist_copy = [df_copy]\ndef is_float(number):\n try:\n float(number)\n return 1\n except ValueError:\n return 0\n\nfor data in list_copy:\n data['sample'] = data['Ticket'].apply(is_float)\n \nprint df_copy[['sample', 'Survived']].groupby(['sample'], as_index=False).mean()\n\n", + "execution_count": 402, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "output_type": "execute_result", + "execution_count": 403, + "data": { + "text/plain": " TicketCategory Survived\n0 X 0.384266\n1 a 0.071429\n2 as 0.000000\n3 c 0.400000\n4 ca 0.341463\n5 casoton 0.000000\n6 fa 0.000000\n7 fc 0.000000\n8 fcc 0.800000\n9 line 0.250000\n10 pc 0.650000\n11 pp 0.666667\n12 ppp 0.500000\n13 sc 1.000000\n14 sca 0.000000\n15 scah 0.666667\n16 scow 0.000000\n17 scparis 0.454545\n18 soc 0.166667\n19 sop 0.000000\n20 sopp 0.000000\n21 sotono 0.000000\n22 sotonoq 0.133333\n23 sp 0.000000\n24 stono 0.444444\n25 swpp 1.000000\n26 wc 0.100000\n27 wep 0.333333", + "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
TicketCategorySurvived
0X0.384266
1a0.071429
2as0.000000
3c0.400000
4ca0.341463
5casoton0.000000
6fa0.000000
7fc0.000000
8fcc0.800000
9line0.250000
10pc0.650000
11pp0.666667
12ppp0.500000
13sc1.000000
14sca0.000000
15scah0.666667
16scow0.000000
17scparis0.454545
18soc0.166667
19sop0.000000
20sopp0.000000
21sotono0.000000
22sotonoq0.133333
23sp0.000000
24stono0.444444
25swpp1.000000
26wc0.100000
27wep0.333333
\n
" + }, + "metadata": {} + } + ], + "source": "#Will attempt to make sense of Ticket(if there is any correlation)\ndef delete_chars(ticket):\n found = ticket.find(' ')\n if found != -1:\n return ticket[found+1:]\n return ticket\n\ndef get_ticket(ticket):\n ticket = ticket.replace(\".\" , \"\")\n ticket = ticket.replace(\"/\" , \"\")\n ticket_search = re.search('[a-zA-Z]+', ticket)\n if ticket_search:\n #print 'ticket:', ticket, ' | ticket_search:', ticket_search.group(0)\n return ticket_search.group(0).lower()\n return \"X\"\n \nfor data in full_data:\n #data['Ticket'] = data['Ticket'].apply(delete_chars)\n data['TicketCategory'] = data['Ticket'].apply(get_ticket)\n #data['Ticket'].\n #data['TicketCategory'] = data['TicketCategory'].astype(float)\ndf_data[['TicketCategory', 'Survived']].groupby(['TicketCategory'], as_index=False).mean()\n\n#df_data.head()", + "execution_count": 403, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "equiv = {'X': 0, 'pc':1, 'ca':2,'a':3,'stono':4,'sotonoq':5,'scparis':6,'wc':7,'soc':8,\n'c':9,'fcc':10,'line':11,'sopp':12,'wep':13,'pp':14,'scah':15,'sotono':16,'ppp':17,'swpp':18,\n'fc':19,'scow':20,'fa':21,'casoton':22,'as':23,'sop':24,'sca':25,'sp':26,'sc':27,'lp':28,'aq':29,'stonoq':30}\n\n#for data in full_data:\n# data['TicketCategory'] = data['TicketCategory'].map(equiv).astype(int)\ndf_data['TicketCategory'] = df_data.TicketCategory.map(equiv)\ndf_test['TicketCategory'] = df_test.TicketCategory.map(equiv)\n#print df_test['TicketCategory'].isnull().sum()\n#print df_data['TicketCategory'].isnull().sum() \n\n#df_data[['TicketCategory', 'Survived']].groupby(['TicketCategory'], as_index=False).mean()", + "execution_count": 404, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": "TRAIN\nTEST\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "print \"TRAIN\"\n#for i in range(len(df_data.TicketCategory.values)):\n #if df_data.TicketCategory.iloc[i] == '':\n # print \"i:\", i\n\nprint \"TEST\"\n#for i in range(len(df_test.TicketCategory.values)):\n #if df_test.TicketCategory.iloc[i] == '':\n # print \"i:\", i\n\n#df_data.TicketCategory.value_counts()", + "execution_count": 405, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "output_type": "execute_result", + "execution_count": 406, + "data": { + "text/plain": "'LINE'" + }, + "metadata": {} + } + ], + "source": "df_copy.Ticket.iloc[302]", + "execution_count": 406, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "", + "execution_count": null, + "cell_type": "code", + "metadata": { + "collapsed": true + } + }, + { + "outputs": [], + "source": "", + "execution_count": null, + "cell_type": "code", + "metadata": { + "collapsed": true + } + }, + { + "outputs": [], + "source": "", + "execution_count": null, + "cell_type": "code", + "metadata": { + "collapsed": true + } + }, + { + "outputs": [ + { + "text": " CategoryAge Survived\n0 (0.0942, 15.336] 0.281250\n1 (15.336, 30.502] 0.416290\n2 (30.502, 45.668] 0.371681\n3 (45.668, 60.834] 0.357143\n4 (60.834, 76] 0.500000\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "#Since there are a huge number of age missing, we will use random number generated using mean and std.\nfor data in full_data:\n age_mean = data['Age'].mean()\n age_std = data['Age'].std()\n age_null = data['Age'].isnull().sum()\n\n age_random = np.random.randint(age_mean - age_std, age_mean + age_std, size=age_null)\n\n data['Age'][np.isnan(data['Age'])] = age_random.astype(int)\n \ndf_data['CategoryAge'] = pd.cut(data['Age'], 5)\n\nprint (df_data[['CategoryAge', 'Survived']].groupby(['CategoryAge'], as_index=False).mean())", + "execution_count": 407, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "#Will see if name has an impact on the outcome\ndef get_title(name):\n title_search = re.search('([A-Za-z]+)\\.', name)\n if title_search:\n return title_search.group(1)\n return \"\"", + "execution_count": 408, + "cell_type": "code", + "metadata": { + "scrolled": true, + "collapsed": false + } + }, + { + "outputs": [ + { + "text": "Sex female male\nTitle \nCapt 0 1\nCol 0 2\nCountess 1 0\nDon 0 1\nDr 1 6\nJonkheer 0 1\nLady 1 0\nMajor 0 2\nMaster 0 40\nMiss 182 0\nMlle 2 0\nMme 1 0\nMr 0 517\nMrs 125 0\nMs 1 0\nRev 0 6\nSir 0 1\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "for data in full_data:\n data['Title'] = data['Name'].apply(get_title)\n \nprint pd.crosstab(df_data['Title'], df_data['Sex'])", + "execution_count": 409, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": " Title Survived\n0 Above Average 0.347826\n1 Master 0.575000\n2 Miss 0.702703\n3 Mr 0.156673\n4 Mrs 0.793651\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "#We will put people's titles into meaningful categories\nfor data in full_data:\n data['Title'] = data['Title'].replace(to_replace=['Capt', 'Col', 'Countess', 'Don', 'Dr', 'Jonkheer',\n 'Lady', 'Major', 'Rev', 'Sir'], value='Above Average')\n data['Title'].replace(to_replace='Mlle', value='Miss', inplace=True)\n data['Title'].replace('Mme', 'Mrs', inplace=True)\n data['Title'].replace('Ms', 'Miss', inplace=True)\n\nprint df_data[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()", + "execution_count": 410, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": " hasCabin Survived\n0 0 0.299854\n1 1 0.666667\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "#See if the passengers had a cabin or not\nfor data in full_data:\n data['hasCabin'] = data['Cabin'].apply(lambda x: 1 if type(x)==str else 0)\n \nprint df_data[['hasCabin', 'Survived']].groupby(['hasCabin'], as_index=False).mean()", + "execution_count": 411, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "#df_copy.drop(['Name', 'SibSp', 'Parch', 'FamSize', 'Ticket', 'Cabin'], axis=1, inplace=True)\n#df_copy.head()", + "execution_count": 412, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "output_type": "execute_result", + "execution_count": 413, + "data": { + "text/plain": " PassengerId Pclass Name Sex \\\n0 892 3 Kelly, Mr. James male \n1 893 3 Wilkes, Mrs. James (Ellen Needs) female \n2 894 2 Myles, Mr. Thomas Francis male \n3 895 3 Wirz, Mr. Albert male \n4 896 3 Hirvonen, Mrs. Alexander (Helga E Lindqvist) female \n\n Age SibSp Parch Ticket Fare Cabin Embarked FamSize FamSize<=4 \\\n0 34.5 0 0 330911 7.8292 NaN Q 1 1 \n1 47.0 1 0 363272 7.0000 NaN S 2 1 \n2 62.0 0 0 240276 9.6875 NaN Q 1 1 \n3 27.0 0 0 315154 8.6625 NaN S 1 1 \n4 22.0 1 1 3101298 12.2875 NaN S 3 1 \n\n Alone TicketCategory Title hasCabin \n0 1 0 Mr 0 \n1 0 0 Mrs 0 \n2 1 0 Mr 0 \n3 1 0 Mr 0 \n4 0 0 Mrs 0 ", + "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
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedFamSizeFamSize<=4AloneTicketCategoryTitlehasCabin
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ1110Mr0
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS2100Mrs0
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ1110Mr0
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS1110Mr0
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS3100Mrs0
\n
" + }, + "metadata": {} + } + ], + "source": "df_test.isnull().sum()\n\n#dropping a few features for now\n#df_test.drop(['Cabin', 'CategoryAge', 'FamSize','SibSp', 'Parch', 'Ticket', 'Name'], axis=1, inplace=True)\ndf_test.head()", + "execution_count": 413, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": " PassengerId Survived Pclass Sex Age Fare Embarked FamSize<=4 Alone \\\n0 1 0 3 1 1 0 1 1 0 \n1 2 1 1 0 2 3 2 1 0 \n2 3 1 3 0 1 1 1 1 1 \n3 4 1 1 0 2 3 1 1 0 \n4 5 0 3 1 2 1 1 1 1 \n5 6 0 3 1 2 1 0 1 1 \n6 7 0 1 1 3 3 1 1 1 \n7 8 0 3 1 0 2 1 0 0 \n8 9 1 3 0 1 1 1 1 0 \n9 10 1 2 0 0 2 2 1 0 \n\n TicketCategory Title hasCabin \n0 3 1 0 \n1 1 2 1 \n2 4 3 0 \n3 0 2 1 \n4 0 1 0 \n5 0 1 0 \n6 0 1 1 \n7 0 4 0 \n8 0 2 0 \n9 0 2 0 \n\nPassengerId 0\nPclass 0\nSex 0\nAge 0\nFare 0\nEmbarked 0\nFamSize<=4 0\nAlone 0\nTicketCategory 0\nTitle 0\nhasCabin 0\ndtype: int64\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "#We will be using map() method in order to convert everything into numerical value so that we can get a classifier score\nfor data in full_data:\n \n #Mapping Embarked\n data['Embarked'] = data['Embarked'].map({'Q': 0, 'S': 1, 'C': 2}).astype(int)\n \n #Mapping Sex\n data['Sex'] = data['Sex'].map({'male': 1, 'female': 0}).astype(int)\n \n #Mapping Age(used cut method)\n data.loc[data['Age'] <= 16 , 'Age'] = 0\n data.loc[(data['Age'] > 16) & (data['Age'] <=32), 'Age'] = 1\n data.loc[(data['Age'] > 32) & (data['Age'] <=48), 'Age'] = 2\n data.loc[(data['Age'] > 48) & (data['Age'] <=64), 'Age'] = 3\n data.loc[(data['Age'] > 64), 'Age'] = 4\n \n #Mapping Fare(used qcut method)\n data.loc[data['Fare'] <= 7.91, 'Fare'] = 0\n data.loc[(data['Fare'] > 7.91) & (data['Fare'] < 14.454) , 'Fare'] = 1\n data.loc[(data['Fare'] > 14.454) & (data['Fare'] < 31) , 'Fare'] = 2\n data.loc[(data['Fare'] > 31), 'Fare'] = 3\n \n #Mapping Title to values\n data['Title'] = data['Title'].map({'Above Average': 0, 'Mr': 1, 'Mrs': 2, 'Miss': 3, 'Master': 4})\n #There is 1 missing title in df_test dataset\n data['Title'].fillna(0, inplace=True)\n \n#print df_data.columns.values\ndrop_features = ['Name', 'SibSp', 'Parch', 'Ticket', 'Cabin', 'FamSize']\ndf_data.drop(drop_features, axis=1, inplace=True)\ndf_data.drop(['CategoryFare', 'CategoryAge'], axis=1, inplace=True)\ndf_test.drop(drop_features, axis=1, inplace=True)\n\nprint df_data.head(10)\nprint '\\n', df_test.isnull().sum()", + "execution_count": 414, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "output_type": "execute_result", + "execution_count": 415, + "data": { + "text/plain": "PassengerId 0\nSurvived 0\nPclass 0\nSex 0\nAge 0\nFare 0\nEmbarked 0\nFamSize<=4 0\nAlone 0\nTicketCategory 0\nTitle 0\nhasCabin 0\ndtype: int64" + }, + "metadata": {} + } + ], + "source": "df_data.isnull().sum()", + "execution_count": 415, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "features = ['Pclass', 'Sex', 'Age', 'Alone', 'Fare', 'Embarked', 'Title', 'hasCabin', 'TicketCategory'] \nX_train = df_data[features]\nY_train = df_data['Survived']\nX_test = df_test[features]\n\nfrom sklearn.ensemble import RandomForestClassifier\n \ncl = RandomForestClassifier(n_estimators=1000, max_depth=None, min_samples_split=2, random_state=0)\n\ncl.fit(X_train, Y_train)\nY_pred = cl.predict(X_test)\n\n#testing2 = DecisionTreeClassifier()\n#testing2.fit(X_train, Y_train)\n#Y_pred = testing2.predict(X_test)\n#testing1 = GradientBoostingClassifier()\n#testing1.fit(X_train, Y_train)\n#Y_pred = testing1.predict(X_test)", + "execution_count": 416, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": "RandomForestClassifier: 0.798206278027\n", + "output_type": "stream", + "name": "stdout" + }, + { + "output_type": "execute_result", + "execution_count": 417, + "data": { + "text/plain": "" + }, + "metadata": {} + }, + { + "metadata": {}, + "data": { + "text/plain": "", + "image/png": "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\n" + }, + "output_type": "display_data" + } + ], + "source": "x_train, x_test, y_train, y_test = train_test_split(X_train, Y_train)\n\nc2 = RandomForestClassifier(n_estimators=1000, max_depth=None, min_samples_split=2, random_state=4)\nc2.fit(x_train,y_train)\nprint 'RandomForestClassifier:', metrics.accuracy_score(c2.predict(x_test), y_test)\n\nk_range = range(1,26)\nscores = []\n\nfor k in k_range:\n knn = KNeighborsClassifier(n_neighbors=k)\n knn.fit(x_train, y_train)\n k_pred = knn.predict(x_test)\n scores.append(metrics.accuracy_score(k_pred, y_test))\n \n#Visualize by plotting\nplt.plot(k_range, scores)\nplt.xlabel('Value of K for KNN')\nplt.ylabel(\"Accuracy Score\")\n#k=5 seems like it's best", + "execution_count": 417, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": "0.748878923767\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "knn = KNeighborsClassifier(n_neighbors=5)\nknn.fit(x_train,y_train)\naassd = knn.predict(x_test)\nprint metrics.accuracy_score(aassd, y_test)", + "execution_count": 418, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [ + { + "text": "0.820627802691\n0.838565022422\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "svc = SVC(probability=True)\nsvc.fit(x_train, y_train)\nfdsa = svc.predict(x_test)\nprint metrics.accuracy_score(fdsa, y_test)\n\ngrad = GradientBoostingClassifier()\ngrad.fit(x_train, y_train)\nqwer = grad.predict(x_test)\nprint metrics.accuracy_score(qwer, y_test)\n", + "execution_count": 419, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "def put_file(credentials, local_file_name): \n \"\"\"This functions returns a StringIO object containing\n the file content from Bluemix Object Storage V3.\"\"\"\n f = open(local_file_name,'r')\n my_data = f.read()\n url1 = ''.join(['https://identity.open.softlayer.com', '/v3/auth/tokens'])\n data = {'auth': {'identity': {'methods': ['password'],\n 'password': {'user': {'name': credentials['username'],'domain': {'id': credentials['domain_id']},\n 'password': credentials['password']}}}}}\n headers1 = {'Content-Type': 'application/json'}\n resp1 = requests.post(url=url1, data=json.dumps(data), headers=headers1)\n resp1_body = resp1.json()\n for e1 in resp1_body['token']['catalog']:\n if(e1['type']=='object-store'):\n for e2 in e1['endpoints']:\n if(e2['interface']=='public'and e2['region']=='dallas'):\n url2 = ''.join([e2['url'],'/', credentials['container'], '/', local_file_name])\n s_subject_token = resp1.headers['x-subject-token']\n headers2 = {'X-Auth-Token': s_subject_token, 'accept': 'application/json'}\n resp2 = requests.put(url=url2, headers=headers2, data = my_data )\n print resp2", + "execution_count": 420, + "cell_type": "code", + "metadata": { + "collapsed": true + } + }, + { + "outputs": [], + "source": "# The code was removed by DSX for sharing.", + "execution_count": 421, + "cell_type": "code", + "metadata": { + "collapsed": true + } + }, + { + "outputs": [ + { + "text": " PassengerId Survived\n0 892 0\n1 893 0\n2 894 0\n3 895 0\n4 896 1\n\nDone!\n", + "output_type": "stream", + "name": "stdout" + } + ], + "source": "PId = range(892,1310)\nans = pd.DataFrame({'PassengerId':PId, 'Survived':Y_pred})\nprint ans.head()\nans.to_csv('minho_ans.csv', index=False)\nput_file(credentials_1, 'minho_ans.csv')\nprint 'Done!'", + "execution_count": 422, + "cell_type": "code", + "metadata": { + "collapsed": false + } + }, + { + "outputs": [], + "source": "", + "execution_count": null, + "cell_type": "code", + "metadata": { + "collapsed": true + } + } + ], + "nbformat_minor": 0 +} \ No newline at end of file