{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom fancyimpute import KNN\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"def create_dummies(df, column_name, pref=False):\n    dummies = pd.get_dummies(df[column_name], prefix=column_name if pref else None)\n    df = df.join(dummies)\n    return df\n\n\ndef prepare_data(train, test):\n    # replace numerical categorical features with indicators\n    train = create_dummies(train, \"Pclass\", pref=True)\n    test = create_dummies(test, \"Pclass\", pref=True)\n    train = create_dummies(train, \"Sex\")\n    test = create_dummies(test, \"Sex\")\n\n    # deduce missing ports from fares\n    train.loc[train.Embarked != train.Embarked, \"Embarked\"] = \"C\"\n    test.loc[test.Embarked != test.Embarked, \"Embarked\"] = \"C\"\n    train = create_dummies(train, \"Embarked\", pref=True)\n    test = create_dummies(test, \"Embarked\", pref=True)\n\n    # deduce missing fare by port\n    full = pd.concat([train, test], sort=False)\n    imp_fare = full.loc[(full.Embarked == 'S') & (full.Pclass == 3), \"Fare\"].mean()\n    test.loc[test.Fare != test.Fare, \"Fare\"] = round(imp_fare, 2)\n\n    # create features by aggregation\n    train_fsize = train.Parch + train.SibSp\n    train = train.join(train_fsize.rename('Fsize'))\n    test_fsize = test.Parch + test.SibSp\n    test = test.join(test_fsize.rename('Fsize'))\n\n    # engineer features from existing with regexps\n    train_titles = train.Name.str.replace('(.*, )|(\\\\..*)', '').rename('Title')\n    test_titles = test.Name.str.replace('(.*, )|(\\\\..*)', '').rename('Title')\n    train = train.join(train_titles)\n    test = test.join(test_titles)\n    rare_title = [\"Capt\", \"Col\", \"Don\", \"Dona\", \"Dr\", \"Jonkheer\", \"Lady\", \"Major\", \"Rev\", \"Sir\", \"the Countess\"]\n    train.loc[train.Title.isin(rare_title), \"Title\"] = \"Rare\"\n    test.loc[test.Title.isin(rare_title), \"Title\"] = \"Rare\"\n    train.loc[train.Title.isin([\"Mlle\", \"Ms\"]), \"Title\"] = \"Miss\"\n    test.loc[test.Title.isin([\"Mlle\", \"Ms\"]), \"Title\"] = \"Miss\"\n    train.loc[train.Title == \"Mme\", \"Title\"] = \"Mrs\"\n    test.loc[test.Title == \"Mme\", \"Title\"] = \"Mrs\"\n    train = create_dummies(train, 'Title')\n    test = create_dummies(test, 'Title')\n    train.drop(['Title'], axis=1, inplace=True)\n    test.drop(['Title'], axis=1, inplace=True)\n\n    # drop useless columns\n    train.drop(['Sex', 'Name', 'Pclass', 'Embarked', 'Ticket', 'Cabin', 'PassengerId'], axis=1, inplace=True)\n    test.drop(['Sex', 'Name', 'Pclass', 'Embarked', 'Ticket', 'Cabin'], axis=1, inplace=True)\n\n    # impute Age using knn\n    k_train = int(np.sqrt(train.shape[0]))\n    k_test = int(np.sqrt(test.shape[0]))\n    train_features = train.drop(['Survived'], axis=1).select_dtypes(include=[np.float, np.int])\n    test_features = test.select_dtypes(include=[np.float, np.int])\n    filled_ages_train = pd.DataFrame(KNN(k=k_train).fit_transform(train_features)).loc[:, 0]\n    filled_ages_test = pd.DataFrame(KNN(k=k_test).fit_transform(test_features)).loc[:, 0]\n    train.Age = round(filled_ages_train, 1)\n    test.Age = round(filled_ages_test, 1)\n\n    # add two age categories\n    cut_points = [0, 16, 100]\n    label_names = [\"Child\", 'Adult']\n    test[\"AgeGroup\"] = pd.cut(test[\"Age\"], cut_points, labels=label_names)\n    train[\"AgeGroup\"] = pd.cut(train[\"Age\"], cut_points, labels=label_names)\n    test = create_dummies(test, \"AgeGroup\")\n    train = create_dummies(train, \"AgeGroup\")\n    test.drop(['AgeGroup'], axis=1, inplace=True)\n    train.drop(['AgeGroup'], axis=1, inplace=True)\n\n    train_x = train[train.columns[1:]]\n    train_y = train['Survived']\n    test_x = test\n\n    return train_x, train_y, test_x","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"34ebcae065878bd0355a3922e5a625f53e983ff5"},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import cross_val_score","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e6203f3b03323e478a3e8dd2d4a52a478e0df0ad"},"cell_type":"code","source":"train = pd.read_csv(\"../input/train.csv\")\ntest = pd.read_csv(\"../input/test.csv\")\ntrain_x, train_y, test_x = prepare_data(train, test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7893d6fc790cc298df4ecb07c2c439a082d25568"},"cell_type":"code","source":"random_forest = RandomForestClassifier(n_estimators=200)\nscores = cross_val_score(random_forest, train_x, train_y, cv=10)\nprint(f\"random forest scrore: {np.mean(scores):.5f}±{np.std(scores):.5f}\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7b7529fd0bc290c27f9eeba775d9798b57495171"},"cell_type":"code","source":"model = RandomForestClassifier(n_estimators=200)\nmodel.fit(train_x, train_y)\ntest_predictions = model.predict(test_x[train_x.columns])\ntest_ids = test[\"PassengerId\"]\nsubmission_df = {\"PassengerId\": test_ids, \"Survived\": test_predictions}\nsubmission = pd.DataFrame(submission_df)\nsubmission.to_csv('titanic_submission.csv', index=False)","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}