{"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"}],"dockerImageVersionId":30635,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### Import necessary libraries","metadata":{}},{"cell_type":"code","source":"#necessary\nimport pandas as pd#导入csv文件的库\nimport numpy as np#进行矩阵运算的库\nimport os#与操作系统交互的库\n#model\nfrom lightgbm import  LGBMClassifier\n\nfrom sklearn.model_selection import StratifiedKFold\n#设置随机种子,保证模型可以复现\nimport random\nseed=2024\nnum_folds=10\nnp.random.seed(seed)\nrandom.seed(seed)\n\nimport warnings#避免一些可以忽略的报错\nwarnings.filterwarnings('ignore')#filterwarnings()方法是用于设置警告过滤器的方法，它可以控制警告信息的输出方式和级别。","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### eegs_features","metadata":{}},{"cell_type":"code","source":"train_eegs_path=\"/kaggle/input/hms-harmful-brain-activity-classification/train_eegs/\"\ntrain_eegs=sorted(os.listdir(train_eegs_path))#['101.parquet',……]\norigin_columns=pd.read_parquet(train_eegs_path+train_eegs[0]).keys().values\ncolumns=[]\nfor agg in ['max','min','mean','std','median']:\n    columns=columns+['_'.join([col,agg]) for col in origin_columns]\ncolumns=['eeg_id']+columns\nprint(f\"len(columns):{len(columns)}\")\ntrain_feats1=[]\nfor i in range(len(train_eegs)):\n    idx=int(train_eegs[i][:-8])#idx.parquet\n    train_eeg=pd.read_parquet(train_eegs_path+train_eegs[i])#(,20)\n    feats=[idx]\n    feats=feats+list(train_eeg.max(axis=0).values)\n    feats=feats+list(train_eeg.min(axis=0).values)\n    feats=feats+list(train_eeg.mean(axis=0).values)\n    feats=feats+list(train_eeg.std(axis=0).values)\n    feats=feats+list(train_eeg.median(axis=0).values)\n    train_feats1.append(feats)\ntrain_feats1=pd.DataFrame(columns=columns,data=train_feats1)\ntrain_feats1.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_eegs_path=\"/kaggle/input/hms-harmful-brain-activity-classification/test_eegs/\"\ntest_eegs=sorted(os.listdir(test_eegs_path))#['101.parquet',……]\norigin_columns=pd.read_parquet(test_eegs_path+test_eegs[0]).keys().values\ncolumns=[]\nfor agg in ['max','min','mean','std','median']:\n    columns=columns+['_'.join([col,agg]) for col in origin_columns]\ncolumns=['eeg_id']+columns\nprint(f\"len(columns):{len(columns)}\")\ntest_feats1=[]\nfor i in range(len(test_eegs)):\n    idx=int(test_eegs[i][:-8])#idx.parquet\n    test_eeg=pd.read_parquet(test_eegs_path+test_eegs[i])#(,20)\n    feats=[idx]\n    feats=feats+list(test_eeg.max(axis=0).values)\n    feats=feats+list(test_eeg.min(axis=0).values)\n    feats=feats+list(test_eeg.mean(axis=0).values)\n    feats=feats+list(test_eeg.std(axis=0).values)\n    feats=feats+list(test_eeg.median(axis=0).values)\n    test_feats1.append(feats)\ntest_feats1=pd.DataFrame(columns=columns,data=test_feats1)\ntest_feats1.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### spectrograms_features","metadata":{}},{"cell_type":"code","source":"# train_spectrograms_path=\"/kaggle/input/hms-harmful-brain-activity-classification/train_spectrograms/\"\n# train_spectrograms=sorted(os.listdir(train_spectrograms_path))#['101.parquet',……]\n# origin_columns=pd.read_parquet(train_spectrograms_path+train_spectrograms[0]).keys().values\n# columns=[]\n# for agg in ['max','min','mean','std','median']:\n#     columns=columns+['_'.join([col,agg]) for col in origin_columns]\n# columns=['patient_id']+columns\n# print(f\"len(columns):{len(columns)}\")\n# train_feats2=[]\n# for i in range(len(train_spectrograms)):\n#     idx=int(train_spectrograms[i][:-8])#idx.parquet\n#     train_spect=pd.read_parquet(train_spectrograms_path+train_spectrograms[i])#(,20)\n#     feats=[idx]\n#     feats=feats+list(train_spect.max(axis=0).values)\n#     feats=feats+list(train_spect.min(axis=0).values)\n#     feats=feats+list(train_spect.mean(axis=0).values)\n#     feats=feats+list(train_spect.std(axis=0).values)\n#     feats=feats+list(train_spect.median(axis=0).values)\n#     train_feats2.append(feats)\n# train_feats2=pd.DataFrame(columns=columns,data=train_feats2)\n# train_feats2.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test_spectrograms_path=\"/kaggle/input/hms-harmful-brain-activity-classification/test_spectrograms/\"\n# test_spectrograms=sorted(os.listdir(test_spectrograms_path))#['101.parquet',……]\n# origin_columns=pd.read_parquet(test_spectrograms_path+test_spectrograms[0]).keys().values\n# columns=[]\n# for agg in ['max','min','mean','std','median']:\n#     columns=columns+['_'.join([col,agg]) for col in origin_columns]\n# columns=['patient_id']+columns\n# print(f\"len(columns):{len(columns)}\")\n# test_feats2=[]\n# for i in range(len(test_spectrograms)):\n#     idx=int(test_spectrograms[i][:-8])#idx.parquet\n#     test_spect=pd.read_parquet(test_spectrograms_path+test_spectrograms[i])#(,20)\n#     feats=[idx]\n#     feats=feats+list(test_spect.max(axis=0).values)\n#     feats=feats+list(test_spect.min(axis=0).values)\n#     feats=feats+list(test_spect.mean(axis=0).values)\n#     feats=feats+list(test_spect.std(axis=0).values)\n#     feats=feats+list(test_spect.median(axis=0).values)\n#     test_feats2.append(feats)\n# test_feats2=pd.DataFrame(columns=columns,data=test_feats2)\n# test_feats2.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Import dataset","metadata":{}},{"cell_type":"code","source":"train_feats=pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/train.csv\")\ntrain_feats=train_feats[train_feats['eeg_sub_id']==0]\nprint(f\"len(train_feats):{len(train_feats)}\")\ntrain_feats.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_feats=train_feats.merge(train_feats1,on='eeg_id',how='left')\n#train_feats=train_feats.merge(train_feats2,on='patient_id',how='left')\nlabels=['seizure','lpd','gpd','lrda','grda','other']\nlabels_idx=[0,1,2,3,4,5]\ntrain_feats['expert_consensus']=train_feats['expert_consensus'].apply(lambda x:x.lower())\ntrain_feats['expert_consensus']=train_feats['expert_consensus'].replace(labels,labels_idx)\ntrain_feats.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_feats=pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/test.csv\")\nprint(f\"len(test_feats):{len(test_feats)}\")\ntest_feats=test_feats.merge(test_feats1,on='eeg_id',how='left')\n#test_feats=test_feats.merge(test_feats2,on='patient_id',how='left')\ntest_feats.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### drop cols","metadata":{}},{"cell_type":"code","source":"drop_cols=['eeg_id', 'eeg_sub_id', 'eeg_label_offset_seconds','spectrogram_id', 'spectrogram_sub_id','spectrogram_label_offset_seconds', 'label_id', 'patient_id','seizure_vote','lpd_vote', 'gpd_vote','lrda_vote', 'grda_vote', 'other_vote']\ntrain_feats.drop(drop_cols,axis=1,inplace=True)\n\nfor col in drop_cols:\n    if col in test_feats.keys().values:\n        test_feats.drop([col],axis=1,inplace=True)\n\nunique_cols=[key for key in train_feats.keys().values if train_feats[key].nunique()<2]\nprint(f\"unique_cols:{unique_cols}\")\ntrain_feats.drop(unique_cols,axis=1,inplace=True)\n\nfor col in unique_cols:\n    if col in test_feats.keys().values:\n        test_feats.drop([col],axis=1,inplace=True)\nprint(f\"total_features_count:{len(test_feats.keys().values)}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### optuna find_params","metadata":{}},{"cell_type":"code","source":"#import optuna#自动超参数优化软件框架\nTARGET_NAME='expert_consensus'\ny=train_feats[TARGET_NAME]\nX=train_feats.drop([TARGET_NAME],axis=1)\n#valid_y_onehot=np.eye(6)[y]\n#valid_pred=np.zeros((len(y),6))\n#评估指标是log_loss\ndef log_loss(y_true,y_pred):\n    return -np.mean(np.sum(y_true*np.log(y_pred),axis=1))\n# def objective(trial):\n#     lgbm_params = {\n#         'objective': 'multi_logloss', \n#         'random_state': trial.suggest_int('random_state',seed,seed),\n#         'n_estimators': trial.suggest_int('n_estimators', 50, 1000),\n#         'reg_alpha': trial.suggest_loguniform('reg_alpha', 1e-3, 10.0),\n#         'reg_lambda': trial.suggest_loguniform('reg_lambda', 1e-3, 10.0),#对数分布的建议值\n#         'colsample_bytree': trial.suggest_float('colsample_bytree', 0.5, 1),#浮点数\n#         'subsample': trial.suggest_float('subsample', 0.5, 1),\n#         'learning_rate': trial.suggest_float('learning_rate', 1e-4, 0.5, log=True),\n#         'num_leaves' : trial.suggest_int('num_leaves', 8, 64),#整数\n#         'min_child_samples': trial.suggest_int('min_child_samples', 1, 100),\n#     }\n\n#     skf = StratifiedKFold(n_splits=num_folds, random_state=seed, shuffle=True)\n\n#     for i, (train_idx, valid_idx) in enumerate(skf.split(X, y)):\n#         train_X = X.iloc[train_idx]\n#         train_y = y.iloc[train_idx]\n#         valid_X = X.iloc[valid_idx]\n#         valid_y = y.iloc[valid_idx]\n#         model = LGBMClassifier(**lgbm_params)  \n#         model.fit(train_X,train_y, eval_set = [(train_X, train_y), (valid_X, valid_y)],early_stopping_rounds=100,verbose=500)\n#         valid_pred[valid_idx] = model.predict_proba(valid_X)\n#     log = log_loss(valid_y_onehot, valid_pred)\n    \n#     return log\n# #创建的研究命名,找最小值.\n# study = optuna.create_study(direction='minimize', study_name='Optimize boosting hyperparameters')\n# #目标函数,尝试的次数\n# study.optimize(objective, n_trials=100)\n# lgbm_params=study.best_trial.params\n# lgbm_params['objective']='multi_logloss'\n\n#Trial 8 finished with value: 0.9817261416742666 and parameters: \nlgb_params={'random_state': 2024,'objective': 'multi_logloss','n_estimators': 1024,#281, \n            'reg_alpha': 0.0019271015336167967, 'reg_lambda': 1.2984473097696712,\n            'colsample_bytree': 0.7598802620534322, 'subsample': 0.7943069587625833, \n            'learning_rate': 0.06700127543548802, 'num_leaves': 25, 'min_child_samples': 32}\n#输出最佳的参数\n#print('lgbm_params=', lgbm_params)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### fit and predict.","metadata":{}},{"cell_type":"code","source":"y=train_feats[TARGET_NAME]\nX=train_feats.drop([TARGET_NAME],axis=1)\ntest_X=test_feats.copy()\ntest_pred=[]\nskf = StratifiedKFold(n_splits=num_folds, random_state=seed, shuffle=True)\nfor fold, (train_idx, valid_idx) in enumerate(skf.split(X, y)):\n    print(f\"fold:{fold}/num_folds:{num_folds}\")\n    train_X = X.iloc[train_idx]\n    train_y = y.iloc[train_idx]\n    valid_X = X.iloc[valid_idx]\n    valid_y = y.iloc[valid_idx]\n    model = LGBMClassifier(**lgb_params)  \n    model.fit(train_X,train_y, eval_set = [(train_X, train_y), (valid_X, valid_y)],early_stopping_rounds=100,verbose=500)\n    test_pred.append(model.predict_proba(test_X))\ntest_pred=np.mean(np.array(test_pred),axis=0)\ntest_pred","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Submission","metadata":{}},{"cell_type":"code","source":"submission=pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/sample_submission.csv\")\nfor i in range(len(labels)):\n    submission[f'{labels[i]}_vote']=test_pred[:,i]\nsubmission.to_csv(\"submission.csv\",index=None)\nsubmission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}