{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":96164,"databundleVersionId":11418275,"sourceType":"competition"}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Baseline: Linear Regression (OLS)","metadata":{"_uuid":"84440da2-5ca6-4b5a-ba35-a17351e6409d","_cell_guid":"04584dad-a2d7-4a57-9282-be864106ced6","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"markdown","source":"## 1. Imports & Environment Setup","metadata":{"_uuid":"7ac84055-475e-4057-a0e8-b349a8ef32c0","_cell_guid":"82336321-95ad-4642-b8e5-f18f38ced367","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"# Suppress warnings\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# Memory management\nimport gc\n\n# Data manipulation\nimport pandas as pd\nimport numpy as np\n\n# Modeling\nfrom sklearn.linear_model import LinearRegression\n\n# Evaluation\nfrom sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\nfrom scipy.stats import pearsonr\n\n# Visualization\nimport matplotlib.pyplot as plt\n\n# Display\nfrom IPython.display import display","metadata":{"_uuid":"ecb29130-675d-45e9-a3d5-42391c5b7bd7","_cell_guid":"cad0e5fd-8108-4c03-a38f-bd00b27ea579","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. Data Loading and Preprocessing","metadata":{"_uuid":"adfc42c8-e4de-4147-a626-dadf4bd3d24e","_cell_guid":"b692a721-6b80-4198-b138-b0b20a0dd4df","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"# Load data\ntrain_df = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/train.parquet', engine='pyarrow')\ntrain_df.replace([np.inf, -np.inf], 0, inplace=True)\n\n# Subset for training and testing\n_train_df = train_df.iloc[:200_000]\n_test_df = train_df.iloc[500_000:550_000]\n\nx_train = _train_df.drop(columns=['label'])\ny_train = _train_df['label']\n\nx_test = _test_df.drop(columns=['label'])\ny_test = _test_df['label']\n\n# Cleanup\ndel _train_df, _test_df, train_df\ngc.collect()","metadata":{"_uuid":"072f5e7b-15e7-49ac-8359-25cbd1d5bca7","_cell_guid":"8e82e5eb-d2bd-475c-9fde-a0b9018c2079","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. Model Definition and Training","metadata":{"_uuid":"d5224b51-58a6-4451-b0cf-69d1ef8fb308","_cell_guid":"e07d3cb6-792a-41fe-8300-a7231329ae9e","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"# Define OLS model\nOLS = LinearRegression(n_jobs=-1)\n\n# Train\nOLS.fit(x_train, y_train)","metadata":{"_uuid":"90c86505-33c7-4f04-ab2d-75cd85a9c5a1","_cell_guid":"f3704c2f-fc6c-4c1a-bd76-43464715abf5","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Model Evaluation","metadata":{"_uuid":"ec0b16b0-7033-453e-8a89-e5a17aaf1aeb","_cell_guid":"e961c5fe-997f-4e9b-80d3-8057436ec376","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"# Predict\ny_pred = OLS.predict(x_test)\n\n# Metrics\nmae = mean_absolute_error(y_test, y_pred)\nmse = mean_squared_error(y_test, y_pred)\nrmse = np.sqrt(mse)\nr2 = r2_score(y_test, y_pred)\ncorr_coef, p_val = pearsonr(y_test, y_pred)\n\nresults = pd.DataFrame({\n    'Model': ['Linear OLS'],\n    'MAE': [mae],\n    'MSE': [mse],\n    'RMSE': [rmse],\n    'R2': [r2],\n    'Pearson Corr': [corr_coef],\n    'P-value': [p_val],\n})\n\ndisplay(results)","metadata":{"_uuid":"fc024de2-9170-408b-a7f9-edbf30f0e343","_cell_guid":"bb3d1c5d-b4ea-4249-ac23-877792794732","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 5. Visualization of Predictions","metadata":{"_uuid":"7b7cfdbb-c7e1-4ca5-817b-086f3c37614a","_cell_guid":"3c15f64f-9cfe-4407-8c64-6487e746f83e","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"idx = np.random.RandomState(42).choice(len(y_test), size=100, replace=False)\n\nplt.figure(figsize=(12, 6))\nplt.plot(np.array(y_test)[idx], label='Actual', marker='o')\nplt.plot(y_pred[idx], label='Predicted (OLS)', marker='x')\nplt.title(\"OLS: Actual vs Predicted (100 Random Samples)\")\nplt.xlabel(\"Sample Index\")\nplt.ylabel(\"Target\")\nplt.legend()\nplt.tight_layout()\nplt.show()","metadata":{"_uuid":"718fe5d8-3c43-4525-9a99-6375349b1119","_cell_guid":"08824926-6761-4353-9460-918b08f42166","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## **6. FINAL TEST PREDICTION & SUBMISSION**","metadata":{}},{"cell_type":"code","source":"# Load test data\ntest_df = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/test.parquet', engine='pyarrow')\n\n# Drop label column if exists\ntest_df.drop(columns=['label'], errors='ignore', inplace=True)\n\n# Replace infinite values\ntest_df.replace([np.inf, -np.inf], 0, inplace=True)\n\n# Align test features with training features\ntest_df = test_df[x_train.columns]  # Ensures feature consistency\n\n# Make predictions\ntest_preds = OLS.predict(test_df)\n\n# Load and prepare submission\nsample_submission = pd.read_csv('/kaggle/input/drw-crypto-market-prediction/sample_submission.csv')\nsample_submission['prediction'] = test_preds\n\n# Save submission file\nsample_submission.to_csv('sample_submission.csv', index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Enhanced Pipeline: PCA-driven Weighted OLS for Superior Directional Signal**","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\nfrom sklearn.decomposition import PCA\nfrom sklearn.linear_model import LinearRegression\nfrom scipy.stats import pearsonr\nimport numpy as np\n\n# 1. Standardize features (critical for PCA stability)\n_scaler = StandardScaler()\nX_tr = _scaler.fit_transform(x_train.values)\nX_te = _scaler.transform(x_test.values)\n\n# 2. Automated PCA: retain 95% explained variance → minimal yet informative subspace\n_pca = PCA(n_components=0.95, svd_solver='full', random_state=0)\nX_tr_pca = _pca.fit_transform(X_tr)\nX_te_pca = _pca.transform(X_te)\n\n# 3. Exponential weighting: emphasize most recent observations (decay tuned via heuristic)\n_decay = 1e-4\n_idx  = np.arange(len(y_train))\n_wgts = np.exp(-_decay * (_idx.max() - _idx))  # newer rows receive higher weight\n\n# 4. Fit weighted OLS on reduced subspace\n_model = LinearRegression(n_jobs=-1)\n_model.fit(X_tr_pca, y_train, sample_weight=_wgts)\n\n# 5. Validation: compute Pearson correlation on held-out test slice\n_y_pred = _model.predict(X_te_pca)\n_corr, _ = pearsonr(y_test, _y_pred)\nprint(f'Enhanced PCA-OLS Pearson Corr: {_corr:.6f}')\n\n# 6. Autonomous Submission Logic: if improvement, overwrite predictions\nif _corr > corr_coef:\n    # scale & project full test set\n    X_full_te = _scaler.transform(test_df.values)\n    X_full_pca = _pca.transform(X_full_te)\n    sample_submission['prediction'] = _model.predict(X_full_pca)\n    sample_submission.to_csv('submission_enhanced.csv', index=False)\n    print('↳ submission_enhanced.csv generated (better than baseline)')\nelse:\n    print('↳ Baseline remains superior; no submission overwrite.')\n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"\n**This baseline serves as the foundational step and substantial work remains to build deeper modeling pipelines and extract meaningful signals.**","metadata":{"_uuid":"c6e0b015-b314-42a9-88a2-32d9d18875b3","_cell_guid":"55a8bc3d-fa18-4b3e-ad01-3d7467d7e50b","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}}]}