{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Loading Important Libraries"},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nimport pandas as pd\nimport numpy as np\n\nfrom matplotlib import pyplot as plt\nimport matplotlib.ticker as ticker\nimport seaborn as sns\nfrom PIL import Image\nimport matplotlib.image as immg\nfrom pathlib import Path\nimport os\nimport gc\nimport cv2\nfrom tqdm.notebook import tqdm\nimport zipfile\nimport io\nfrom sklearn.decomposition import PCA\nfrom sklearn.manifold import TSNE","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pd.set_option('display.max_rows', 50)\npd.set_option('display.max_columns', 150)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"home = Path('/kaggle/input/predict-volcanic-eruptions-ingv-oe')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"trn_dir = Path('../input/predict-volcanic-eruptions-ingv-oe/train')\ntst_dir = Path('../input/predict-volcanic-eruptions-ingv-oe/test')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv(home/'train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.segment_id = df.segment_id.apply(lambda x : str(x)+'.csv')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Stratified Kfold for Regression"},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold\n\ndef stra_kfold(data,target,targ_type,n_splits,seed=2020): \n    '''\n    data = dataframe\n    target = target variable\n    targ_type = 'clas' for classfication | 'reg' for regression \n    n_splits = number of splits\n    '''\n    df = data.copy()\n    df = df.sample(frac = 1., random_state = seed)\n    \n    if targ_type =='clas':\n        df['kfold'] = -1\n        y = df[target].values\n        kf = StratifiedKFold(n_splits=n_splits,random_state = seed,shuffle = True)\n        for fold ,(trn_,val_ )in enumerate(kf.split(X=df,y=y)):\n            df.loc[val_,'kfold'] = fold\n        return df\n    elif targ_type =='reg':\n        df['kfold'] = -1\n        num_bins = int(np.floor(1 + np.log2(len(df))))\n        df.loc[:,'bins'] = pd.cut(df[target],bins=num_bins,labels=False)\n        kf = StratifiedKFold(n_splits = n_splits, random_state = seed, shuffle = True)\n        for fold ,(trn_,val_ )in enumerate(kf.split(X=df,y=df.bins.values)):\n            df.loc[val_,'kfold'] = fold\n        return df\n    else:\n        return 0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trn_df = stra_kfold(df,'time_to_eruption','reg',5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"files = df.segment_id.tolist()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Helpful functions to compress whole csv into single row features"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_df(a,name):\n    return pd.DataFrame(data=np.array(a.values).reshape((1,10)),columns=[str(x)+\"_\"+str(name) for x in a.index])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def add_feature(XX):\n    X = XX.copy()\n    nan = make_df(X.isna().sum(),'isna')\n    X.fillna(value=-999,inplace=True)\n    mean = make_df(X.mean(),'mean')\n    std = make_df(X.std(),'std')\n    var = make_df(X.var(),'var')\n    maxi = make_df(X.max(),'max')\n    lif = make_df(X.quantile(0.25)-(1.5*(X.quantile(0.75)-X.quantile(0.25))),'lif')\n    uif = make_df(X.quantile(0.75)+(1.5*(X.quantile(0.75)-X.quantile(0.25))),'uif')\n    mad = make_df(X.mad(),'mad')\n    mini = make_df(X.min(),'min')\n    quant5 = make_df(X.quantile(0.05),'quant5')\n    quant10 = make_df(X.quantile(0.1),'quant10')\n    quant15 = make_df(X.quantile(0.15),'quant15')\n    quant25 = make_df(X.quantile(0.25),'quant25')\n    quant35 = make_df(X.quantile(0.35),'quant35')\n    quant50 = make_df(X.quantile(0.5),'quant50')\n    quant65 = make_df(X.quantile(0.65),'quant65')\n    quant75 = make_df(X.quantile(0.75),'quant75')\n    quant85 = make_df(X.quantile(0.85),'quant85')\n    quant90 = make_df(X.quantile(0.9),'quant90')\n    quant95 = make_df(X.quantile(0.95),'quant95')\n    iqr = make_df(X.quantile(0.75)-X.quantile(0.25),'iqr')\n    skew = make_df(X.skew(),'skew')\n    kurt = make_df(X.kurtosis(),'kurtosis')\n    data = pd.concat([nan,mean,std,var,maxi,mini,quant5,quant10,quant15,quant25,quant35,quant50,quant65,\n                      quant75,quant85,quant90,quant95,iqr,lif,uif,skew,kurt,mad],axis=1)\n    return data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from joblib import Parallel, delayed","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Will Be using joblib's parallel function to speed up data_processing"},{"metadata":{},"cell_type":"markdown","source":"## Preparing train_data"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_all(fname):\n    dfile = pd.read_csv(trn_dir/fname)\n    new_row = add_feature(dfile)\n    new_row['segment_id'] = fname\n    return new_row","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"out = Parallel(n_jobs=-1,verbose=1)(delayed(make_all)(i) for i in files)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_all = pd.concat(out,axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_all.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_all.to_csv('volcano_train_data.csv',index=False)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Preparing Test Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"sam = pd.read_csv('../input/predict-volcanic-eruptions-ingv-oe/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"files_ts = [str(x)+'.csv' for x in sam.segment_id]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_all_ts(fname):\n    dfile = pd.read_csv(tst_dir/fname)\n    new_row = add_feature(dfile)\n    new_row['segment_id'] = fname\n    return new_row","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"out_ts = Parallel(n_jobs=-1,verbose=1)(delayed(make_all_ts)(i) for i in files_ts)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_test_all = pd.concat(out_ts,axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_test_all.to_csv('volcano_test_data.csv',index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_trn = data_all.merge(trn_df,on='segment_id',how='left')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Categorical features - is NaN\n## Numeric features rest of them"},{"metadata":{"trusted":true},"cell_type":"code","source":"cat_names = data_trn.columns.tolist()[:10]\ncont_names = data_trn.columns.tolist()[10:-4] ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Training Using CatBoost Regressor"},{"metadata":{"trusted":true},"cell_type":"code","source":"from catboost import CatBoostRegressor\nfrom sklearn.metrics import mean_absolute_error","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_sc = []\nmae = []\nfor i in tqdm(range(5)):\n    n = 3\n    print('scaling_factor ',n)\n    X_train,y_train = data_trn[data_trn.kfold!=i][cat_names+cont_names],data_trn[data_trn.kfold!=i]['time_to_eruption']**(1/n)\n    X_test,y_test = data_trn[data_trn.kfold==i][cat_names+cont_names],data_trn[data_trn.kfold==i]['time_to_eruption']**(1/n)\n    model = CatBoostRegressor(iterations = 2000,loss_function='RMSE',verbose=400)\n    model.fit(X_train, y_train,cat_features=np.arange(10),eval_set=(X_test, y_test));\n    y_true = y_test**n\n    y_pred = model.predict(X_test)**n\n    score = mean_absolute_error(y_true,y_pred)\n    mae.append(score)\n    print('--'*30)\n    print('fold ' ,i,' mean_absolute_error : ',score)\n    print('--'*30)\n    ts_pred = model.predict(data_test_all[cat_names+cont_names])**n\n    test_sc.append(ts_pred)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('avg_mean_absolute_error_5_fold : ',np.mean(mae))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"result = np.array(test_sc).mean(axis=0);result.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"l,m = df.time_to_eruption.quantile(.1),df.time_to_eruption.quantile(.90)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sam['time_to_eruption'] = result\nsam['time_to_eruption'].clip(l,m,inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sam.to_csv('submission_volcano2.csv',index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sam.head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}