{"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":"gpu","dataSources":[{"sourceId":94147,"databundleVersionId":11390004,"sourceType":"competition"}],"dockerImageVersionId":30919,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import h5py\nimport numpy as np\nimport pandas as pd\nimport xgboost as xgb\nfrom sklearn.model_selection import KFold\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.metrics import mean_squared_error, r2_score\nfrom sklearn.multioutput import MultiOutputRegressor\nfrom sklearn.ensemble import RandomForestRegressor\n\n# Load training data\ndef load_train_data(h5_file_path):\n    train_spot_tables = {}\n    with h5py.File(h5_file_path, \"r\") as f:\n        train_spots = f[\"spots/Train\"]\n        for slide_name in train_spots.keys():\n            spot_array = np.array(train_spots[slide_name])\n            df = pd.DataFrame(spot_array)\n            train_spot_tables[slide_name] = df\n    print(\"Training data loaded successfully.\")\n    return train_spot_tables\n\n# Prepare training set\ndef prepare_training_set(train_spot_tables, slides=None):\n    if slides is None:\n        slides = list(train_spot_tables.keys())\n    \n    X_list, y_list = [], []\n    for slide_id in slides:\n        df = train_spot_tables[slide_id]\n        feature_cols = ['x', 'y']\n        target_cols = [col for col in df.columns if col not in feature_cols]\n        \n        X_list.append(df[feature_cols].values.astype(float))\n        y_list.append(df[target_cols].values.astype(float))\n    \n    return np.vstack(X_list), np.vstack(y_list), target_cols\n\n# Load test data\ndef load_test_data(h5_file_path, slide_id):\n    with h5py.File(h5_file_path, \"r\") as f:\n        test_spots = f[\"spots/Test\"]\n        if slide_id not in test_spots:\n            raise ValueError(f\"Slide {slide_id} not found in test data.\")\n        spot_array = np.array(test_spots[slide_id])\n        test_df = pd.DataFrame(spot_array)\n    print(f\"Test data for slide {slide_id} loaded successfully.\")\n    return test_df\n\n# Train MultiOutputRegressor with XGBoost using K-Fold\ndef train_multioutput_xgb(X, y, n_splits=5):\n    kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)\n    models = []\n    fold = 1\n    for train_index, val_index in kf.split(X):\n        X_train, X_val = X[train_index], X[val_index]\n        y_train, y_val = y[train_index], y[val_index]\n        \n        model = MultiOutputRegressor(xgb.XGBRegressor(objective='reg:squarederror', n_estimators=1000, max_depth=6, learning_rate=0.1, subsample=0.8, colsample_bytree=0.8, random_state=42))\n        model.fit(X_train, y_train)\n        models.append(model)\n        \n        y_pred = model.predict(X_val)\n        mse = mean_squared_error(y_val, y_pred)\n        r2 = r2_score(y_val, y_pred)\n        print(f\"Fold {fold}: MSE={mse:.4f}, R²={r2:.4f}\")\n        fold += 1\n    \n    return models\n\n# Make predictions\ndef predict(models, X_test):\n    predictions = np.mean([model.predict(X_test) for model in models], axis=0)\n    return predictions\n\n# Create submission file\ndef create_submission(test_df, predictions, target_cols, submission_filename=\"submission.csv\"):\n    pred_df = pd.DataFrame(predictions, columns=target_cols, index=test_df.index)\n    pred_df.insert(0, 'ID', pred_df.index)\n    pred_df.to_csv(submission_filename, index=False)\n    print(f\"Submission file '{submission_filename}' created!\")\n\n# Main execution\nif __name__ == \"__main__\":\n    h5_file_path = \"/kaggle/input/el-hackathon-2025/elucidata_ai_challenge_data.h5\"\n    \n    # Load training data\n    train_spot_tables = load_train_data(h5_file_path)\n    X, y, target_cols = prepare_training_set(train_spot_tables)\n    \n    # Train MultiOutputRegressor with XGBoost\n    models = train_multioutput_xgb(X, y, n_splits=5)\n    \n    # Load test data\n    test_df = load_test_data(h5_file_path, slide_id='S_7')\n    X_test = test_df[['x', 'y']].values.astype(float)\n    \n    # Make predictions\n    predictions = predict(models, X_test)\n    \n    # Save predictions\n    create_submission(test_df, predictions, target_cols)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-19T04:15:14.662273Z","iopub.execute_input":"2025-03-19T04:15:14.662706Z","iopub.status.idle":"2025-03-19T04:15:28.230992Z","shell.execute_reply.started":"2025-03-19T04:15:14.662671Z","shell.execute_reply":"2025-03-19T04:15:28.230118Z"}},"outputs":[],"execution_count":null}]}