{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport os\n\nimport optuna \nfrom optuna import Trial, visualization\nfrom optuna.samplers import TPESampler\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport lightgbm as lgb\nfrom xgboost import XGBClassifier\nimport xgboost as xgb\nfrom sklearn import ensemble\n\nfrom lightgbm import LGBMClassifier\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn import preprocessing\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.model_selection import cross_val_score\n\ndf_train = pd.read_csv('../input/airbnb-new-user/train.csv')\ndf_test = pd.read_csv('../input/airbnb-new-user/test.csv')\ndf_countries = pd.read_csv('../input/airbnb-new-user/countries.csv')\ndf_age = pd.read_csv('../input/airbnb-new-user/age_gender_bkts.csv')\ndf_ses = pd.read_csv('../input/airbnb-new-user/sessions.csv')\nlabels = df_train['country_destination']\ndf_train = df_train.drop(['country_destination'], axis=1)\nid_test = df_test['id']\npiv_train = df_train.shape[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_all = pd.concat((df_train, df_test), axis=0, ignore_index=True) #concatenate train and test\n# df_all = df_all.drop(['id'], axis=1)\n\ntotal_seconds = df_ses.groupby('user_id')['secs_elapsed'].sum()\naverage_seconds = df_ses.groupby('user_id')['secs_elapsed'].mean()\ntotal_sessions = df_ses.groupby('user_id')['action'].count()\ndistinct_sessions = df_ses.groupby('user_id')['action'].nunique()\nnum_short_sessions = df_ses[df_ses['secs_elapsed'] <= 300].groupby('user_id')['action'].count()\nnum_long_sessions = df_ses[df_ses['secs_elapsed'] >= 2000].groupby('user_id')['action'].count()\nnum_devices = df_ses.groupby('user_id')['device_type'].nunique()\n\ndef account_created(df):\n    #date_account_created\n    dac = np.vstack(df.date_account_created.astype(str).apply(lambda x: list(map(int, x.split('-')))).values)\n    df['dac_year'] = dac[:,0]\n    df['dac_month'] = dac[:,1]\n    df['dac_day'] = dac[:,2]\n    df = df.drop(['date_account_created'], axis=1)\n    return df\n\ndef first_active(df):\n#     tfa = np.vstack(df_all.timestamp_first_active.astype(str).apply(lambda x: list(map(int, [x[:4],x[4:6],x[6:8],x[8:10],x[10:12],x[12:14]]))).values)\n#     df_all['tfa_year'] = tfa[:,0]\n#     df_all['tfa_month'] = tfa[:,1]\n#     df_all['tfa_day'] = tfa[:,2]\n#     df = df.drop(['timestamp_first_active'], axis=1)\n    return df\n\ndef first_booking(df):\n    df.date_first_booking = df.date_first_booking.fillna('2000-01-01')\n    first_booking = np.vstack(df.date_first_booking.astype(str).apply(lambda x: list(map(int, x.split('-')))).values)\n    df['first_booking_year'] = first_booking[:,0]\n    df['first_booking_month'] = first_booking[:,1]\n    df['first_booking_day'] = first_booking[:,2]\n    df = df.drop(['date_first_booking'], axis=1)\n#     df['date_first_booking']=df['date_first_booking'].apply(lambda x:1 if x is np.nan else 0)\n    return df  \n\ndef gender(df):\n    return df \n\n\ndef age(df):\n    df['age'] = df['age'].apply(lambda x: np.nan if x > 115 or x<15 else x)\n    df['age']=  df['age'].fillna(df['age'].mode()[0])\n    return df\n\ndef signup_method(df):\n    return df\n\ndef signup_flow(df):\n    df['signup_flow'] = df['signup_flow'].apply(lambda x: x if x==3 or x==6 or x==8 or x==10 or x==2 or x==16  or x==21 else 0)\n    return df\n\ndef languages(df):\n    df['language'] = df['language'].apply(lambda x: 'foreign' if x != 'en' else x)\n    return df\n\ndef affiliate_channel(df):\n    df['affiliate_channel'] = df['affiliate_channel'].apply(lambda x: 'other' if x  not in ['direct', 'content'] else x)\n    return df\n\ndef affiliate_provider(df):\n    df['affiliate_provider'] = df['affiliate_provider'].apply(lambda x: 'rest' if x not in ['direct', 'google', 'other'] else x)\n    return df\n\n\ndef affiliate_tracked(df):\n    df['first_affiliate_tracked'] = df['first_affiliate_tracked'].fillna('Unknown')\n    df['first_affiliate_tracked'] = df['first_affiliate_tracked'].apply(lambda x: 'Other' if x != 'Unknown' and x != 'untracked' else x)\n    return df\n\ndef signup_app(df):\n    return df\n\n\ndef browsers(df):\n    major_browsers = ['Chrome', 'Safari', 'Firefox', 'IE', 'Mobile_Safari']\n    df['first_browser'] = df['first_browser'].apply(lambda x: 'Other' if x not in major_browsers else x)\n    return df\n\ndef first_device_type(df):\n    df = df.drop(['first_device_type'], axis=1)\n    return df\n\ndef session_features(df):\n    df['total_seconds'] = df['id'].apply(lambda x: total_seconds[x] if x in total_seconds else 0)\n    df['average_seconds'] = df['id'].apply(lambda x: average_seconds[x] if x in average_seconds else 0)\n    df['total_sessions'] = df['id'].apply(lambda x: total_sessions[x] if x in total_sessions else 0)\n    df['distinct_sessions'] = df['id'].apply(lambda x: distinct_sessions[x] if x in distinct_sessions else 0)\n    df['num_short_sessions'] = df['id'].apply(lambda x: num_short_sessions[x] if x in num_short_sessions else 0)\n    df['num_long_sessions'] = df['id'].apply(lambda x: num_long_sessions[x] if x in num_long_sessions else 0)\n    df['num_devices'] = df['id'].apply(lambda x: num_devices[x] if x in num_devices else 0)\n    return df\n\ndef feature_engineering(df):\n    df=account_created(df)\n    df=first_active(df)\n    df=first_booking(df)\n    df=gender(df)\n    df=age(df)\n    df=session_features(df)\n#     df=signup_method(df)\n#     df=signup_flow(df)\n#     df=languages(df)\n#     df=affiliate_channel(df)\n#     df=affiliate_provider(df)\n#     df=affiliate_tracked(df)\n#     df=signup_app(df)\n#     df=browsers(df)\n#     df=first_device_type(df)\n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_all=feature_engineering(df_all)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_all = df_all.drop(['id'], axis=1)\ndf_all['average_seconds'] = df_all['average_seconds'].fillna(df_all['average_seconds'].mean())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#One-hot-encoding features\n\nfeatures = ['gender', 'signup_method', 'signup_flow', 'language', 'affiliate_channel', 'affiliate_provider', 'first_affiliate_tracked',\n             'signup_app', 'first_browser', 'first_device_type']\nle = preprocessing.LabelEncoder()\nfor f in features:\n    df_all[f] = df_all[f].astype('category')\n    df_all[f] = df_all[f].fillna(df_all[f].mode()[0])\n#     df_all[f] = le.fit_transform(df_all[f])\n#     df_all_dummy = pd.get_dummies(df_all[f], prefix=f)\n#     df_all = df_all.drop([f], axis=1)\n#     df_all = pd.concat((df_all, df_all_dummy), axis=1)\n\ndf_all.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = df_all[:piv_train]\nX_test = df_all[piv_train:]\n\ny = le.fit_transform(labels)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from skopt.space import Real, Categorical, Integer\nfrom catboost import CatBoostClassifier\ndef objective(trial: Trial,X,y) -> float:\n\n    train_X,test_X,train_y,test_y = train_test_split(X, y, test_size = 0.30,random_state = 101)\n\n#     param = {\n#         'num_leaves': trial.suggest_int('num_leaves', 32, 512),\n#         'min_data_in_leaf': trial.suggest_int('min_data_in_leaf',100, 300),\n#         'n_estimators' : trial.suggest_int('n_estimators', 0, 1000),\n#         'max_depth':trial.suggest_int('max_depth', 2, 25),\n#         'reg_alpha':trial.suggest_int('reg_alpha', 0, 5),\n#         'reg_lambda':trial.suggest_int('reg_lambda', 0, 5),\n#         'min_child_weight':trial.suggest_int('min_child_weight', 0, 5),\n#         'learning_rate':trial.suggest_loguniform('learning_rate',0.005,0.5),\n#         'colsample_bytree':trial.suggest_discrete_uniform('colsample_bytree',0.1,1,0.01),\n#         'nthread' : -1\n#         }\n\n    param = {'depth': trial.suggest_int('depth', 1, 16),\n          'learning_rate' : trial.suggest_categorical(\"learning_rate\",[0.03,0.001,0.01,0.1,0.2,0.3]),\n         'l2_leaf_reg': trial.suggest_int('l2_leaf_reg', 1, 15),\n         'iterations': trial.suggest_categorical(\"iterations\", [250,100,400,600])}\n    \n#     param = {'iterations': Integer(10, 1000),\n#                 'depth': Integer(1, 8),\n#                  'learning_rate': Real(0.01, 1.0, 'log-uniform'),\n#                  'random_strength': Real(1e-9, 10, 'log-uniform'),\n#                  'bagging_temperature': Real(0.0, 1.0),\n#                  'border_count': Integer(1, 255),\n#                  'l2_leaf_reg': Integer(2, 30),\n#                  'scale_pos_weight':Real(0.01, 1.0, 'uniform')}\n    \n    model = CatBoostClassifier(**param,cat_features=features)\n    \n    model.fit(train_X,train_y)\n    \n    return roc_auc_score(model,test_X,test_y)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"study = optuna.create_study(direction='maximize',sampler=TPESampler())\nstudy.optimize(lambda trial : objective(trial,X,y),n_trials= 50)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"params = study.best_trial.params\nprint('Best trial: score {},\\nparams {}'.format(study.best_trial.value,study.best_trial.params))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.7, random_state=1234)\n\nmodel = CatBoostClassifier(**params,od_type='Iter',one_hot_max_size=10)\n\nmodel.fit(X_train, y_train,cat_features=features,eval_set=(X_validation, y_validation),plot=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pred = model.predict_proba(X_test)  \n\n#Taking the 3 classes with highest probabilities\nids = []  \ncts = []  \nfor i in range(len(id_test)):\n    idx = id_test[i]\n    ids += [idx] * 3\n    cts += le.inverse_transform(np.argsort(y_pred[i])[::-1])[:3].tolist()\n\n#Generate submission\nsub = pd.DataFrame(np.column_stack((ids, cts)), columns=['id', 'country_destination'])\nsub.to_csv('subcb.csv',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}