{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":91844,"databundleVersionId":11361821,"sourceType":"competition"}],"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.svm import LinearSVC\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.preprocessing import StandardScaler\nimport librosa\nimport os\n\n# 假设数据路径（这里根据你上传文件路径调整，若实际不同需修改）\ndata_root = \"/kaggle/working/\"\n\n# 训练数据的标注文件路径，为你上传的 train.csv\ntrain_metadata_path = os.path.join(data_root, \"train.csv\")\n\n# 检查训练数据标注文件是否存在\nif not os.path.exists(train_metadata_path):\n    print(f\"训练数据标注文件 {train_metadata_path} 不存在，请检查文件名是否正确。\")\nelse:\n    print(f\"训练数据标注文件 {train_metadata_path} 存在。\")\n    # 加载训练数据的标注信息\n    train_metadata = pd.read_csv(train_metadata_path)\n\n    # 定义音频特征提取函数\n    def extract_audio_features(audio_path, n_fft=2048, hop_length=512):\n        audio, sr = librosa.load(audio_path)\n        spectrogram = librosa.stft(audio, n_fft=n_fft, hop_length=hop_length)\n        spectrogram = np.abs(spectrogram)\n        mfccs = librosa.feature.mfcc(audio, sr=sr, n_mfcc=13)\n        chroma = librosa.feature.chroma_stft(S=spectrogram, sr=sr)\n        mel = librosa.feature.melspectrogram(audio, sr=sr)\n        contrast = librosa.feature.spectral_contrast(S=spectrogram, sr=sr)\n        features = np.concatenate((np.mean(spectrogram, axis=1), np.mean(mfccs, axis=1),\n                                   np.mean(chroma, axis=1), np.mean(mel, axis=1),\n                                   np.mean(contrast, axis=1)))\n        return features\n\n    # 构建完整的音频文件路径并提取特征，同时获取标签\n    X = []\n    y = []\n    for index, row in train_metadata.iterrows():\n        audio_name = row['filename']\n        # 这里根据音频文件名的实际情况，可能需要进一步处理路径等信息，\n        # 目前简单假设音频文件就在 train_audio 目录下，若实际不同需修改\n        audio_path = os.path.join(data_root, \"train_audio\", audio_name)\n        species_label = row['primary_label']\n        try:\n            features = extract_audio_features(audio_path)\n            X.append(features)\n            y.append(species_label)\n        except:\n            print(f\"处理音频 {audio_path} 时出错，已跳过\")\n\n    X = np.array(X)\n    y = np.array(y)\n\n    # 标签编码\n    label_encoder = LabelEncoder()\n    y_encoded = label_encoder.fit_transform(y)\n\n    # 划分训练集和测试集\n    X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)\n\n    # 构建分类器管道（以线性SVM为例）\n    pipeline = Pipeline([\n        ('scaler', StandardScaler()),\n        ('clf', LinearSVC())\n    ])\n\n    # 训练模型\n    pipeline.fit(X_train, y_train)\n\n    # 预测并评估\n    y_pred_proba = pipeline.predict_proba(X_test)\n    # 由于竞赛评估指标是跳过无真正阳性标签类别的宏平均ROC-AUC，这里简化计算，实际需按竞赛数据处理\n    auc_score = roc_auc_score(y_test, y_pred_proba, multi_class='ovr', average='macro')\n    print(f\"Macro-averaged ROC-AUC score: {auc_score}\")\n\n    # 以下部分为对测试集进行预测（如果竞赛有测试集数据且需要预测结果的话）\n    # 假设测试数据标注文件路径\n    test_metadata_path = os.path.join(data_root, \"test.csv\")\n\n    # 检查测试数据标注文件是否存在\n    if not os.path.exists(test_metadata_path):\n        print(f\"测试数据标注文件 {test_metadata_path} 不存在，请检查文件名是否正确。\")\n    else:\n        print(f\"测试数据标注文件 {test_metadata_path} 存在。\")\n        test_metadata = pd.read_csv(test_metadata_path)\n\n        test_X = []\n        for index, row in test_metadata.iterrows():\n            audio_name = row['filename']\n            audio_path = os.path.join(data_root, \"test_audio\", audio_name)\n            try:\n                features = extract_audio_features(audio_path)\n                test_X.append(features)\n            except:\n                print(f\"处理测试音频 {audio_path} 时出错，已跳过\")\n\n        test_X = np.array(test_X)\n        test_y_pred = pipeline.predict(test_X)\n        test_y_pred_labels = label_encoder.inverse_transform(test_y_pred)\n\n        # 这里可以将预测结果保存为合适的格式，以便提交竞赛\n        # 例如保存为CSV文件\n        submission = pd.DataFrame({\n            'filename': test_metadata['filename'],\n            'primary_label': test_y_pred_labels\n        })\n        submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"_kg_hide-input":false,"_kg_hide-output":false},"outputs":[],"execution_count":null}]}