{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","collapsed":true,"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport catboost as cb\nimport numpy as np\n\nfrom textblob import TextBlob\nfrom nltk.corpus import stopwords\nfrom nltk.stem.snowball import RussianStemmer\nfrom sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer\nfrom sklearn.model_selection import train_test_split","execution_count":1,"outputs":[]},{"metadata":{"_uuid":"9917834c64a9d31a4a06ff6c140d28e0c14da33d","collapsed":true,"_cell_guid":"9d1ac288-6e2e-47c3-90e9-238a22aa07c7","trusted":true},"cell_type":"code","source":"MAX_TFIDF_FEATURES = 75\nstop_words = stopwords.words('russian')\nrs = RussianStemmer()","execution_count":2,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","collapsed":true,"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"train_data = pd.read_csv(\"../input/train.csv\", parse_dates = [\"activation_date\"])\ny = train_data.deal_probability.copy()","execution_count":3,"outputs":[]},{"metadata":{"_uuid":"5a109631f8ff2c17e6e51183694c0ab57d92282b","_cell_guid":"968dedc3-9ff4-4937-b77b-6f6efd1032b5"},"cell_type":"markdown","source":"Data preprocessing"},{"metadata":{"_uuid":"a6490346fff08a79a8ce6e284a7e3b758c2f0759","collapsed":true,"_cell_guid":"4da0e49a-5a28-4d44-94f2-3f28fca08ebd","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\",\n                    \"title\", \"activation_date\", \"param_1\", \"param_2\", \"param_3\"]\nlabel_column = \"deal_probability\"\n\ntrain_labels = train_data[label_column]\ntrain_data = train_data[selected_columns]","execution_count":4,"outputs":[]},{"metadata":{"_uuid":"97c27bdb5b0be4db467ec187a46a5cd7a4daa428","collapsed":true,"_cell_guid":"88d63703-7266-496e-ae07-f9c874c8a37f","trusted":true},"cell_type":"code","source":"def preprocess(df):\n    df[\"price\"].fillna(train_data[\"price\"].mean(), inplace=True)\n    df[\"image_top_1\"].fillna(train_data[\"image_top_1\"].mode()[0], inplace=True)\n    df['title'].fillna(' ', inplace=True)\n    df['description'].fillna(' ', inplace=True)\n    df['param_1'].fillna(' ', inplace=True)\n    df['param_2'].fillna(' ', inplace=True)\n    df['param_3'].fillna(' ', inplace=True)\n    df[\"Weekday\"] = df['activation_date'].dt.weekday\n    df[\"Day of Month\"] = df['activation_date'].dt.day\n    # text preparation\n    df[\"txt\"] = df[\"title\"] + \" \" + df[\"description\"] + \" \" + df[\"param_2\"] + \" \" + df[\"param_3\"]\n    # lower everything\n    df[\"txt\"] = df[\"txt\"].str.lower() \n    # remove punctuation\n    df[\"txt\"] = df[\"txt\"].str.replace('[^\\w\\s]',' ')\n    # remove stopwords\n    df[\"txt\"] = df[\"txt\"].apply(lambda x: \" \".join(x for x in x.split() if x not in stop_words))\n    # stem\n    #df[\"stem_txt\"] =df[\"txt\"][0:len(df)].apply(lambda x: \" \".join([rs.stem(word) for word in x.split()]))\n    df.drop([\"activation_date\", \"title\", \"description\", \"param_2\", \"param_3\"], axis = 1, inplace = True)\n    return df","execution_count":5,"outputs":[]},{"metadata":{"_uuid":"5092ea8fc0d2a1505febccbf8538d2823f3a794e","_cell_guid":"9eb23abe-25f9-4159-a0ba-8ef449b31baf","trusted":true},"cell_type":"code","source":"%%time\ntrain_data = preprocess(train_data)\ntrain_data.head()","execution_count":6,"outputs":[]},{"metadata":{"_uuid":"fae87d65c59dcf3f2836a261701cbf635493fa91","_cell_guid":"5edd1be1-da22-4412-ac4d-485f4bd38f0a"},"cell_type":"markdown","source":"Feature engineering"},{"metadata":{"_uuid":"578f03b483ec475559f5a6340795b8c0b131d6bb","collapsed":true,"_cell_guid":"939af6f3-f512-4513-8f4c-6c69ed8aab20","trusted":true},"cell_type":"code","source":"def tfidf_vectorize(series, max_features):\n    vectorizer = TfidfVectorizer(max_features=max_features, stop_words=stop_words)\n    return np.array(vectorizer.fit_transform(series).todense(), dtype=np.float16)\n\ndef feature_engineering(df):\n    txt_vectors = tfidf_vectorize(df['txt'], MAX_TFIDF_FEATURES)\n\n    for i in range(MAX_TFIDF_FEATURES):\n        df.loc[:, 'txt_tfidf_' + str(i)] = txt_vectors[:, i]\n    df.drop(\"txt\", axis = 1, inplace = True)\n    return df","execution_count":9,"outputs":[]},{"metadata":{"_uuid":"c85d59baedc50f09f82c9c8c566b5489045f0b14","_kg_hide-output":false,"_cell_guid":"93c456b0-83f6-4320-8094-4c1467dab337","trusted":true},"cell_type":"code","source":"train_data = feature_engineering(train_data)\nX = train_data","execution_count":10,"outputs":[]},{"metadata":{"_uuid":"a92bd319ade9d6d544ce5993b0fd125bc1ef8cbd","_cell_guid":"0c35796e-1843-4abf-8c93-b44777d211ea","trusted":true},"cell_type":"code","source":"X.head()","execution_count":11,"outputs":[]},{"metadata":{"_uuid":"68b623166700a94d5d7bf2fc48c889cde7cccb99","_cell_guid":"025c9219-85e4-4c86-b7f9-930958a4d2df"},"cell_type":"markdown","source":"Preparing and processing the test data"},{"metadata":{"_uuid":"6d2d3392a75a1378271929218b714489c06250dc","_cell_guid":"3cc7046f-65da-4249-9af3-ce74badc1a20","trusted":true},"cell_type":"code","source":"test_data = pd.read_csv(\"../input/test.csv\", parse_dates = [\"activation_date\"])\ntest_data = test_data[selected_columns]\ntest_data = preprocess(test_data)\ntest_data = feature_engineering(test_data)\ntest_data.head()","execution_count":12,"outputs":[]},{"metadata":{"_uuid":"e3177ad4519160a2d0c78c56af585020a0052bd2","collapsed":true,"_kg_hide-output":false,"_cell_guid":"c09d010f-5804-4c57-a443-e1e1de6f123f","trusted":true},"cell_type":"code","source":"X_train, X_valid, y_train, y_valid = train_test_split(\n    X, y, test_size=0.15, random_state=167)","execution_count":13,"outputs":[]},{"metadata":{"_uuid":"8b765ecedac7aca18d0b4f75c2c3e09fc2e70b16","_cell_guid":"c5f76461-efe6-4b2d-9e7a-aba6bf99ebac"},"cell_type":"markdown","source":"Train model"},{"metadata":{"_uuid":"006423e8392368eb2b2415616be6d63f5723083f","_kg_hide-output":false,"_cell_guid":"77752060-1071-499c-91e5-22f0e20a7f42","trusted":true},"cell_type":"code","source":"model = cb.CatBoostRegressor(iterations=400,\n                             learning_rate=0.05,\n                             depth=10,\n                             #loss_function='RMSE',\n                             eval_metric='RMSE',\n                             random_seed = 167, \n                             od_type='Iter',\n                             metric_period = 50,\n                             od_wait=20) \nmodel.fit(X_train, y_train,\n          eval_set=(X_valid,y_valid),\n          use_best_model=True,\n          cat_features=[0, 1, 2, 4, 5, 6, 7, 8, 9, 10])","execution_count":14,"outputs":[]},{"metadata":{"_uuid":"70522dd3619495e3fd6517f4b9c5df8936d2aaf7","_cell_guid":"e306ad36-04d8-467c-be99-3b3a730d6a0e"},"cell_type":"markdown","source":"Make predictions"},{"metadata":{"_uuid":"7af66e2bc1df034516f3ed311e4e2c610da2137e","collapsed":true,"_cell_guid":"597b0ff2-7e4e-46cb-a6da-9761e0487bdc","trusted":true},"cell_type":"code","source":"preds = model.predict(test_data)","execution_count":15,"outputs":[]},{"metadata":{"_uuid":"1925bf3f01a0279b67e71566b3218aec7c72a688","_cell_guid":"7b8e9ce5-99d1-4982-877b-a46dc4b84c90"},"cell_type":"markdown","source":"Make submission"},{"metadata":{"_uuid":"7db4fd694b81559329ca2b9ed52e367aa8f6c8a8","collapsed":true,"_cell_guid":"c10f0b26-610f-45c6-8498-5d1a1001e119","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":16,"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}