{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Resources Used/Links","metadata":{}},{"cell_type":"markdown","source":"•\thttps://www.kaggle.com/competitions/freesound-audio-tagging <br >\n\n•\thttps://www.kaggle.com/datasets/kelbycraft/kwc-freesound-yamnet-embeddings <br >\n\n•\thttps://www.kaggle.com/code/kelbycraft/kwc-freesound-cnn-cv-v01 <br >\n\n•\thttps://www.kaggle.com/code/kelbycraft/kwc-freesound-yamnet-cv-v01 <br >","metadata":{}},{"cell_type":"markdown","source":"# Imports and Loads","metadata":{}},{"cell_type":"code","source":"import numpy as np, pandas as pd\nimport os\n\n# adjust these to the actual mount paths shown in your input panel\nYAM = '/kaggle/input/notebooks/kelbycraft/kwc-freesound-yamnet-cv-v01'\nCNN = '/kaggle/input/notebooks/kelbycraft/kwc-freesound-cnn-cv-v01'\n\n# YAMNet artifacts\nyam_oof  = np.load(f'{YAM}/yamnet_oof_probs.npy')\nyam_test = np.load(f'{YAM}/yamnet_test_probs.npy')\ny_true   = np.load(f'{YAM}/y_true.npy')\nclasses  = np.load(f'{YAM}/label_classes.npy', allow_pickle=True)\n\n# CNN artifacts\ncnn_oof  = np.load(f'{CNN}/cnn_oof_probs.npy')\ncnn_test = np.load(f'{CNN}/cnn_test_probs.npy')\ncnn_order = pd.read_csv(f'{CNN}/cnn_train_order.csv')\n\nprint('yam_oof', yam_oof.shape, '| cnn_oof', cnn_oof.shape)\nprint('yam_test', yam_test.shape, '| cnn_test', cnn_test.shape)\nprint('classes match:', list(classes))\n\ndef mapk_from_probs(probs, true_idx, k=3):\n    top_k = np.argsort(-probs, axis=1)[:, :k]\n    s = 0.0\n    for i, t in enumerate(true_idx):\n        h = np.where(top_k[i] == t)[0]\n        if len(h): s += 1.0/(h[0]+1)\n    return s/len(true_idx)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-08-22T20:17:38.969332Z","iopub.execute_input":"2026-08-22T20:17:38.970037Z","iopub.status.idle":"2026-08-22T20:17:39.553365Z","shell.execute_reply.started":"2026-08-22T20:17:38.970004Z","shell.execute_reply":"2026-08-22T20:17:39.552335Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# OOF Array Alignment","metadata":{}},{"cell_type":"code","source":"YAM_EMB = '/kaggle/input/datasets/kelbycraft/kwc-freesound-yamnet-embeddings'\n\n# load both row orders fresh\nyam_order = pd.read_csv(f'{YAM_EMB}/train_labels.csv').reset_index().rename(columns={'index':'yam_row'})\ncnn_order = pd.read_csv(f'{CNN}/cnn_train_order.csv').reset_index().rename(columns={'index':'cnn_row'})\n\n# normalize fnames to bare IDs (YAMNet has .wav, CNN has .png)\nyam_order['fname'] = yam_order['fname'].str.replace('.wav', '', regex=False)\ncnn_order['fname'] = cnn_order['fname'].str.replace('.png', '', regex=False)\n\n# join to get the row mapping\nmerged = yam_order.merge(cnn_order, on='fname', suffixes=('_yam','_cnn'))\nassert len(merged) == 9473, f'mismatch: {len(merged)}'\n\nyam_rows = merged['yam_row'].values\ncnn_rows = merged['cnn_row'].values\n\n# align both OOF arrays and the truth into a common order\nyam_oof_al = yam_oof[yam_rows]\ncnn_oof_al = cnn_oof[cnn_rows]\ny_al       = y_true[yam_rows]\n\nprint('merged rows:', len(merged))\nprint('YAMNet solo OOF:', round(mapk_from_probs(yam_oof_al, y_al), 4))\nprint('CNN solo OOF   :', round(mapk_from_probs(cnn_oof_al, y_al), 4))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-22T20:17:42.362738Z","iopub.execute_input":"2026-08-22T20:17:42.363447Z","iopub.status.idle":"2026-08-22T20:17:42.593433Z","shell.execute_reply.started":"2026-08-22T20:17:42.363412Z","shell.execute_reply":"2026-08-22T20:17:42.592468Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Evaluate Blends on OOF","metadata":{}},{"cell_type":"code","source":"# 1. simple average\navg_oof = (yam_oof_al + cnn_oof_al) / 2\nprint('Simple average OOF:', round(mapk_from_probs(avg_oof, y_al),4))\n\n# 2. weighted average: sweep the weight on YAMNet\nbest_w, best_s = 0.5, 0\nfor w in np.linspace(0, 1, 21):\n    blend = w*yam_oof_al + (1-w)*cnn_oof_al\n    s = mapk_from_probs(blend, y_al)\n    if s > best_s:\n        best_s, best_w = s, w\nprint(f'Best weighted: w_yam={best_w:.2f}  OOF={best_s:.4f}')\n\n# 3. simple stacking: logistic regression meta-model on concatenated probs\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.model_selection import cross_val_predict\nmeta_X = np.hstack([yam_oof_al, cnn_oof_al])   # 82-dim (41+41)\nmeta = LogisticRegression(max_iter=2000, C=1.0)\nstack_oof = cross_val_predict(meta, meta_X, y_al, cv=5, method='predict_proba')\nprint('Stacking OOF   :', round(mapk_from_probs(stack_oof, y_al),4))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-22T20:17:46.464834Z","iopub.execute_input":"2026-08-22T20:17:46.465176Z","iopub.status.idle":"2026-08-22T20:17:58.066579Z","shell.execute_reply.started":"2026-08-22T20:17:46.465147Z","shell.execute_reply":"2026-08-22T20:17:58.065723Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Generate Submission from Winning Blend","metadata":{}},{"cell_type":"code","source":"method = 'average'\n\nif method == 'average':\n    final_test = (yam_test + cnn_test) / 2\nelif method == 'weighted':\n    final_test = best_w*yam_test + (1-best_w)*cnn_test\nelif method == 'stack':\n    meta.fit(meta_X, y_al)                       # fit on all OOF\n    final_test = meta.predict_proba(np.hstack([yam_test, cnn_test]))\n\n# build submission\ntest_fnames = pd.read_csv(f'{YAM_EMB}/test_fnames.csv')['fname'].values\ntop3 = np.argsort(-final_test, axis=1)[:, :3]\nlabels = [' '.join(classes[i] for i in row) for row in top3]\nsub = pd.DataFrame({'fname': test_fnames, 'label': labels})\nsub.to_csv('/kaggle/working/submission.csv', index=False)\nprint('wrote submission.csv'); print(sub.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-22T20:18:02.397698Z","iopub.execute_input":"2026-08-22T20:18:02.398194Z","iopub.status.idle":"2026-08-22T20:18:02.506117Z","shell.execute_reply.started":"2026-08-22T20:18:02.398137Z","shell.execute_reply":"2026-08-22T20:18:02.505164Z"}},"outputs":[],"execution_count":null}]}