{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Your first lines of code\nIf the code runs successfully, three lines of output are returned. Below, you can see the same code that you just ran, along with the output that you should see in your notebook.","metadata":{}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-09T16:43:08.926490Z","iopub.execute_input":"2022-08-09T16:43:08.926919Z","iopub.status.idle":"2022-08-09T16:43:08.937649Z","shell.execute_reply.started":"2022-08-09T16:43:08.926875Z","shell.execute_reply":"2022-08-09T16:43:08.936240Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load the data","metadata":{}},{"cell_type":"code","source":"train_data = pd.read_csv(\"/kaggle/input/titanic/train.csv\",index_col='PassengerId')\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:09.082576Z","iopub.execute_input":"2022-08-09T16:43:09.083539Z","iopub.status.idle":"2022-08-09T16:43:09.113510Z","shell.execute_reply.started":"2022-08-09T16:43:09.083490Z","shell.execute_reply":"2022-08-09T16:43:09.112021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = pd.read_csv(\"/kaggle/input/titanic/test.csv\",index_col='PassengerId')\ntest_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:09.243961Z","iopub.execute_input":"2022-08-09T16:43:09.244466Z","iopub.status.idle":"2022-08-09T16:43:09.273331Z","shell.execute_reply.started":"2022-08-09T16:43:09.244424Z","shell.execute_reply":"2022-08-09T16:43:09.272071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# My solution","metadata":{}},{"cell_type":"code","source":"train_data.info()","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:09.345847Z","iopub.execute_input":"2022-08-09T16:43:09.346320Z","iopub.status.idle":"2022-08-09T16:43:09.365433Z","shell.execute_reply.started":"2022-08-09T16:43:09.346254Z","shell.execute_reply":"2022-08-09T16:43:09.363848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data.info()","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:09.433622Z","iopub.execute_input":"2022-08-09T16:43:09.434580Z","iopub.status.idle":"2022-08-09T16:43:09.454104Z","shell.execute_reply.started":"2022-08-09T16:43:09.434539Z","shell.execute_reply":"2022-08-09T16:43:09.452521Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\ntrain_data[\"Cabin\"].isna().sum()\nfor dataset in train_test_datasets:\n    dataset[\"Cabin Letter\"] = dataset[\"Cabin\"].str.slice(0, 1)\ntrain_data[\"Cabin Letter\"].unique()\n# array([nan, 'C', 'E', 'G', 'D', 'A', 'B', 'F', 'T'], dtype=object)\n\nfor dataset in train_test_datasets:\n    dataset[\"Embarked\"] = pd.Categorical(dataset[\"Embarked\"])\n    dataset[\"Embarked\"] = dataset[\"Embarked\"].cat.codes\n\"\"\"\n\"hi\"","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:09.603226Z","iopub.execute_input":"2022-08-09T16:43:09.605686Z","iopub.status.idle":"2022-08-09T16:43:09.616836Z","shell.execute_reply.started":"2022-08-09T16:43:09.605621Z","shell.execute_reply":"2022-08-09T16:43:09.615493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocessing","metadata":{}},{"cell_type":"markdown","source":"dijest of all we did","metadata":{}},{"cell_type":"code","source":"# Load data\ntrain = pd.read_csv(\"/kaggle/input/titanic/train.csv\", index_col='PassengerId')\ntest = pd.read_csv(\"/kaggle/input/titanic/test.csv\", index_col='PassengerId')\n \n# Merge train and test for wrangling and preprocessing\ntrain_test_datasets = [train, test]\n \n\"\"\"Data wrangling\"\"\"\n# Split cabin into letter and number\nmedian_age = train[\"Age\"].median()\nmedian_fare = train[\"Fare\"].median()\nfor idx, dataset in enumerate(train_test_datasets):\n    dataset[\"Age\"].fillna(median_age, inplace=True)\n    dataset[\"Fare\"].fillna(median_fare, inplace=True)\n    dataset[\"Cabin Letter\"] = dataset[\"Cabin\"].str.slice(0, 1)\n    dataset.drop(\"Cabin\", axis=1, inplace=True)\n    #dataset[\"Embarked\"] = dataset[\"Embarked\"].cat.codes\n    dataset.drop([\"Name\", \"Ticket\"], axis=1, inplace=True)\n \ncategorical_cols = [\"Pclass\", \"Sex\", \"Embarked\", \"Cabin Letter\",\"SibSp\"]\ntrain_dummies = pd.get_dummies(train,\n                               columns=categorical_cols,\n                               prefix=categorical_cols,\n                               dummy_na=True)\n \ntest_dummies = pd.get_dummies(test,\n                              columns=categorical_cols,\n                              prefix=categorical_cols,\n                              dummy_na=True)\n \ntrain_dummies.shape\n# (891, 32)\ntest_dummies.shape\n# (418, 30)","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:09.749308Z","iopub.execute_input":"2022-08-09T16:43:09.750457Z","iopub.status.idle":"2022-08-09T16:43:09.799867Z","shell.execute_reply.started":"2022-08-09T16:43:09.750408Z","shell.execute_reply":"2022-08-09T16:43:09.798437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dummies[\"Cabin Letter_T\"] = np.zeros(test_dummies.shape[0])","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:09.832400Z","iopub.execute_input":"2022-08-09T16:43:09.833456Z","iopub.status.idle":"2022-08-09T16:43:09.842811Z","shell.execute_reply.started":"2022-08-09T16:43:09.833400Z","shell.execute_reply":"2022-08-09T16:43:09.841136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Balancing the Training Data","metadata":{}},{"cell_type":"code","source":"total_samples = train_dummies.shape[0]  # Number of rows in DataFrame\nnumber_surviving = (train_dummies['Survived'] == 1).sum()  # Number of survivors\nperc_survivors = (number_surviving / total_samples) * 100\n# 38.38383838383838\nperc_survivors","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:09.930012Z","iopub.execute_input":"2022-08-09T16:43:09.931338Z","iopub.status.idle":"2022-08-09T16:43:09.942623Z","shell.execute_reply.started":"2022-08-09T16:43:09.931282Z","shell.execute_reply":"2022-08-09T16:43:09.940917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bool_survivors = train_dummies['Survived'] == 1\nbool_nonsurvivors = train_dummies['Survived'] == 0\nall_survivors = train_dummies[bool_survivors]\nall_nonsurvivors = train_dummies[bool_nonsurvivors]\nrandom_nonsurvivors = all_nonsurvivors.sample(number_surviving)\ntrain_balanced = pd.concat((all_survivors, random_nonsurvivors))\n# Concatenating like this we must also remember to shuffle the rows with .sample(frac=1)\ntrain_balanced = train_balanced.sample(frac=1)\nprint((train_balanced[\"Survived\"] == 0).sum())\nprint((train_balanced[\"Survived\"] == 1).sum())\n","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:10.031533Z","iopub.execute_input":"2022-08-09T16:43:10.032620Z","iopub.status.idle":"2022-08-09T16:43:10.052473Z","shell.execute_reply.started":"2022-08-09T16:43:10.032575Z","shell.execute_reply":"2022-08-09T16:43:10.050925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Standardization","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\n \nscaler = StandardScaler()\nscaler.fit(train_dummies.iloc[:,1:])\ntrain_scaled = scaler.transform(train_balanced.iloc[:,1:])\ntest_scaled = scaler.transform(test_dummies)\n \ntrain_scaled = pd.DataFrame(train_scaled,\n                            index=train_balanced.index,\n                            columns=train_balanced.iloc[:,1:].columns)\n \ntest_scaled = pd.DataFrame(test_scaled,\n                           index=test_dummies.index,\n                           columns=test_dummies.columns)\n \nprint(train_balanced[\"Age\"].mean(), train_balanced[\"Age\"].std())\n# (29.23489766081871, 13.239715945608669)\nprint(train_scaled[\"Age\"].mean(), train_scaled[\"Age\"].std())\n# (-0.009735709395380402, 1.0174700960384269)","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:10.141249Z","iopub.execute_input":"2022-08-09T16:43:10.142039Z","iopub.status.idle":"2022-08-09T16:43:10.165759Z","shell.execute_reply.started":"2022-08-09T16:43:10.142000Z","shell.execute_reply":"2022-08-09T16:43:10.164621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Validation Data Split","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n \nX_train = train_scaled\ny_train = train_balanced[\"Survived\"]\nX_test = test_scaled\n#X_train, X_validate, y_train, y_validate = train_test_split(X, y, test_size=0.1)","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:10.230748Z","iopub.execute_input":"2022-08-09T16:43:10.232643Z","iopub.status.idle":"2022-08-09T16:43:10.238926Z","shell.execute_reply.started":"2022-08-09T16:43:10.232594Z","shell.execute_reply":"2022-08-09T16:43:10.237761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Building the Network with pyTorch\n","metadata":{}},{"cell_type":"code","source":"import os\nimport torch\nfrom torch import nn\nfrom torch.utils.data import DataLoader\nfrom torchvision import datasets, transforms\n\nn_features = X_train.shape[1]\n\nclass NeuralNetwork(nn.Module):\n    def __init__(self):\n        super(NeuralNetwork, self).__init__()\n        self.flatten = nn.Flatten()\n        self.linear_relu_stack = nn.Sequential(\n            nn.Linear(n_features, 50),\n            nn.ReLU(),\n            nn.Linear(50, 1),\n            nn.Sigmoid(),\n        )\n\n    def forward(self, x):\n        x = self.flatten(x)\n        logits = self.linear_relu_stack(x)\n        return logits","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:10.335910Z","iopub.execute_input":"2022-08-09T16:43:10.337260Z","iopub.status.idle":"2022-08-09T16:43:10.349488Z","shell.execute_reply.started":"2022-08-09T16:43:10.337211Z","shell.execute_reply":"2022-08-09T16:43:10.347898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(f\"Using {device} device\")","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:10.426414Z","iopub.execute_input":"2022-08-09T16:43:10.427621Z","iopub.status.idle":"2022-08-09T16:43:10.435140Z","shell.execute_reply.started":"2022-08-09T16:43:10.427580Z","shell.execute_reply":"2022-08-09T16:43:10.433209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = NeuralNetwork().to(device)\nprint(model)","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:10.524562Z","iopub.execute_input":"2022-08-09T16:43:10.525815Z","iopub.status.idle":"2022-08-09T16:43:10.535018Z","shell.execute_reply.started":"2022-08-09T16:43:10.525767Z","shell.execute_reply":"2022-08-09T16:43:10.533319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import TensorDataset, DataLoader\nfrom tqdm import tqdm\n\nloss_fn = torch.nn.BCELoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.0001, weight_decay=0.001)\nbatch_size = 41\nresult = []\ntensor_x = torch.Tensor(X_train.values)  # transform to torch tensor\ntensor_y = torch.Tensor(y_train.values)\ntraining_dataset = TensorDataset(tensor_x, tensor_y)  # create your datset\ntrain_dataloader = DataLoader(training_dataset, batch_size=batch_size)  # create your dataloader\n    \nepochs = 2000\nfor t in tqdm(range(epochs)):\n    running_loss = 0\n    size = len(train_dataloader.dataset)\n    model.train()\n    for batch, (X, y) in enumerate(train_dataloader):\n        X, y = X.to(device), y.to(torch.float).to(device).unsqueeze(1)\n        # Compute prediction error\n        \n        pred = model(X)\n        loss = loss_fn(pred, y)\n        \n        # Backpropagation\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n\n    else:\n        result.append(loss.item())\ntrainingLoss = running_loss / len(train_dataloader)\nprint('trainingLoss', trainingLoss)","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:43:10.632432Z","iopub.execute_input":"2022-08-09T16:43:10.633407Z","iopub.status.idle":"2022-08-09T16:44:18.610899Z","shell.execute_reply.started":"2022-08-09T16:43:10.633360Z","shell.execute_reply":"2022-08-09T16:44:18.609553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.plot(result, linewidth=3)\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"BCE Loss\")","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:44:18.613507Z","iopub.execute_input":"2022-08-09T16:44:18.614594Z","iopub.status.idle":"2022-08-09T16:44:18.854431Z","shell.execute_reply.started":"2022-08-09T16:44:18.614539Z","shell.execute_reply":"2022-08-09T16:44:18.853331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# test","metadata":{}},{"cell_type":"code","source":"\"\"\"\nbatch_size = 41\ntensor_x = torch.Tensor(X_test.values)  # transform to torch tensor\ntensor_y = torch.Tensor(y_test.values)\ntest_dataset = TensorDataset(tensor_x, tensor_y)  # create your datset\ndataloader = DataLoader(test_dataset, batch_size=batch_size)  # create your dataloader\n\nloss_fn = torch.nn.BCELoss()\nsize = len(dataloader.dataset)\nnum_batches = len(dataloader)\nmodel.eval()\ntest_loss, correct = 0, 0\nwith torch.no_grad():\n    for X, y in dataloader:\n        X, y = X.to(device), y.to(torch.float).to(device).unsqueeze(1)\n        pred = model(X)\n        test_loss += loss_fn(pred, y).item()\n        correct += (pred.argmax(1) == y).type(torch.float).sum().item()\ntest_loss /= num_batches\ncorrect /= size\nAccuracy = float(f\"{(100 * correct):>0.1f}\")\nAvg_loss = float(f\"{test_loss:>8f}\")\nf\"Test Error: \\n Accuracy: {(100 * correct):>0.1f}%, Avg loss: {test_loss:>8f} \\n\"\n\"\"\"\n\"hi\"","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:44:18.855980Z","iopub.execute_input":"2022-08-09T16:44:18.856675Z","iopub.status.idle":"2022-08-09T16:44:18.865485Z","shell.execute_reply.started":"2022-08-09T16:44:18.856628Z","shell.execute_reply":"2022-08-09T16:44:18.864388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# submission","metadata":{}},{"cell_type":"code","source":"subb_data = pd.read_csv(\"/kaggle/input/titanic/gender_submission.csv\",index_col='PassengerId')\nsubb_data\ntest_features = torch.Tensor(X_test.values).to(device)\ntest_prediction = model(test_features).flatten()\ntest_prediction_binary = (test_prediction > 0.5).to(torch.int32)\noutput = pd.DataFrame(test_prediction_binary.cpu().numpy(),\n                                  index=test.index,\n                                  columns=[\"Survived\"])\noutput.to_csv('submission.csv')\nprint(\"Your submission was successfully saved!\")","metadata":{"execution":{"iopub.status.busy":"2022-08-09T16:44:18.867555Z","iopub.execute_input":"2022-08-09T16:44:18.868918Z","iopub.status.idle":"2022-08-09T16:44:18.892125Z","shell.execute_reply.started":"2022-08-09T16:44:18.868876Z","shell.execute_reply":"2022-08-09T16:44:18.890840Z"},"trusted":true},"execution_count":null,"outputs":[]}]}