{"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\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom glob import glob\nfrom tqdm import tqdm\n\nprint('Import done')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/predict-volcanic-eruptions-ingv-oe/train.csv')\ntest = pd.read_csv('/kaggle/input/predict-volcanic-eruptions-ingv-oe/sample_submission.csv')\n\ntrain_set = glob('../input/predict-volcanic-eruptions-ingv-oe/train/*')\ntest_set = glob('../input/predict-volcanic-eruptions-ingv-oe/test/*')\n\nprint('Reading done')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"signals_mean = pd.DataFrame()\n\nfor signals in tqdm(train_set):\n    signals_df = pd.read_csv(signals)\n    signals_df_T = pd.DataFrame(signals_df.mean()).T\n    signals_df_T['id'] = signals.split('/')[-1].split('.')[0]\n    signals_mean = pd.concat([signals_mean,signals_df_T], ignore_index=True)\n\nsignals_mean.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"signals_mean.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"signals_mean['id'] = signals_mean['id'].astype('int64')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"signals_mean = signals_mean.join(train.set_index('segment_id'), on='id')\nsignals_mean.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"signals_mean_test = pd.DataFrame()\n\nfor signals in tqdm(test_set):\n    signals_df = pd.read_csv(signals)\n    signals_df_T = pd.DataFrame(signals_df.mean()).T\n    signals_df_T['id'] = signals.split('/')[-1].split('.')[0]\n    signals_mean_test = pd.concat([signals_mean_test, signals_df_T], ignore_index=True)\n\nsignals_mean_test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"signals_mean_test = signals_mean_test.fillna(signals_mean_test.mean())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Build out the Light GBM Regression model using MAE as the eval metric"},{"metadata":{"trusted":true},"cell_type":"code","source":"import lightgbm as lgbm\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.metrics import mean_absolute_error\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.linear_model import LinearRegression\nfrom sklearn.model_selection import KFold,StratifiedKFold, RepeatedKFold\n\nprint('Import done')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Preprocessing data using StandardScaler"},{"metadata":{"trusted":true},"cell_type":"code","source":"feature_train_df = signals_mean.drop(['id','time_to_eruption'],axis=1)\ny_train = signals_mean['time_to_eruption']\n\nfeature_test_df = signals_mean_test.drop('id', axis=1)\n\nscaler = StandardScaler()\nscaler.fit(feature_train_df)\nscaled_feature_train_df = pd.DataFrame(scaler.transform(feature_train_df), columns=feature_train_df.columns)\nscaled_test_df    = pd.DataFrame(scaler.transform(feature_test_df), columns=feature_test_df.columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(scaled_feature_df.shape)\nprint(scaled_test_df.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"n_fold = 5\nfolds = KFold(n_splits=n_fold, shuffle=True, random_state=42)\nscaled_feature_df_columns = scaled_feature_train_df.columns.values\n\nparams = {\n    'num_leaves': 85,\n    'min_data_in_leaf': 10, \n    'objective':'regression',\n    'max_depth': -1,\n    'learning_rate': 0.001,\n    'max_bins': 2048,\n    \"boosting\": \"gbdt\",\n    \"feature_fraction\": 0.91,\n    \"bagging_freq\": 1,\n    \"bagging_fraction\": 0.91,\n    \"bagging_seed\": 42,\n    \"metric\": 'mae',\n    \"lambda_l1\": 0.1,\n    \"verbosity\": -1,\n    \"nthread\": -1,\n    \"random_state\": 42\n}\n\n\noof = np.zeros(len(scaled_feature_train_df))\npredictions = np.zeros(len(scaled_test_df))\nfeature_importance_df = pd.DataFrame()\n\nfor fold_, (trn_idx, val_idx) in enumerate(folds.split(scaled_feature_train_df, y.values)):\n    \n    strLog = \"fold {}\".format(fold_)\n    print(strLog)\n    \n    X_tr, X_val = scaled_feature_train_df.iloc[trn_idx], scaled_feature_train_df.iloc[val_idx]\n    y_tr, y_val = y.iloc[trn_idx], y.iloc[val_idx]\n\n    model = lgbm.LGBMRegressor(**params, n_estimators = 20000, n_jobs = -1)\n    model.fit(X_tr, y_tr, \n              eval_set=[(X_tr, y_tr), (X_val, y_val)], eval_metric='mae',\n              verbose=1000, early_stopping_rounds=400)\n    \n    oof[val_idx] = model.predict(X_val, num_iteration=model.best_iteration_)\n\n    fold_importance_df = pd.DataFrame()\n    fold_importance_df[\"Feature\"] = scaled_feature_df_columns\n    fold_importance_df[\"importance\"] = model.feature_importances_[:len(scaled_feature_df_columns)]\n    fold_importance_df[\"fold\"] = fold_ + 1\n    feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n    #predictions\n    predictions += model.predict(scaled_test_df, num_iteration=model.best_iteration_) / folds.n_splits","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.DataFrame()\nsubmission['segment_id'] = signals_mean_test['id']\nsubmission['time_to_eruption'] = predictions\nsubmission.to_csv('submission_recent.csv', header=True, index=False)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}