{"cells":[{"metadata":{"_uuid":"9d3946c5a33fd88d6f0246aecd4da788ba8676e1"},"cell_type":"markdown","source":"This kernel use PyTorch to implement LSTM for [LANL Earthquake Prediction](https://www.kaggle.com/c/LANL-Earthquake-Prediction). The ideas and features are mainly from [RNN starter ](https://www.kaggle.com/mayer79/rnn-starter) with little adjustment. Because the hyperparameter has not tuned, so the model can not be used for prediction directly. It's just for demo."},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"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)\nimport os\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"490217d840e9d79e06b5684640d34db94577ce9d"},"cell_type":"code","source":"torch.set_num_threads(4)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv', dtype={\"acoustic_data\": np.float32, \"time_to_failure\": np.float32})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0e7ffb528f7fe1450c9884c4e062f43459ae757c"},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0870f44be07c021b71e14342c2f80614b041fab1"},"cell_type":"code","source":"sample_freq = 100\nplt.plot(train.acoustic_data.values[::sample_freq])\nplt.plot(train.time_to_failure.values[::sample_freq]*100)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9cefe2b386357c469f215582ec8dedae229cd164"},"cell_type":"markdown","source":"We sample 1% of the data(sample_freq=100). There are 16 earth quakes."},{"metadata":{"_uuid":"ebbd188b92a291555a0c0709090e926773aeb68b"},"cell_type":"markdown","source":"Extracts mean, standard deviation, and quantiles per time step."},{"metadata":{"trusted":true,"_uuid":"eea18052a5bd83db2e68d9b2bc12387f4bf7efc6"},"cell_type":"code","source":"def extract_features(z):\n    return np.c_[\n        z.mean(axis=1), \n        np.percentile(np.abs(z), q=[0, 25, 50, 75, 100], axis=1).T, \n        z.std(axis=1)\n    ]","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1c378d3d39bddd057f404fd05936f8c9a692b278"},"cell_type":"markdown","source":"Because our test data has 150000 points in each segment. we use window_size=1000 and sequence_length=150."},{"metadata":{"trusted":true,"_uuid":"8092a54af29b92b720d4b55bbd2be184b888a36a"},"cell_type":"code","source":"def create_X(x, window_size=1000, sequence_len=150):\n    tmp = x.reshape(sequence_len, -1)\n    return np.c_[\n        extract_features(tmp),\n        extract_features(tmp[:, -window_size // 10:]),\n        extract_features(tmp[:, -window_size // 100:])\n    ]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d71729ed9fdeacf00d049dcbc9626ad5defe5843"},"cell_type":"code","source":"n_features = create_X(train.acoustic_data.values[0:150000]).shape[1]","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1e7cd20be15ec7260e8028a4448fcf8b1f3be526"},"cell_type":"markdown","source":"torch.utils.data.Dataset is a convenient tools for data loading provided by PyTorch.\n\nIt is an abstract class representing a dataset. Your custom dataset should inherit Dataset and override the following methods:\n\n- `__len__` so that len(dataset) returns the size of the dataset.\n- `__getitem__` to support the indexing such that dataset[i] can be used to get ith sample"},{"metadata":{"trusted":true,"_uuid":"d55bfe3737825e1e84b4a46c8ce6b853ec9b91e6"},"cell_type":"code","source":"class TrainData(Dataset):\n    def __init__(self, df, window_size=1000, sequence_len=150):\n        self.rows = df.shape[0] // (window_size*sequence_len)\n        self.data, self.labels = [], []\n        for segment in range(self.rows):\n            seg = df.iloc[segment*window_size*sequence_len: (segment+1)*window_size*sequence_len]\n            x = seg.acoustic_data.values\n            y = seg.time_to_failure.values[-1]\n            self.data.append(create_X(x))\n            self.labels.append(y)\n    \n    def __len__(self):\n        return self.rows\n    \n    def __getitem__(self, idx):\n        return (\n            torch.from_numpy(self.data[idx].astype(np.float32)),\n            self.labels[idx]\n        )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f8d6938b0053d0e14cfbd521b3e9b41a9d7f6e1c"},"cell_type":"code","source":"train_data = TrainData(train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cf9942d809c2061eed58e350d81b13c33c7b480b"},"cell_type":"code","source":"batch_size = 100\nn_steps = len(train_data) // 100","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4e8da27deb5e433ea20571b6729f85c4ddd112a2"},"cell_type":"code","source":"train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b78c161c93d47591a4b57c36441e07ea7b099cfe"},"cell_type":"code","source":"class LSTM(nn.Module):\n    def __init__(self, input_size, hidden_size):\n        super(LSTM, self).__init__()\n        self.hidden_size = hidden_size\n        self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)\n        self.fc = nn.Linear(hidden_size, 1)\n    \n    def forward(self, x):\n        hidden = (\n            torch.zeros(1, x.size(0), self.hidden_size),\n            torch.zeros(1, x.size(0), self.hidden_size)\n        )\n        \n        out, _ = self.lstm(x, hidden)\n        \n        out = self.fc(out[:, -1, :])\n        return out.view(-1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8fe7037997372688dd942f0f854b7229c7bc3f08"},"cell_type":"code","source":"input_size = n_features\nhidden_size = 32\nmodel = LSTM(input_size, hidden_size)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"657afdb0e56f06151f752d3723ad1460969d9b0b"},"cell_type":"code","source":"learning_rate = 0.01\ncriterion = nn.MSELoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f91c1bc960821893aca002050a3e33afd423826e"},"cell_type":"code","source":"for epoch in range(2):\n    for i, (data, labels) in enumerate(train_loader):\n        outputs = model(data)\n        loss = criterion(outputs, labels)\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        if i % 10 == 0:\n            print(f'[Epoch {epoch}/2, Step {i}/{n_steps}]  loss: {loss.item(): .4f}')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"41e14087a26750154dbdd7e051f60c8cfcd00ded"},"cell_type":"markdown","source":"That's all, thank's for advice!"}],"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}