{"cells":[{"metadata":{"_uuid":"7b1bf02a652f9d059568e248816413739a811c90"},"cell_type":"markdown","source":"# A kernel modeled after Siraj's recent video\nSiraj probably needs no introduction. He recently did a [video on this earthquake competition](https://www.youtube.com/watch?v=TffGdSsWKlA), which is informative to data science noobs like me. I like the step by step approach. Watch that video if you want to see how to construct a kernel from scratch, but do note that it runs on Google's Colab framework.\n\nFollowing Siraj's step by step approach, I'm following my own steps in constructing this kernel in a Kaggle environment. I added the submission steps, since I want to use this kernel as a template with other models instead of the LSTM. \n\n## My Steps\n1. Install the Dependencies\n1. Import the Dataset\n1. Exploratory Data Analysis\n1. Feature Engineering\n1. Implement Model\n1. Evaluate Model\n1. Finalise Submission\n1. Future Directions\n\n## Install the Dependencies\nFortunately, the kaggle dependencies are already installed. I opted to install model specific dependencies in that code block, since the code is easier to modify in terms of swopping out models. It's also easier to see what you have imported and what is still missing in this way."},{"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\n# Installing dependencies\n#data preprocessing\nimport pandas as pd\n#math operations\nimport numpy as np\n#data visualization\nimport matplotlib.pyplot as plt\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":1,"outputs":[{"output_type":"stream","text":"['test', 'train.csv', 'sample_submission.csv']\n","name":"stdout"}]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"markdown","source":"## Import the Dataset\nSince we aren't using the Google Colab framework, we can import the dataset directly. "},{"metadata":{"trusted":true,"_uuid":"d91c5674070f84a38a6e25b6ab8a58b34a27994e"},"cell_type":"code","source":"# Extract training data into a dataframe for further manipulation\ntrain = pd.read_csv('../input/train.csv', nrows=6000000, dtype={'acoustic_data': np.int16, 'time_to_failure': np.float64})\n\n# Print first 10 entries\ntrain.head(10)","execution_count":2,"outputs":[{"output_type":"execute_result","execution_count":2,"data":{"text/plain":"   acoustic_data  time_to_failure\n0             12           1.4691\n1              6           1.4691\n2              8           1.4691\n3              5           1.4691\n4              8           1.4691\n5              8           1.4691\n6              9           1.4691\n7              7           1.4691\n8             -5           1.4691\n9              3           1.4691","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>acoustic_data</th>\n      <th>time_to_failure</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>12</td>\n      <td>1.4691</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>6</td>\n      <td>1.4691</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>8</td>\n      <td>1.4691</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>5</td>\n      <td>1.4691</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>8</td>\n      <td>1.4691</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>8</td>\n      <td>1.4691</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>9</td>\n      <td>1.4691</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>7</td>\n      <td>1.4691</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>-5</td>\n      <td>1.4691</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>3</td>\n      <td>1.4691</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"_uuid":"69f88065c08ee49b6addbef976eca917636dd576"},"cell_type":"markdown","source":"## Exploratory Data Analysis\nFor this, we just visualise the data and see what we can deduce from the graphs."},{"metadata":{"trusted":true,"_uuid":"ec82e1a615678bbde3f2f1d3524e3331fc79e398"},"cell_type":"code","source":"#visualize 1% of samples data, first 100 datapoints\ntrain_ad_sample_df = train['acoustic_data'].values[::100]\ntrain_ttf_sample_df = train['time_to_failure'].values[::100]\n\n#function for plotting based on both features\ndef plot_acc_ttf_data(train_ad_sample_df, train_ttf_sample_df, title=\"Acoustic data and time to failure: 1% sampled data\"):\n    fig, ax1 = plt.subplots(figsize=(12, 8))\n    plt.title(title)\n    plt.plot(train_ad_sample_df, color='r')\n    ax1.set_ylabel('acoustic data', color='r')\n    plt.legend(['acoustic data'], loc=(0.01, 0.95))\n    ax2 = ax1.twinx()\n    plt.plot(train_ttf_sample_df, color='b')\n    ax2.set_ylabel('time to failure', color='b')\n    plt.legend(['time to failure'], loc=(0.01, 0.9))\n    plt.grid(True)\n\nplot_acc_ttf_data(train_ad_sample_df, train_ttf_sample_df)\ndel train_ad_sample_df\ndel train_ttf_sample_df","execution_count":3,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 864x576 with 2 Axes>","image/png":"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dyD7Lv/QoUPp1asXvXv35thjj62Q39mzZ/PTn/6UHj16cMopp5CsrJ5vWwYNGsSSJUvo06cPv/zlLyvdZhERERGpO2plKI/x48ez1VZbhYGzzoKPPiruyvv0gZtuqjTJnDlz6NChA0uWLGGHHXbgrbfeYtWqVWy33Xa8/fbbdO/efXWaM844g06dOnHppZfyxhtvcM455/DRRx8xePBgWrduzXnnnQeEgOD5559n9OjRvPzyy9x9990AzJ8/n7Zt29KtWzdGjRpFp06dAFYPf/PNNxxyyCGMGDGCTp06rV5v0plnnkmnTp245JJLeOGFF9h///2ZNWtWVvrktnTs2JHWrVuzcOHCSre5Y8eOWevJ+m5EREREGri0rQyVkp4QNFC33HILvXv3pm/fvnz11Vd89tlnjBw5kl133XV1s5vxRfm77767+q79HnvswezZs/nuu+8KLnubbbbh1Vdf5Q9/+APvvPMObdu2rTQvb7zxBocffvjqQCE3GAB4++23OeaYYwDYb7/9aN++faXbknabRURERKRule2LyVKr4k5+XRg+fDivvfYa7733Hi1btmTAgAE1am6zSZMmWS9Xi5exxRZbMGbMGF588UUuuugi9txzTy655JKi5T8p7bYUa5tFREREpHr0hKABmj9/Pu3bt6dly5ZMmDCBkSNHAtC3b1/efvttJk2aBIQiNgD9+/fn4YfDy+uGDx9Op06dWHfddenWrRtjxowBYMyYMavnmzZtGi1btuSYY47h/PPPX52mTZs2LFiwoEJ+9thjDx5//HFmz56dtd6kXXfdlWHDhgHw0ksvMXfu3Eq3BaBp06asWLGiynQiIiIiUnf0hKAB2nfffbnzzjvZaqut2HLLLenbty8A6623HkOGDOHQQw9l1apVdO7cmVdffZXBgwdz0kkn0atXL1q2bMmDDz4IwC9+8QuGDh1Kjx492Gmnndhiiy0AGDduHOeffz6NGjWiadOm3HHHHQAMHDiQfffdlw022IA333xzdX569OjBH//4R3bbbTcaN27MtttuywMPPJCV50svvZSjjjqKHj160K9fPzbeeONKtyVeX69evdhuu+247777CqYTERERkbqjSsV5qOJqw6XvRkRERNYkqlQsIiIiIiINmgICEREREakTixZBmRZGWaOoDoGIiIjUj0mTYJNN4Jln4KCDSp0bqWN/+QtceCE0bQrrrw+dOkGXLqFbb70wbr31oHNn+MEPMv2NG5c65+VHAUEB7o6ZlTobklCu9V1ERNYao0aFz7/9TQFBGfjyy/B59tnwzTehmzkTxo6F2bNh2bL883XsmAkcOnWCDTYIn8nAIQ4mWjXokvlrDgUEebRo0YLZs2fTsWNHBQUNhLsze/ZsWrRoUeqsiIiISEpdusDVV1ccv2oVfPddCBJmzYLp08PnzJkwY0bonzEDPvoI/vnPkDafli0LP3Ho1CkzrksXaN9eTx8KUUCQR9euXZk6dSqzZs0qdVYkoUWLFnTt2rXU2RAREZFaatQI2rUL3ZZbVp1+yZLwVGHaNPj228wTh2QwMWkSjBwZpn//fcVl7LorvPVW8bdlbaCAII+mTZvSvXv3UmdDRERERIB11oGuXUNXlVWrQlAwa1Z24LDeenWfzzWVAgIRERERWWs0ahSKDXXuDD16lDo3awYFBHmsWLGCqVOnsnTp0lJnRQqIiw81bdq01FkRERERWaMpIMhj6tSptGnThm7duqlScQMUVzCeOnWqinaJiIiI1JJeTJbH0qVL1cJQA2ZmdOzYUU9wRERERIpAAUEBCgYaNn0/IiIiIsWhgEBEREREpIwpIGiA5s2bx+233756eNq0aRx22GFFX8/w4cMZMWJEteZZtmwZe+21F3369OGxxx4rmO6SSy7htddeA2DAgAGMit9OKSIiIiINiioVN0BxQHD66acDsMEGG/DEE08UfT3Dhw+ndevW9OvXL/U8H374IQAfffRRpekuv/zyGudr5cqVNGmiQ1NERESkPugJQQM0aNAgJk6cSJ8+fTj//POZPHkyPXv2BOCBBx7g4IMPZu+996Zbt2789a9/5YYbbmDbbbelb9++zJkzB4CJEyey77778uMf/5j+/fszYcKErHVMnjyZO++8kxtvvJE+ffrwzjvvMHnyZPbYYw969erFnnvuyZQpU7LmmTlzJscccwwffPABffr0YeLEiVx++eXssMMO9OzZk4EDB+LuAJxwwgl5g5jWrVuv7n/iiSc44YQTVqc/7bTT2Gmnnfj973/PokWLOOmkk9hxxx3ZdtttefbZZ4u2f0VEpETi18fWwU0uEam5kt6GNbP7gP2Bme7eMxrXAXgM6AZMBo5w97kWapHeDPwcWAyc4O5jonmOBy6KFvsnd3+wWHk86yyo4mZ4tfXpAzfdVHj6VVddxSeffLL6LvzkyZOzpn/yySd8+OGHLF26lM0224yrr76aDz/8kLPPPpuhQ4dy1llnMXDgQO68804233xz3n//fU4//XTeeOON1cvo1q0bp512Gq1bt+a8884D4IADDuD444/n+OOP57777uPMM8/kmWeeWT1P586dueeee7juuut4/vnnAfjtb3/LJZdcAsCxxx7L888/zwEHHFCj/TJ16lRGjBhB48aNufDCC9ljjz247777mDdvHjvuuCN77bUXrVq1qtGyRUSkAVi0qNQ5EJE8Sv2E4AFg35xxg4DX3X1z4PVoGOBnwOZRNxC4A1YHEJcCOwE7ApeaWfs6z3kJ7b777rRp04b11luPtm3brr4A32abbZg8eTILFy5kxIgRHH744fTp04dTTz2V6dOnV7nc9957j6OPPhoIF/fvvvtulfO8+eab7LTTTmyzzTa88cYbfPrppzXersMPP5zGjRsD8Morr3DVVVfRp08fBgwYwNKlSys8sRARERGR2ivpEwJ3f9vMuuWMPggYEPU/CAwH/hCNH+qhTMpIM2tnZutHaV919zkAZvYqIch4pBh5rOxOfqk0b958dX+jRo1WDzdq1IiVK1eyatUq2rVrV2U5/9paunQpp59+OqNGjWKjjTZi8ODBVb4bINlcaG7a5N1/d+fJJ59kyy23LG6mRURERCRLqZ8Q5NPF3ePb2TOALlH/hsBXiXRTo3GFxq+x2rRpw4IFC2o8/7rrrkv37t15/PHHgXBxPXbs2CrX069fPx599FEAHn74Yfr371/peuIL+k6dOrFw4cJUFZ+7dOnC+PHjWbVqFU8//XTBdPvssw+33nrr6joJcWVmERERESmuhhgQrBY9DfBiLc/MBprZKDMbtXLlymIttug6duzILrvsQs+ePTn//PNrtIyHH36Ye++9l969e9OjR4+8lXIPOOAAnn766dWVim+99Vbuv/9+evXqxUMPPcTNN99c6TratWvHr371K3r27Mk+++zDDjvsUGW+rrrqKvbff3/69evH+uuvXzDdxRdfzIoVK+jVqxc9evTg4osvrnqjRURERKTaLL4DW7IMhCJDzycqFf8XGODu06MiQcPdfUszuyvqfySZLu7c/dRofFa6Qlq1auWLClRuGj9+PFtttVURtk7qkr4nEZE1zL33wimnhP4SX39I3TvtNHjmGZgxo9Q5KS0zW+zuDbpVlIb4hOA54Pio/3jg2cT44yzoC8yPihb9E/ipmbWPKhP/NBonIiIiIiJVKHWzo48Q7vB3MrOphNaCrgL+bmYnA18CR0TJXyQ0Ofo5odnREwHcfY6ZXQF8EKW7PK5gLCIiIiIilSt1K0NHFZi0Z560DvymwHLuA+4rYtZw96wWcaRhKXVRNxEREZG1RUMsMlRyLVq0YPbs2brobKDcndmzZ9OiRYtSZ0VERERkjVfSJwQNVdeuXZk6dSqzZs0qdVakgBYtWtC1a9dSZ0NERERkjaeAII+mTZvSvXv3UmdDRERERKTOqciQiIiIiEgZU0AgIiIi9UN180QaJAUEIiIiIiJlTAGBiIiIiEgZU0AgIiIiIlLGFBCIiIiIiJQxBQQiIiIiImVMAYGIiIiISBlTQCAiIiIiUsYUEIiIiIiIlDEFBCIiIiIiZUwBgYiIiIhIGVNAICIiIiJSxhQQiIiIiIiUMQUEIiIiIiJlTAGBiIiIiEgZU0AgIiIiIlLGFBCIiIiIiJQxBQQiIiIiImVMAYGIiIiISBlTQCAiIiIiUsYUEIiIiIiIlDEFBCIiIiIiZUwBgYiIiIhIGVNAICIiIiJSQmZ2n5nNNLNPEuM6mNmrZvZZ9Nm+rtavgEBEREREpLQeAPbNGTcIeN3dNwdej4brhAICEREREZEScve3gTk5ow8CHoz6HwQOrqv1N6mrBTd0HTp0YPjw4aXOhoiISPlo1w6uuy706z94rTdt2hYsX96J4cNHlDorpdbEzEYlhoe4+5AU83Vx9+lR/wygS/GzFpRtQDBnzhwGDBhQ6myIiIiUj7vvhvPOC/3upc2L1LlHH4VmzdD1Fqx09+1rswB3dzOrs5NGRYZERERERBqeb8xsfYDoc2ZdrUgBgYiIiIhIw/MccHzUfzzwbF2tSAGBiIiIiEgJmdkjwHvAlmY21cxOBq4C9jazz4C9ouE6UbZ1CEREREREGgJ3P6rApD3rY/16QiAiIiIiUsYUEIiIiIiIlDEFBCIiIiIiZUwBgYiIiIhIGVNAICIiIiJSxhQQiIiIiIiUMQUEIiIiIiJlTAGBiIiI1A+zUudARPJQQCAiIiIiUsYUEIiIiIiIlDEFBCIiIiIiZUwBgYiIiIhIGVNAICIiIiJSxhQQiIiIiIiUMQUEIiIiIiJlTAGBiIiIiEgZU0AgIiIiIlLGFBCIiIiIiJSxBhsQmNlkMxtnZh+Z2ahoXAcze9XMPos+20fjzcxuMbPPzexjM9uutLkXEREREVkzNNiAILK7u/dx9+2j4UHA6+6+OfB6NAzwM2DzqBsI3FHvORURERERWQM19IAg10HAg1H/g8DBifFDPRgJtDOz9UuRQRERERGRNUlDDggceMXMRpvZwGhcF3efHvXPALpE/RsCXyXmnRqNExERkYbCvdQ5EJE8mpQ6A5X4ibt/bWadgVfNbEJyoru7mVXrlyUKLAYCNGvWrHg5FRERERFZQzXYJwTu/nX0ORN4GtgR+CYuChR9zoySfw1slJi9azQud5lD3H17d9++SZOGHAuJiIiIiNSPBhkQmFkrM2sT9wM/BT4BngOOj5IdDzwb9T8HHBe1NtQXmJ8oWiQiIiINwZIlpc6BiOTRUG+TdwGeNjMIeRzm7i+b2QfA383sZOBL4Igo/YvAz4HPgcXAifWfZREREanUbbeVOgcikkeDDAjc/Qugd57xs4E984x34Df1kDURERGpqRUrSp0DEcmjQRYZEhERERGR+qGAQERERESkjCkgEBEREREpYwoIRERERETKmAICEREREZEypoBARERERKSMKSAQERERESljCghERERERMqYAgIRERGpH+6lzoGI5KGAQERERESkjCkgEBERkfphVuociEgeCghERERERMqYAgIRERERkTKmgEBEREREpIwpIBARERERKWMKCERERKR+qNlRkQZJAYGIiIiISBlTQCAiIiL1Q82OijRICghERERERMqYAgIRERERkTKmgEBEREREpIwpIBAREZH6oVaGRBokBQQiIiIiImVMAYGIiIiISBlTQCAiIiIiUsYUEIiIiIiIlDEFBCIiIiIiZUwBgYiIiIhIGVNAICIiIiJSxhQQiIiIiIiUMQUEIiIiIiJlTAGBiIiIiEgZU0AgIiIiIlJCZna2mX1qZp+Y2SNm1qI+16+AQEREROqHe6lzINLgmNmGwJnA9u7eE2gMHFmfeVBAICIiIvXjyy9LnQORhqoJsI6ZNQFaAtPqc+UKCERERERESsTdvwauA6YA04H57v5KfeahSX2urCHp0KEDw4cPL3U2REREysd112X69R+81ps2bQuWL+/E8OEjSp2VUmtiZqMSw0PcfUg8YGbtgYOA7sA84HEz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\n"},"metadata":{}}]},{"metadata":{"_uuid":"721073de2aa8c4ae5c557e0c6ee7c6b5f80eae7f"},"cell_type":"markdown","source":"## Feature Engineering\nAdding statistical features. Siraj adds a few of the most common ones, plus he has a handy description of most of these in his [notebook on github](https://github.com/llSourcell/Kaggle_Earthquake_challenge/blob/master/Earthquake_Challenge.ipynb). \n\nThis kernel, called [Earthquakes FE More Features and Samples](https://www.kaggle.com/artgor/earthquakes-fe-more-features-and-samples), contains more features. There are also links to more ideas if you want to engineer additional features. For this kernel, I'm sticking to Siraj's basics."},{"metadata":{"trusted":true,"_uuid":"ec2bf170a4bc2af0a1c28f46c20b68ff5af11051"},"cell_type":"code","source":"# let's create a function to generate some statistical features based on the training data\ndef gen_features(X):\n    strain = []\n    strain.append(X.mean())\n    strain.append(X.std())\n    strain.append(X.min())\n    strain.append(X.max())\n    strain.append(X.kurtosis())\n    strain.append(X.skew())\n    strain.append(np.quantile(X,0.01))\n    strain.append(np.quantile(X,0.05))\n    strain.append(np.quantile(X,0.95))\n    strain.append(np.quantile(X,0.99))\n    strain.append(np.abs(X).max())\n    strain.append(np.abs(X).mean())\n    strain.append(np.abs(X).std())\n    return pd.Series(strain)","execution_count":4,"outputs":[]},{"metadata":{"_uuid":"414361a56616b9dce41424285ba0859ca5c8829f"},"cell_type":"markdown","source":"For this, note how the chunks are used to iterate through this fairly large dataset. Each chunk is processed, and the results are appended to the *X_train* and *y_train* dataframes. This is somewhat different from some of the other kernels that I used, where all the chunks weren't iterated through and the training data was just limited."},{"metadata":{"trusted":true,"_uuid":"f9b157d842d0c799a7b483f6bd327b18c1fe2e5a"},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv', iterator=True, chunksize=150_000, dtype={'acoustic_data': np.int16, 'time_to_failure': np.float64})\n\nX_train = pd.DataFrame()\ny_train = pd.Series()\nfor df in train:\n    ch = gen_features(df['acoustic_data'])\n    X_train = X_train.append(ch, ignore_index=True)\n    y_train = y_train.append(pd.Series(df['time_to_failure'].values[-1]))\n    \n\n# Let's see what we have done\nX_train.describe()","execution_count":5,"outputs":[{"output_type":"execute_result","execution_count":5,"data":{"text/plain":"                0            1      ...                11           12\ncount  4195.000000  4195.000000     ...       4195.000000  4195.000000\nmean      4.519475     6.547788     ...          5.547367     5.750165\nstd       0.256049     8.503939     ...          1.517038     8.339211\nmin       3.596313     2.802720     ...          4.147707     2.589085\n25%       4.349497     4.478637     ...          5.061843     3.862810\n50%       4.522147     5.618798     ...          5.380853     4.781513\n75%       4.693350     6.880904     ...          5.748553     5.887947\nmax       5.391993   153.703569     ...         32.762073   150.432368\n\n[8 rows x 13 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>0</th>\n      <th>1</th>\n      <th>2</th>\n      <th>3</th>\n      <th>4</th>\n      <th>5</th>\n      <th>6</th>\n      <th>7</th>\n      <th>8</th>\n      <th>9</th>\n      <th>10</th>\n      <th>11</th>\n      <th>12</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>count</th>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n      <td>4195.000000</td>\n    </tr>\n    <tr>\n      <th>mean</th>\n      <td>4.519475</td>\n      <td>6.547788</td>\n      <td>-149.190942</td>\n      <td>163.522288</td>\n      <td>68.297997</td>\n      <td>0.125830</td>\n      <td>-11.224603</td>\n      <td>-2.184779</td>\n      <td>11.231716</td>\n      <td>20.321890</td>\n      <td>170.046246</td>\n      <td>5.547367</td>\n      <td>5.750165</td>\n    </tr>\n    <tr>\n      <th>std</th>\n      <td>0.256049</td>\n      <td>8.503939</td>\n      <td>265.087984</td>\n      <td>272.930331</td>\n      <td>70.532565</td>\n      <td>0.477901</td>\n      <td>14.106852</td>\n      <td>2.346558</td>\n      <td>2.358067</td>\n      <td>14.225526</td>\n      <td>296.887015</td>\n      <td>1.517038</td>\n      <td>8.339211</td>\n    </tr>\n    <tr>\n      <th>min</th>\n      <td>3.596313</td>\n      <td>2.802720</td>\n      <td>-5515.000000</td>\n      <td>23.000000</td>\n      <td>0.648602</td>\n      <td>-4.091826</td>\n      <td>-336.000000</td>\n      <td>-39.000000</td>\n      <td>9.000000</td>\n      <td>11.000000</td>\n      <td>23.000000</td>\n      <td>4.147707</td>\n      <td>2.589085</td>\n    </tr>\n    <tr>\n      <th>25%</th>\n      <td>4.349497</td>\n      <td>4.478637</td>\n      <td>-154.000000</td>\n      <td>92.000000</td>\n      <td>28.090227</td>\n      <td>-0.040779</td>\n      <td>-14.000000</td>\n      <td>-3.000000</td>\n      <td>10.000000</td>\n      <td>15.000000</td>\n      <td>94.000000</td>\n      <td>5.061843</td>\n      <td>3.862810</td>\n    </tr>\n    <tr>\n      <th>50%</th>\n      <td>4.522147</td>\n      <td>5.618798</td>\n      <td>-111.000000</td>\n      <td>123.000000</td>\n      <td>45.816625</td>\n      <td>0.085620</td>\n      <td>-10.000000</td>\n      <td>-2.000000</td>\n      <td>11.000000</td>\n      <td>19.000000</td>\n      <td>127.000000</td>\n      <td>5.380853</td>\n      <td>4.781513</td>\n    </tr>\n    <tr>\n      <th>75%</th>\n      <td>4.693350</td>\n      <td>6.880904</td>\n      <td>-79.000000</td>\n      <td>170.000000</td>\n      <td>78.664202</td>\n      <td>0.253930</td>\n      <td>-6.000000</td>\n      <td>-1.000000</td>\n      <td>12.000000</td>\n      <td>23.000000</td>\n      <td>175.000000</td>\n      <td>5.748553</td>\n      <td>5.887947</td>\n    </tr>\n    <tr>\n      <th>max</th>\n      <td>5.391993</td>\n      <td>153.703569</td>\n      <td>-15.000000</td>\n      <td>5444.000000</td>\n      <td>631.158927</td>\n      <td>4.219429</td>\n      <td>-2.000000</td>\n      <td>0.000000</td>\n      <td>50.000000</td>\n      <td>337.000000</td>\n      <td>5515.000000</td>\n      <td>32.762073</td>\n      <td>150.432368</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"_uuid":"1b34ec7db9df118192efc89816e9fb3d7257b2ab"},"cell_type":"markdown","source":"## Implement Model\nIn this case, I am implementing an [LSTM Model](https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/). \n\nSiraj implemented an SVR and a CatBoost model. Since I want to use this as a template, I didn't replicate the SVR or CatBoost model here, but decided to implement a different one. If you are interested in the others, have a look at Siraj's work. The SVR seems to get a better score than the CatBoost model.\n\nI ran into some trouble with the shapes of the training and testing data. The LSTM model itself is not that important to me here, since I only want to use this kernel as a template for other models.\n\nI've removed the parts where I split into training and test sets, since this is time series data and it's not really necessary. \n\n"},{"metadata":{"trusted":true,"_uuid":"690627e7f3a11d5814b64bb062ebc8e85cab3aff"},"cell_type":"code","source":"# LSTM Model\nfrom sklearn.preprocessing import StandardScaler\nfrom keras.models import Sequential\nfrom keras.layers import Dense\nfrom keras.layers import LSTM\n\nscaler = StandardScaler()\nscaler.fit(X_train)\nX_train_scaled = scaler.transform(X_train)\n\n# Reshape to correct dimensions\nX_train_scaled = X_train_scaled.reshape(X_train_scaled.shape[0],X_train_scaled.shape[1],1)\n\n# Model\nmodel = Sequential()\nmodel.add(LSTM(50,  input_shape=(X_train_scaled.shape[1], X_train_scaled.shape[2])))\nmodel.add(Dense(1))\nmodel.compile(loss='mae', optimizer='adam')\n\n# Fit network\nhistory = model.fit(X_train_scaled, \n                    y_train, \n                    epochs=15,\n                    batch_size=64,\n                    verbose=0)\n\nmodel.summary()\n","execution_count":12,"outputs":[{"output_type":"stream","text":"_________________________________________________________________\nLayer (type)                 Output Shape              Param #   \n=================================================================\nlstm_2 (LSTM)                (None, 50)                10400     \n_________________________________________________________________\ndense_2 (Dense)              (None, 1)                 51        \n=================================================================\nTotal params: 10,451\nTrainable params: 10,451\nNon-trainable params: 0\n_________________________________________________________________\n","name":"stdout"},{"output_type":"execute_result","execution_count":12,"data":{"text/plain":"\"plt.plot(history.history['loss'], label='train')\\nplt.plot(history.history['val_loss'], label='test')\\nplt.legend()\\nplt.show()\""},"metadata":{}}]},{"metadata":{"_uuid":"94cb798c98bf452c5a81ee72ab0ab4960d05c5ce"},"cell_type":"markdown","source":"## Evaluate Model\nDo the hyper parameter tuning or other means of evaluating the model here."},{"metadata":{"trusted":true,"_uuid":"8a7b2318ebc1f38f7b1b478d7ad9b330591584c0"},"cell_type":"code","source":"# Evaluate model\nfrom sklearn.metrics import mean_absolute_error\n    \ny_pred = model.predict(X_train_scaled)\nmae = mean_absolute_error(y_train, y_pred)\nprint('%.5f' % mae)\n\n","execution_count":13,"outputs":[{"output_type":"stream","text":"2.16595\n","name":"stdout"}]},{"metadata":{"_uuid":"ce15e862f2c592102253a339b8cf622019561abb"},"cell_type":"markdown","source":"## Finalise Submission\nSiraj doesn't provide the code for this. I had to glean this from other kernels. So far, we have only seen training data. We haven't dealt with test data, so that needs to be done as well."},{"metadata":{"trusted":true,"_uuid":"6dcfd6760d343d801ad82716482abdb9e7225056"},"cell_type":"code","source":"# submission format\nsubmission = pd.read_csv('../input/sample_submission.csv', index_col='seg_id')\nX_test = pd.DataFrame()\n\n# prepare test data\nfor seg_id in submission.index:\n    seg = pd.read_csv('../input/test/' + seg_id + '.csv')\n    ch = gen_features(seg['acoustic_data'])\n    X_test = X_test.append(ch, ignore_index=True)\n\nX_test = scaler.transform(X_test)","execution_count":8,"outputs":[]},{"metadata":{"_uuid":"8f77b86f347708aca857cf6bec6d7381ba2d014b"},"cell_type":"markdown","source":"### Generate predictions for the submission.\n\nThe prediction here is from the LSTM model. You would have to reinitialise the SVR with the hyper parameter tuning values and get your prediction from that if you want to submit SVR model data."},{"metadata":{"trusted":true,"_uuid":"461614a70baee26d83a57154838a4b68a772c669"},"cell_type":"code","source":"# model of choice here\nX_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)\ny_hat = model.predict(X_test)","execution_count":10,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"04f467672bc68c5fc5e0698927f9a8aac12f8d78"},"cell_type":"code","source":"# write submission file\nsubmission['time_to_failure'] = y_hat\nsubmission.to_csv('submission.csv')","execution_count":11,"outputs":[]},{"metadata":{"_uuid":"483ef86e8a3c9ad40c211b02c91b198526b7d6ce"},"cell_type":"markdown","source":"## Future Directions\n1. Recurrent Networks. See my kernel, [RNN Starter Kernel](https://www.kaggle.com/devilears/rnn-starter-kernel-with-notebook), for starter code.\n1. Genetic Algorithms.\n1. [Ordinary Differential Equation Network](https://towardsdatascience.com/paper-summary-neural-ordinary-differential-equations-37c4e52df128). See also [Neural Ordinary Differential Equations](https://paperswithcode.com/paper/neural-ordinary-differential-equations)."}],"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}