{"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_minor":4,"nbformat":4,"cells":[{"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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# http://contrib.scikit-learn.org/categorical-encoding/\n!pip install category-encoders","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from category_encoders.ordinal import OrdinalEncoder","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc\nimport lightgbm as lgb\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn import preprocessing\n# from sklearn.preprocessing import StandardScaler\nfrom sklearn.model_selection import cross_val_score, cross_val_predict","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/digital-turbine-auction-bid-price-prediction/train_data.csv')\ntest = pd.read_csv('/kaggle/input/digital-turbine-auction-bid-price-prediction/test_data.csv')\nsample_sub = pd.read_csv('../input/digital-turbine-auction-bid-price-prediction/sample_submission.csv')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('\\n Train shape', train.shape)\nprint('\\n Test shape', test.shape)\nprint('\\n Sample sub shape', sample_sub.shape)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features = train.columns.to_list()\nprint(features)\n# drop_feat = ['eventTimestamp', 'deviceId']\n# num_features = ['bidFloorPrice','sentPrice']","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Feature Engineering","metadata":{}},{"cell_type":"code","source":"def feat_eng(df):\n    df['dif_sent_floor'] = df['sentPrice'] - df['bidFloorPrice']\n    df['div_sent_floor'] = df['sentPrice']/df['bidFloorPrice']\n    #\n    df['sum_c2_c4'] = df['c2'] + df['c4']\n    df['dif_c2_c4'] = df['c2'] - df['c4']\n    df['mult_c2_c4'] = df['c2'] * df['c4']\n    df['div_c2_c4'] = df['c2'] / df['c4']\n    #\n    df['c1_c3'] = df['c1']+'_'+df['c3']\n    return df\n\ntrain = feat_eng(train)\ntest = feat_eng(test)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Some stats","metadata":{}},{"cell_type":"code","source":"train.describe()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.describe()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('\\nTrain shape', train.shape)\nprint('\\nTest shape', test.shape)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# dataframe info stats (https://www.kaggle.com/code/itkin16/catboost-on-gpu-baseline)\n\ndef stats(data):\n    \n    maxx = []\n    minn = []\n    for i in data.columns:\n        maxx.append(data[i].value_counts().max())\n        minn.append(data[i].value_counts().min())\n\n    return pd.DataFrame(\n        {'nunique': data.nunique(),\n         'len': len(data),\n        # 'nunique/len': data.nunique()/len(data),\n         'types':data.dtypes,\n         'Nulls' : data.isna().sum(),\n        # 'Nullpercent' : data.isna().sum()/len(data),\n         \"Value counts Max\": maxx,\n         'Value counts Min':minn \n        },\n        columns = ['nunique', 'len','types','Nulls'#,'Nullpercent', 'nunique/len'\n                   ,\"Value counts Max\",'Value counts Min']).\\\n        sort_values(by ='nunique',ascending = False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"\\nStats train\")\nstats(train)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"\\nStats test\")\nstats(test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Target endoding - Thanks to ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Target encoding\n\nUpvote Lucas Morin\n\nhttps://www.kaggle.com/code/lucasmorin/eda-item-price","metadata":{}},{"cell_type":"code","source":"def agg_features(df):\n    feature_groups = ['has_won', 'sentPrice', 'winBid']\n    # Group by device id\n    df_agg = df.groupby(['deviceId'])[feature_groups].agg(['mean', 'median', 'std', 'max', 'min', 'sum',]).reset_index()\n    # Rename columns joining suffix\n    df_agg.columns = ['_'.join(col) for col in df_agg.columns]\n    return df_agg\n\ntrain_agg = agg_features(train)\ntrain =  train.merge(train_agg, left_on = ['deviceId'], right_on = ['deviceId_'], how='left')\ntest =  test.merge(train_agg, left_on = ['deviceId'], right_on = ['deviceId_'], how='left')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model","metadata":{}},{"cell_type":"code","source":"# Categorical features\ncat_features = [\"countryCode\", \n    \"brandName\", \n    \"appVersion\", \n    \"osAndVersion\", \n    \"c1\", \n    \"mediationProviderVersion\", \n    \"bundleId\",\n    \"size\", \n    \"c3\", \n    \"unitDisplayType\",\n    \"connectionType\",\n    \"c1_c3\",]\n\n# Encode Categorical Columns\n# train[cat_features] = train[cat_features].astype(\"category\")\n# test[cat_features] = test[cat_features].astype(\"category\")\n\noe = OrdinalEncoder(cat_features)\ntrain[cat_features] = oe.fit_transform(train[cat_features])\ntest[cat_features] = oe.transform(test[cat_features])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn import preprocessing\n# enc = preprocessing.OrdinalEncoder(handle_unknown='use_encoded_value',\n#                                   unknown_value=-1)\n# train[cat_features] = enc.set_params(encoded_missing_value=-1).fit_transform(train[cat_features])\n# test[cat_features] = enc.transform(train[cat_features])\n\n# Target\ntrain_y = train.winBid\nmax_winBid = np.max(train['winBid'])\nmin_winBid = np.min(train['winBid'])\n# Drop columns\ntrain = train.drop(columns=[\"eventTimestamp\",\n                            \"deviceId\", \"deviceId_\",\n                            \"correctModelName\",\n                            \"winBid\",\n                            \"has_won\"]).reset_index(drop = True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train, X_test, y_train, y_test = train_test_split(train, train_y,test_size = .3, random_state=42)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# build the lightgbm model\nhyper_params = {\n    'task': 'train',\n    'boosting_type': 'gbdt',\n    'objective': 'regression',\n    'metric': 'rmse',\n    'learning_rate': 0.1,\n    # 'feature_fraction': .9,\n    # 'bagging_fraction': .7,\n    'bagging_freq': 10,\n    'verbose': 0,\n    \"max_depth\": 5,\n    \"num_iterations\": 100\n}\nlgb = lgb.LGBMRegressor(**hyper_params)\n\nlgb.fit(X_train, y_train,\n        eval_set=[(X_test, y_test)],\n        eval_metric='rmse',\n        early_stopping_rounds=25,)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = lgb.predict(X_test, num_iteration=lgb.best_iteration_)\n# Basic RMSE\nprint('The rmse of prediction is:', np.sqrt(mean_squared_error(y_pred, y_test)))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Feature importance\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\n# sorted(zip(clf.feature_importances_, X.columns), reverse=True)\nfeature_imp = pd.DataFrame(sorted(zip(lgb.feature_importances_,X_train.columns)), columns=['Value','Feature'])\n\nplt.figure(figsize=(20, 10))\nsns.barplot(x=\"Value\", y=\"Feature\", data=feature_imp.sort_values(by=\"Value\", ascending=False))\nplt.title('LightGB Features')\nplt.tight_layout()\nplt.show()\nplt.savefig('lgb_importances-01.png')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del train\n_ = gc.collect()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Submission","metadata":{}},{"cell_type":"code","source":"sub_test = pd.DataFrame({'deviceId':test['deviceId'], 'winBid':0})\n                         \ntest = test.drop(columns=[\"eventTimestamp\",\n                        \"deviceId\",\n                        \"deviceId_\",\n                        \"correctModelName\"]).reset_index(drop = True)\n# Predict\ny_pred = lgb.predict(test, num_iteration=lgb.best_iteration_)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_test['winBid'] = y_pred\nsub_test.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_test.to_csv('submission.csv', index = False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_test['winBid'] = np.clip(y_pred, min_winBid, max_winBid)\nsub_test.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_test.to_csv('submission_clip.csv', index = False)","metadata":{},"execution_count":null,"outputs":[]}]}