{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"collapsed":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\nimport time\nnotebookstart= time.time()\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nimport gc\nprint(\"Data:\\n\",os.listdir(\"../input\"))\n\n# Models Packages\nfrom sklearn import metrics\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn import feature_selection\nfrom catboost import CatBoostRegressor\nfrom sklearn.model_selection import train_test_split\nfrom sklearn import preprocessing\nimport seaborn as sns\nimport matplotlib.pyplot as plt","execution_count":1,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"64029cc2a9341e890fe7d832c7ba2849ba25d9d0","collapsed":true},"cell_type":"code","source":"print(\"\\nData Load Stage\")\ntraining = pd.read_csv('../input/train.csv', index_col = \"item_id\", parse_dates = [\"activation_date\"])#.sample(1000)\ntraindex = training.index\ntesting = pd.read_csv('../input/test.csv', index_col = \"item_id\", parse_dates = [\"activation_date\"])#.sample(1000)\ntestdex = testing.index\ny = training.deal_probability.copy()\ntraining.drop(\"deal_probability\",axis=1, inplace=True)\nprint('Train shape: {} Rows, {} Columns'.format(*training.shape))\nprint('Test shape: {} Rows, {} Columns'.format(*testing.shape))","execution_count":2,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true,"scrolled":true,"collapsed":true},"cell_type":"code","source":"# Combine Train and Test\ndf = pd.concat([training,testing],axis=0)\ndel training, testing\ngc.collect()\nprint('\\nAll Data shape: {} Rows, {} Columns'.format(*df.shape))\n\nprint(\"Feature Engineering\")\ndf[\"price\"] = np.log(df[\"price\"]+0.001)\ndf[\"price\"].fillna(-999,inplace=True)\ndf[\"image_top_1\"].fillna(-999,inplace=True)\n\nprint(\"\\nCreate Time Variables\")\ndf[\"Weekday\"] = df['activation_date'].dt.weekday\ndf[\"Week of Year\"] = df['activation_date'].dt.week\ndf[\"Day of Month\"] = df['activation_date'].dt.day\nprint('Create combined param len')\ndf['param_combined'] = df.apply(lambda row:' '.join([str(row['param_1']),str(row['param_2']),str(row['param_3'])]),axis = 1)\ndf['param_combined'].fillna(' ',inplace = True)\ndf['param_combined_len'] = df['param_combined'].apply(lambda x:len(x.split()))\n# Remove Dead Variables\ndf.drop([\"activation_date\",\"image\",'param_combined','Week of Year','Day of Month'],axis=1,inplace=True)\n\nprint(\"\\nEncode Variables\")\ncategorical = [\"user_id\",\"region\",\"city\",\"parent_category_name\",\"category_name\",\"item_seq_number\",\"user_type\",\"image_top_1\",'param_combined_len']\nmessy_categorical = [\"param_1\",\"param_2\",\"param_3\",\"title\",\"description\"] # Need to find better technique for these\nprint(\"Encoding :\",categorical + messy_categorical)\n","execution_count":3,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c29f4daf81aa8ec01ff4c0eb762fd73dfd76b1c1","collapsed":true},"cell_type":"code","source":"# Encoder:\nlbl = preprocessing.LabelEncoder()\nfor col in categorical + messy_categorical:\n    df[col] = lbl.fit_transform(df[col].astype(str))\n    \nprint(\"\\nCatboost Modeling Stage\")\nX = df.loc[traindex,:].copy()\nprint(\"Training Set shape\",X.shape)\ntest = df.loc[testdex,:].copy()\nprint(\"Submission Set Shape: {} Rows, {} Columns\".format(*test.shape))\ndel df\ngc.collect()","execution_count":4,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"b9f52a88128fc70cbee90e4c7f7a0319536b1244"},"cell_type":"code","source":"# Training and Validation Set\nX_train, X_valid, y_train, y_valid = train_test_split(\n    X, y, test_size=0.10, random_state=23)\n\n# Prepare Categorical Variables\ndef column_index(df, query_cols):\n    cols = df.columns.values\n    sidx = np.argsort(cols)\n    return sidx[np.searchsorted(cols,query_cols,sorter=sidx)]\ncategorical_features_pos = column_index(X,categorical + messy_categorical)\n","execution_count":5,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1fa7576637f03b18f7faaff364b2864d1495e16c","collapsed":true},"cell_type":"code","source":"X.head()","execution_count":6,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"10842f21f68e4371c0fdd4922b10c92d39a427f5","scrolled":true,"collapsed":true},"cell_type":"code","source":"X.columns.values","execution_count":7,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"98e81357fdf7fc527399d4d701574f158fa8db0d","collapsed":true},"cell_type":"code","source":"categorical_features_pos","execution_count":8,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cc2ee46f3cae73e1e6621bd2fc7a8f25fcc7e235","collapsed":true},"cell_type":"code","source":"# Train Model\nprint(\"Train CatBoost Decision Tree\")\nmodelstart= time.time()\ncb_model = CatBoostRegressor(iterations=700,\n                             learning_rate=0.02,\n                             depth=12,\n                             eval_metric='RMSE',\n                             random_seed = 23,\n                             bagging_temperature = 0.2,\n                             od_type='Iter',\n                             metric_period = 75,\n                             od_wait=100)\ncb_model.fit(X_train, y_train,\n             eval_set=(X_valid,y_valid),\n             cat_features=categorical_features_pos,\n             use_best_model=True,\n             verbose=True)","execution_count":9,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"080d8ee2fbf47230bf097bf96d4cd7e1eb324353","collapsed":true},"cell_type":"code","source":"fea_imp = pd.DataFrame({'imp': cb_model.feature_importances_, 'col': X.columns})\nfea_imp = fea_imp.sort_values(['imp', 'col'], ascending=[True, False]).iloc[-30:]\n_ = fea_imp.plot(kind='barh', x='col', y='imp', figsize=(20, 10))\nplt.savefig('catboost_feature_importance.png')   \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"546d32e887c4b225bbeaa49a5993eb77b3e6cf4b","collapsed":true},"cell_type":"code","source":"print(\"Model Evaluation Stage\")\nprint(cb_model.get_params())\nprint('RMSE:', np.sqrt(metrics.mean_squared_error(y_valid, cb_model.predict(X_valid))))\ncatpred = cb_model.predict(test)\ncatsub = pd.DataFrame(catpred,columns=[\"deal_probability\"],index=testdex)\ncatsub['deal_probability'].clip(0.0, 1.0, inplace=True)\ncatsub.to_csv(\"submission.csv\",index=True,header=True) # Between 0 and 1\nprint(\"Model Runtime: %0.2f Minutes\"%((time.time() - modelstart)/60))\nprint(\"Notebook Runtime: %0.2f Minutes\"%((time.time() - notebookstart)/60))","execution_count":12,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.5","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}