{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "50e3f1be-4e1f-4e8a-b927-f4bb6e6c7fa8", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "from sklearn.linear_model import LinearRegression, Lasso\n", "from sklearn.feature_selection import RFE\n", "from sklearn.preprocessing import PolynomialFeatures, StandardScaler\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import r2_score, mean_squared_error\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 49, "id": "a14b9fe5-a74a-433b-a712-ddca8f656715", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 1675 entries, 0 to 1674\n", "Data columns (total 42 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 AimoScore 1675 non-null float64\n", " 1 No_1_Angle_Deviation 1675 non-null float64\n", " 2 No_2_Angle_Deviation 1675 non-null float64\n", " 3 No_3_Angle_Deviation 1675 non-null float64\n", " 4 No_4_Angle_Deviation 1675 non-null float64\n", " 5 No_5_Angle_Deviation 1675 non-null float64\n", " 6 No_6_Angle_Deviation 1675 non-null float64\n", " 7 No_7_Angle_Deviation 1675 non-null float64\n", " 8 No_8_Angle_Deviation 1675 non-null float64\n", " 9 No_9_Angle_Deviation 1675 non-null float64\n", " 10 No_10_Angle_Deviation 1675 non-null float64\n", " 11 No_11_Angle_Deviation 1675 non-null float64\n", " 12 No_12_Angle_Deviation 1675 non-null float64\n", " 13 No_13_Angle_Deviation 1675 non-null float64\n", " 14 No_1_NASM_Deviation 1675 non-null float64\n", " 15 No_2_NASM_Deviation 1675 non-null float64\n", " 16 No_3_NASM_Deviation 1675 non-null float64\n", " 17 No_4_NASM_Deviation 1675 non-null float64\n", " 18 No_5_NASM_Deviation 1675 non-null float64\n", " 19 No_6_NASM_Deviation 1675 non-null float64\n", " 20 No_7_NASM_Deviation 1675 non-null float64\n", " 21 No_8_NASM_Deviation 1675 non-null float64\n", " 22 No_9_NASM_Deviation 1675 non-null float64\n", " 23 No_10_NASM_Deviation 1675 non-null float64\n", " 24 No_11_NASM_Deviation 1675 non-null float64\n", " 25 No_12_NASM_Deviation 1675 non-null float64\n", " 26 No_13_NASM_Deviation 1675 non-null float64\n", " 27 No_14_NASM_Deviation 1675 non-null float64\n", " 28 No_15_NASM_Deviation 1675 non-null float64\n", " 29 No_16_NASM_Deviation 1675 non-null float64\n", " 30 No_17_NASM_Deviation 1675 non-null float64\n", " 31 No_18_NASM_Deviation 1675 non-null float64\n", " 32 No_19_NASM_Deviation 1675 non-null float64\n", " 33 No_20_NASM_Deviation 1675 non-null float64\n", " 34 No_21_NASM_Deviation 1675 non-null float64\n", " 35 No_22_NASM_Deviation 1675 non-null float64\n", " 36 No_23_NASM_Deviation 1675 non-null float64\n", " 37 No_24_NASM_Deviation 1675 non-null float64\n", " 38 No_25_NASM_Deviation 1675 non-null float64\n", " 39 No_1_Time_Deviation 1675 non-null float64\n", " 40 No_2_Time_Deviation 1675 non-null float64\n", " 41 EstimatedScore 1675 non-null float64\n", "dtypes: float64(42)\n", "memory usage: 549.7 KB\n" ] } ], "source": [ "df = pd.read_csv(\"/Users/reemothman/Downloads/Data-intensive-systems/Datasets_all/A2_dataset_80.csv\")\n", "\n", "df.shape\n", "df.head()\n", "df.info()" ] }, { "cell_type": "code", "execution_count": 5, "id": "70cc5bc3-070b-4409-a65c-b3d6a87fdec1", "metadata": {}, "outputs": [], "source": [ "target = \"AimoScore\"\n", "\n", "X = df.drop(columns=[target])\n", "y = df[target]\n" ] }, { "cell_type": "code", "execution_count": 12, "id": "f1984e72-7e6b-4c28-8d80-e5799341a405", "metadata": {}, "outputs": [], "source": [ "#some features are identical, must be removed\n", "duplicates = X.T.duplicated()\n", "duplicate_cols = X.columns[duplicates]\n", "duplicate_cols\n", "X = X.loc[:, ~duplicates]" ] }, { "cell_type": "code", "execution_count": 13, "id": "d77dfd8c-b95f-4640-bf95-fa1c341c25c1", "metadata": {}, "outputs": [], "source": [ "# split \n", "X_train, X_test, y_train, y_test = train_test_split(\n", " X, y, test_size=0.2, random_state=42\n", ")\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "cf8f4a63-c5ab-4e8b-aada-f0e4a49bf0c1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LinearRegression()" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Train the model\n", "model = LinearRegression()\n", "model.fit(X_train, y_train)\n" ] }, { "cell_type": "code", "execution_count": 17, "id": "4c664e7e-c50e-43fb-a71e-5153b1a3c507", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "R2: 0.4863899887420844, RMSE: 0.16014781430803546\n" ] } ], "source": [ "# evaluation \n", "y_pred = model.predict(X_test)\n", "r2 = r2_score(y_test, y_pred)\n", "mse = mean_squared_error(y_test, y_pred)\n", "rmse = np.sqrt(mse)\n", "\n", "print(f\"R2: {r2}, RMSE: {rmse}\")\n", "\n", "#y_pred = model.predict(X_test)\n", "#r2 = r2_score(y_test, y_pred)\n", "#rmse = mean_squared_error(y_test, y_pred, squared=False)\n", "#r2, rmse" ] }, { "cell_type": "code", "execution_count": 18, "id": "a44dd5c8-9b19-48b1-8c3a-9371d318f7e6", "metadata": {}, "outputs": [ { "data": { "image/png": "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//e//y3mUC7zgVRwh+A8++OPP15MoJxK+MUXX5S91q1bN/HDHsmsWbO0Zs2aifU5pW3evHlODS2wmDnmDRs2FF+a2Af/MAFnjnksEDepOeaff/65KC3BEzSnhT/wwAMiJR84c8wPHz6sjRkzRgiaypUraw0aNNCuv/56bdeuXTjkknz66adxf5/148x/+bjHvqdt27biHPF1/uKLL2pWSeN/1BiVAAAAAADcBzE3AAAAAAgUEDcAAAAACBQQNwAAAAAIFBA3AAAAAAgUEDcAAAAACBQQNwAAAAAIFBA3AAAAAAgUEDcAgECQlpZG77zzjtvDAAB4AIgbAIApli5dKvrs9O7d2/SRa9SoEU2cONGVI/7bb7/RP//5Tzr++OMpMzNTNOrr2bMnLVmyxJXxAACcA13BAQCmeP755+mGG24Qf7dv30716tXzxRG89NJLRRftl19+mU444QTRcZgb9f3++++ObRNduwFwB1huAADS7Nu3j2bOnCksIGy5eemll8qt8+6779Lpp59OlStXptzcXLr44ovF8r/85S+0ZcsWGjFihHAh8YMZM2YMtW3bNuoz2LrDVh6dr776is4991zxeTk5OdStWzdasWKF9Lh3795NixYtoocfflh0MW/YsCF16NCB7rjjDtHZPHK9f/zjH1SnTh0x/pYtW9J7771X9vpbb71Fp5xyirD88PgeffTRqO3wMu5SP3DgQMrOzqahQ4eK5YsXL6auXbtSlSpVRPf0G2+8kYqKiqTHDwAwB8QNAECaWbNm0cknn0wnnXQSXXHFFfTCCy9QZHu6efPmCTHTq1cvWrlypbCMsIhgZs+eTccddxzdd9999Msvv4iHLHv37qVBgwYJkfDFF19Q06ZNxTZ4uQzVqlUTD47JKS4ujrtOaWkpnX/++cJN9dprr9H3339PDz30kHDBMcuXL6fLLruMLr/8cvrmm2+EKBs1alQ5gTdhwgRq06aN2H9+fcOGDXTeeecJy9HXX38txCHvx/Dhw6X3HwBgEsstNwEAoaNz587axIkTyzon5+bmik6+Op06ddIGDBhg+H7u5P74449HLeMu7m3atIlaxuvwukaUlJRo1atX1959992yZfxz9vbbbxu+580339Rq1qwpujzzftxxxx3a6tWry17/4IMPtAoVKmg//vhj3Pf3799fO/fcc6OW/fvf/9ZatGgRtX8XXXRR1DrXXHONNnTo0KhlixYtEts6cOCA4XgBANaB5QYAIMWPP/5Iy5Yto379+onnlSpVor59+4rYG51Vq1bROeeco/yIcnzMkCFDhMWG3VLs8mEX2datW6U/gy0nHCM0d+5cYUlZuHAhnXbaaWWWFx47W5aaNWsW9/0//PADdenSJWoZP1+3bh2VlJSULWvfvn3UOqtXrxbb0K1H/OBAZrYUbdq0yeSRAADIgIBiAIAULGKOHDkSFUDMBhOOP5k0aZIQHRxTYpYKFSpEubaYw4cPRz1nlxQH/j7xxBMiXoa32alTJxGwawaOo+HYHX6wy+jaa6+l0aNH01VXXWVp7PHIysqKes4ijON4OM4mFs7cAgCoB5YbAEBSWNS88sorIoCWLRz6g60SLHamT58u1mvdurWIszEiIyMjysrBHHvssZSfnx8lcPizI+E4GBYHHGejB/QWFBTYPnMtWrQoC+zlsf/888+0du3auOs2b968XNo4P2dLjx6XEw+2DnH8zoknnljuwccDAKAeiBsAQFI4Y2jXrl10zTXXiAyiyAe7e3TXFFtBWOjwX3bjcOAtZyhFZhN99tlntG3btjJxwllUXIPmkUceEcG3kydPpvfffz9q++yOevXVV8VnfvnllzRgwABTlha2+nTv3l0ECnNQL7uD3njjDbHNCy+8UKzDGVhnnXWW2J8PP/xQrMPjWLBggXj9lltuEcKNs6FYAHFKOVusbr311oTbvv322+nzzz8XAcQs2tiNNWfOHAQUA+AkNuJ1AAAh4W9/+5vWq1evuK99+eWXIphXD8596623tLZt22oZGRki4PiSSy4pW3fp0qVa69attczMTPEenaefflpr0KCBlpWVpQ0cOFB74IEHogKKV6xYobVv314EAzdt2lR74403ygUnJwooPnjwoDZy5EjttNNO03JycrSqVatqJ510knb33Xdr+/fvL1vv999/1wYPHqwdc8wxYlstW7bU3nvvvaigZA4gTk9P144//nht/PjxSQOmmWXLlolg5GrVqol95GPA+wgAcIY0/sdR9QQAAAAAkELglgIAAABAoIC4AQAAAECggLgBAAAAQKCAuAEAAABAoIC4AQAAAECggLgBAAAAQKCAuAEAAABAoIC4AQAAAECggLgBAAAAQKCAuAEAAABAoIC4AQAAAECggLgBAAAAAAWJ/w/3lLcSd96/LQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot predicted vs actual\n", "\n", "plt.scatter(y_test, y_pred)\n", "plt.xlabel(\"Actual Score\")\n", "plt.ylabel(\"Predicted Score\")\n", "plt.title(\"Baseline Regression\")\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 41, "id": "8b0d7b0e-692f-4ba1-80ce-0b6f2e79ca0e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Corr-filtered R2: 0.4870508755461206\n", "Corr-filtered RMSE: 0.025614320779348027\n" ] } ], "source": [ "# Correlation-Based Feature Selection\n", "# Remove highly correlated features (>0.9).\n", "\n", "corr_matrix = X.corr().abs()\n", "upper = corr_matrix.where(\n", " np.triu(np.ones(corr_matrix.shape), k=1).astype(bool)\n", ")\n", "\n", "to_drop = [column for column in upper.columns if any(upper[column] > 0.9)]\n", "X_corr_reduced = X.drop(columns=to_drop)\n", "len(to_drop)\n", "\n", "# Split into train/test (again)\n", "#X_train_c, X_test_c, y_train_c, y_test_c = train_test_split(\n", "# X_corr_reduced,\n", " # y,\n", "# test_size=0.2,\n", " # random_state=42\n", "#)\n" ] }, { "cell_type": "code", "execution_count": 24, "id": "652119d0-015d-4af9-a454-a463f724a7ff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['No_3_Angle_Deviation', 'No_8_Angle_Deviation', 'No_11_Angle_Deviation',\n", " 'No_12_Angle_Deviation', 'No_13_Angle_Deviation', 'No_6_NASM_Deviation',\n", " 'No_8_NASM_Deviation', 'No_9_NASM_Deviation', 'No_10_NASM_Deviation',\n", " 'No_12_NASM_Deviation', 'No_13_NASM_Deviation', 'No_15_NASM_Deviation',\n", " 'No_17_NASM_Deviation', 'No_19_NASM_Deviation', 'No_21_NASM_Deviation',\n", " 'No_22_NASM_Deviation', 'No_23_NASM_Deviation', 'No_25_NASM_Deviation',\n", " 'No_2_Time_Deviation', 'EstimatedScore'],\n", " dtype='object')\n" ] } ], "source": [ "# Recursive Feature Elimination (RFE)\n", "\n", "rfe = RFE(\n", " estimator=LinearRegression(),\n", " n_features_to_select=20\n", ")\n", "\n", "rfe.fit(X_train, y_train)\n", "\n", "selected_features = X_train.columns[rfe.support_]\n", "\n", "print(selected_features)" ] }, { "cell_type": "code", "execution_count": 42, "id": "a6a79d77-8f15-4607-b05c-42330b43bf34", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LinearRegression()\n" ] } ], "source": [ "#Train using selected features\n", "\n", "model_rfe = LinearRegression()\n", "model_rfe.fit(X_train[selected_features], y_train)\n" ] }, { "cell_type": "code", "execution_count": 26, "id": "8946a54b-cbb2-4906-a6bd-ca4bbf7c0245", "metadata": {}, "outputs": [], "source": [ "# Lasso Feature Selection, lasso shrinks weak coefficients to zero.\n", "# ! Requires scaling\n", "scaler = StandardScaler()\n", "X_scaled = scaler.fit_transform(X)" ] }, { "cell_type": "code", "execution_count": 27, "id": "01d5b9cf-ff72-491a-abc8-007cefeedc28", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Lasso(alpha=0.01)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Lasso(alpha=0.01)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#train Lasso\n", "lasso = Lasso(alpha=0.01)\n", "lasso.fit(X_scaled, y)" ] }, { "cell_type": "code", "execution_count": 30, "id": "404276d2-4101-45ea-9283-add955a655c8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['No_3_Angle_Deviation', 'No_8_Angle_Deviation', 'No_9_Angle_Deviation',\n", " 'No_11_Angle_Deviation', 'No_12_Angle_Deviation',\n", " 'No_13_Angle_Deviation', 'No_6_NASM_Deviation', 'No_9_NASM_Deviation',\n", " 'No_10_NASM_Deviation', 'No_11_NASM_Deviation', 'No_12_NASM_Deviation',\n", " 'No_15_NASM_Deviation', 'No_17_NASM_Deviation', 'No_19_NASM_Deviation',\n", " 'No_2_Time_Deviation', 'EstimatedScore'],\n", " dtype='object')" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Selected features\n", "\n", "lasso_features = X.columns[lasso.coef_ != 0]\n", "lasso_features" ] }, { "cell_type": "code", "execution_count": 34, "id": "cf661033-9bb4-440f-a36a-0f1e84667469", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.36107126 0.56193209 0.34672406 ... 0.06779253 0.02844099 0.02934304]\n", " [0.27977044 0.86800574 0.34672406 ... 0.02247705 0.02631807 0.02674119]\n", " [0.27977044 0.1037781 0.34672406 ... 0.02247705 0.04644784 0.04719459]\n", " ...\n", " [0.77666188 0.3950263 0.34672406 ... 0.02505717 0.01933842 0.01957354]\n", " [0.95504543 0.79244381 0.34672406 ... 0.03440218 0.14653587 0.09728012]\n", " [0.30846485 0.09230033 0.34672406 ... 0.02666892 0.09156891 0.07841673]]\n" ] } ], "source": [ "# Polynomial / Interaction Features, add interactions.\n", "\n", "# Limit degree to 2\n", "\n", "poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)\n", "X_poly = poly.fit_transform(X)\n", "print(X_poly)\n", "\n", "# Warning, Interaction features increase dimensionality significantly — risk of overfitting." ] }, { "cell_type": "code", "execution_count": 35, "id": "7b071964-80dc-453b-a3de-b381e9cc25cf", "metadata": {}, "outputs": [], "source": [ "# apply symmetry constraints, assignment gives symmetric pairs\n", "\n", "sym_pairs = [\n", " (4,6), (5,7), (8,11), (9,12), (10,13),\n", " (14,15), (17,18), (21,22), (24,25),\n", " (26,27), (28,29), (31,32)\n", "]\n", "\n", "for a, b in sym_pairs:\n", " colA = X.columns[a-1]\n", " colB = X.columns[b-1]\n", " X[f\"{colA}_{colB}_sym\"] = (X[colA] + X[colB]) / 2\n", "\n", "# Left-right symmetric features were averaged to enforce movement symmetry invariance.\n" ] }, { "cell_type": "markdown", "id": "3aa1c0c9-c01d-4290-9386-30040336523f", "metadata": {}, "source": [ "# Experiment Documentation Structur, the notebook should includes:\n", "\n", "- 1 Dataset Overview\n", "- 2 Duplicate Feature Removal\n", "- 3 Baseline Regression\n", "- 4 Correlation Filtering\n", "- 5 RFE Selection\n", "- 6 Lasso Selection\n", "- 7 Polynomial Features\n", "- 8 Symmetry Feature Engineering\n", "- 9 Model Comparison Table\n", "- 10 Champion Candidate Discussion\n" ] }, { "cell_type": "markdown", "id": "9d5b37bf-0c1d-4c5f-a22c-e03aa186cb21", "metadata": {}, "source": [ "|- Variant | R² | RMSE | #Features |\n", "| ------------- | -- | ---- | --------- |\n", "|- Baseline | | | |\n", "|- Corr filtered | | | |\n", "|- RFE | | | |\n", "|- Lasso | | | |\n", "|- Symmetry | | | |\n" ] }, { "cell_type": "code", "execution_count": null, "id": "c7a90c18-dbb2-4f06-a2e4-bf494d0e32fc", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.8" } }, "nbformat": 4, "nbformat_minor": 5 }