{"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":"import numpy as np\nimport pandas as pd\nfrom nltk.corpus import stopwords\nimport re\nfrom sklearn.feature_extraction.text import CountVectorizer\nfrom sklearn.linear_model import SGDClassifier\nfrom xgboost import XGBClassifier\nfrom scipy.sparse import hstack, csr_matrix\nimport gc\nimport sys\nfrom sklearn.naive_bayes import MultinomialNB, ComplementNB\nfrom sklearn.model_selection import cross_val_score\n\npd.set_option('display.max_colwidth', None)\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Data Import**","metadata":{}},{"cell_type":"code","source":"def read_data():\n    data = pd.read_csv(\"/kaggle/input/avito-category-prediction/train.csv\", low_memory=False)#, nrows=300000)\n    data[\"Category\"] = data[\"Category\"].astype(\"int8\")\n    data.loc[data[\"description\"].isna() == True, [\"description\"]] = data.loc[data[\"description\"].isna() == True, [\"title\"]].values\n    return data\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = read_data()\nprint(data.info(memory_usage=\"deep\"))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del read_data\ngc.collect()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(data.head())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Data Preparation**","metadata":{}},{"cell_type":"code","source":"stop_words = set(stopwords.words(\"russian\"))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prepare_data(text_column):\n    processed_column = []\n    for text_row in text_column:\n        text_row = re.sub('[^A-Za-zА-Яа-я0-9]+', ' ', text_row)\n        text_row = ' '.join(word for word in text_row.lower().split() if word not in stop_words)\n        processed_column.append(text_row.lower().strip())\n    return processed_column","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data[\"description\"] = prepare_data(data[\"description\"])\ndata[\"title\"] = prepare_data(data[\"title\"])\ndisplay(data.head())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def vectorize_train_data(data):\n    \n    title_vect = CountVectorizer(min_df=4)\n    X_train_title = title_vect.fit_transform(data[\"title\"]).astype(np.float32)\n\n    descr_vect = CountVectorizer(min_df=10)\n    X_train_descr = descr_vect.fit_transform(data[\"description\"]).astype(np.float32)\n\n    X_train = hstack((X_train_title, X_train_descr)).tocsr()\n    \n    return X_train, title_vect, descr_vect\n\ndef vectorize_test_data(data, title_vect, descr_vect):\n    \n    data[\"description\"] = prepare_data(data[\"description\"])\n    data[\"title\"] = prepare_data(data[\"title\"])\n    \n    X_test_title = title_vect.transform(data[\"title\"]).astype(np.float32)\n\n    X_test_descr = descr_vect.transform(data[\"description\"]).astype(np.float32)\n\n    X_test = hstack((X_test_title, X_test_descr)).tocsr()\n    \n    return X_test","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, title_vect, descr_vect = vectorize_train_data(data)\ny_train = data[\"Category\"].copy()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.drop([\"Category\", \"Category_name\", \"title\", \"description\"], axis=1, inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del vectorize_train_data, data\ngc.collect()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Base Models and Blender Training**","metadata":{}},{"cell_type":"code","source":"models = [SGDClassifier(random_state=42, max_iter=1000, n_jobs=-1, alpha=0.000001), \n          ComplementNB(alpha=0.01), \n          MultinomialNB(alpha=0.001)]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_estimators(models, X_train, y_train):\n    trained_models = []\n    cols = [type(x).__name__ for x in models]\n    preds = pd.DataFrame(columns=cols)\n    \n    for model in models:\n        model.fit(X_train, y_train)\n        preds[str(type(model).__name__)] = model.predict(X_train)\n        print(model.score(X_train, y_train))\n        trained_models.append(model)\n    \n    \n    #blender = RidgeClassifier(random_state=42)\n    #blender = SGDClassifier(random_state=42, max_iter=1000, n_jobs=-1)\n    #blender = CatBoostClassifier(random_state=42, thread_count=1, verbose=10, n_estimators=100)\n    blender = XGBClassifier(n_jobs=-1, random_state=42, verbosity=1, n_estimators=50)\n    blender.fit(preds, y_train)\n    print(blender.score(preds, y_train))\n    preds[\"blender\"] = blender.predict(preds)\n    display(preds.head(20))\n    \n    return trained_models, blender","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ntrained_models, blender = train_estimators(models, X_train, y_train)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del X_train, y_train, train_estimators\ngc.collect()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Test data predictions**","metadata":{}},{"cell_type":"code","source":"def read_test():\n    data = pd.read_csv(\"/kaggle/input/avito-category-prediction/test.csv\", low_memory=False)#, nrows=300000)\n    data.loc[data[\"description\"].isna() == True, [\"description\"]] = data.loc[data[\"description\"].isna() == True, [\"title\"]].values\n    return data","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = read_test()\ntest.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = vectorize_test_data(test, title_vect, descr_vect)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_predictions(X_test, trained_models, blender):\n    cols = [type(x).__name__ for x in models]\n    preds = pd.DataFrame(columns=cols)\n    \n    for model in models:\n        preds[str(type(model).__name__)] = model.predict(X_test)\n    preds[\"blender\"] = blender.predict(preds)   \n    display(preds.head(20))\n\n    return preds[\"blender\"]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.DataFrame(columns=[\"Id\", \"Category\"])\ndf[\"Id\"] = test[\"itemid\"]\ndf[\"Category\"] = get_predictions(X_test, trained_models, blender)\ndf.to_csv('submission.csv', index=False, header=df.columns)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}