{"cells":[{"metadata":{},"cell_type":"markdown","source":"Hi every one. I've made you guys a validation split, which considered unseen graphemes.\n\nIt have only 1245 graphemes in training set, while all components are remains. All unseen graphemes are used in every fold while training.\n\nUsing my split, we will have approximately **38k SEEN** samples, and exacly **7578 UNSEEN** samples for validation in each fold.\n\nDownload the file `train_v2.csv` generated by this script and have a try on yourself!\n"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import StratifiedKFold","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train = pd.read_csv('../input/bengaliai-cv19/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.head(2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Map grapheme to id"},{"metadata":{"trusted":true},"cell_type":"code","source":"grapheme2idx = {grapheme: idx for idx, grapheme in enumerate(df_train.grapheme.unique())}\ndf_train['grapheme_id'] = df_train['grapheme'].map(grapheme2idx)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.head(2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# StratifiedKFold On Grapheme"},{"metadata":{"trusted":true},"cell_type":"code","source":"n_fold = 5\nskf = StratifiedKFold(n_fold, random_state=42)\nfor i_fold, (train_idx, val_idx) in enumerate(skf.split(df_train, df_train.grapheme)):\n    df_train.loc[val_idx, 'fold'] = i_fold\ndf_train['fold'] = df_train['fold'].astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.head(2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Add Unseen Flag"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train['unseen'] = 0\ndf_train.loc[df_train.grapheme_id >= 1245, 'unseen'] = 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.unseen.value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.to_csv('train_v2.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Usage Example"},{"metadata":{"trusted":true},"cell_type":"code","source":"n_fold = 5\nfor fold in range(n_fold):\n    train_idx = np.where((df_train['fold'] != fold) & (df_train['unseen'] == 0))[0]\n    valid_idx = np.where((df_train['fold'] == fold) | (df_train['unseen'] != 0))[0]\n\n    df_this_train = df_train.loc[train_idx].reset_index(drop=True)\n    df_this_valid = df_train.loc[valid_idx].reset_index(drop=True)\n    \n    #################################\n    # Do training and validating here\n    #################################\n    \n    break","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Analysis"},{"metadata":{"trusted":true},"cell_type":"code","source":"n_uniq_grapheme = df_this_train.grapheme_id.nunique()\nn_uniq_root = df_this_train.grapheme_root.nunique()\nn_uniq_vowel = df_this_train.vowel_diacritic.nunique()\nn_uniq_diacritic = df_this_train.consonant_diacritic.nunique()\n\nprint(f'We have only {n_uniq_grapheme} grapheme in training data, but all {n_uniq_root} roots, {n_uniq_vowel} vowels, {n_uniq_diacritic} diacritics are remains')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"n_uniq_grapheme = df_this_valid.grapheme_id.nunique()\nn_uniq_root = df_this_valid.grapheme_root.nunique()\nn_uniq_vowel = df_this_valid.vowel_diacritic.nunique()\nn_uniq_diacritic = df_this_valid.consonant_diacritic.nunique()\n\nprint(f'While we have all {n_uniq_grapheme} grapheme in validation, and all {n_uniq_root} roots, {n_uniq_vowel} vowels, {n_uniq_diacritic} diacritics as well')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# We have 7578 unseen samples in validation set, which is approximately 16.4%\ndf_this_valid['unseen'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}