{"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":"markdown","source":"In this notebook I will try to predict birds only with metadata.\n\nThis is an experiment I did for my interest, so it doesn't contribute to raising the ranking of LB.","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport lightgbm as lgb\n\nfrom sklearn.metrics import f1_score\nfrom sklearn.model_selection import StratifiedKFold\nfrom tqdm._tqdm_notebook import tqdm_notebook\nfrom matplotlib import pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"load meta data","metadata":{}},{"cell_type":"code","source":"train_metadata_df = pd.read_csv(\"/kaggle/input/birdclef-2021/train_metadata.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"make target data","metadata":{}},{"cell_type":"code","source":"label_dic = {v:i for i, v in enumerate(train_metadata_df[\"primary_label\"].unique())}\nn_labels = len(label_dic)\ny_train = train_metadata_df[\"primary_label\"].map(label_dic).values","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"conversion year data.\n\nit has mistake labels like '0199'.\n","metadata":{}},{"cell_type":"code","source":"def check_year(year):\n    if year[:2] in [\"19\", \"20\"]:\n        return int(year)\n    else:\n        # there are mistake label like 0000, 0201, 0199, ...\n        return -1","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"date_df = pd.DataFrame(train_metadata_df[\"date\"].str.split(\"-\").tolist(), columns=[\"year\", \"month\", \"day\"])\ndate_df[\"year\"] = date_df[\"year\"].map(check_year)\ndate_df[\"month\"] = date_df[\"month\"].astype(int)\ndate_df[\"day\"] = date_df[\"day\"].astype(int)\ndate_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"conversion year data.\n\nit has mistake labels like 'xx'.","metadata":{}},{"cell_type":"code","source":"def check_hhmm(m):\n    if m is None:\n        return -1\n    m = m.lower().replace(\"am\", \"\").replace(\"pm\", \"\")\n    if m in [\"?\", \"??\", \"x\", \"xx\", \".\", \"\", \"night\", \"xx.xx\", \"dawn\", \"xx;xx\"]:\n        return -1\n    return int(m)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"time_df = pd.DataFrame(train_metadata_df[\"time\"].str.split(\":\").tolist(), columns=[\"hour\", \"minute\", \"second\"])\ntime_df[\"hour\"] = time_df[\"hour\"].map(check_hhmm)\ntime_df[\"minute\"] = time_df[\"minute\"].map(check_hhmm)\ntime_df = time_df.drop(\"second\", axis=1)\ntime_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Frequent authors are featured.\n\nInfrequent authors are grouped into -1","metadata":{}},{"cell_type":"code","source":"author_counts = train_metadata_df[\"author\"].value_counts()\nfrequent_author = {v: i for i, v in enumerate(author_counts[author_counts > 100].index)}\nauthor_df = pd.DataFrame(train_metadata_df[\"author\"].map(frequent_author).fillna(-1).values, columns=[\"author_id\"])\nauthor_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"make feature values","metadata":{}},{"cell_type":"code","source":"org_features = [\"latitude\", \"longitude\", \"rating\"]\nfeature_df = pd.concat([train_metadata_df[org_features], date_df, time_df, author_df], axis=1)\nfeature_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features = feature_df.columns.tolist()\nX_train = feature_df.values","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Train by LGBM","metadata":{}},{"cell_type":"code","source":"oof = np.zeros(len(y_train))\nskf = StratifiedKFold(n_splits=5,  shuffle=True, random_state=416)\nfor train_index, valid_index in skf.split(X_train, y_train):\n    \n    dtrain = lgb.Dataset(X_train[train_index, :], label=y_train[train_index])\n    d_eval = lgb.Dataset(X_train[valid_index, :], label=y_train[valid_index])\n    \n    param = {\n        'objective': 'multiclass',\n        'metric': 'multi_logloss',\n        'num_class': n_labels,\n        'verbosity': -1,\n        'boosting_type': 'gbdt',\n    }\n\n    model = lgb.train(param, \n              dtrain,\n              valid_sets=d_eval,\n              early_stopping_rounds=10)\n    pred_y = model.predict(X_train[valid_index, :])\n    oof[valid_index] = pred_y.argmax(1)\n    \noof = oof.astype(int)\nprint(\"---------------------------\")\nscore = f1_score(y_train, oof, average='micro')\nprint(f\"F1 micro = {score:0.4}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}