{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.6.6","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":"code","source":"import numpy as np, pandas as pd, joblib\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.preprocessing import LabelEncoder\n\nX = np.load('/kaggle/input/datasets/kelbycraft/kwc-freesound-yamnet-embeddings/X_train.npy')\nX_test = np.load('/kaggle/input/datasets/kelbycraft/kwc-freesound-yamnet-embeddings/X_test.npy')\ntrain_labels = pd.read_csv('/kaggle/input/datasets/kelbycraft/kwc-freesound-yamnet-embeddings/train_labels.csv')\ntest_fnames = pd.read_csv('/kaggle/input/datasets/kelbycraft/kwc-freesound-yamnet-embeddings/test_fnames.csv')\n\nle = LabelEncoder()\ny = le.fit_transform(train_labels['label'])\nNUM_CLASSES = len(le.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)\n\nskf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n\noof_probs = np.zeros((len(X), NUM_CLASSES))     # out-of-fold predictions\ntest_probs_folds = np.zeros((5, len(X_test), NUM_CLASSES))  # test preds per fold\nfold_scores = []\n\nfor fold, (tr_idx, va_idx) in enumerate(skf.split(X, y)):\n    clf = LogisticRegression(max_iter=2000, C=1.0)\n    clf.fit(X[tr_idx], y[tr_idx])\n\n    oof_probs[va_idx] = clf.predict_proba(X[va_idx])         # OOF for this fold\n    test_probs_folds[fold] = clf.predict_proba(X_test)       # test preds\n    score = mapk_from_probs(oof_probs[va_idx], y[va_idx])\n    fold_scores.append(score)\n    joblib.dump(clf, f'/kaggle/working/yamnet_logreg_fold{fold}.joblib')\n    print(f'fold {fold}: MAP@3 = {score:.4f}')\n\nfold_scores = np.array(fold_scores)\nprint(f'\\nYAMNet+LogReg 5-fold MAP@3: {fold_scores.mean():.4f} ± {fold_scores.std():.4f}')\nprint(f'Overall OOF MAP@3: {mapk_from_probs(oof_probs, y):.4f}')\n\n# save artifacts for week-6 ensemble\nnp.save('/kaggle/working/yamnet_oof_probs.npy', oof_probs)\nnp.save('/kaggle/working/yamnet_test_probs.npy', test_probs_folds.mean(axis=0))  # avg over folds\nnp.save('/kaggle/working/y_true.npy', y)\nnp.save('/kaggle/working/label_classes.npy', le.classes_)\nprint('artifacts saved')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null}]}