{"cells":[{"metadata":{"trusted":true,"_uuid":"799e28a21ada13afac80455b539e5e52b943a732"},"cell_type":"code","source":"#import libraries\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn import metrics\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.linear_model import LinearRegression\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"51884d0e6cb421375dd3e4f258366784d02813fc"},"cell_type":"code","source":"def findDr(st):\n    found = 0\n    for word in st.lower().split():\n        if word == 'dr.':\n            found += 1\n    if found > 0:\n        return 1\n    else:\n        return 0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e835e6243909fb6a1513dc11e0f54f8012bebf79"},"cell_type":"code","source":"def CabinCat(cabin):\n    returnedPrefix = 'U'\n    if pd.notnull(cabin):\n        CabinPrefix = cabin[0].upper()\n        knownCabinTypes = ['A','B','C','D','E','F','G','T']\n        \n        if CabinPrefix in knownCabinTypes:\n            returnedPrefix = CabinPrefix   \n    \n    return returnedPrefix","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f1faabc8fc66c7aa70540751aebeb6fd947fa2b8"},"cell_type":"code","source":"def age_model_build(df):\n    #function uses linear regression to predict age.\n    \n    #drop the null ages for the purpose of building a model.  Drop columns which don't seem relevant to age\n    df = df.dropna()\n    X = df.drop(columns=['Age','PassengerId','Survived','Embarked_Q','Embarked_C','CabinCategory_T',\n                         'CabinCategory_D','CabinCategory_E','CabinCategory_C','CabinCategory_B',\n                         'CabinCategory_U','CabinCategory_F','CabinCategory_G'])\n    y = df['Age']\n    \n   # X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)\n    lm = LinearRegression()\n    lm.fit(X,y)\n    \n    predictions = lm.predict(X)\n    coeffecients = pd.DataFrame(lm.coef_,X.columns)\n    coeffecients.columns = ['Coeffecient']\n    coeffecients.to_csv('Coefficients.csv')\n    \n    #Write out a scatterplot to check model performance\n    plt.figure(figsize=(8, 6))\n    plt.scatter(y,predictions)\n    plt.grid()\n    plt.xlabel('Actual Y Values')\n    plt.ylabel('Predicted Values')\n    plt.rcParams['axes.axisbelow'] = True\n    plt.rc('axes', axisbelow=True)\n    \n    print('MAE:', metrics.mean_absolute_error(y, predictions))\n    print('MSE:', metrics.mean_squared_error(y, predictions))\n    print('RMSE:', np.sqrt(metrics.mean_squared_error(y, predictions)))\n\n    \n    return lm","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"927cabddaf2581b2b2cb2f76491af8612c76c5dc"},"cell_type":"code","source":"def findRev(st):\n    found = 0\n    for word in st.lower().split():\n        if word == 'rev.':\n            found += 1\n    if found > 0:\n        return 1\n    else:\n        return 0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b955205144eaf8845c5e7a83fa9bc4ac42e8a936"},"cell_type":"code","source":"def findMstr(st):\n    found = 0\n    for word in st.lower().split():\n        if word == 'master.':\n            found += 1\n    if found > 0:\n        return 1\n    else:\n        return 0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9464a34dacb6f3161ae3f56779b4f905bd905ee1"},"cell_type":"code","source":"def guess_missing(cols):\n    #if data is missing use dummy column else use actual data\n    if pd.isnull(cols[0]):\n        return cols[1]\n    else:\n        return cols[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8363b80bb73923000326443d74d9c58e9831400c"},"cell_type":"code","source":"def populate_missing(df, model = None, dropPredicted = None):\n    \n    if(dropPredicted):\n        delcolumns=['Age','PassengerId','Avg_Fare','Survived','Embarked_Q','Embarked_C','CabinCategory_T',\n                         'CabinCategory_D','CabinCategory_E','CabinCategory_C','CabinCategory_B',\n                         'CabinCategory_U','CabinCategory_F','CabinCategory_G']\n    else:\n        delcolumns=['Age','PassengerId','Avg_Fare','Embarked_Q','Embarked_C','CabinCategory_T',\n                         'CabinCategory_D','CabinCategory_E','CabinCategory_C','CabinCategory_B',\n                         'CabinCategory_U','CabinCategory_F','CabinCategory_G']\n    \n    #First a calculation for average Fare\n    by_Class = df.groupby(\"Pclass\")\n    AvgFare = pd.DataFrame(by_Class.mean()['Fare'])\n    AvgFare['Pclass'] = AvgFare.index\n    AvgFare = AvgFare.rename(columns={'Fare': 'Avg_Fare'})\n    df = df.merge(AvgFare, on='Pclass',how='left')\n    \n    #There isn't any missing Fare data in the Train dataset but there is missing fare data in the test dataset\n    #For the fare I will use the mean fare for the particular class\n    df['Fare'] = df[['Fare','Avg_Fare']].apply(guess_missing,axis=1)\n\n    #Next a calculation for age using a linear regression model\n    predicted_ages = pd.DataFrame(model.predict(df.drop(columns=delcolumns)))\n    predicted_ages = predicted_ages.rename(columns={0: 'Pred_Age'})\n    \n    df = df.join(predicted_ages)\n    df['Age'] = df[['Age','Pred_Age']].apply(guess_missing,axis=1)\n    df = df.drop(columns=['Pred_Age','Avg_Fare'])\n    \n    return df\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"29f460914ffcb6e46bb4d0ec28842f92de0aea49"},"cell_type":"code","source":"#dataclean up function\ndef dataCleanUp(df):\n\n    #simplified strategy:  Drop Cabin & Ticket.  \n    #From Name, only derive Master, Dr, Rev\n    \n    df['CabinCategory'] = df['Cabin'].apply(CabinCat)\n    df = df.drop(columns='Cabin')\n    \n    df = df.drop(columns='Ticket')\n\n    df['IsDR'] = df['Name'].apply(findDr)\n    df['IsRev'] = df['Name'].apply(findRev)\n    df['IsMstr'] = df['Name'].apply(findMstr)\n\n    df = df.drop(columns='Name')\n\n    df = pd.get_dummies(df,columns=['Sex'])\n    df = pd.get_dummies(df,columns=['Embarked'])\n    df = pd.get_dummies(df,columns=['CabinCategory'])\n\n    df =df.drop(columns=['Sex_female','Embarked_S','CabinCategory_A'])\n    #df =df.drop(columns=['Sex_female','Embarked_S'])\n    \n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b3574022d7987ffc821e1ec6891c5babd79f05a4"},"cell_type":"code","source":"def buildRandomForest(df):\n    X = df.drop(columns='Survived')\n    y= df['Survived']\n    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)\n    #parameters come from GridSearchCV which is commented out below \n    rfc = RandomForestClassifier(n_estimators=600,max_depth=7,max_features='sqrt',criterion='gini')\n    rfc.fit(X_train,y_train)\n    #rfc.fit(X,y)\n    predictions = rfc.predict(X_test)\n    #predictions = rfc.predict(X)\n    from sklearn.metrics import confusion_matrix,classification_report\n    print(\"The confusion Matrix\")\n    print(confusion_matrix(y_test,predictions))\n    #print(confusion_matrix(y,predictions))\n    #print(\"The classification report\")\n    print(classification_report(y_test,predictions))\n    #print(classification_report(y,predictions))\n    \n    return rfc","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2d8d4a8a5ae1fb4593999e26f5e11a48a16cbea6"},"cell_type":"code","source":"def buildLogReg(df):\n    X = df.drop(columns='Survived')\n    y= df['Survived']\n    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)\n    #parameters come from GridSearchCV which is commented out below \n    logmodel = LogisticRegression()\n    logmodel.fit(X_train,y_train)\n    #rfc.fit(X,y)\n    predictions = logmodel.predict(X_test)\n    #predictions = rfc.predict(X)\n    from sklearn.metrics import confusion_matrix,classification_report\n    print(\"The confusion Matrix\")\n    print(confusion_matrix(y_test,predictions))\n    #print(confusion_matrix(y,predictions))\n    #print(\"The classification report\")\n    print(classification_report(y_test,predictions))\n    #print(classification_report(y,predictions))\n    \n    return logmodel","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2a084404070b72c98def4b11fbb6b0d5788a1f86"},"cell_type":"code","source":"df = pd.read_csv('../input/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8d83ff290b272de1b3001b00593e4184e47dbb35"},"cell_type":"code","source":"#First step is to build a model to predict the age of each passenger.  This will be used to populate missing ages later\ndf = dataCleanUp(df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9caa2b7103ceb202b78a3222735640f767b9d5c2"},"cell_type":"code","source":"df_headers = set(df.columns.drop('Survived'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d1dc30ef9be8bcd6565e34a20f97687e83593d1a"},"cell_type":"code","source":"age_model = age_model_build(df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"38009a11d4c5e8f5971504210f7a41d065d63ba6"},"cell_type":"code","source":"df = populate_missing(df,age_model,True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d01d6bf79a932043fa0991e037c71f33e13f0712"},"cell_type":"code","source":"rfc = buildRandomForest(df.drop(columns='PassengerId'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"72dd08747db4f2e532e51846733fe8c94bd390e9"},"cell_type":"code","source":"# #Determine the best parameters for Random Forest\n# from sklearn.model_selection import GridSearchCV\n# param_grid = { \n#   'n_estimators': [500, 600],\n#    'max_features': ['auto', 'sqrt', 'log2'],\n#    'max_depth' : [4,5,6,7,8],\n#    'criterion' :['gini', 'entropy']\n# }\n\n# CV_rfc = GridSearchCV(estimator=rfc, param_grid=param_grid, cv= 5)\n# CV_rfc.fit(df.drop(columns='Survived'),df['Survived'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bbd846d0a68cd6a537018cf642db269c64814b39"},"cell_type":"code","source":"# CV_rfc.best_params_","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0f317976b1bf21f70fc97b73e1f9fbad0be26aad"},"cell_type":"code","source":"test_df = pd.read_csv('../input/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b77290215f4d3408407b9529540bcf36067f135f"},"cell_type":"code","source":"test_df_rows = test_df.count()[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8a981ec0a8dd4028a9f9929865f7266374d01f2d"},"cell_type":"code","source":"test_df = dataCleanUp(test_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a5c88ef6d0f7122a3eb388f46b387bd8722c7f73"},"cell_type":"code","source":"test_df_headers = set(test_df.columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fd770114ca7a303070151914289cd1420f94f52c"},"cell_type":"code","source":"missing_from_test =  df_headers-test_df_headers","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4dacbf07c3370aaa634fe51fe31a0254b9e90833"},"cell_type":"code","source":"number_of_columns_missing = len(list(missing_from_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c526bad7ec68c397a48377ad392be6392fbb534e"},"cell_type":"code","source":"#Append dummy data\ndummy_columns = np.zeros((test_df_rows,number_of_columns_missing))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"efba665ada1b9fee9d8c5b9c7332ac2498c85e74"},"cell_type":"code","source":"final_dummy_data = pd.DataFrame(dummy_columns,columns=list(missing_from_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2d7af8e2f0e2ff0436f942d297a2a90a40586646"},"cell_type":"code","source":"test_df = test_df.join(final_dummy_data)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"10ea950e92631b8f72c4571ebe787c04c400da5c"},"cell_type":"code","source":"#populate the ages using the previously built age model\ntest_df = populate_missing(test_df,age_model,False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"354974d527eee37840198ce1f7e73a9fb5a929a2"},"cell_type":"code","source":"test_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a04b992b61cc38e0ea1648a89cd2f0dead7f380c"},"cell_type":"code","source":"finalPredictions = pd.DataFrame(rfc.predict(test_df.drop(columns='PassengerId')))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9b0e7a7ab850388964de5c6584657128d95c119d"},"cell_type":"code","source":"finalPredictions = finalPredictions.rename(columns={0:'Survived'})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2feff374d7520a16b15ca64c5d613f9189630a1f"},"cell_type":"code","source":"#join back to original dataset\nfinal_predictions_for_csv = pd.DataFrame(test_df['PassengerId']).join(finalPredictions)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0c2cf2ea24ac28089538a17d7a3cf7ee8a9d3c29"},"cell_type":"code","source":"#final_predictions_for_csv.to_csv('../input/final_prediction.csv',index=False)\nfinal_predictions_for_csv.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"f94fc1f6d048fe88bb5eb9f11b9c698afeda9d59"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"75f28b5d3f32d4c03d4f10523a2d72adb914f026"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}