{"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 os\nimport shutil\n\nimport IPython\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport seaborn as sns\nfrom tqdm import tqdm_notebook\n# from sklearn.cross_validation import StratifiedKFold\nfrom sklearn.preprocessing import LabelEncoder\nimport librosa\nimport numpy as np\nimport scipy\nimport glob\nfrom tqdm.notebook import tqdm\nfrom sklearn.model_selection import train_test_split\nimport pickle\nfrom scipy.stats import skew, kurtosis\nimport lightgbm as lgb\nimport soundfile as sf\nfrom pydub import AudioSegment\nimport pydub.silence as silence\nfrom pydub.exceptions import CouldntDecodeError\nimport signal\nimport scipy.signal\nfrom sklearn.model_selection import StratifiedKFold \nimport torchvision.models as models\n\n%matplotlib inline\nmatplotlib.style.use('ggplot')\n\n\nfrom torch.utils.data import Dataset, DataLoader, RandomSampler, SequentialSampler, TensorDataset\nimport torch.nn.functional as F\nfrom torch import nn\nimport torch\nfrom sklearn.metrics import accuracy_score, f1_score\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\nimport random\n\nrandom.seed(42)\nnp.random.seed(42)\ntorch.manual_seed(42)\ntorch.cuda.manual_seed(42)\ntorch.backends.cudnn.deterministic = True","metadata":{"execution":{"iopub.status.busy":"2022-06-24T05:13:01.127442Z","iopub.execute_input":"2022-06-24T05:13:01.128215Z","iopub.status.idle":"2022-06-24T05:13:07.831305Z","shell.execute_reply.started":"2022-06-24T05:13:01.128161Z","shell.execute_reply":"2022-06-24T05:13:07.830570Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path_train = '../input/audio-train/train'\nfilepath_train = glob.glob(path_train + \"/*\")\nname_wav = [x.split('/')[-1] for x in filepath_train]\ndf_label = pd.read_csv('../input/label-data/train.csv')\ndf_label.set_index('fname', inplace=True)\ndf_label.loc[name_wav, 'filepath'] = filepath_train\ny_train = df_label.label\nle = LabelEncoder()\ny_train = le.fit_transform(y_train)\nfilepath_train = np.array(df_label.filepath)\n\npath_test = '../input/audiotest/test'\nfilepath_test = glob.glob(path_test + \"/*\")\nname_wav_test = [x.split('/')[-1] for x in filepath_test]\ndf_test = pd.DataFrame({'filepath_test': filepath_test, 'fname': name_wav_test})\ndf_test.set_index('fname', inplace=True)","metadata":{"execution":{"iopub.status.busy":"2022-06-22T08:21:22.581185Z","iopub.execute_input":"2022-06-22T08:21:22.582218Z","iopub.status.idle":"2022-06-22T08:21:23.079398Z","shell.execute_reply.started":"2022-06-22T08:21:22.582168Z","shell.execute_reply":"2022-06-22T08:21:23.078413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Features","metadata":{}},{"cell_type":"markdown","source":"Logmel признаки, сначала с помощью либросы убирается тишина из файла, затем рандомно выбирается участок блинной 2.5 с, если вавка меньше, то она увеличивается сама собой до 2.5\n\n","metadata":{}},{"cell_type":"code","source":"class LogMelExtractor():\n    def __init__(self, sample_rate, window_size=2048, overlap=1024, mel_bins=64):\n        \n        self.window_size = window_size\n        self.overlap = overlap\n        self.ham_win = np.hamming(window_size)\n        self.sr = sample_rate\n        self.melW = librosa.filters.mel(sr=sample_rate, \n                                        n_fft=window_size, \n                                        n_mels=mel_bins, \n                                        fmin=50., \n                                        fmax=sample_rate // 2).T\n    \n    def transform(self, audio):\n    \n        ham_win = self.ham_win\n        window_size = self.window_size\n        overlap = self.overlap\n    \n        [f, t, x] = scipy.signal.spectrogram(\n                        audio, \n                        window=ham_win,\n                        nperseg=window_size, \n                        noverlap=overlap, \n                        detrend=False, \n                        return_onesided=True, \n                        mode='magnitude') \n        x = x.T\n            \n        x = np.dot(x, self.melW)\n        x = np.log(x + 1e-8)\n#         x = librosa.pcen(x, self.sr)\n        x = x.astype(np.float32)\n        \n        return x\n    \n    \ndef compute_logmel_features(filepath, max_duration=2.5):\n    features = []\n    for x in tqdm(filepath):\n        wav, sr = sf.read(x)\n        max_length = int(max_duration * sr)\n        wav = wav / np.max(np.abs(wav))\n        length = len(wav)\n         # Trim silence from ends\n        wav, _ = librosa.effects.trim(wav, top_db=40)\n        length_int = len(wav)\n        ratio_int = length_int/length\n\n        # Split file into non-silent chunks and recombine\n        splits = librosa.effects.split(wav, top_db=40)\n        if len(splits) > 1:\n            wav = np.concatenate([wav[x[0]:x[1]] for x in splits])      \n#           Random offset / Padding\n        if len(wav) > max_length:\n            max_offset = len(wav) - max_length\n            offset = np.random.randint(max_offset)\n            wav = wav[offset:(max_length+offset)]\n        else:\n            if max_length > len(wav):\n                max_offset = max_length - len(wav)\n                offset = np.random.randint(max_offset)\n            else:\n                offset = 0\n            wav = np.pad(wav, (offset, max_length - len(wav) - offset), \"constant\")\n        extractor = LogMelExtractor(sample_rate=sr)\n        feature = extractor.transform(wav)\n        features.append(feature)\n    return np.array(features)","metadata":{"execution":{"iopub.status.busy":"2022-05-10T17:13:51.313091Z","iopub.execute_input":"2022-05-10T17:13:51.313488Z","iopub.status.idle":"2022-05-10T17:13:51.333386Z","shell.execute_reply.started":"2022-05-10T17:13:51.313448Z","shell.execute_reply":"2022-05-10T17:13:51.332107Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features_train = compute_logmel_features(filepath_train)\nfeatures_test = compute_logmel_features(filepath_test)","metadata":{"execution":{"iopub.status.busy":"2022-05-10T17:13:57.22821Z","iopub.execute_input":"2022-05-10T17:13:57.229637Z","iopub.status.idle":"2022-05-10T17:19:15.727334Z","shell.execute_reply.started":"2022-05-10T17:13:57.229553Z","shell.execute_reply":"2022-05-10T17:19:15.725953Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open(f'features_logmel_train_comp_kaggle_pcen.pkl', 'wb') as f:\n    pickle.dump(features_train, f)\nwith open(f'features_logmel_test_comp_kaggle_pcen.pkl', 'wb') as f:\n    pickle.dump(features_test, f)","metadata":{"execution":{"iopub.status.busy":"2022-05-10T17:26:17.258671Z","iopub.execute_input":"2022-05-10T17:26:17.259277Z","iopub.status.idle":"2022-05-10T17:26:17.54741Z","shell.execute_reply.started":"2022-05-10T17:26:17.259219Z","shell.execute_reply":"2022-05-10T17:26:17.546374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"MFCC признаки, сначала с помощью либросы убирается тишина из файла, затем рандомно выбирается участок блинной 2.5 с, если вавка меньше, то она увеличивается сама собой до 2.5","metadata":{}},{"cell_type":"code","source":"def compute_mfcc(filepath, max_duration=2.5, n_mfcc=40):\n    features = []\n    for x in tqdm(filepath):\n        wav, sr = sf.read(x)\n        max_length = int(max_duration * sr)\n        length = len(wav)\n         # Trim silence from ends\n        wav, _ = librosa.effects.trim(wav, top_db=40)\n        length_int = len(wav)\n        ratio_int = length_int/length\n\n        # Split file into non-silent chunks and recombine\n        splits = librosa.effects.split(wav, top_db=40)\n        if len(splits) > 1:\n            wav = np.concatenate([wav[x[0]:x[1]] for x in splits])      \n                        # Random offset / Padding\n        if len(wav) > max_length:\n            max_offset = len(wav) - max_length\n            offset = np.random.randint(max_offset)\n            wav = wav[offset:(max_length+offset)]\n        else:\n            if max_length > len(wav):\n                max_offset = max_length - len(wav)\n                offset = np.random.randint(max_offset)\n            else:\n                offset = 0\n            wav = np.pad(wav, (offset, max_length - len(wav) - offset), \"constant\")\n        data = librosa.feature.mfcc(wav, sr=sr,n_mfcc=n_mfcc)\n        features.append(data)\n    return np.array(features)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Models","metadata":{}},{"cell_type":"code","source":"class CustomModel(nn.Module):\n    \n    def __init__(self):\n        super().__init__()\n#         self.ms = torchaudio.transforms.MelSpectrogram(sample_rate)\n#         self.bn1 = nn.BatchNorm2d(1)\n        #[batch, 1, 40, 173]\n        self.conv1 = nn.Conv2d(1, 32, (4,10), padding='same') #[batch, 32, 40, 173]\n        self.bn1 = nn.BatchNorm2d(32)\n        self.mp1 = nn.MaxPool2d((2, 2))  #[batch, 32, 20, 86]\n        \n        self.conv2 = nn.Conv2d(32, 32, (4,10), padding='same')\n        self.bn2 = nn.BatchNorm2d(32)\n        self.mp2 = nn.MaxPool2d((2, 2))\n        \n        self.conv3 = nn.Conv2d(32, 32, (4,10), padding='same')\n        self.bn3 = nn.BatchNorm2d(32)\n        self.mp3 = nn.MaxPool2d((2, 2))\n        \n        self.conv4 = nn.Conv2d(32, 32, (4,10), padding='same')\n        self.bn4 = nn.BatchNorm2d(32)\n        self.mp4 = nn.MaxPool2d((2, 2))\n                    \n        self.linear1 = nn.Linear(2560, 256)\n        self.bn5 = nn.BatchNorm1d(256)\n        \n        self.linear2 = nn.Linear(256, 41)\n        \n        self.relu = nn.LeakyReLU()\n        \n        \n    def forward(self, x):\n#         x = self.ms(x)\n#         x = self.bn1(x)\n \n                \n        x = self.mp1(self.relu(self.bn1(self.conv1(x))))\n        x = self.mp2(self.relu(self.bn2(self.conv2(x))))\n        x = self.mp3(self.relu(self.bn3(self.conv3(x))))\n        x = self.mp4(self.relu(self.bn4(self.conv4(x))))\n        \n        x = torch.flatten(x, start_dim=1)\n\n        \n        x = self.relu(self.bn5(self.linear1(x)))\n        \n        x = self.linear2(x)\n        \n#         x = self.features(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2022-05-12T17:32:28.554473Z","iopub.execute_input":"2022-05-12T17:32:28.555254Z","iopub.status.idle":"2022-05-12T17:32:28.5678Z","shell.execute_reply.started":"2022-05-12T17:32:28.555204Z","shell.execute_reply":"2022-05-12T17:32:28.566958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## VGGish","metadata":{}},{"cell_type":"markdown","source":"https://github.com/tensorflow/models/tree/master/research/audioset\n\nhttps://github.com/qiuqiangkong/dcase2018_task2/blob/master/pytorch/models_pytorch.py - vggish torch","metadata":{}},{"cell_type":"code","source":"class VggishConvBlock(nn.Module):\n    def __init__(self, in_channels, out_channels):\n        \n        super(VggishConvBlock, self).__init__()\n        \n        self.conv1 = nn.Conv2d(in_channels=in_channels, \n                              out_channels=out_channels,\n                              kernel_size=(3, 3), stride=(1, 1),\n                              padding=(1, 1), bias=False)\n                              \n        self.conv2 = nn.Conv2d(in_channels=out_channels, \n                              out_channels=out_channels,\n                              kernel_size=(3, 3), stride=(1, 1),\n                              padding=(1, 1), bias=False)\n                              \n        self.bn1 = nn.BatchNorm2d(out_channels)\n        \n        self.bn2 = nn.BatchNorm2d(out_channels)\n        \n        \n    def forward(self, input):\n        \n        x = input\n        x = F.relu(self.bn1(self.conv1(x)))\n        x = F.relu(self.bn2(self.conv2(x)))\n        x = F.max_pool2d(x, kernel_size=(2, 2), stride=(2, 2))\n        \n        return x\n    \n    \nclass Vggish(nn.Module):\n    def __init__(self, classes_num=41):\n        \n        super(Vggish, self).__init__()\n\n        self.conv_block1 = VggishConvBlock(in_channels=1, out_channels=64)\n        self.conv_block2 = VggishConvBlock(in_channels=64, out_channels=128)\n        self.conv_block3 = VggishConvBlock(in_channels=128, out_channels=256)\n        self.conv_block4 = VggishConvBlock(in_channels=256, out_channels=512)\n\n        self.fc_final = nn.Linear(512, classes_num, bias=True)\n\n\n    def forward(self, x, return_bottleneck=False):\n        (_, seq_len, mel_bins) = x.shape\n        \n\n        x = x.view(-1, 1, seq_len, mel_bins)\n        '''(samples_num, feature_maps, time_steps, freq_num)'''\n\n        x = self.conv_block1(x)\n        x = self.conv_block2(x)\n        x = self.conv_block3(x)\n        x = self.conv_block4(x)\n\n        x = F.max_pool2d(x, kernel_size=x.shape[2:])\n        x = x.view(x.shape[0:2])\n        x = self.fc_final(x)\n\n#         x = F.log_softmax(self.fc_final(x), dim=-1)\n\n        return x","metadata":{"execution":{"iopub.status.busy":"2022-06-01T18:58:54.825173Z","iopub.execute_input":"2022-06-01T18:58:54.825429Z","iopub.status.idle":"2022-06-01T18:58:54.839217Z","shell.execute_reply.started":"2022-06-01T18:58:54.825402Z","shell.execute_reply":"2022-06-01T18:58:54.838529Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pip install efficientnet_pytorch","metadata":{"execution":{"iopub.status.busy":"2022-05-12T12:50:11.549392Z","iopub.execute_input":"2022-05-12T12:50:11.550102Z","iopub.status.idle":"2022-05-12T12:50:11.554005Z","shell.execute_reply.started":"2022-05-12T12:50:11.550064Z","shell.execute_reply":"2022-05-12T12:50:11.553241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from efficientnet_pytorch import EfficientNet","metadata":{"execution":{"iopub.status.busy":"2022-05-12T12:50:09.297063Z","iopub.execute_input":"2022-05-12T12:50:09.297347Z","iopub.status.idle":"2022-05-12T12:50:09.301262Z","shell.execute_reply.started":"2022-05-12T12:50:09.297317Z","shell.execute_reply":"2022-05-12T12:50:09.300384Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip install resnet_pytorch","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:02:33.7612Z","iopub.execute_input":"2022-05-12T20:02:33.761446Z","iopub.status.idle":"2022-05-12T20:02:45.023467Z","shell.execute_reply.started":"2022-05-12T20:02:33.761418Z","shell.execute_reply":"2022-05-12T20:02:45.022599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from resnet_pytorch import ResNet ","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:02:45.025962Z","iopub.execute_input":"2022-05-12T20:02:45.026283Z","iopub.status.idle":"2022-05-12T20:02:45.036474Z","shell.execute_reply.started":"2022-05-12T20:02:45.026241Z","shell.execute_reply":"2022-05-12T20:02:45.035742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomModel3(nn.Module):\n    \n    def __init__(self, out_features=1000, n_classes=41):\n        super().__init__()\n#         self.ms = torchaudio.transforms.MelSpectrogram(sample_rate)\n#         self.bn1 = nn.BatchNorm2d(1)\n\n        \n        self.conv1 = nn.Conv2d(in_channels=1, out_channels=10, kernel_size=1, padding='same')\n        self.conv2 = nn.Conv2d(in_channels=10, out_channels=3, kernel_size=1, padding='same')\n        \n#         self.model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18')\n#         self.resnet = torch.nn.Sequential(*(list(self.model.children())[:-1]))\n#         self.model = EfficientNet.from_pretrained('efficientnet-b0')\n        self.model = ResNet.from_pretrained('resnet18', num_classes=1000)\n        \n        \n        self.linear1 = nn.Linear(1000, 512)\n        self.dropout1 = nn.Dropout(0.5)\n        self.bn1 = nn.BatchNorm1d(512)\n        self.linear2 = nn.Linear(512, 256)\n        self.dropout2 = nn.Dropout(0.5)\n        self.bn2 = nn.BatchNorm1d(256)\n        self.linear3 = nn.Linear(256, 41)\n        self.bn3 = nn.BatchNorm1d(41)\n        \n        self.relu = nn.ReLU()\n        \n    def forward(self, x):\n\n                \n        x = self.relu(self.conv1(x))\n        x = self.relu(self.conv2(x))\n        \n        x = self.model(x)\n#         x = torch.flatten(x, 1)\n#         x = self.model(x)\n#        print(x.shape)\n        x = self.bn1(self.relu(self.linear1(x)))\n        x = self.dropout1(x)\n        x = self.bn2(self.relu(self.linear2(x)))\n        x = self.dropout2(x)\n        x = self.linear3(x)\n\n       \n        return x\n    \n","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:02:15.041674Z","iopub.execute_input":"2022-05-12T20:02:15.042451Z","iopub.status.idle":"2022-05-12T20:02:15.054465Z","shell.execute_reply.started":"2022-05-12T20:02:15.042402Z","shell.execute_reply":"2022-05-12T20:02:15.053477Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train","metadata":{}},{"cell_type":"code","source":"def learning_curves(train, val, txt='loss'):\n    plt.figure(figsize=(8,6))\n    plt.plot(range(1, len(train)+1), train, label='train {}'.format(txt))\n    plt.plot(range(1, len(val)+1), val, label='validation {}'.format(txt))\n    plt.title('Training history', fontsize=14)\n    plt.ylabel('{}'.format(txt), fontsize=14)\n    plt.xlabel('Epoch', fontsize=14)\n    plt.legend(fontsize=14)\n    plt.tick_params(axis='both', which='major', labelsize=14)\n    plt.grid()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-06-22T08:21:35.954859Z","iopub.execute_input":"2022-06-22T08:21:35.95525Z","iopub.status.idle":"2022-06-22T08:21:35.963995Z","shell.execute_reply.started":"2022-06-22T08:21:35.955218Z","shell.execute_reply":"2022-06-22T08:21:35.962598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(train_dataloader, val_dataloader, model, optimizer, loss_fn, epoch, model_idx, scheduler):\n    losses_train = []\n    losses_val = []\n    accuracy_train = []\n    accuracy_val = []\n    EER_train = []\n    EER_val = []\n    loss_best = 1.2\n    acc_best = 0.69\n    for i in range(epoch):\n        loss_train = []\n        acc_train = []\n        eer_train = []\n        eer_val = []\n        loss_val = []\n        acc_val = []\n        m = nn.Softmax(dim=1)\n        model.train()\n        for d in tqdm(train_dataloader):\n            optimizer.zero_grad()\n            X = d[0].float().to(device)\n#             X = d[0].float().to(device)\n            y = d[1].to(device)\n            predict = model(X)\n            logits = m(predict).detach().cpu().numpy().argmax(axis=-1).flatten().tolist()\n            predict_logsoftmax = F.log_softmax(predict, dim=-1)\n            loss = loss_fn(predict_logsoftmax, y)\n#             loss = loss_fn(predict, y)\n            loss_train.append(loss.item())\n            acc_train.append(accuracy_score(logits, y.cpu().numpy()))\n            loss.backward()\n            torch.nn.utils.clip_grad_norm_(model.parameters(), 1)\n            optimizer.step()\n#             scheduler.step(loss) \n            \n        if i % 1 == 0:\n            model.eval()\n            with torch.no_grad():\n                optimizer.zero_grad()\n                for d_v in tqdm(val_dataloader):\n                    X_val = d_v[0].float().to(device)\n#                     X_val = d_v[0].float().to(device)\n                    y_val = d_v[1].to(device)\n                    predict_val = model(X_val)\n                    redict_logsoftmax = F.log_softmax(predict_val, dim=-1)\n                    loss_v = loss_fn(redict_logsoftmax, y_val)\n#                     loss_v = loss_fn(predict_val, y)\n                    logits_val = m(predict_val).detach().cpu().numpy().argmax(axis=-1).flatten().tolist()\n                    loss_val.append(loss_v.item())\n                    acc_val.append(accuracy_score(logits_val, y_val.cpu().numpy()))\n\n\n            print('')\n            print('---Train---')\n            print('Epoch: {}, Accuracy: {}, Loss: {}'.format(i, np.mean(acc_train), np.mean(loss_train)))\n            print('---Validation---')\n            print('Epoch: {}, Accuracy: {}, Loss: {}'.format(i, np.mean(acc_val), np.mean(loss_val)))\n            print('')\n#             torch.save(model.state_dict(), f\"model_Vggish_{i}ep.pkl\")\n        losses_train.append(np.mean(loss_train))\n        losses_val.append(np.mean(loss_val))\n        accuracy_train.append(np.mean(acc_train))\n        accuracy_val.append(np.mean(acc_val))\n        if loss_best > np.mean(loss_val):\n            torch.save(model.state_dict(), f'best_model_vggish2_{model_idx}_{i}ep_{round(np.mean(loss_val), 4)}loss')\n            loss_best = np.mean(loss_val)\n        if acc_best < np.mean(acc_val):\n            torch.save(model.state_dict(), f'best_model_vggish2_{model_idx}_{i}ep_{round(np.mean(acc_val), 4)}acc')\n            acc_best = np.mean(acc_val)\n    return {'losses_train': losses_train,\n           'losses_val': losses_val,\n           'accuracy_train': accuracy_train,\n           'accuracy_val': accuracy_val\n            }","metadata":{"execution":{"iopub.status.busy":"2022-06-01T19:38:00.822592Z","iopub.execute_input":"2022-06-01T19:38:00.822845Z","iopub.status.idle":"2022-06-01T19:38:00.844065Z","shell.execute_reply.started":"2022-06-01T19:38:00.822815Z","shell.execute_reply":"2022-06-01T19:38:00.842993Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('../input/features-logmel-db/features_logmel_train_comp_kaggle_db_2s.pkl', 'rb') as f:\n    X_train = pickle.load(f)\nwith open('../input/features-logmel-db/features_logmel_test_comp_kaggle_db_2s.pkl', 'rb') as f:\n    X_test = pickle.load(f)\n    \n# with open('', 'rb') as f:\n#     X_val = pickle.load(f)","metadata":{"execution":{"iopub.status.busy":"2022-06-01T19:31:07.383069Z","iopub.execute_input":"2022-06-01T19:31:07.383325Z","iopub.status.idle":"2022-06-01T19:31:19.727633Z","shell.execute_reply.started":"2022-06-01T19:31:07.383296Z","shell.execute_reply":"2022-06-01T19:31:19.726831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('../input/features-train/features_logmel_train_comp_kaggle.pkl', 'rb') as f:\n    X_train = pickle.load(f)\nwith open('../input/featurestest/features_logmel_test_comp_kaggle.pkl', 'rb') as f:\n    X_test = pickle.load(f)","metadata":{"execution":{"iopub.status.busy":"2022-06-01T18:59:24.155845Z","iopub.execute_input":"2022-06-01T18:59:24.156423Z","iopub.status.idle":"2022-06-01T18:59:26.080857Z","shell.execute_reply.started":"2022-06-01T18:59:24.156383Z","shell.execute_reply":"2022-06-01T18:59:26.080095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.optim.lr_scheduler import ChainedScheduler\nfrom torch.optim.lr_scheduler import ConstantLR,ExponentialLR\n\nscheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min',\nfactor=0.1, patience=10, threshold=0.0001, threshold_mode='abs')","metadata":{"execution":{"iopub.status.busy":"2022-06-01T18:51:47.445464Z","iopub.execute_input":"2022-06-01T18:51:47.446059Z","iopub.status.idle":"2022-06-01T18:51:47.449764Z","shell.execute_reply.started":"2022-06-01T18:51:47.446023Z","shell.execute_reply":"2022-06-01T18:51:47.448647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import math\n\ndef cyclical_lr(stepsize, min_lr=3e-4, max_lr=3e-3):\n\n    # Scaler: we can adapt this if we do not want the triangular CLR\n    scaler = lambda x: 1.\n\n    # Lambda function to calculate the LR\n    lr_lambda = lambda it: min_lr + (max_lr - min_lr) * relative(it, stepsize)\n\n    # Additional function to see where on the cycle we are\n    def relative(it, stepsize):\n        cycle = math.floor(1 + it / (2 * stepsize))\n        x = abs(it / stepsize - 2 * cycle + 1)\n        return max(0, (1 - x)) * scaler(cycle)\n\n    return lr_lambda","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:06:52.347994Z","iopub.execute_input":"2022-05-12T20:06:52.348252Z","iopub.status.idle":"2022-05-12T20:06:52.354205Z","shell.execute_reply.started":"2022-05-12T20:06:52.348223Z","shell.execute_reply":"2022-05-12T20:06:52.353425Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# KFolds","metadata":{}},{"cell_type":"code","source":"device = 'cuda' if torch.cuda.is_available() else 'cpu'\nskf = StratifiedKFold(n_splits=2, shuffle=True, random_state=42)\nidx = 1\nhistory = []\nmodels = []\nfor train_index, test_index in skf.split(np.array(X_train), np.array(y_train)):\n    X_train_, X_val_ = np.array(X_train)[train_index], np.array(X_train)[test_index]\n    y_train_, y_val_ = np.array(y_train)[train_index], np.array(y_train)[test_index]\n    train_dataset = TensorDataset(torch.Tensor(X_train_), torch.tensor(y_train_, dtype=torch.long))\n    val_dataset = TensorDataset(torch.Tensor(X_val_), torch.tensor(y_val_, dtype=torch.long))\n\n    batch_size = 128\n    train_dataloader = DataLoader(train_dataset,\n                              sampler=RandomSampler(train_dataset),\n                              batch_size=batch_size,\n                              drop_last=True\n                              )\n    val_dataloader = DataLoader(val_dataset,\n                            sampler=SequentialSampler(val_dataset),\n                            batch_size=batch_size,\n                           drop_last=True)\n    print(f'model: {idx}')\n    model = Vggish().to(device)\n    loss_fn = nn.NLLLoss()\n#     loss_fn = nn.CrossEntropyLoss()\n#     optimizer = torch.optim.Adam(model.parameters(), lr=1., betas=(0.9, 0.999), \n#                                eps=1e-08, weight_decay=0.)\n# 1e-3\n#     optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3)\n    optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)\n    lambda1 = lambda epoch: 0.65 ** epoch\n#     scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min',\n    factor=0.1, patience=10, threshold=0.0001, threshold_mode='abs')\n#     step_size = 4*len(train_dataloader)\n#     clr = cyclical_lr(step_size)\n#     scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, [clr])\n    epoch = 30\n    dct_history = train(train_dataloader, val_dataloader, model, optimizer, loss_fn, epoch, idx, scheduler)\n    history.append(dct_history)\n    models.append(model)\n#     torch.save(model.state_dict(), f'model{idx}_{epoch}ep_best.pkl')\n#     with open(f'dct_history_model{idx}.pkl', 'wb') as f:\n#         pickle.dump(dct_history, f)\n    idx += 1","metadata":{"execution":{"iopub.status.busy":"2022-06-01T19:38:04.341871Z","iopub.execute_input":"2022-06-01T19:38:04.342431Z","iopub.status.idle":"2022-06-01T19:47:34.757929Z","shell.execute_reply.started":"2022-06-01T19:38:04.342392Z","shell.execute_reply":"2022-06-01T19:47:34.756806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import copy\ndef mergeDict(dict1, dict2):\n    dct_e = copy.deepcopy(dict1)\n    for k, v in dict2.items():\n        dct_e[k].extend(v)\n    return dct_e","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for x in history:\n    learning_curves(x['losses_train'], x['losses_val'], txt='loss')","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:09:00.671737Z","iopub.execute_input":"2022-05-12T20:09:00.672553Z","iopub.status.idle":"2022-05-12T20:09:00.885532Z","shell.execute_reply.started":"2022-05-12T20:09:00.672507Z","shell.execute_reply":"2022-05-12T20:09:00.884861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for x in history:\n    learning_curves(x['accuracy_train'], x['accuracy_val'], txt='Accuracy')","metadata":{"execution":{"iopub.status.busy":"2022-05-12T19:34:28.312386Z","iopub.execute_input":"2022-05-12T19:34:28.313006Z","iopub.status.idle":"2022-05-12T19:34:28.937843Z","shell.execute_reply.started":"2022-05-12T19:34:28.312968Z","shell.execute_reply":"2022-05-12T19:34:28.937133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(test_dataloader, model, criterion):\n    loss_test = []\n    y_test = []\n    y_predict = []\n    acc_test = []\n    m = nn.Softmax(dim=1)\n    model.eval()\n    probs = []\n    with torch.no_grad():\n        optimizer.zero_grad()\n        for d_t in tqdm(test_dataloader):\n            X_t = d_t[0].float().unsqueeze(1).to(device)\n            y_t = d_t[1].to(device)\n            predict_t = model(X_t)\n            redict_logsoftmax = F.log_softmax(predict_t, dim=-1)\n            loss_t = criterion(redict_logsoftmax, y_t)\n            logits_t = m(predict_t).detach().cpu().numpy().argmax(axis=-1).flatten().tolist()\n            loss_test.append(loss_t.item())\n            acc_test.append(accuracy_score(logits_t, y_t.cpu().numpy()))\n            y_test.extend(y_t.cpu().numpy())\n            y_predict.extend(logits_t)\n            probs.extend(m(predict_t).detach().cpu().numpy())\n    print('---testing---')\n    print('Accuracy: {}, F1: {}, Loss: {}'.format(np.mean(acc_test), f1_score(y_test, y_predict, average='macro'), np.mean(loss_test)))\n    return y_test, y_predict, np.array(probs)","metadata":{"execution":{"iopub.status.busy":"2022-05-12T16:44:28.10287Z","iopub.execute_input":"2022-05-12T16:44:28.103161Z","iopub.status.idle":"2022-05-12T16:44:28.113224Z","shell.execute_reply.started":"2022-05-12T16:44:28.10313Z","shell.execute_reply":"2022-05-12T16:44:28.112518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('../input/features-test/features_mfcc_test.pkl', 'rb') as f:\n    X_val = pickle.load(f)","metadata":{"execution":{"iopub.status.busy":"2022-05-05T17:01:24.697893Z","iopub.execute_input":"2022-05-05T17:01:24.698647Z","iopub.status.idle":"2022-05-05T17:01:25.045633Z","shell.execute_reply.started":"2022-05-05T17:01:24.6986Z","shell.execute_reply":"2022-05-05T17:01:25.044808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_dataset = TensorDataset(torch.Tensor(X_val), torch.tensor(y_val, dtype=torch.long))\n# val_dataset = TensorDataset(torch.Tensor(X_val))\n\nbatch_size = 128\n\nval_dataloader = DataLoader(val_dataset,\n                            sampler=SequentialSampler(val_dataset),\n                            batch_size=batch_size)","metadata":{"execution":{"iopub.status.busy":"2022-05-10T15:19:49.78188Z","iopub.execute_input":"2022-05-10T15:19:49.782474Z","iopub.status.idle":"2022-05-10T15:19:50.015394Z","shell.execute_reply.started":"2022-05-10T15:19:49.782434Z","shell.execute_reply":"2022-05-10T15:19:50.014212Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_test_1, y_predict_1, score_1 = predict(val_dataloader, models[0], loss_fn)\ny_test_2, y_predict_2, score_2 = predict(val_dataloader, models[1], loss_fn)\ny_test_3, y_predict_3, score_3 = predict(val_dataloader, models[2], loss_fn)\ny_test_4, y_predict_4, score_4 = predict(val_dataloader, models[3], loss_fn)\ny_test_5, y_predict_5, score_5 = predict(val_dataloader, models[4], loss_fn)","metadata":{"execution":{"iopub.status.busy":"2022-05-05T17:01:27.640647Z","iopub.execute_input":"2022-05-05T17:01:27.641473Z","iopub.status.idle":"2022-05-05T17:01:32.059917Z","shell.execute_reply.started":"2022-05-05T17:01:27.641408Z","shell.execute_reply":"2022-05-05T17:01:32.05919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"w = 1/5\nscore = w * score_1 + w * score_2 + w * score_3 + w * score_4 + w * score_5\ny_test = score.argmax(axis=-1).flatten().tolist()","metadata":{"execution":{"iopub.status.busy":"2022-05-05T17:01:45.000895Z","iopub.execute_input":"2022-05-05T17:01:45.00115Z","iopub.status.idle":"2022-05-05T17:01:45.006513Z","shell.execute_reply.started":"2022-05-05T17:01:45.00112Z","shell.execute_reply":"2022-05-05T17:01:45.005603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import classification_report\nfrom sklearn.metrics import f1_score\nf1_score(y_val, y_test, average='macro')","metadata":{"execution":{"iopub.status.busy":"2022-05-05T17:01:47.097144Z","iopub.execute_input":"2022-05-05T17:01:47.09769Z","iopub.status.idle":"2022-05-05T17:01:47.111662Z","shell.execute_reply.started":"2022-05-05T17:01:47.097653Z","shell.execute_reply":"2022-05-05T17:01:47.110893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"accuracy_score(y_val, y_test)","metadata":{"execution":{"iopub.status.busy":"2022-05-05T16:34:22.794878Z","iopub.execute_input":"2022-05-05T16:34:22.795133Z","iopub.status.idle":"2022-05-05T16:34:22.805218Z","shell.execute_reply.started":"2022-05-05T16:34:22.795105Z","shell.execute_reply":"2022-05-05T16:34:22.804295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.DataFrame(score)\ndf['y'] = y_val\ndf['predict'] = y_predict_1\ndf['name'] = names\ndf.set_index('name', inplace=True)","metadata":{"execution":{"iopub.status.busy":"2022-05-05T14:04:12.645645Z","iopub.execute_input":"2022-05-05T14:04:12.645969Z","iopub.status.idle":"2022-05-05T14:04:12.706003Z","shell.execute_reply.started":"2022-05-05T14:04:12.645921Z","shell.execute_reply":"2022-05-05T14:04:12.705042Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# classes = np.arange(0, 41)\n# classes_score = []\n# for elem in classes:\n#     df.loc['2c0e354c.wav'][elem]\n#     classes_score.append((df.loc['2c0e354c.wav'][elem].max()))\n# print(np.array(classes_score).argmax(axis=-1).flatten().tolist()[0])","metadata":{"execution":{"iopub.status.busy":"2022-05-05T14:14:35.354438Z","iopub.execute_input":"2022-05-05T14:14:35.354999Z","iopub.status.idle":"2022-05-05T14:14:35.415246Z","shell.execute_reply.started":"2022-05-05T14:14:35.354962Z","shell.execute_reply":"2022-05-05T14:14:35.414005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes = np.arange(0, 41)\nfor name in tqdm(df.index):\n    x = df.loc[name].y\n    if type(x) != np.float64:\n        classes_score = []\n        for elem in classes:\n            classes_score.append((df.loc[name][elem].max()))\n        df.loc[name, 'predict'] = np.array(classes_score).argmax(axis=-1).flatten().tolist()[0]","metadata":{"execution":{"iopub.status.busy":"2022-05-05T14:22:45.227766Z","iopub.execute_input":"2022-05-05T14:22:45.228079Z","iopub.status.idle":"2022-05-05T14:23:36.398882Z","shell.execute_reply.started":"2022-05-05T14:22:45.228048Z","shell.execute_reply":"2022-05-05T14:23:36.398011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"f1_score(y_val, df.predict, average='macro')","metadata":{"execution":{"iopub.status.busy":"2022-05-05T14:24:26.514779Z","iopub.execute_input":"2022-05-05T14:24:26.515171Z","iopub.status.idle":"2022-05-05T14:24:26.532323Z","shell.execute_reply.started":"2022-05-05T14:24:26.515113Z","shell.execute_reply":"2022-05-05T14:24:26.530971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"accuracy_score(y_val, df.predict)","metadata":{"execution":{"iopub.status.busy":"2022-05-05T14:24:29.156356Z","iopub.execute_input":"2022-05-05T14:24:29.157166Z","iopub.status.idle":"2022-05-05T14:24:29.168223Z","shell.execute_reply.started":"2022-05-05T14:24:29.157104Z","shell.execute_reply":"2022-05-05T14:24:29.167055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# with open('../input/featurestestcompkaggle/features_mfcc_test_comp_kaggle.pkl', 'rb') as f:\n#     X_val = pickle.load(f)\n    \ntest_dataset = TensorDataset(torch.Tensor(X_test))\n\nbatch_size = 128\n\ntest_dataloader = DataLoader(test_dataset,\n                            sampler=SequentialSampler(test_dataset),\n                            batch_size=batch_size)","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:03:17.182242Z","iopub.execute_input":"2022-05-12T20:03:17.182776Z","iopub.status.idle":"2022-05-12T20:03:17.18775Z","shell.execute_reply.started":"2022-05-12T20:03:17.182737Z","shell.execute_reply":"2022-05-12T20:03:17.18702Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict_test(test_dataloader, model, sq=False):\n    loss_test = []\n    y_predict = []\n    logit = []\n    acc_test = []\n    m = nn.Softmax(dim=1)\n    model.eval()\n    probs = []\n    with torch.no_grad():\n        optimizer.zero_grad()\n        for d_t in tqdm(test_dataloader):\n            if sq:\n                 X_t = d_t[0].float().unsqueeze(1).to(device)\n            else:\n                X_t = d_t[0].float().to(device)\n            predict_t = model(X_t)\n            logit.extend(predict_t.cpu().numpy())\n            redict_logsoftmax = F.log_softmax(predict_t, dim=-1)\n            logits_t = m(predict_t).detach().cpu().numpy().argmax(axis=-1).flatten().tolist() \n            y_predict.extend(logits_t)\n            probs.extend(m(predict_t).detach().cpu().numpy())  \n    return y_predict, np.array(probs), np.array(logit)","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:03:07.993612Z","iopub.execute_input":"2022-05-12T20:03:07.993888Z","iopub.status.idle":"2022-05-12T20:03:08.002664Z","shell.execute_reply.started":"2022-05-12T20:03:07.993857Z","shell.execute_reply":"2022-05-12T20:03:08.001975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### fuse vggish + resnet","metadata":{}},{"cell_type":"code","source":"path_vggish = glob.glob('../input/best-vggish/*')\nmodels_vggish = []\nfor x in path_vggish:\n    model1 = Vggish().to(device)\n    model1.load_state_dict(torch.load(x))\n    models_vggish.append(model1)\n    \npath_resnet = glob.glob('../input/resnet/*')\nmodels_resnet = []\nfor x in path_resnet:\n    model = CustomModel3().to(device)\n    model.load_state_dict(torch.load(x))\n    models_resnet.append(model)","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:17:04.862013Z","iopub.execute_input":"2022-05-12T20:17:04.862288Z","iopub.status.idle":"2022-05-12T20:17:06.971592Z","shell.execute_reply.started":"2022-05-12T20:17:04.86226Z","shell.execute_reply":"2022-05-12T20:17:06.970853Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_predict1, score1, logit1 = predict_test(test_dataloader, models_vggish[0])\ny_predict2, score2, logit2 = predict_test(test_dataloader, models_vggish[1])\ny_predict3, score3, logit3 = predict_test(test_dataloader, models_vggish[2])\ny_predict4, score4, logit4 = predict_test(test_dataloader, models_vggish[3])\ny_predict5, score5, logit5 = predict_test(test_dataloader, models_vggish[4])","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:17:09.977364Z","iopub.execute_input":"2022-05-12T20:17:09.977688Z","iopub.status.idle":"2022-05-12T20:17:16.643233Z","shell.execute_reply.started":"2022-05-12T20:17:09.977646Z","shell.execute_reply":"2022-05-12T20:17:16.642592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_predict1_r, score1_r, logit1_r = predict_test(test_dataloader, models_resnet[0], True)\ny_predict2_r, score2_r, logit2_r = predict_test(test_dataloader, models_resnet[1], True)\ny_predict3_r, score3_r, logit3_r = predict_test(test_dataloader, models_resnet[2], True)\ny_predict4_r, score4_r, logit4_r = predict_test(test_dataloader, models_resnet[3], True)\ny_predict5_r, score5_r, logit5_r = predict_test(test_dataloader, models_resnet[4], True)","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:03:29.354832Z","iopub.execute_input":"2022-05-12T20:03:29.355565Z","iopub.status.idle":"2022-05-12T20:03:31.816169Z","shell.execute_reply.started":"2022-05-12T20:03:29.355523Z","shell.execute_reply":"2022-05-12T20:03:31.815535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# y_test_1, score_1 = predict_test(test_dataloader, models[0])\n# y_test_2, score_2 = predict_test(test_dataloader, models[1])\n# y_test_3, score_3 = predict_test(test_dataloader, models[2])\n# y_test_4, score_4 = predict_test(test_dataloader, models[3])\n# y_test_5, score_5 = predict_test(test_dataloader, models[4])","metadata":{"execution":{"iopub.status.busy":"2022-05-06T07:14:15.250443Z","iopub.execute_input":"2022-05-06T07:14:15.250722Z","iopub.status.idle":"2022-05-06T07:14:21.973616Z","shell.execute_reply.started":"2022-05-06T07:14:15.250691Z","shell.execute_reply":"2022-05-06T07:14:21.972886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path = '../input/audiotest/test'\nfilepath_test = glob.glob(path + \"/*\")\nfname = [x.split('/')[-1] for x in filepath_test]","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:03:50.044113Z","iopub.execute_input":"2022-05-12T20:03:50.044638Z","iopub.status.idle":"2022-05-12T20:03:50.064564Z","shell.execute_reply.started":"2022-05-12T20:03:50.0446Z","shell.execute_reply":"2022-05-12T20:03:50.063921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"усреднение фолдов","metadata":{}},{"cell_type":"code","source":"w = 1/5\nscore_v = w * score1 + w * score2 + w * score3 + w * score4 + w * score5\nscore_r = w * score1_r + w * score2_r + w * score3_r + w * score4_r + w * score5_r\n# y_test = score.argmax(axis=-1).flatten().tolist()","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:05:14.05259Z","iopub.execute_input":"2022-05-12T20:05:14.052879Z","iopub.status.idle":"2022-05-12T20:05:14.063838Z","shell.execute_reply.started":"2022-05-12T20:05:14.052848Z","shell.execute_reply":"2022-05-12T20:05:14.062975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"объединение скоров моделей","metadata":{}},{"cell_type":"code","source":"w1 = 0.6\nw2 = 0.4\nscore = w1 * score_v + w2 * score_r\ny_test = score.argmax(axis=-1).flatten().tolist()","metadata":{"execution":{"iopub.status.busy":"2022-05-12T20:17:39.659697Z","iopub.execute_input":"2022-05-12T20:17:39.660025Z","iopub.status.idle":"2022-05-12T20:17:39.667469Z","shell.execute_reply.started":"2022-05-12T20:17:39.659989Z","shell.execute_reply":"2022-05-12T20:17:39.666413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test['label'] =  le.inverse_transform(y_test)\ndf_test.drop('filepath_test', axis=1, inplace=True)\ndf_test","metadata":{"execution":{"iopub.status.busy":"2022-05-10T15:30:57.507108Z","iopub.execute_input":"2022-05-10T15:30:57.507408Z","iopub.status.idle":"2022-05-10T15:30:57.529944Z","shell.execute_reply.started":"2022-05-10T15:30:57.507354Z","shell.execute_reply":"2022-05-10T15:30:57.529276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.to_csv('./sample_submission_5_mean_score.csv')","metadata":{"execution":{"iopub.status.busy":"2022-05-10T15:31:06.740998Z","iopub.execute_input":"2022-05-10T15:31:06.741256Z","iopub.status.idle":"2022-05-10T15:31:06.755041Z","shell.execute_reply.started":"2022-05-10T15:31:06.741229Z","shell.execute_reply":"2022-05-10T15:31:06.754417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nimport seaborn as sns\n\ndef show_confusion_matrix(y_test, y_pred):\n    cm = confusion_matrix(y_test, y_pred)\n    df_cm = pd.DataFrame(cm)\n    plt.figure(figsize=(30,20))\n    hmap = sns.heatmap(df_cm, annot=True, fmt=\"d\", cmap=\"Blues\", annot_kws={\"fontsize\":18})\n    hmap.yaxis.set_ticklabels(hmap.yaxis.get_ticklabels(), rotation=0, ha='right')\n    hmap.xaxis.set_ticklabels(hmap.xaxis.get_ticklabels(), rotation=30, ha='right')\n    plt.ylabel('True sentiment', fontsize=18)\n    plt.xlabel('Predicted sentiment', fontsize=18)\n    plt.tick_params(axis='both', which='major', labelsize=18)\n    plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"show_confusion_matrix(y_test, y_predict)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}