{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","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":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Libraries\nimport os\nimport pandas as pd\nimport numpy as np\nimport lightgbm as lgb\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import log_loss\nfrom sklearn.preprocessing import StandardScaler\n\n# Function to load parquet files in smaller chunks\ndef load_parquet_data_chunked(directory, max_files=10):\n    \"\"\"Load a limited number of parquet files at a time to avoid memory issues.\"\"\"\n    data_frames = []\n    file_count = 0  # Counter to limit the number of files loaded\n    for file in os.listdir(directory):\n        if file.endswith('.parquet'):\n            data_frames.append(pd.read_parquet(os.path.join(directory, file)))\n            file_count += 1\n            if file_count >= max_files:\n                break  # Stop loading files after max_files\n    return pd.concat(data_frames, ignore_index=True)\n\n# Feature Engineering Function\ndef extract_features(df):\n    \"\"\"Generate statistical features for each EEG segment.\"\"\"\n    features = df.drop(columns=['eeg_id', 'label'], errors='ignore')\n    stats = features.agg(['mean', 'std', 'min', 'max', 'median', 'skew', 'kurt'], axis=1).values\n    return stats\n\n# Directory for training EEG files\ntrain_dir = '/kaggle/input/hms-harmful-brain-activity-classification/train_eegs'\ntest_dir = '/kaggle/input/hms-harmful-brain-activity-classification/test_eegs'\n\n# Load training data (in chunks)\nprint(\"Loading a subset of training data...\")\ntrain_data = load_parquet_data_chunked(train_dir, max_files=50)  # Adjust max_files if needed\nprint(\"Training data loaded.\")\n\n# Extract features for training\nprint(\"Extracting features...\")\nX_train = extract_features(train_data)\ny_train = train_data['label']\n\n# Load test data (in chunks)\nprint(\"Loading test data...\")\ntest_data = load_parquet_data_chunked(test_dir, max_files=50)  # Adjust max_files if needed\nX_test = extract_features(test_data)\n\n# Normalize the features\nprint(\"Normalizing features...\")\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_test_scaled = scaler.transform(X_test)\n\n# Train-validation split\nX_train_split, X_val_split, y_train_split, y_val_split = train_test_split(\n    X_train_scaled, y_train, test_size=0.2, random_state=42\n)\n\n# Train a LightGBM Model\nprint(\"Training LightGBM...\")\ntrain_dataset = lgb.Dataset(X_train_split, label=y_train_split)\nval_dataset = lgb.Dataset(X_val_split, label=y_val_split, reference=train_dataset)\n\nparams = {\n    'objective': 'multiclass',\n    'num_class': len(y_train.unique()),\n    'metric': 'multi_logloss',\n    'boosting_type': 'gbdt',\n    'learning_rate': 0.05,\n    'num_leaves': 31,\n    'verbose': -1\n}\n\nlgb_model = lgb.train(\n    params,\n    train_dataset,\n    valid_sets=[train_dataset, val_dataset],\n    num_boost_round=500,\n    early_stopping_rounds=50,\n    verbose_eval=50\n)\n\n# Validate the Model\nprint(\"Validating the model...\")\ny_val_pred_proba = lgb_model.predict(X_val_split)\nlogloss = log_loss(y_val_split, y_val_pred_proba)\nprint(f\"Validation Log Loss: {logloss}\")\n\n# Make predictions on test data\nprint(\"Making predictions on test data...\")\ntest_probs = lgb_model.predict(X_test_scaled)\n\n# Create the Submission File\nprint(\"Creating submission file...\")\nsubmission = pd.DataFrame(test_probs, columns=['seizure_vote', 'lpd_vote', 'gpd_vote', 'lrda_vote', 'grda_vote', 'other_vote'])\nsubmission.insert(0, 'eeg_id', test_data['eeg_id'])\nsubmission.to_csv('submission.csv', index=False)\n\nprint(\"Submission file created successfully!\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-18T16:48:18.349329Z","iopub.execute_input":"2024-11-18T16:48:18.349697Z","iopub.status.idle":"2024-11-18T16:48:19.734512Z","shell.execute_reply.started":"2024-11-18T16:48:18.349666Z","shell.execute_reply":"2024-11-18T16:48:19.733106Z"}},"outputs":[],"execution_count":null}]}