{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","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":"code","source":"import random\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\nfrom sklearn.decomposition import PCA\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.model_selection import KFold\n\nfrom catboost import CatBoostRegressor\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\n\nimport torch\nfrom torch import nn\nfrom torch.utils.data import Dataset, DataLoader\nimport torch.optim as optim\nfrom torch.utils.data import DataLoader, TensorDataset, random_split\n\nfrom scipy.stats import pearsonr","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:01:20.073368Z","iopub.execute_input":"2025-05-22T19:01:20.074100Z","iopub.status.idle":"2025-05-22T19:01:20.079498Z","shell.execute_reply.started":"2025-05-22T19:01:20.074076Z","shell.execute_reply":"2025-05-22T19:01:20.078686Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/train.parquet')\ntest = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/test.parquet')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:00:48.152666Z","iopub.execute_input":"2025-05-22T19:00:48.153282Z","iopub.status.idle":"2025-05-22T19:01:08.348249Z","shell.execute_reply.started":"2025-05-22T19:00:48.153263Z","shell.execute_reply":"2025-05-22T19:01:08.312122Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head(2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:01:08.349056Z","iopub.execute_input":"2025-05-22T19:01:08.349234Z","iopub.status.idle":"2025-05-22T19:01:08.419123Z","shell.execute_reply.started":"2025-05-22T19:01:08.349218Z","shell.execute_reply":"2025-05-22T19:01:08.418439Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"x_features = [col for col in train.columns if col.startswith('X')]\n\nkey_features = ['bid_qty', 'ask_qty', 'buy_qty', 'sell_qty', 'volume']\n\nlabel_col = 'label'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:01:08.420806Z","iopub.execute_input":"2025-05-22T19:01:08.421043Z","iopub.status.idle":"2025-05-22T19:01:08.425175Z","shell.execute_reply.started":"2025-05-22T19:01:08.421028Z","shell.execute_reply":"2025-05-22T19:01:08.424501Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(x_features)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:01:08.425883Z","iopub.execute_input":"2025-05-22T19:01:08.426347Z","iopub.status.idle":"2025-05-22T19:01:08.443882Z","shell.execute_reply.started":"2025-05-22T19:01:08.426317Z","shell.execute_reply":"2025-05-22T19:01:08.443354Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Machine Learning","metadata":{}},{"cell_type":"code","source":"def val_loss_function(y_true, y_pred):\n    y_true, y_pred = np.array(y_true), np.array(y_pred)\n\n    # if np.std(y_true) == 0 or np.std(y_pred) == 0:\n    #     return 1.0 \n\n    corr, _ = pearsonr(y_true, y_pred)\n    return corr\n\ndef cross_val_predict(model, X_train, y_train, X_test, val_loss_function, n_splits=5, random_state=42):\n    print(f\"Model: {model.__class__.__name__}\")\n\n    oof_preds = np.zeros(X_train.shape[0])\n    test_preds = np.zeros(X_test.shape[0])\n\n    \n    kf = KFold(n_splits=n_splits, shuffle=True, random_state=random_state)\n    val_score = 0\n    val_score_log = 0\n    \n    for fold, (train_idx, val_idx) in enumerate(kf.split(X_train)):\n        print(f\"Fold {fold + 1}\")\n        \n        X_tr, X_val = X_train.iloc[train_idx], X_train.iloc[val_idx]\n        y_tr, y_val = y_train.iloc[train_idx], y_train.iloc[val_idx]\n        \n        model.fit(X_tr, y_tr)\n        \n        val_preds = model.predict(X_val)\n        oof_preds[val_idx] = val_preds\n        cur_val_score = val_loss_function(y_val, val_preds)\n        print(f\"Current validation score: {cur_val_score}\")\n          \n        val_score += cur_val_score / n_splits\n\n        test_preds += model.predict(X_test) / n_splits\n\n\n    print(f\"Average validation score: {val_score}\")\n    return oof_preds, test_preds, val_score","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:01:08.444475Z","iopub.execute_input":"2025-05-22T19:01:08.444714Z","iopub.status.idle":"2025-05-22T19:01:08.468551Z","shell.execute_reply.started":"2025-05-22T19:01:08.444660Z","shell.execute_reply":"2025-05-22T19:01:08.468048Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train = train[key_features]\nX_test = test[key_features]\ny_train = train[label_col]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:01:08.469102Z","iopub.execute_input":"2025-05-22T19:01:08.469327Z","iopub.status.idle":"2025-05-22T19:01:08.502869Z","shell.execute_reply.started":"2025-05-22T19:01:08.469312Z","shell.execute_reply":"2025-05-22T19:01:08.502306Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"models = [\n    LGBMRegressor(\n        boosting_type='gbdt',\n        device='gpu'  \n    ),\n    XGBRegressor(\n        n_estimators=100,\n        learning_rate=0.1,\n        max_depth=6,\n        tree_method='gpu_hist', \n        predictor='gpu_predictor'\n    ),\n    CatBoostRegressor(\n        verbose=0,\n        task_type='GPU',  \n        devices='0'       \n    )\n]\n\nresults = {}\n\nfor model in models:\n    oof, test, score = cross_val_predict(model, X_train, y_train, X_test, val_loss_function)\n    results[model.__class__.__name__] = {\n        \"oof\": oof,\n        \"test\": test,\n        \"score\": score\n    }\n    print(f\"Final validation score for {model.__class__.__name__}: {score}\\n\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:01:24.066310Z","iopub.execute_input":"2025-05-22T19:01:24.067025Z","iopub.status.idle":"2025-05-22T19:02:11.984738Z","shell.execute_reply.started":"2025-05-22T19:01:24.067001Z","shell.execute_reply":"2025-05-22T19:02:11.983595Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_pred = (results['LGBMRegressor']['test'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:03:43.051810Z","iopub.execute_input":"2025-05-22T19:03:43.052784Z","iopub.status.idle":"2025-05-22T19:03:43.056456Z","shell.execute_reply.started":"2025-05-22T19:03:43.052757Z","shell.execute_reply":"2025-05-22T19:03:43.055616Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub = pd.read_csv('/kaggle/input/drw-crypto-market-prediction/sample_submission.csv')\nsub['prediction'] = y_pred\nsub.to_csv('submission.csv', index = False)\nsub","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T19:03:56.773203Z","iopub.execute_input":"2025-05-22T19:03:56.773480Z","iopub.status.idle":"2025-05-22T19:03:58.167003Z","shell.execute_reply.started":"2025-05-22T19:03:56.773462Z","shell.execute_reply":"2025-05-22T19:03:58.166375Z"}},"outputs":[],"execution_count":null}]}