{"cells":[{"metadata":{"papermill":{"duration":0.020302,"end_time":"2020-12-19T22:55:50.42162","exception":false,"start_time":"2020-12-19T22:55:50.401318","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# Library"},{"metadata":{"execution":{"iopub.execute_input":"2020-12-19T22:55:50.469055Z","iopub.status.busy":"2020-12-19T22:55:50.468302Z","iopub.status.idle":"2020-12-19T22:55:51.34599Z","shell.execute_reply":"2020-12-19T22:55:51.345354Z"},"papermill":{"duration":0.904036,"end_time":"2020-12-19T22:55:51.346125","exception":false,"start_time":"2020-12-19T22:55:50.442089","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nfrom tqdm.auto import tqdm\ntqdm.pandas()\nimport Levenshtein\nimport cv2\nfrom PIL import Image\nfrom matplotlib import pyplot as plt\nimport seaborn as sns","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Data Loading"},{"metadata":{"execution":{"iopub.execute_input":"2020-12-19T22:55:51.447944Z","iopub.status.busy":"2020-12-19T22:55:51.44732Z","iopub.status.idle":"2020-12-19T22:55:51.588259Z","shell.execute_reply":"2020-12-19T22:55:51.587686Z"},"papermill":{"duration":0.16734,"end_time":"2020-12-19T22:55:51.588366","exception":false,"start_time":"2020-12-19T22:55:51.421026","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"%%time\n\ntrain = pd.read_csv('../input/bms-molecular-translation/train_labels.csv')\ntest = pd.read_csv('../input/bms-molecular-translation/sample_submission.csv')\n\ndef get_train_file_path(image_id):\n    return \"../input/bms-molecular-translation/train/{}/{}/{}/{}.png\".format(\n        image_id[0], image_id[1], image_id[2], image_id \n    )\n\ndef get_test_file_path(image_id):\n    return \"../input/bms-molecular-translation/test/{}/{}/{}/{}.png\".format(\n        image_id[0], image_id[1], image_id[2], image_id \n    )\n\ntrain['file_path'] = train['image_id'].progress_apply(get_train_file_path)\ntest['file_path'] = test['image_id'].progress_apply(get_test_file_path)\n\nprint(f'train.shape: {train.shape}  test.shape: {test.shape}')\ndisplay(train.head())\ndisplay(test.head())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Quick EDA"},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in range(5):\n    image = cv2.imread(train.loc[i, 'file_path'], cv2.IMREAD_GRAYSCALE)\n    image = 255 - image\n    image = image[:, :, np.newaxis]\n    label = train.loc[i, 'InChI']\n    print(image.shape)\n    plt.imshow(image)\n    plt.title(label)\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Preprocessing"},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\n\ntrain['InChI_list'] = train['InChI'].progress_apply(lambda x: x.split('/'))\ntrain['InChI_length'] = train['InChI_list'].progress_apply(len)\nInChI_df = train['InChI_list'].progress_apply(pd.Series)\ntrain = pd.concat([train, InChI_df.add_prefix('InChI_')], axis=1)\ndisplay(train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.to_pickle('train.pkl')\ntest.to_pickle('test.pkl')","execution_count":null,"outputs":[]},{"metadata":{"papermill":{"duration":0.031387,"end_time":"2020-12-19T22:55:57.645536","exception":false,"start_time":"2020-12-19T22:55:57.614149","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# Scoring function"},{"metadata":{"execution":{"iopub.execute_input":"2020-12-19T22:55:57.723607Z","iopub.status.busy":"2020-12-19T22:55:57.722921Z","iopub.status.idle":"2020-12-19T22:55:57.729789Z","shell.execute_reply":"2020-12-19T22:55:57.729313Z"},"papermill":{"duration":0.05167,"end_time":"2020-12-19T22:55:57.729917","exception":false,"start_time":"2020-12-19T22:55:57.678247","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"def get_score(y_true, y_pred):\n    scores = []\n    for true, pred in zip(y_true, y_pred):\n        score = Levenshtein.distance(true, pred)\n        scores.append(score)\n    avg_score = np.mean(scores)\n    return avg_score","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Naive baseline"},{"metadata":{"trusted":true},"cell_type":"code","source":"# sample submission baseline\ny_true = train['InChI'].values\ny_pred = ['InChI=1S/H2O/h1H2'] * len(train)\nscore = get_score(y_true, y_pred)\nprint(score)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# mode baseline\n\nmode_concat_string = ''\nfor i in range(11):\n    mode_string = train[f'InChI_{i}'].fillna('nan').mode()[0]\n    if mode_string != 'nan':\n        if i == 0:\n            mode_concat_string += mode_string\n        else:\n            mode_concat_string += '/' + mode_string\nprint(mode_concat_string)\n\ny_true = train['InChI'].values\ny_pred = [mode_concat_string] * len(train)\nscore = get_score(y_true, y_pred)\nprint(score)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Submission"},{"metadata":{"trusted":true},"cell_type":"code","source":"test['InChI'] = mode_concat_string\noutput_cols = ['image_id', 'InChI']\ndisplay(test[output_cols])\ntest[output_cols].to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}