{"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":"### **[1] LIBRARY IMPORTS AND ENVIRONMENT CONFIGURATION**","metadata":{}},{"cell_type":"code","source":"# Suppress warnings for clean output\nimport warnings; warnings.filterwarnings(\"ignore\")\n\n# System memory management\nimport gc\n\n# Core data handling libraries\nimport pandas as pd\nimport numpy as np\n\n# Feature selection and model components\nfrom sklearn.feature_selection import SelectKBest, f_regression\nfrom sklearn.linear_model import Ridge\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import Pipeline\n\n# Visualization and metrics\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\nfrom scipy.stats import pearsonr\n\n# Display utility for output formatting\nfrom IPython.display import display\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### *[2] DATASET INGESTION AND INITIAL PREPROCESSING*","metadata":{}},{"cell_type":"code","source":"# Load raw training data from Parquet format\ndf = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/train.parquet', engine='pyarrow')\n\n# Replace infinite values with zeros to prevent computation errors\ndf.replace([np.inf, -np.inf], 0, inplace=True)\n\n# Segment data for training and validation\n_tr = df.iloc[:200_000]\n_te = df.iloc[500_000:550_000]\n\n# Split features and target labels\nX_train = _tr.drop(columns=['label'])\ny_train = _tr['label']\nX_test  = _te.drop(columns=['label'])\ny_test  = _te['label']\n\n# Explicitly delete unused dataframes and trigger garbage collection\ndel df, _tr, _te\ngc.collect()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### **[3] MACHINE LEARNING PIPELINE CONSTRUCTION AND MODEL FITTING**","metadata":{}},{"cell_type":"code","source":"pipe = Pipeline([\n    ('select', SelectKBest(f_regression, k=200)),     # Feature selection: retain top 200 based on correlation\n    ('scale', StandardScaler()),                      # Feature scaling: zero-mean, unit variance normalization\n    ('ridge', Ridge(alpha=1.0, random_state=42))      # Ridge Regression: L2-regularized linear model\n])\n\n# Train the pipeline end to end\npipe.fit(X_train, y_train)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### **[4] MODEL EVALUATION ON HELD OUT VALIDATION SEGMENT**","metadata":{}},{"cell_type":"code","source":"# Predict target values for the test set\ny_pred = pipe.predict(X_test)\n\n# Compute evaluation 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, pval = pearsonr(y_test, y_pred)\n\n# Display evaluation results\nresults = pd.DataFrame([{\n    'Model': 'Ridge+SelectK',\n    'MAE': mae,\n    'MSE': mse,\n    'RMSE': rmse,\n    'R2': r2,\n    'Pearson Corr': corr,\n    'P-value': pval\n}])\n\ndisplay(results)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### **[5] DIAGNOSTIC VISUALIZATION: ACTUAL VS PREDICTED COMPARISON**","metadata":{}},{"cell_type":"code","source":"# Select a random sample of 100 points for plotting\nidx = np.random.RandomState(42).choice(len(y_test), 100, replace=False)\n\n# Plot actual vs predicted values\nplt.figure(figsize=(10, 5))\nplt.plot(y_test.values[idx], marker='o', label='Actual')\nplt.plot(y_pred[idx], marker='x', label='Predicted')\nplt.title('Actual vs Predicted (100 samples)')\nplt.legend()\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### **[6] GENERATING FINAL TEST PREDICTIONS AND SUBMISSION FILE**","metadata":{}},{"cell_type":"code","source":"# Load the test dataset for final prediction\ntest_df = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/test.parquet', engine='pyarrow')\n\n# Drop target column and replace infinities\ntest_df.drop(columns=['label'], inplace=True)\ntest_df.replace([np.inf, -np.inf], 0, inplace=True)\n\n# Make predictions\npreds = pipe.predict(test_df)\n\n# Prepare submission file\nsub = pd.read_csv('/kaggle/input/drw-crypto-market-prediction/sample_submission.csv')\nsub['prediction'] = preds\n\n# Save to CSV\nsub.to_csv('ridge_selectk_submission.csv', index=False)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **[7] SCIENTIFIC VISUALIZATION: Residual Analysis and Feature Coefficients**","metadata":{}},{"cell_type":"code","source":"# 1. Residual Distribution\n\nresiduals = y_test.values - y_pred\nplt.figure(figsize=(8, 4))\nplt.hist(residuals, bins=50)\nplt.title(\"Residual Distribution\")\nplt.xlabel(\"Residual (Actual − Predicted)\")\nplt.ylabel(\"Frequency\")\nplt.tight_layout()\nplt.show()\n\n# 2. Predicted vs Actual Scatter\n\nplt.figure(figsize=(6, 6))\nplt.scatter(y_test.values, y_pred, alpha=0.4)\nplt.plot([y_test.min(), y_test.max()],\n         [y_test.min(), y_test.max()],\n         linestyle=\"--\")\nplt.title(\"Predicted vs Actual\")\nplt.xlabel(\"Actual Label\")\nplt.ylabel(\"Predicted Label\")\nplt.tight_layout()\nplt.show()\n\n# 3. Top-10 Ridge Coefficients (Post-Selection)\n\n# retrieve selected feature names\nselected_feats = X_train.columns[pipe.named_steps['select'].get_support()]\n# retrieve corresponding coefficients\ncoefs = pipe.named_steps['ridge'].coef_\n# identify top 10 by absolute value\nidx_top = np.argsort(np.abs(coefs))[-10:]\nplt.figure(figsize=(6, 4))\nplt.barh(selected_feats[idx_top], coefs[idx_top])\nplt.title(\"Top-10 Feature Coefficients\")\nplt.xlabel(\"Coefficient Value\")\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}