{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "71e03c30-2b9c-f7a8-f7b5-90c9a01423a1"
      },
      "source": [
        "#Titanic Competition Binary Classifier with logistic regression"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "ac49383f-7c6e-87cd-80fc-f7178ae17eb9"
      },
      "outputs": [],
      "source": [
        "# Import declarations\n",
        "\n",
        "import re # regular expressions\n",
        "import numpy as np # linear algebra\n",
        "import pandas as pd # data processing\n",
        "import matplotlib.pyplot as plt # plotting\n",
        "\n",
        "from sklearn import preprocessing\n",
        "from sklearn.utils import shuffle # Shuffle dataset function\n",
        "from sklearn.decomposition import PCA # Principal component Analysis dimensionality reduction\n",
        "from sklearn.svm import SVC # State vector machine\n",
        "from sklearn.model_selection import learning_curve # Learning curve\n",
        "from sklearn.metrics import f1_score # benchmarking"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "eb6bc3de-f51f-efe3-0813-a5af8d1837d8"
      },
      "source": [
        "#Import and prepare data sets\n",
        "\n",
        "### Preprocessing\n",
        "\n",
        "* Gender is mapped: male to 0, female to 1\n",
        "* NaNs are replaced with zeros\n",
        "\n",
        "**Cabin**  \n",
        "Cabin is separated in\n",
        "\n",
        "* number of cabins\n",
        "* letter of cabins mapped A=1, B=2...\n",
        "* number of cabin (or average if multiple)\n",
        "\n",
        "### Cross validation set\n",
        "\n",
        "Cross validation set is created using 20% of shuffled processed input data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "dc66ee0e-2d3a-0706-333e-8e266b10161b"
      },
      "outputs": [],
      "source": [
        "# read data\n",
        "raw_data = pd.read_csv('../input/train.csv')\n",
        "raw_data = shuffle(raw_data)\n",
        "\n",
        "test_data = pd.read_csv('../input/test.csv')\n",
        "\n",
        "# replace gender with index\n",
        "gender_dic = {\"male\": 0, \"female\": 1}\n",
        "raw_data.ix[:,4] = raw_data.ix[:,4].replace(gender_dic)\n",
        "test_data.ix[:,3] = test_data.ix[:,3].replace(gender_dic)\n",
        "\n",
        "# replace port with index\n",
        "port_dic = {\"S\": 0, \"C\": 1, \"Q\": 2}\n",
        "raw_data.ix[:,11] = raw_data.ix[:,11].replace(port_dic)\n",
        "test_data.ix[:,10] = test_data.ix[:,10].replace(port_dic)\n",
        "\n",
        "#raw_data.fillna(0, inplace=True)\n",
        "\n",
        "# cabin data\n",
        "raw_data = raw_data.assign(Cabin_count=np.nan);\n",
        "raw_data = raw_data.assign(Cabin_letter=np.nan);\n",
        "raw_data = raw_data.assign(Cabin_number=np.nan);\n",
        "test_data = test_data.assign(Cabin_count=np.nan);\n",
        "test_data = test_data.assign(Cabin_letter=np.nan);\n",
        "test_data = test_data.assign(Cabin_number=np.nan);\n",
        "\n",
        "def map_cabin(row):\n",
        "   \n",
        "    cabin_str = row['Cabin']\n",
        "    if not isinstance(cabin_str, str):\n",
        "        return row\n",
        "        \n",
        "    cabin_parts = cabin_str.split(\" \")\n",
        "    row['Cabin_count'] = len(cabin_parts)\n",
        "    \n",
        "    lc = cabin_parts[len(cabin_parts)-1]\n",
        "    cl = re.findall('[A-Z]', lc)\n",
        "    cn = re.findall('\\d+', lc)\n",
        "    \n",
        "    if len(cl) > 0:\n",
        "        row['Cabin_letter'] = ord(cl[0])\n",
        "    else:\n",
        "        row['Cabin_letter'] = np.nan\n",
        "    \n",
        "    if len(cn) > 0:\n",
        "        row['Cabin_number'] = int(cn[0])\n",
        "    else:\n",
        "        row['Cabin_number'] = np.nan\n",
        "    \n",
        "    return row\n",
        "\n",
        "raw_data = raw_data.apply(map_cabin, axis=1)\n",
        "test_data = test_data.apply(map_cabin, axis=1)\n",
        "\n",
        "# extract columns\n",
        "data_X = raw_data.ix[:, [2,4,5,6,7,9,12,13,14]]\n",
        "test_X = test_data.ix[:, [1,3,4,5,6,8,11,12,13]]\n",
        "#data_X = raw_data.ix[:, [4,5]]\n",
        "data_y = raw_data.ix[:,1]\n",
        "\n",
        "#remove NaN and normalize\n",
        "data_X = data_X.fillna(data_X.mean())\n",
        "test_X = test_X.fillna(data_X.mean())\n",
        "\n",
        "#poly = preprocessing.PolynomialFeatures(3)\n",
        "#data_X = poly.fit_transform(data_X)\n",
        "\n",
        "min_max_scaler = preprocessing.MinMaxScaler()\n",
        "np_scaled = min_max_scaler.fit_transform(data_X)\n",
        "data_X = pd.DataFrame(np_scaled)\n",
        "\n",
        "np_scaled = min_max_scaler.fit_transform(test_X)\n",
        "test_X = pd.DataFrame(np_scaled)\n",
        "\n",
        "# seaparate training and cross validation\n",
        "msk = np.random.rand(len(data_X)) < 0.8\n",
        "\n",
        "train_X = data_X[msk]\n",
        "train_y = data_y[msk]\n",
        "\n",
        "cv_X = data_X[~msk]\n",
        "cv_y = data_y[~msk]\n",
        "\n",
        "#raw_data.head()\n",
        "#data_X.head()\n",
        "test_X.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "99ecba68-ecaa-1666-e5d4-6539fff7a1fe"
      },
      "source": [
        "# Data visualization\n",
        "\n",
        "Use PCA to visualize data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "9a8c43c7-707b-0415-52a5-2fcd280dd3b5"
      },
      "outputs": [],
      "source": [
        "pca = PCA(n_components=2)\n",
        "t = pca.fit_transform(data_X)\n",
        "t_x, t_y = t.T\n",
        "\n",
        "plt.scatter(t_x, t_y, c=data_y)\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "321eb7a2-0434-2fc8-f36e-ab0c2ca1cb5e"
      },
      "source": [
        "#Learning Curves"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "d3c34a3f-90b3-a425-50ff-800df7f1faab"
      },
      "outputs": [],
      "source": [
        "est = SVC(C=0.4)\n",
        "\n",
        "ts = [10,25,50,100,200,300,400,445]\n",
        "train_sizes, train_scores, valid_scores = learning_curve(est, data_X, data_y, train_sizes=ts, cv=2)\n",
        "\n",
        "line1, = plt.plot(train_sizes, np.mean(train_scores, axis=1), 'o-', label=\"Train score\")\n",
        "line2, = plt.plot(train_sizes, np.mean(valid_scores, axis=1), 'o-', label=\"CV score\")\n",
        "plt.legend(handles=[line1, line2])\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "756b5f1d-bd8e-6409-043a-cf1046694112"
      },
      "source": [
        "#Train Classifier"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "585e9e0c-bd81-7cc2-6eb6-e84b09ffa338"
      },
      "outputs": [],
      "source": [
        "# Train classifier and print score\n",
        "est.fit(train_X, train_y)\n",
        "predict = est.predict(cv_X)\n",
        "score = f1_score(cv_y, predict, average='macro')\n",
        "print(score)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "c6b7ab63-5fe4-f111-a506-cce2c3ffaafc"
      },
      "outputs": [],
      "source": [
        "# read test set and predict results\n",
        "predict = est.predict(test_X)\n",
        "\n",
        "test_data = pd.read_csv('../input/test.csv')\n",
        "result = {'PassengerId': test_data.ix[:,0], 'Survived': predict}\n",
        "resultDf = pd.DataFrame(result)\n",
        "\n",
        "print(resultDf.to_csv())"
      ]
    }
  ],
  "metadata": {
    "_change_revision": 0,
    "_is_fork": false,
    "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.6.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}