{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","collapsed":true,"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport catboost as cb\nimport numpy as np\n\nfrom nltk.corpus import stopwords\nfrom sklearn.feature_extraction.text import TfidfVectorizer","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"6d0e7af3-f7b1-499e-b1c5-2226d678568a","_uuid":"589a152c16985a905593fd56d7c56f61ae2174e0","collapsed":true,"trusted":true},"cell_type":"code","source":"stop_words = stopwords.words('russian')","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","collapsed":true,"trusted":true},"cell_type":"code","source":"train_data = pd.read_csv(\"../input/train.csv\")\ntest_data = pd.read_csv(\"../input/test.csv\")","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"5e6b921d-60ef-4a01-9b94-11fcddef02c5","_uuid":"1871b869d985d6768327fdb364c7d183995dc5ea"},"cell_type":"markdown","source":"Data preprocessing"},{"metadata":{"_cell_guid":"34c83ced-759e-4e41-9950-cf7f1c438424","_uuid":"3ab631b745db8421da68a1d21bc4a138fedac62d","collapsed":true,"trusted":true},"cell_type":"code","source":"selected_columns = [\"item_id\", \"user_id\", \"region\", \"price\", \"item_seq_number\", \n                    \"user_type\", \"image_top_1\", \"category_name\", \"description\", \"title\", \"activation_date\"]\nlabel_column = \"deal_probability\"\n\ntrain_labels = train_data[label_column]\ntrain_data = train_data[selected_columns]\ntest_data = test_data[selected_columns]","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"22d1a952-86ac-42a9-9056-95287e75ef47","_uuid":"d561ef7bfff2aba6cf632bb82cd32ad4519b742b","collapsed":true,"trusted":true},"cell_type":"code","source":"def preprocess(df):\n    df[\"price\"].fillna(df[\"price\"].mean(), inplace=True)\n    df[\"image_top_1\"].fillna(df[\"image_top_1\"].mode()[0], inplace=True)\n    df['description'].fillna(' ', inplace=True)\n    df['title'].fillna(' ', inplace=True)\n    \n    return df","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"6436f069-521d-49b8-a604-1defc2386289","_uuid":"eb80177460bcac1e5436782d8ec0fb3200fd8295","collapsed":true,"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain_data = preprocess(train_data)\ntest_data = preprocess(test_data)\nX_train, X_val, y_train, y_val = train_test_split(train_data, train_labels, train_size=0.8, test_size=0.2)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"a9f87c5a-e1ac-4e44-8163-eb7b77abb6f6","_uuid":"19c077882c44e1b0b29756e79ce36b25c99fc471"},"cell_type":"markdown","source":"Feature engineering"},{"metadata":{"_cell_guid":"eefab92a-ad40-44fc-9829-2ee4981f300b","_uuid":"fa1921a993155c0a46c0bc59615c74fae67f4e05","collapsed":true,"trusted":true},"cell_type":"code","source":"def tfidf_vectorize(series, max_features):\n    vectorizer = TfidfVectorizer(max_features=max_features, stop_words=stop_words, min_df=1)\n    return np.array(vectorizer.fit_transform(series).todense(), dtype=np.float16)\n\n\ndef price_feature(df, column_name):\n    df.loc[:, column_name + \"_mean_price\"] = df.groupby(column_name)[\"price\"].transform(\"mean\")\n    df.loc[:, column_name + \"_max_price\"] = df.groupby(column_name)[\"price\"].transform(\"max\")\n    df.loc[:, column_name + \"_min_price\"] = df.groupby(column_name)[\"price\"].transform(\"min\")\n    return df\n\n\ndef date_features(df):\n    df.loc[:, \"weekday\"] = pd.to_datetime(df['activation_date']).dt.weekday\n    df.loc[:, \"month\"] = pd.to_datetime(df['activation_date']).dt.month\n    df.loc[:, \"month_day\"] = pd.to_datetime(df['activation_date']).dt.day\n    df.drop(['activation_date'], inplace=True, axis=1)\n    return df\n\n\ndef feature_engineering(df):\n    description_vectors = tfidf_vectorize(df['description'], 100)\n    title_vectors = tfidf_vectorize(df['title'], 200)\n\n    for i in range(100):\n        df.loc[:, 'description_tfidf_' + str(i)] = description_vectors[:, i]\n    for i in range(200):\n        df.loc[:, 'title_tfidf_' + str(i)] = title_vectors[:, i]\n    \n    df.drop([\"description\"], inplace=True, axis=1)\n    \n    df = price_feature(df, \"category_name\")\n    df = price_feature(df, \"user_id\")\n    df = price_feature(df, \"region\")\n    df = date_features(df)\n    \n    df.loc[:, \"title_len\"] = df.title.apply(lambda x: len(x))\n    df.drop([\"title\"], inplace=True, axis=1)\n    return df","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"e28b0b5a-28c3-4bc5-a13a-56ebb0787efa","_uuid":"0b6cdaa1dc51072f4418f9688194fde3b9f91dab","collapsed":true,"scrolled":true,"trusted":true},"cell_type":"code","source":"X_train_features = feature_engineering(X_train)\nX_val_features = feature_engineering(X_val)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"3d398def-3aae-4b10-9a54-5aa1e41977a2","_uuid":"14d3dbb3b587f104e1711b6d814eae156ad2915d"},"cell_type":"markdown","source":"Train model"},{"metadata":{"_cell_guid":"a7b8a89d-842e-4274-b472-b9b9dfc78d2b","_uuid":"29df97843f62f0f2c3899cb309c6dbad9fb5e18d","collapsed":true,"trusted":true},"cell_type":"code","source":"CAT_FEATURES=[0, 1, 2, 4, 5, 6, 7]\nmodel = cb.CatBoostRegressor(iterations=200, \n                             learning_rate=0.05, \n                             depth=5, \n                             loss_function='RMSE', \n                             eval_metric='RMSE', \n                             random_seed=23, \n                             od_type='Iter', \n                             metric_period=50, \n                             od_wait=20)\nvalid_pool = cb.Pool(data=X_val_features, label=y_val, cat_features=CAT_FEATURES)\nmodel.fit(X=X_train_features, y=y_train,  eval_set=valid_pool, cat_features=CAT_FEATURES)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"ef899f90-6358-49b1-9a3e-9e9fa0b9af21","_uuid":"27f9ca485095041a28e2192649c6ac673c19f991","collapsed":true,"trusted":true},"cell_type":"code","source":"test_data = feature_engineering(test_data)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"3bdaf0f9-c1e1-4994-a7b7-7f6101802d52","_uuid":"7c6dcf8cec839f692cee2eba375d0f3203e41593"},"cell_type":"markdown","source":"Make predictions"},{"metadata":{"_cell_guid":"f2fd0774-3454-4f03-8b42-9596203e7104","_uuid":"48ec5ae4134a5c895b1fba1a04501dc0e0e713dd","collapsed":true,"trusted":true},"cell_type":"code","source":"preds = model.predict(test_data)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"dd75b34f-d367-4c13-aa8c-45c6a803ec46","_uuid":"452fb1e6a7a2bb72619b1000442e19efed278d25"},"cell_type":"markdown","source":"Make submission"},{"metadata":{"_cell_guid":"edc0fbe6-ddf2-4f75-94f7-85568a1ab9de","_uuid":"ef1d3f99365ccd49adb5b0c72e14af9f23786062","collapsed":true,"trusted":true},"cell_type":"code","source":"submission = pd.DataFrame(columns=[\"item_id\", \"deal_probability\"])\nsubmission[\"item_id\"] = test_data[\"item_id\"]\nsubmission[\"deal_probability\"] = preds\nsubmission[\"deal_probability\"].clip(0.0, 1.0, inplace=True)\nsubmission.to_csv(\"submission.csv\", index=False)","execution_count":null,"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}