{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"},{"sourceId":159575698,"sourceType":"kernelVersion"}],"dockerImageVersionId":30635,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### Import necessary libraries","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"code","source":"import pandas as pd#导入csv文件的库\nimport numpy as np#进行矩阵运算的库\nfrom lightgbm import LGBMClassifier#导入lgbm分类器\nimport dill#对对象进行序列化和反序列化(例如保存和加载树模型)\nimport warnings#避免一些可以忽略的报错\nwarnings.filterwarnings('ignore')#filterwarnings()方法是用于设置警告过滤器的方法，它可以控制警告信息的输出方式和级别。","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Config","metadata":{}},{"cell_type":"code","source":"#设置随机种子,保证模型可以复现\nimport random\nTARGETS=['seizure_vote', 'lpd_vote', 'gpd_vote', 'lrda_vote', 'grda_vote', 'other_vote']\nseed=2024\nnum_folds=10\n#设置随机种子,保证模型可以复现\nnp.random.seed(seed)\nrandom.seed(seed)\n#除了时间列,其他列都要\nSPEC_COLS = pd.read_parquet(f\"/kaggle/input/hms-harmful-brain-activity-classification/train_spectrograms/1000086677.parquet\").columns[1:]\n#对这些列的数据构造特征.\nFEATURES = [f'{c}_mean_10m' for c in SPEC_COLS]\nFEATURES += [f'{c}_min_10m' for c in SPEC_COLS]\nFEATURES += [f'{c}_mean_20s' for c in SPEC_COLS]\nFEATURES += [f'{c}_min_20s' for c in SPEC_COLS]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### test feature engineer","metadata":{}},{"cell_type":"code","source":"test = pd.read_csv('/kaggle/input/hms-harmful-brain-activity-classification/test.csv')\n#测试数据\ndata = np.zeros((len(test),len(FEATURES)))\n    \nfor k in range(len(test)):\n    row = test.iloc[k]##取出第k个数据,或者说第K行\n    s = int( row.spectrogram_id )#spectrogram_id\n    spec = pd.read_parquet(f'/kaggle/input/hms-harmful-brain-activity-classification/test_spectrograms/{s}.parquet')\n    \n    r = 10#测试数据不提供row['min'],row['max'],这里就用训练数据的中位数来尝试.\n    #数据 时间维度是[r:r+300],列是400,按列对不是缺失值的数据求均值和最小值.\n    data[k,:400] = np.nanmean( spec.iloc[r:r+300,1:].values, axis=0)\n    data[k,400:800] = np.nanmin( spec.iloc[r:300,1:].values, axis=0)\n    #数据 时间维度是[r+145:r+155],列是400,按列对不是缺失值的数据求均值和最小值.\n    data[k,800:1200] = np.nanmean( spec.iloc[r+145:r+155,1:].values, axis=0)\n    data[k,1200:1600] = np.nanmin( spec.iloc[r+145:r+155,1:].values, axis=0)\n\ntest[FEATURES] = data\nprint('test shape',test.shape)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### load models and predict","metadata":{}},{"cell_type":"code","source":"def pickle_load(path):\n    #打开指定的路径path,binary read(二进制读取)\n    with open(path, mode=\"rb\") as f:\n        #按照制定路径去加载模型\n        data = dill.load(f)\n        return data\npreds = []\n\nfor fold in range(num_folds):\n    \n    model = pickle_load(f'/kaggle/input/hms-baseline-lgb-10-folds-training/lgb_f{fold}.model')\n    \n    # Make predictions\n    pred = model.predict_proba(test[FEATURES])\n    preds.append(pred)\n\n#对预测结果求平均\npred = np.mean(preds, axis=0)\nprint('Test preds shape', pred.shape)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Submission","metadata":{}},{"cell_type":"code","source":"submission = pd.DataFrame({'eeg_id':test.eeg_id.values})\nsubmission[TARGETS] = pred\nsubmission.to_csv('submission.csv',index=None)\nsubmission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}