XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
+ "XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
+
" colsample_bylevel=None, colsample_bynode=None,\n",
" colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
" enable_categorical=False, eval_metric=None, feature_types=None,\n",
@@ -5556,7 +3349,9 @@
" max_delta_step=None, max_depth=None, max_leaves=None,\n",
" min_child_weight=None, missing=nan, monotone_constraints=None,\n",
" multi_strategy=None, n_estimators=None, n_jobs=None,\n",
- " num_parallel_tree=None, random_state=None, ...) 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. XGBRegressoriFitted XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
+
+ " num_parallel_tree=None, random_state=None, ...) 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. XGBRegressoriFitted XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
+
" colsample_bylevel=None, colsample_bynode=None,\n",
" colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
" enable_categorical=False, eval_metric=None, feature_types=None,\n",
@@ -5582,7 +3377,9 @@
" num_parallel_tree=None, random_state=None, ...)"
]
},
- "execution_count": 78,
+
+ "execution_count": 150,
+
"metadata": {},
"output_type": "execute_result"
}
@@ -5594,16 +3391,20 @@
},
{
"cell_type": "code",
- "execution_count": 80,
+
+ "execution_count": 94,
+
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "RMSE: 224.66436370022384\n",
- "MAE: 162.62070643817412\n",
- "MAPE: 0.7441437311249671\n",
+
+ "RMSE: 2.733930065274145\n",
+ "MAE: 1.502457380471909\n",
+ "MAPE: 0.010026410639661481\n",
+
"\n"
]
}
@@ -5627,7 +3428,9 @@
},
{
"cell_type": "code",
- "execution_count": 83,
+
+ "execution_count": 97,
+
"metadata": {
"id": "HNq66cXRiYPJ"
},
@@ -5638,7 +3441,9 @@
},
{
"cell_type": "code",
- "execution_count": 85,
+
+ "execution_count": 152,
+
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
@@ -5651,7 +3456,9 @@
{
"data": {
"text/html": [
- "AdaBoostRegressor() 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. "
+ "AdaBoostRegressor() 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": [
"AdaBoostRegressor()"
]
},
- "execution_count": 85,
+
+ "execution_count": 152,
+
"metadata": {},
"output_type": "execute_result"
}
@@ -6073,9 +3957,24 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+
+ "execution_count": 105,
+ "metadata": {
+ "id": "Bf1m5ukOi2VM"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 9.175482477551942\n",
+ "MAE: 7.527617905792734\n",
+ "MAPE: 0.1858930099598583\n",
+ "\n"
+ ]
+ }
+ ],
+
"source": [
"rmse, mae, mape = evaluate_model(model6, X_test_scaled, y_test)\n",
"metrics[\"Model\"].append(\"AdaBoost Regressor\")\n",
@@ -6095,7 +3994,9 @@
},
{
"cell_type": "code",
- "execution_count": 90,
+
+ "execution_count": 108,
+
"metadata": {
"id": "23DZ2biSjF9a"
},
@@ -6106,7 +4007,9 @@
},
{
"cell_type": "code",
- "execution_count": 92,
+
+ "execution_count": 154,
+
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
@@ -6119,7 +4022,9 @@
{
"data": {
"text/html": [
- "DecisionTreeRegressor() 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. "
+ "DecisionTreeRegressor() 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": [
"DecisionTreeRegressor()"
]
},
- "execution_count": 92,
+
+ "execution_count": 154,
+
"metadata": {},
"output_type": "execute_result"
}
@@ -6541,9 +4523,24 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+
+ "execution_count": 112,
+ "metadata": {
+ "id": "BFJ9q_tvkgRC"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 3.12966540689625\n",
+ "MAE: 1.6497286032971983\n",
+ "MAPE: 0.010286427942970355\n",
+ "\n"
+ ]
+ }
+ ],
+
"source": [
"rmse, mae, mape = evaluate_model(model7, X_test_scaled, y_test)\n",
"metrics[\"Model\"].append(\"Decision Tree\")\n",
@@ -6563,7 +4560,9 @@
},
{
"cell_type": "code",
- "execution_count": 97,
+
+ "execution_count": 115,
+
"metadata": {
"id": "JVDSed7yktFY"
},
@@ -6575,7 +4574,9 @@
},
{
"cell_type": "code",
- "execution_count": 99,
+
+ "execution_count": 156,
+
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
@@ -6588,7 +4589,9 @@
{
"data": {
"text/html": [
- "KNeighborsRegressor() 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. "
+ "KNeighborsRegressor() 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": [
"KNeighborsRegressor()"
]
},
- "execution_count": 99,
+
+ "execution_count": 156,
+
"metadata": {},
"output_type": "execute_result"
}
@@ -7010,9 +5090,24 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+
+ "execution_count": 119,
+ "metadata": {
+ "id": "hbfbbjcSlDn7"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 3.0274590148039873\n",
+ "MAE: 1.7525904376439672\n",
+ "MAPE: 0.013668115353592272\n",
+ "\n"
+ ]
+ }
+ ],
+
"source": [
"rmse, mae, mape = evaluate_model(model8, X_test_scaled, y_test)\n",
"metrics[\"Model\"].append(\"KNN\")\n",
@@ -7045,7 +5140,9 @@
},
{
"cell_type": "code",
- "execution_count": 106,
+
+ "execution_count": 124,
+
"metadata": {
"id": "ZIf94WLMlv04"
},
@@ -7057,7 +5154,9 @@
},
{
"cell_type": "code",
- "execution_count": 108,
+
+ "execution_count": 126,
+
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
@@ -7069,10 +5168,12 @@
{
"data": {
"text/plain": [
- ""
+
+ ""
]
},
- "execution_count": 108,
+ "execution_count": 126,
+
"metadata": {},
"output_type": "execute_result"
}
@@ -7084,7 +5185,9 @@
},
{
"cell_type": "code",
- "execution_count": 109,
+
+ "execution_count": 128,
+
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
@@ -7098,9 +5201,11 @@
"output_type": "stream",
"text": [
"\u001b[1m45/45\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step\n",
- "RMSE: 2.8150472311407646\n",
- "MAE: 1.8129405045040394\n",
- "MAPE: 0.013972537999927807\n",
+
+ "RMSE: 2.801001091255311\n",
+ "MAE: 1.7605365826618848\n",
+ "MAPE: 0.0126215060590655\n",
+
"\n"
]
}
@@ -7124,7 +5229,9 @@
},
{
"cell_type": "code",
- "execution_count": 111,
+
+ "execution_count": 131,
+
"metadata": {
"id": "uACvajfImrbB"
},
@@ -7155,7 +5262,9 @@
},
{
"cell_type": "code",
- "execution_count": 117,
+
+ "execution_count": 135,
+
"metadata": {
"id": "YpSfHu6gov35"
},
@@ -7167,7 +5276,9 @@
},
{
"cell_type": "code",
- "execution_count": 119,
+
+ "execution_count": 137,
+
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
@@ -7179,10 +5290,12 @@
{
"data": {
"text/plain": [
- ""
+
+ ""
]
},
- "execution_count": 119,
+ "execution_count": 137,
+
"metadata": {},
"output_type": "execute_result"
}
@@ -7207,20 +5320,11 @@
},
{
"cell_type": "code",
- "execution_count": 123,
+
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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q1WrlnV/xMWLFzVs2DBNmTJFEydO1MSJE61yXl5eVrn88Pvvv+f6SGZERIQ1/Ur5+WRF9h/V7HX9Wdn3lQwZMkRDhgzJtczVAezq9mQvo3bt2rnOf/V9JT4+PvLy8nIZ53Q6Xe7L+LP69Omje+65R2PHjtVvv/2W5/0P2fsqt30UERFhbe/scmFhYTnKXT3u119/1YEDB/IMiVdvzysNHz5cvr6+euutt/T666/Lzc1NDRo00IQJE/L1PYz/PgQG/C1VqFDB+nBr3LixsrKyNGvWLC1evFgPPfRQnvM98sgjeumll+RwONSzZ88bWqeHh4dGjhypKVOm6LvvvvtT9bcTHByslJSUHON/+eUXSVJISIjL+Px67t8Yo48++ki+vr759scju67Dhw9Xu3btci0THR3t8vrq9mQvY/HixTnOtgvK3XffrejoaI0ePVpNmzZVZGRkruWCg4MlSSkpKS6PpkqX92d227LLpaam5lhGamqqS4AMCQmRt7d3jhsvr5yeF3d3dw0aNEiDBg3SyZMntWbNGr3wwguKi4vTkSNH5OPjk3ej8T+NwID/ChMnTtQHH3ygl19+We3atcvzSYaePXtq69atqlChgu644448l5eSkpLrGeGePXsk5d/Zd16aNGmi8ePH6+uvv1aNGjWs8fPnz5fD4VDjxo1vyXpHjRql77//Xi+88EKOM/SbFR0drbJly+qbb77RuHHjbmoZcXFxcnd3148//pjjcsXNyv6OjHPnzt30Ml566SUtXrxY/fr1y7PMfffdJ0l66623XHpIEhMTtWfPHr344ouSLl9m8/Ly0ttvv+3Sxs2bN+unn35yCQytW7fWuHHjFBwcrJIlS950/QsXLqyHHnpIP//8swYOHKhDhw4pJibmppeH/24EBvxXKFKkiIYPH67nnntO77zzjrp165ZruYiICOsbCa8lLi5Od955p9q0aaPy5cvr0qVLSkpK0uTJk+Xn56cBAwa4lD937py++uqrXJd111133XB7nn32Wc2fP1+tWrXS6NGjFRUVpU8++UQzZszQU0899ae/DOnkyZNWfc+cOWN9cdOmTZvUoUMH6wuN8ssbb7yhFi1aKC4uTr169dIdd9yhP/74Q3v27NHXX3+t999//5rzlyhRQqNHj9aLL76ogwcPWvet/Prrr9q2bZt8fX1vuM7+/v6KiorShx9+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k5aWZiRZn1P16tUzHTp0MD4+PmbAgAHWuqKioswDDzzg0gNTs2ZNExgY6NJDd+XnW9GiRY3T6TRpaWk5jpsdO3ZYx2lux01ERIQZO3asGTp0qKlbt64xxpjatWubvn37GmP+//M3+z1hTM4e1oYNG5pq1aq5bLMRI0aYZs2auYx76KGHrLp8/PHHxsvLy6WneOTIkSYoKMh07tzZdOrUydx3333GmLx7GHbu3GlWrFhhPDw8zIEDB4wxt76HoX79+i7HR0hIiFm9evUN16thw4ZmwIAB5vz58yYqKsqMHj3aGEMPQ7658mw/PDxckqwz0h07dmju3Lny8/Ozhri4OF26dEnJycmSpJ07d+r+++9XVFSU/P391ahRI0nKcQ0qO+XbmTJlipKSkrR69WpVq1ZNU6ZMUZkyZaz6pKenKzg42KVOycnJ+vHHHyVdPqupU6eOyzKvfi1JlStXtu4fyF72gQMH5O/vby03KChI58+f148//qigoCD16tVLcXFxatOmjXX9sX379vrll1/UrVs3HTx4UDNmzFD16tU1ceJESZdTsTFGwcHBSkpK0rBhw+Tu7q4qVaro999/V1ZWlqTLZ5kNGzZUyZIlrTPin3/+Ocd2rFixotzc3Fz2Wfb+2rNnj9zd3V22dfny5V1+VGzPnj2KjIx0+RnzmJgYFS5c2OUsp0SJEvL397deh4aGKiYmRoUKFXIZd2XvRW6io6OVlJRkDdlnn3v27FHVqlXl6/v/v0N/991369KlSy7X6vPaT40bN7a275X7KTExUe3atVNGRobef/99vfbaa8rKytLQoUOVlJSkJ598UqVKlZIktWrVytr+V+rdu7fmzp2rgwcPasuWLerates125gtISFBPj4+Sk5O1tGjR63x6enpOnv2rDp16iRJcnd3V+fOnRUbG6s33nhDZ86c0d69e1WvXj1Jl++jSEpKUo8ePRQdHa1x48bpiSee0IIFC/Tkk09ax1iLFi2Unp6uw4cPKzg4WNHR0bp48aKGDh2qcuXKqV+/fvr888+ttt51113av3+/9uzZo5YtWyoqKkqlSpVS9+7dlZmZqf379ysrK0t79uyRw+FQWFiY1Ybs5We/R5555hmNGTNGd999t0aOHKlvv/32urZRblq0aKFGjRpp4cKFioqK0ty5c61exRMnTujMmTNWb19aWpr1eVC1alXrl3iz35dJSUlq3ry51UN3pas/g9LS0nTq1Ck5nU55eHjIy8tLzZo1sz7fvL29FRQUpFKlSumFF15QUFCQgoODrXU3adJE0uXelv/85z86d+6cSpQoIWOMfvnlF919990ux+fdd9+doyfB7nPx6uk7duzQunXrXD7/sp98Cw0N1Ysvvqjz58+radOm1vRx48bpjz/+0I8//qgxY8Zo06ZNWrVq1TXXGxcXp3vuuUcjRoy4Zrn8sHfvXm3bts3l+OjYsaMSEhJuul5Op1OjR4/WpEmTdPz48VtS7/zytwoM2QemJOuu3Ow7ky9duqQnnnjC5QP/m2++0f79+1W6dGmdOXNGzZo1k5+fn9566y0lJiZaN4xdfYPOlX8YriUsLExlypRR48aN9f7776tfv376/vvvrfqEh4e71CcpKUl79+7V0KFDc7Qjm8nlizevrs+lS5dUs2bNHMvet2+funTpIunyDUlbtmxR/fr1tWjRIpUrV05fffWVvLy8tGDBAu3Zs0cjR45UWFiYhg0bpqVLlyowMFCenp46c+aMypQpozVr1qhLly66dOmSyx3gxhht2rRJffv21caNG/X0008rODg4x3a8cn9ltzV7OeaKLu68GGNynX71+NzWc61158XT01NlypSxhisvx+RVzyvH57WfNm7cKIfDof79+7vsp1KlSumDDz5QjRo1FB4erkWLFunnn39Wenq6ypQpo+DgYPn7+2vq1KnavHmz1q1bl2P9LVu21Pnz59WnTx+1adPG+iNxLVu2bNGUKVP04Ycfql69eurTp4+1P7Kf1rjjjjvk7u4ud3d3JSQkaPXq1bn+0l6hQoVUpkwZFS5cWF5eXho0aJAaN26sAQMGaMeOHerdu7fc3Ny0Y8cOl/dI9vpCQkLk6empkJAQ3XfffVZbd+3aZZXz8vLS119/rYULFyo8PFzvvPOOLl68qJMnT+Z6vGTPl71vHn30UR08eFDdu3fXrl27VKtWLU2bNs12O+Um+w9bx44dNWrUKD344IPKyMiQdPlGt7CwMCUlJWnAgAEKDQ3VmjVrtGbNGm3dutW6Gz77CQBvb2+XbXGlq99Lbm5ueuqppzRz5kx17txZAQEBKl++vL7//nuVLl1aDodDgwcP1sKFCxUQEKATJ06oatWqOnnypNzc3LR69Wr5+fnpjjvu0LRp0zR9+nSX9WY/6XDl8Xn1e97uczG393+bNm1cPqPatGmj2NhYrV+/3vrj+P7771vTn3zySZUvX16LFy9W6dKl9dhjj+n555/Pcz9n+8c//qFFixa5PMVzK8yePVuZmZkux8fMmTO1ZMmSXJ/uud56devWTSVKlNCYMWNuVdXzxd8qMFxLjRo1tHv3bpcP/OzB09NTP/zwg44fP65//OMfuvfee1W+fHnbM84bUaZMGbVv317Dhw+36pOamip3d/cc9QkJCZF0+Yx227ZtLsvZvn37dbV1//79KlasWI5lX/kzpdWrV9fw4cO1efNmVapUSe+88441rVy5cnr22Wc1ePBgeXp6Wtdjg4ODde7cOX388cf68ssv1adPH1WsWFHGGP3666/W/CVKlFDfvn1VvXp1jRkzRr/99ptOnTp13durQoUKyszMdGnv3r17XR5vi4mJ0eHDh3XkyBFr3Pfff69Tp06pQoUK172uPysmJkZJSUku1xi//PJLFSpUSOXKlctzvuz9FB0draZNm1p/8K7eT35+fqpdu7Y2b94sDw8Pff3115IuB5isrCyrl+bcuXM51uHm5qbu3btr/fr16t27t21bzp07p549e+qJJ55QbGysZs2apcTERL3xxhvKzMy0HlvLvlcoO3hHRUVZ96hkh88rXfnazc1Np06d0jPPPKMePXooKytL33//vfUH4vfff9e+ffusUBcTE6MvvvjCmleSvvnmG5UrV86a5u7urtjYWE2cOFGdO3eWJG3YsEExMTHWWXK27OVf+R6JjIzUk08+qSVLlmjw4MH6z3/+Y21jSbn23tjp3r27Ll26pBkzZmjt2rVKT0+XdPnYaNasmY4fP67SpUurSZMmqlKliho3biwPDw8dOHBA0uUe0xUrVuS4VyA3NWrU0N69e/XEE09o/vz52rRpk3bu3Klz585ZbXBzc1NsbKz1BzY5OVlr166VdLmXLD09XS+++KJ27txp7aOAgABFRERY2z/b5s2b//Qxlv2ZXKJECevzKSAgQL6+vipfvrzWrFljBensz7KgoCA5nU4rrL/88svat29fjkcPr1anTh21a9dOzz///J+q87VkZmZq/vz5mjx5co4T06ioKJcnj260XoUKFdL48eM1c+ZM6xi8HRVoYDh16lSOs+TcHlG5HsOGDdOWLVvUr18/JSUlaf/+/Vq+fLn69+8vSSpevLg8PT01bdo0HTx4UMuXL9crr7ySn83R4MGD9dFHH2n79u2KjY1VvXr19MADD2jlypU6dOiQNm/erJdeesn6I9m/f3/Nnj1b8+bN0/79+zVmzBh9++23ts80d+3aVSEhIbr//vu1adMmJScna8OGDRowYICOHj2q5ORkDR8+XFu2bNFPP/2kVatW6YcfftDKlSuVkJCgTp06aeHChZoxY4bGjh0rp9NpfTjUrFlTktShQwdFRUUpOTlZy5cvV1RUlMaNG2fV4ciRI1q5cqX27dunSZMmyc3NTampqbZnAtmio6PVvHlzPfbYY9q6dat27NihRx991DrrkqTY2FhVqVJFXbt21ddff61t27apR48eatiw4XVfNsoPXbt2lZeXl3r27KnvvvtO69atU//+/dW9e3ermzmv+bL30yOPPKKMjAzFxMSoRYsWWrdunT7//HO1adNGu3bt0pkzZ7Rq1SplZmYqMDBQqampCgwM1IEDB/TUU08pODjY2jdXe+WVV/Tbb78pLi7Oti3PP/+8Ll26pAkTJki6fFxMnjxZQ4cOVUJCgtLT0/X000/r1VdfVUJCgk6ePCl/f3/Vq1dPCxYskMPh0FNPPaWEhARt3LhRmZmZGjx4sL777jtduHBBb775plauXKlixYppwYIFyszM1L333qtu3brJ6XTq559/Vrdu3XTHHXfIx8dHp0+fVs+ePbVmzRo98cQTevrpp+Xv76/PPvtMQ4YM0eDBg/X555+rVatW+vDDDzV58mT9+9//lsPhUHR0tMqWLauoqCh98sknev/997V+/Xp17dpVd9xxh+6//35J0sCBA7Vy5UolJyfr66+/1tq1a633e1RUlBwOhz7++GP99ttv1h/9a8nIyFBqaqp1mW/EiBG6//77FRsbq8zMTKsHoHr16mrSpIni4uL0448/ateuXapYsaKeeeYZrVu3Tj169NB7772nixcv6sSJE9q1a5d1efBq5cuX16ZNm9SpUyd9/PHHeu211+Tp6WndbHru3Dlt3LhRSUlJKlu2rCIiIpSVlaWsrCwlJCSoadOmqlGjhooVK6YlS5bozJkz8vLykiQNHTpUEyZM0M6dO3Xx4kU9//zzVi/Jn9GvXz/98ccf6ty5s7Zt26aDBw/ql19+0c6dO5WVlaXy5cvr6aefVnJysqpXr66kpCSlpKTo+PHj1s2zoaGhGjRokP71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",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
+
"source": [
"# Create a DataFrame for metrics\n",
"metrics_df = pd.DataFrame(metrics)\n",
@@ -7239,20 +5343,11 @@
},
{
"cell_type": "code",
- "execution_count": 125,
+
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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xyFnTHAccsYExyFnTHBmDfnhw4cREhICFxcXSJKE2NhYk34iQmRkJFxcXGBlZQV/f38kJiaajCksLMSkSZPg4OAArVaLvn374vr16+Ysk7GXillDnpeXB19fXyxZsqTS/k8//RTz58/HkiVLkJCQAL1ejx49eiAnJ0ceM2XKFGzfvh2bNm3CkSNHkJubiz59+qC0tNScpTL20lCZc2HBwcEIDg6utI+IsHDhQnzwwQcYOHAgAGD16tVwdnbGhg0b8PbbbyMrKwvR0dFYu3YtAgICAADr1q2Dm5sb4uLi0LNnT3OWy9hLodrekycnJyM9PR2BgYFym1qthp+fH44ePQoA+Pnnn1FcXGwyxsXFBd7e3vKYyhQWFiI7O9tkYow9UG0hT09PBwA4OzubtDs7O8t96enpsLS0RN26dascU5moqCjodDp5cnNzM3P1jL24qv3quiRJJo+JqELbo540ZsaMGcjKypKn1NRUs9TKmAiqLeR6vR4AKhyRMzIy5KO7Xq9HUVERMjMzqxxTGbVaDTs7O5OJMfZAtYXc09MTer0e+/btk9uKiopw6NAhdO7cGQDQtm1bWFhYmIxJS0vDuXPn5DGMsadj1qvrubm5uHz5svw4OTkZp0+fhr29Pdzd3TFlyhTMnTsXjRs3RuPGjTF37lxYW1tjxIgRAACdToexY8di2rRpqFevHuzt7TF9+nT4+PjIV9sZY0/HrCE/ceIEunbtKj+eOnUqACAsLAyrVq3Ce++9h/z8fIwfPx6ZmZno2LEj9u7dC1tbW3meBQsWQKVSYciQIcjPz0f37t2xatUqKJVKc5bK2EvDrCH39/cHEVXZL0kSIiMjERkZWeUYjUaDxYsXY/HixeYsjbGXFn92nTHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBccgZExyHnDHBVXvIPTw8IElShWnChAkAgPDw8Ap9nTp1qu4yGROGqrpXmJCQgNLSUvnxuXPn0KNHDwwePFhuCwoK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",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
+
"source": [
"# MAE Plot\n",
"plt.subplot(1, 3, 2)\n",
@@ -7265,20 +5360,11 @@
},
{
"cell_type": "code",
- "execution_count": 127,
+
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
+
"source": [
"# MAPE Plot\n",
"plt.subplot(1, 3, 3)\n",
@@ -7298,26 +5384,11 @@
},
{
"cell_type": "code",
- "execution_count": 135,
+
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[LightGBM] [Info] Auto-choosing row-wise multi-threading, the overhead of testing was 0.000420 seconds.\n",
- "You can set `force_row_wise=true` to remove the overhead.\n",
- "And if memory is not enough, you can set `force_col_wise=true`.\n",
- "[LightGBM] [Info] Total Bins 1020\n",
- "[LightGBM] [Info] Number of data points in the train set: 5659, number of used features: 4\n",
- "[LightGBM] [Info] Start training from score 181.385070\n",
- "LightGBM Metrics: (2.5004678527479367, 1.4593112955917007, 0.009870401910502258, 0.896113074204947, 0.8892086330935252, array([[650, 77],\n",
- " [ 70, 618]], dtype=int64), 0.8982558139534884, 0.8937093275488069)\n",
- "CatBoost Metrics: (2.820023475303284, 1.694133282525543, 0.012356791551784154, 0.8989399293286219, 0.9116809116809117, array([[632, 62],\n",
- " [ 81, 640]], dtype=int64), 0.8876560332871013, 0.8995080815179198)\n"
- ]
- }
- ],
+ "outputs": [],
+
"source": [
"# Import necessary libraries\n",
"import lightgbm as lgb\n",
@@ -7375,4 +5446,3 @@
"nbformat": 4,
"nbformat_minor": 4
}
->>>>>>> 78acead5911ebfa832d5f0bb13c42f09ac8261a2
diff --git a/Stock_Price_Prediction.ipynb b/Stock_Price_Prediction.ipynb
index 7c3ad61..6113649 100644
--- a/Stock_Price_Prediction.ipynb
+++ b/Stock_Price_Prediction.ipynb
@@ -1,1805 +1,4708 @@
{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "id": "qCDSjVhXLr_Z"
- },
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "from sklearn.model_selection import train_test_split\n",
- "from sklearn.impute import SimpleImputer\n",
- "from sklearn.preprocessing import MinMaxScaler\n",
- "from sklearn.linear_model import LinearRegression\n",
- "from sklearn.svm import SVR\n",
- "from sklearn.ensemble import RandomForestRegressor, AdaBoostRegressor, GradientBoostingRegressor, DecisionTreeRegressor\n",
- "from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error\n",
- "from sklearn.neighbors import KNeighborsRegressor\n",
- "from tensorflow.keras.models import Sequential\n",
- "from tensorflow.keras.layers import Dense,LSTM"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "SOQbXSiB-g5G",
- "outputId": "6ae02a27-02b0-4bd9-a1ae-a7029056f32e"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
- ]
- }
- ],
- "source": [
- "from google.colab import drive\n",
- "drive.mount('/content/drive')\n",
- "df = pd.read_csv('drive/My Drive/Colab Notebooks/Stock Price Prediction RNN/SBIN.csv')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 206
- },
- "id": "Sc4id6VxL8BS",
- "outputId": "568d039c-faf4-4636-bfc1-70b9ef83367b"
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- " \n",
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Date \n",
- " Open \n",
- " High \n",
- " Low \n",
- " Close \n",
- " Adj Close \n",
- " Volume \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 01-01-1996 \n",
- " 18.691147 \n",
- " 18.978922 \n",
- " 18.540184 \n",
- " 18.823240 \n",
- " 12.409931 \n",
- " 43733533.0 \n",
- " \n",
- " \n",
- " 1 \n",
- " 02-01-1996 \n",
- " 18.894005 \n",
- " 18.964767 \n",
- " 17.738192 \n",
- " 18.224106 \n",
- " 12.014931 \n",
- " 56167280.0 \n",
- " \n",
- " \n",
- " 2 \n",
- " 03-01-1996 \n",
- " 18.327892 \n",
- " 18.568489 \n",
- " 17.643839 \n",
- " 17.738192 \n",
- " 11.694577 \n",
- " 68296318.0 \n",
- " \n",
- " \n",
- " 3 \n",
- " 04-01-1996 \n",
- " 17.502312 \n",
- " 17.832542 \n",
- " 17.223972 \n",
- " 17.676863 \n",
- " 11.654142 \n",
- " 86073880.0 \n",
- " \n",
- " \n",
- " 4 \n",
- " 05-01-1996 \n",
- " 17.738192 \n",
- " 17.785366 \n",
- " 17.459852 \n",
- " 17.577793 \n",
- " 11.588827 \n",
- " 76613039.0 \n",
- " \n",
- " \n",
- "
\n",
- "
\n",
- "
\n",
- "
\n"
- ],
- "text/plain": [
- " Date Open High Low Close Adj Close \\\n",
- "0 01-01-1996 18.691147 18.978922 18.540184 18.823240 12.409931 \n",
- "1 02-01-1996 18.894005 18.964767 17.738192 18.224106 12.014931 \n",
- "2 03-01-1996 18.327892 18.568489 17.643839 17.738192 11.694577 \n",
- "3 04-01-1996 17.502312 17.832542 17.223972 17.676863 11.654142 \n",
- "4 05-01-1996 17.738192 17.785366 17.459852 17.577793 11.588827 \n",
- "\n",
- " Volume \n",
- "0 43733533.0 \n",
- "1 56167280.0 \n",
- "2 68296318.0 \n",
- "3 86073880.0 \n",
- "4 76613039.0 "
- ]
- },
- "execution_count": 23,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Load the dataset\n",
- "#df = pd.read_csv('/content/SBIN.NS.csv')\n",
- "df.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {
- "id": "7LaYGXsfN-8y"
- },
- "outputs": [],
- "source": [
- "# Drop the 'Date' and 'Adj Close' columns\n",
- "df.drop(['Date', 'Adj Close'], axis=1, inplace=True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 206
- },
- "id": "pqbTBdnBOKJc",
- "outputId": "21da8a7f-4f3e-4f4f-e32b-3b90c230ce55"
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- " \n",
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Open \n",
- " High \n",
- " Low \n",
- " Close \n",
- " Volume \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 18.691147 \n",
- " 18.978922 \n",
- " 18.540184 \n",
- " 18.823240 \n",
- " 43733533.0 \n",
- " \n",
- " \n",
- " 1 \n",
- " 18.894005 \n",
- " 18.964767 \n",
- " 17.738192 \n",
- " 18.224106 \n",
- " 56167280.0 \n",
- " \n",
- " \n",
- " 2 \n",
- " 18.327892 \n",
- " 18.568489 \n",
- " 17.643839 \n",
- " 17.738192 \n",
- " 68296318.0 \n",
- " \n",
- " \n",
- " 3 \n",
- " 17.502312 \n",
- " 17.832542 \n",
- " 17.223972 \n",
- " 17.676863 \n",
- " 86073880.0 \n",
- " \n",
- " \n",
- " 4 \n",
- " 17.738192 \n",
- " 17.785366 \n",
- " 17.459852 \n",
- " 17.577793 \n",
- " 76613039.0 \n",
- " \n",
- " \n",
- "
\n",
- "
\n",
- "
\n",
- "
\n"
- ],
- "text/plain": [
- " Open High Low Close Volume\n",
- "0 18.691147 18.978922 18.540184 18.823240 43733533.0\n",
- "1 18.894005 18.964767 17.738192 18.224106 56167280.0\n",
- "2 18.327892 18.568489 17.643839 17.738192 68296318.0\n",
- "3 17.502312 17.832542 17.223972 17.676863 86073880.0\n",
- "4 17.738192 17.785366 17.459852 17.577793 76613039.0"
- ]
- },
- "execution_count": 25,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {
- "id": "dydEPoNeM6eN"
- },
- "outputs": [],
- "source": [
- "# Handle missing values\n",
- "imputer = SimpleImputer(strategy='mean')\n",
- "df = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {
- "id": "OQ3cGqgTMBwt"
- },
- "outputs": [],
- "source": [
- "# Select features and target variable\n",
- "X = df[['Open', 'High', 'Low', 'Volume']]\n",
- "y = df['Close']"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {
- "id": "9Oz-bwJOMEWD"
- },
- "outputs": [],
- "source": [
- "# Split the data into training and testing sets\n",
- "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "id": "ugapDyXODtn3"
- },
- "outputs": [],
- "source": [
- "# Scale the features using Min-Max scaling\n",
- "scaler = MinMaxScaler()\n",
- "X_train_scaled = scaler.fit_transform(X_train)\n",
- "X_test_scaled = scaler.transform(X_test)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "997ZEgibCZIO",
- "outputId": "2a45a8e3-71b0-47f3-bd66-91bcdc028c76"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(5659, 4)"
- ]
- },
- "execution_count": 29,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "X_train.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "bmtt76RuCeyG",
- "outputId": "658075af-e75d-45b1-f6cf-756e349a32d1"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(1415, 4)"
- ]
- },
- "execution_count": 30,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "X_test.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "CeJkUJ92Ciqd",
- "outputId": "93dec527-ea2e-42e6-c70b-a9491c71d917"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(5659,)"
- ]
- },
- "execution_count": 31,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y_train.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "7HGC7VuTCjWc",
- "outputId": "64dc2569-b4b4-4c2e-d416-1cf77c41ac75"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(1415,)"
- ]
- },
- "execution_count": 32,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y_test.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Function to evaluate and print RMSE, MAE, and MAPE\n",
- "def evaluate_model(model, X_test, y_test):\n",
- " predictions = model.predict(X_test)\n",
- " rmse = np.sqrt(mean_squared_error(y_test, predictions))\n",
- " mae = mean_absolute_error(y_test, predictions)\n",
- " mape = mean_absolute_percentage_error(y_test, predictions)\n",
- "\n",
- " print(f\"RMSE: {rmse}\")\n",
- " print(f\"MAE: {mae}\")\n",
- " print(f\"MAPE: {mape}\\n\")\n",
- " \n",
- " return rmse, mae, mape\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "metrics = {\n",
- " \"Model\": [],\n",
- " \"RMSE\": [],\n",
- " \"MAE\": [],\n",
- " \"MAPE\": []\n",
- "}"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "c6Ek8jRlO2_I"
- },
- "source": [
- "## 1. LINEAR REGRESSION"
- ]
- },
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 161,
+ "metadata": {
+ "id": "qCDSjVhXLr_Z"
+ },
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.impute import SimpleImputer\n",
+ "from sklearn.preprocessing import MinMaxScaler\n",
+ "from sklearn.linear_model import LinearRegression\n",
+ "from sklearn.svm import SVR\n",
+ "from sklearn.ensemble import RandomForestRegressor, AdaBoostRegressor, GradientBoostingRegressor\n",
+ "from sklearn.tree import DecisionTreeRegressor\n",
+ "from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error\n",
+ "from sklearn.neighbors import KNeighborsRegressor\n",
+ "from tensorflow.keras.models import Sequential\n",
+ "from tensorflow.keras.layers import Dense,LSTM"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 179,
+ "metadata": {},
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 33,
- "metadata": {
- "id": "RdZ1SpzdMHAJ"
- },
- "outputs": [],
- "source": [
- "# Create a linear regression model\n",
- "model1 = LinearRegression()"
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running in local system\n"
+ ]
+ }
+ ],
+ "source": [
+ "try:\n",
+ " import google.colab\n",
+ " In_colab=True\n",
+ "except:\n",
+ " In_colab=False\n",
+ "\n",
+ "if(In_colab):\n",
+ " print(\"Running in google colab\")\n",
+ " from google.colab import drive\n",
+ " drive.mount('/content/drive')\n",
+ " df = pd.read_csv('drive/My Drive/Colab Notebooks/Stock Price Prediction RNN/SBIN.csv')\n",
+ "else:\n",
+ " print(\"Running in local system\")\n",
+ " path=r'C:\\Users\\SHRISTI\\OneDrive\\Desktop\\GitHub\\Stock-Price-Prediction\\Data\\SBIN.csv'\n",
+ " df=pd.read_csv(path)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 206
},
+ "id": "Sc4id6VxL8BS",
+ "outputId": "568d039c-faf4-4636-bfc1-70b9ef83367b"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "mPM035IzMY04",
- "outputId": "07379dba-cfe8-4814-b972-d08b12f224ac"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "5286 257.350006\n",
- "3408 129.464996\n",
- "5477 279.350006\n",
- "6906 588.500000\n",
- "530 21.644367\n",
- "Name: Close, dtype: float64"
- ]
- },
- "execution_count": 34,
- "metadata": {},
- "output_type": "execute_result"
- }
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Date \n",
+ " Open \n",
+ " High \n",
+ " Low \n",
+ " Close \n",
+ " Adj Close \n",
+ " Volume \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 01-01-1996 \n",
+ " 18.691147 \n",
+ " 18.978922 \n",
+ " 18.540184 \n",
+ " 18.823240 \n",
+ " 12.409931 \n",
+ " 43733533.0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 02-01-1996 \n",
+ " 18.894005 \n",
+ " 18.964767 \n",
+ " 17.738192 \n",
+ " 18.224106 \n",
+ " 12.014931 \n",
+ " 56167280.0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 03-01-1996 \n",
+ " 18.327892 \n",
+ " 18.568489 \n",
+ " 17.643839 \n",
+ " 17.738192 \n",
+ " 11.694577 \n",
+ " 68296318.0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 04-01-1996 \n",
+ " 17.502312 \n",
+ " 17.832542 \n",
+ " 17.223972 \n",
+ " 17.676863 \n",
+ " 11.654142 \n",
+ " 86073880.0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 05-01-1996 \n",
+ " 17.738192 \n",
+ " 17.785366 \n",
+ " 17.459852 \n",
+ " 17.577793 \n",
+ " 11.588827 \n",
+ " 76613039.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
],
- "source": [
- "y_train.head()"
+ "text/plain": [
+ " Date Open High Low Close Adj Close \\\n",
+ "0 01-01-1996 18.691147 18.978922 18.540184 18.823240 12.409931 \n",
+ "1 02-01-1996 18.894005 18.964767 17.738192 18.224106 12.014931 \n",
+ "2 03-01-1996 18.327892 18.568489 17.643839 17.738192 11.694577 \n",
+ "3 04-01-1996 17.502312 17.832542 17.223972 17.676863 11.654142 \n",
+ "4 05-01-1996 17.738192 17.785366 17.459852 17.577793 11.588827 \n",
+ "\n",
+ " Volume \n",
+ "0 43733533.0 \n",
+ "1 56167280.0 \n",
+ "2 68296318.0 \n",
+ "3 86073880.0 \n",
+ "4 76613039.0 "
]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Load the dataset\n",
+ "#df = pd.read_csv('/content/SBIN.NS.csv')\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "id": "7LaYGXsfN-8y"
+ },
+ "outputs": [],
+ "source": [
+ "# Drop the 'Date' and 'Adj Close' columns\n",
+ "df.drop(['Date', 'Adj Close'], axis=1, inplace=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 206
},
+ "id": "pqbTBdnBOKJc",
+ "outputId": "21da8a7f-4f3e-4f4f-e32b-3b90c230ce55"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 35,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 74
- },
- "id": "qBhQ9HbYMI3d",
- "outputId": "52e0655f-1d23-47b7-decc-7a7ca35c0470"
- },
- "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": 35,
- "metadata": {},
- "output_type": "execute_result"
- }
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Open \n",
+ " High \n",
+ " Low \n",
+ " Close \n",
+ " Volume \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 18.691147 \n",
+ " 18.978922 \n",
+ " 18.540184 \n",
+ " 18.823240 \n",
+ " 43733533.0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 18.894005 \n",
+ " 18.964767 \n",
+ " 17.738192 \n",
+ " 18.224106 \n",
+ " 56167280.0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 18.327892 \n",
+ " 18.568489 \n",
+ " 17.643839 \n",
+ " 17.738192 \n",
+ " 68296318.0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 17.502312 \n",
+ " 17.832542 \n",
+ " 17.223972 \n",
+ " 17.676863 \n",
+ " 86073880.0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 17.738192 \n",
+ " 17.785366 \n",
+ " 17.459852 \n",
+ " 17.577793 \n",
+ " 76613039.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
],
- "source": [
- "# Train the model\n",
- "model1.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 36,
- "metadata": {
- "id": "X269co2kMS4z"
- },
- "outputs": [],
- "source": [
- "rmse, mae, mape = evaluate_model(model1, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"Linear Regressor\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "GxtMzlg-gR2P"
- },
- "source": [
- "## 2. Support Vector Regression"
+
+ "text/plain": [
+ " Open High Low Close Volume\n",
+ "0 18.691147 18.978922 18.540184 18.823240 43733533.0\n",
+ "1 18.894005 18.964767 17.738192 18.224106 56167280.0\n",
+ "2 18.327892 18.568489 17.643839 17.738192 68296318.0\n",
+ "3 17.502312 17.832542 17.223972 17.676863 86073880.0\n",
+ "4 17.738192 17.785366 17.459852 17.577793 76613039.0"
+
]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {
+ "id": "dydEPoNeM6eN"
+ },
+ "outputs": [],
+ "source": [
+ "# Handle missing values\n",
+ "imputer = SimpleImputer(strategy='mean')\n",
+ "df = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {
+ "id": "OQ3cGqgTMBwt"
+ },
+ "outputs": [],
+ "source": [
+ "# Select features and target variable\n",
+ "X = df[['Open', 'High', 'Low', 'Volume']]\n",
+ "y = df['Close']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {
+ "id": "9Oz-bwJOMEWD"
+ },
+ "outputs": [],
+ "source": [
+ "# Split the data into training and testing sets\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {
+ "id": "ugapDyXODtn3"
+ },
+ "outputs": [],
+ "source": [
+ "# Scale the features using Min-Max scaling\n",
+ "scaler = MinMaxScaler()\n",
+ "X_train_scaled = scaler.fit_transform(X_train)\n",
+ "X_test_scaled = scaler.transform(X_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
},
+ "id": "997ZEgibCZIO",
+ "outputId": "2a45a8e3-71b0-47f3-bd66-91bcdc028c76"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 40,
- "metadata": {
- "id": "0xQewd7QWTtq"
- },
- "outputs": [],
- "source": [
- "# Create an SVR model\n",
- "model2 = SVR()"
+ "data": {
+ "text/plain": [
+ "(5659, 4)"
]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_train.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
},
+ "id": "bmtt76RuCeyG",
+ "outputId": "658075af-e75d-45b1-f6cf-756e349a32d1"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 42,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 74
- },
- "id": "22SaCsQmfhgP",
- "outputId": "2121e992-399d-4b78-e42c-fc20b9d52189"
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "SVR() 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": [
- "SVR()"
- ]
- },
- "execution_count": 42,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Train the model\n",
- "model2.fit(X_train, y_train)"
+ "data": {
+ "text/plain": [
+ "(1415, 4)"
]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_test.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
},
+ "id": "CeJkUJ92Ciqd",
+ "outputId": "93dec527-ea2e-42e6-c70b-a9491c71d917"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 43,
- "metadata": {
- "id": "OQ1nL4oYfkAC"
- },
- "outputs": [],
- "source": [
- "rmse, mae, mape = evaluate_model(model2, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"SVR\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
+ "data": {
+ "text/plain": [
+ "(5659,)"
]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_train.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
},
+ "id": "7HGC7VuTCjWc",
+ "outputId": "64dc2569-b4b4-4c2e-d416-1cf77c41ac75"
+ },
+ "outputs": [
{
- "cell_type": "markdown",
- "metadata": {
- "id": "hcIfVMWdgcKt"
- },
- "source": [
- "## 3. Random Forest Regressor"
+
+ "data": {
+ "text/plain": [
+ "(1415,)"
+
]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_test.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Function to evaluate and print RMSE, MAE, and MAPE\n",
+ "def evaluate_model(model, X_test, y_test):\n",
+ " predictions = model.predict(X_test)\n",
+ " rmse = np.sqrt(mean_squared_error(y_test, predictions))\n",
+ " mae = mean_absolute_error(y_test, predictions)\n",
+ " mape = mean_absolute_percentage_error(y_test, predictions)\n",
+ "\n",
+ " print(f\"RMSE: {rmse}\")\n",
+ " print(f\"MAE: {mae}\")\n",
+ " print(f\"MAPE: {mape}\\n\")\n",
+ " \n",
+ " return rmse, mae, mape\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "metrics = {\n",
+ " \"Model\": [],\n",
+ " \"RMSE\": [],\n",
+ " \"MAE\": [],\n",
+ " \"MAPE\": []\n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "c6Ek8jRlO2_I"
+ },
+ "source": [
+ "## 1. LINEAR REGRESSION"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {
+ "id": "RdZ1SpzdMHAJ"
+ },
+ "outputs": [],
+ "source": [
+ "# Create a linear regression model\n",
+ "model1 = LinearRegression()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
},
+ "id": "mPM035IzMY04",
+ "outputId": "07379dba-cfe8-4814-b972-d08b12f224ac"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 46,
- "metadata": {
- "id": "f7raXT_hf2ij"
- },
- "outputs": [],
- "source": [
- "model3 = RandomForestRegressor()"
+ "data": {
+ "text/plain": [
+ "5286 257.350006\n",
+ "3408 129.464996\n",
+ "5477 279.350006\n",
+ "6906 588.500000\n",
+ "530 21.644367\n",
+ "Name: Close, dtype: float64"
]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_train.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 163,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 74
},
+ "id": "qBhQ9HbYMI3d",
+ "outputId": "52e0655f-1d23-47b7-decc-7a7ca35c0470"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 48,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 74
- },
- "id": "fF002Yepgk55",
- "outputId": "d148c589-4879-4e2d-8b0f-5b5ca01a2a53"
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "RandomForestRegressor() 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": [
- "RandomForestRegressor()"
- ]
- },
- "execution_count": 48,
- "metadata": {},
- "output_type": "execute_result"
- }
+ "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. "
],
- "source": [
- "# Train the model\n",
- "model3.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 49,
- "metadata": {
- "id": "8nRU_pzEgnCt"
- },
- "outputs": [],
- "source": [
- "rmse, mae, mape = evaluate_model(model3, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"Random Forest\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "mZsLwLivhLGH"
- },
- "source": [
- "## 4. Gradient Boosting Models (GBM)"
+ "text/plain": [
+ "LinearRegression()"
]
- },
+ },
+ "execution_count": 163,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model\n",
+ "model1.fit(X_train_scaled, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {
+ "id": "X269co2kMS4z"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 52,
- "metadata": {
- "id": "TI8idoxOg6jF"
- },
- "outputs": [],
- "source": [
- "model4 = GradientBoostingRegressor()"
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 1.6881364651923558\n",
+ "MAE: 0.9433353486266928\n",
+ "MAPE: 0.006085435968276741\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model1, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"Linear Regressor\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "GxtMzlg-gR2P"
+ },
+ "source": [
+ "## 2. SVR"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {
+ "id": "0xQewd7QWTtq"
+ },
+ "outputs": [],
+ "source": [
+ "# Create an SVR model\n",
+ "model2 = SVR()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 165,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 74
},
+ "id": "22SaCsQmfhgP",
+ "outputId": "2121e992-399d-4b78-e42c-fc20b9d52189"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 54,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 248
- },
- "id": "2gpbDxshhexj",
- "outputId": "b2b1a681-7ede-4d66-be5d-1a8606d0f470"
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
- " colsample_bylevel=None, colsample_bynode=None,\n",
- " colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
- " enable_categorical=False, eval_metric=None, feature_types=None,\n",
- " gamma=None, grow_policy=None, importance_type=None,\n",
- " interaction_constraints=None, learning_rate=None, max_bin=None,\n",
- " max_cat_threshold=None, max_cat_to_onehot=None,\n",
- " max_delta_step=None, max_depth=None, max_leaves=None,\n",
- " min_child_weight=None, missing=nan, monotone_constraints=None,\n",
- " multi_strategy=None, n_estimators=None, n_jobs=None,\n",
- " num_parallel_tree=None, random_state=None, ...) 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. XGBRegressor XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
- " colsample_bylevel=None, colsample_bynode=None,\n",
- " colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
- " enable_categorical=False, eval_metric=None, feature_types=None,\n",
- " gamma=None, grow_policy=None, importance_type=None,\n",
- " interaction_constraints=None, learning_rate=None, max_bin=None,\n",
- " max_cat_threshold=None, max_cat_to_onehot=None,\n",
- " max_delta_step=None, max_depth=None, max_leaves=None,\n",
- " min_child_weight=None, missing=nan, monotone_constraints=None,\n",
- " multi_strategy=None, n_estimators=None, n_jobs=None,\n",
- " num_parallel_tree=None, random_state=None, ...) "
- ],
- "text/plain": [
- "XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
- " colsample_bylevel=None, colsample_bynode=None,\n",
- " colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
- " enable_categorical=False, eval_metric=None, feature_types=None,\n",
- " gamma=None, grow_policy=None, importance_type=None,\n",
- " interaction_constraints=None, learning_rate=None, max_bin=None,\n",
- " max_cat_threshold=None, max_cat_to_onehot=None,\n",
- " max_delta_step=None, max_depth=None, max_leaves=None,\n",
- " min_child_weight=None, missing=nan, monotone_constraints=None,\n",
- " multi_strategy=None, n_estimators=None, n_jobs=None,\n",
- " num_parallel_tree=None, random_state=None, ...)"
- ]
- },
- "execution_count": 54,
- "metadata": {},
- "output_type": "execute_result"
- }
+ "data": {
+ "text/html": [
+ "SVR() 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. "
],
- "source": [
- "# Train the model\n",
- "model4.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 55,
- "metadata": {
- "id": "Jj9DXdUPhh9V"
- },
- "outputs": [],
- "source": [
- "rmse, mae, mape = evaluate_model(model4, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"GBM\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
+ "text/plain": [
+ "SVR()"
]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "d8nSGoyuh9dx"
- },
- "source": [
- "## 5. Extreme Gradient Boosting (XGBoost)"
- ]
- },
+ },
+ "execution_count": 165,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model\n",
+ "model2.fit(X_train_scaled, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {
+ "id": "OQ1nL4oYfkAC"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 58,
- "metadata": {
- "id": "DyhhdlZAhx94"
- },
- "outputs": [],
- "source": [
- "import xgboost as xgb\n",
- "# Create an XGBoost model\n",
- "model5 = xgb.XGBRegressor()"
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 17.574809673127547\n",
+ "MAE: 6.278157692070486\n",
+ "MAPE: 0.09040265035344064\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model2, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"SVR\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "hcIfVMWdgcKt"
+ },
+ "source": [
+ "## 3. Random Forest"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 72,
+ "metadata": {
+ "id": "f7raXT_hf2ij"
+ },
+ "outputs": [],
+ "source": [
+ "model3 = RandomForestRegressor()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 167,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 74
},
+ "id": "fF002Yepgk55",
+ "outputId": "d148c589-4879-4e2d-8b0f-5b5ca01a2a53"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 60,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 248
- },
- "id": "RAIwxIp5iH9Z",
- "outputId": "d2b4aa97-7e07-4015-c308-76a292b0929f"
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
- " colsample_bylevel=None, colsample_bynode=None,\n",
- " colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
- " enable_categorical=False, eval_metric=None, feature_types=None,\n",
- " gamma=None, grow_policy=None, importance_type=None,\n",
- " interaction_constraints=None, learning_rate=None, max_bin=None,\n",
- " max_cat_threshold=None, max_cat_to_onehot=None,\n",
- " max_delta_step=None, max_depth=None, max_leaves=None,\n",
- " min_child_weight=None, missing=nan, monotone_constraints=None,\n",
- " multi_strategy=None, n_estimators=None, n_jobs=None,\n",
- " num_parallel_tree=None, random_state=None, ...) 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. XGBRegressor XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
- " colsample_bylevel=None, colsample_bynode=None,\n",
- " colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
- " enable_categorical=False, eval_metric=None, feature_types=None,\n",
- " gamma=None, grow_policy=None, importance_type=None,\n",
- " interaction_constraints=None, learning_rate=None, max_bin=None,\n",
- " max_cat_threshold=None, max_cat_to_onehot=None,\n",
- " max_delta_step=None, max_depth=None, max_leaves=None,\n",
- " min_child_weight=None, missing=nan, monotone_constraints=None,\n",
- " multi_strategy=None, n_estimators=None, n_jobs=None,\n",
- " num_parallel_tree=None, random_state=None, ...) "
- ],
- "text/plain": [
- "XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
- " colsample_bylevel=None, colsample_bynode=None,\n",
- " colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
- " enable_categorical=False, eval_metric=None, feature_types=None,\n",
- " gamma=None, grow_policy=None, importance_type=None,\n",
- " interaction_constraints=None, learning_rate=None, max_bin=None,\n",
- " max_cat_threshold=None, max_cat_to_onehot=None,\n",
- " max_delta_step=None, max_depth=None, max_leaves=None,\n",
- " min_child_weight=None, missing=nan, monotone_constraints=None,\n",
- " multi_strategy=None, n_estimators=None, n_jobs=None,\n",
- " num_parallel_tree=None, random_state=None, ...)"
- ]
- },
- "execution_count": 60,
- "metadata": {},
- "output_type": "execute_result"
- }
+ "data": {
+ "text/html": [
+ "RandomForestRegressor() 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. "
],
- "source": [
- "# Train the model\n",
- "model5.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "rmse, mae, mape = evaluate_model(model5, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"XGBoost\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "A_J776rtiovq"
- },
- "source": [
- "## 6. AdaBoostRegressor"
+ "text/plain": [
+ "RandomForestRegressor()"
]
- },
+ },
+ "execution_count": 167,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model\n",
+ "model3.fit(X_train_scaled, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 80,
+ "metadata": {
+ "id": "8nRU_pzEgnCt"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 64,
- "metadata": {
- "id": "HNq66cXRiYPJ"
- },
- "outputs": [],
- "source": [
- "model6 = AdaBoostRegressor()"
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 2.2053909891328036\n",
+ "MAE: 1.2608162799481166\n",
+ "MAPE: 0.008015308194076972\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model3, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"Random Forest\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "mZsLwLivhLGH"
+ },
+ "source": [
+ "## 4. Gradient Boosting Models (GBM)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 83,
+ "metadata": {
+ "id": "TI8idoxOg6jF"
+ },
+ "outputs": [],
+ "source": [
+ "model4 = GradientBoostingRegressor()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 169,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 248
},
+ "id": "2gpbDxshhexj",
+ "outputId": "b2b1a681-7ede-4d66-be5d-1a8606d0f470"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 66,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 74
- },
- "id": "P0oB5wjQivBr",
- "outputId": "8726c583-6782-4504-b0ac-d2ef4ccbca4c"
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "AdaBoostRegressor() 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": [
- "AdaBoostRegressor()"
- ]
- },
- "execution_count": 66,
- "metadata": {},
- "output_type": "execute_result"
- }
+ "data": {
+ "text/html": [
+ "GradientBoostingRegressor() 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. "
],
- "source": [
- "# Train the model\n",
- "model6.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 67,
- "metadata": {
- "id": "Bf1m5ukOi2VM"
- },
- "outputs": [],
- "source": [
- "rmse, mae, mape = evaluate_model(model6, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"AdaBoost Regressor\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "Q9DzOt3CkWFX"
- },
- "source": [
- "## 7. Decision Tree"
+ "text/plain": [
+ "GradientBoostingRegressor()"
]
- },
+ },
+ "execution_count": 169,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model\n",
+ "model4.fit(X_train_scaled, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 87,
+ "metadata": {
+ "id": "Jj9DXdUPhh9V"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 70,
- "metadata": {
- "id": "23DZ2biSjF9a"
- },
- "outputs": [],
- "source": [
- "model7 = DecisionTreeRegressor()"
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 2.6985863368468084\n",
+ "MAE: 1.692542658558929\n",
+ "MAPE: 0.011883244132236716\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model4, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"GBM\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "d8nSGoyuh9dx"
+ },
+ "source": [
+ "## 5. Extreme Gradient Boosting (XGBoost)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 90,
+ "metadata": {
+ "id": "DyhhdlZAhx94"
+ },
+ "outputs": [],
+ "source": [
+ "import xgboost as xgb\n",
+ "# Create an XGBoost model\n",
+ "model5 = xgb.XGBRegressor()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 171,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 248
},
+ "id": "RAIwxIp5iH9Z",
+ "outputId": "d2b4aa97-7e07-4015-c308-76a292b0929f"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 72,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 74
- },
- "id": "6mQEQf-ykc9F",
- "outputId": "f1a62020-4125-4aea-e7e4-11acffdc5169"
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "DecisionTreeRegressor() 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": [
- "DecisionTreeRegressor()"
- ]
- },
- "execution_count": 72,
- "metadata": {},
- "output_type": "execute_result"
- }
+ "data": {
+ "text/html": [
+ "XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
+ " colsample_bylevel=None, colsample_bynode=None,\n",
+ " colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
+ " enable_categorical=False, eval_metric=None, feature_types=None,\n",
+ " gamma=None, grow_policy=None, importance_type=None,\n",
+ " interaction_constraints=None, learning_rate=None, max_bin=None,\n",
+ " max_cat_threshold=None, max_cat_to_onehot=None,\n",
+ " max_delta_step=None, max_depth=None, max_leaves=None,\n",
+ " min_child_weight=None, missing=nan, monotone_constraints=None,\n",
+ " multi_strategy=None, n_estimators=None, n_jobs=None,\n",
+ " num_parallel_tree=None, random_state=None, ...) 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. XGBRegressoriFitted XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
+ " colsample_bylevel=None, colsample_bynode=None,\n",
+ " colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
+ " enable_categorical=False, eval_metric=None, feature_types=None,\n",
+ " gamma=None, grow_policy=None, importance_type=None,\n",
+ " interaction_constraints=None, learning_rate=None, max_bin=None,\n",
+ " max_cat_threshold=None, max_cat_to_onehot=None,\n",
+ " max_delta_step=None, max_depth=None, max_leaves=None,\n",
+ " min_child_weight=None, missing=nan, monotone_constraints=None,\n",
+ " multi_strategy=None, n_estimators=None, n_jobs=None,\n",
+ " num_parallel_tree=None, random_state=None, ...) "
],
- "source": [
- "# Train the model\n",
- "model7.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 73,
- "metadata": {
- "id": "BFJ9q_tvkgRC"
- },
- "outputs": [],
- "source": [
- "rmse, mae, mape = evaluate_model(model7, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"Decision Tree\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "LH-B-Xd6k5UD"
- },
- "source": [
- "## 8. KNeighborsRegressor(KNN)"
+ "text/plain": [
+ "XGBRegressor(base_score=None, booster=None, callbacks=None,\n",
+ " colsample_bylevel=None, colsample_bynode=None,\n",
+ " colsample_bytree=None, device=None, early_stopping_rounds=None,\n",
+ " enable_categorical=False, eval_metric=None, feature_types=None,\n",
+ " gamma=None, grow_policy=None, importance_type=None,\n",
+ " interaction_constraints=None, learning_rate=None, max_bin=None,\n",
+ " max_cat_threshold=None, max_cat_to_onehot=None,\n",
+ " max_delta_step=None, max_depth=None, max_leaves=None,\n",
+ " min_child_weight=None, missing=nan, monotone_constraints=None,\n",
+ " multi_strategy=None, n_estimators=None, n_jobs=None,\n",
+ " num_parallel_tree=None, random_state=None, ...)"
]
- },
+ },
+ "execution_count": 171,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model\n",
+ "model5.fit(X_train_scaled, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 94,
+ "metadata": {},
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 76,
- "metadata": {
- "id": "JVDSed7yktFY"
- },
- "outputs": [],
- "source": [
- "# Create a KNN model\n",
- "model8 = KNeighborsRegressor()"
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 2.733930065274145\n",
+ "MAE: 1.502457380471909\n",
+ "MAPE: 0.010026410639661481\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model5, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"XGBoost\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "A_J776rtiovq"
+ },
+ "source": [
+ "## 6. AdaBoostRegressor"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 97,
+ "metadata": {
+ "id": "HNq66cXRiYPJ"
+ },
+ "outputs": [],
+ "source": [
+ "model6 = AdaBoostRegressor()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 173,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 74
},
+ "id": "P0oB5wjQivBr",
+ "outputId": "8726c583-6782-4504-b0ac-d2ef4ccbca4c"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 78,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 74
- },
- "id": "9fn64o-ZlBka",
- "outputId": "dc5e6af2-de37-46ee-cde7-e0a3baa31a1f"
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "KNeighborsRegressor() 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": [
- "KNeighborsRegressor()"
- ]
- },
- "execution_count": 78,
- "metadata": {},
- "output_type": "execute_result"
- }
+ "data": {
+ "text/html": [
+ "AdaBoostRegressor() 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. "
],
- "source": [
- "# Train the model\n",
- "model8.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 79,
- "metadata": {
- "id": "hbfbbjcSlDn7"
- },
- "outputs": [],
- "source": [
- "rmse, mae, mape = evaluate_model(model8, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"KNN\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
+ "text/plain": [
+ "AdaBoostRegressor()"
]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "X5XtlzMXljps"
- },
- "source": [
- "## 9. Artificial Neural Networks (ANN)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 84,
- "metadata": {
- "id": "vd1fDjQiltP4"
- },
- "outputs": [],
- "source": [
- "# Create an ANN model\n",
- "model9 = Sequential()\n",
- "model9.add(Dense(32, activation='relu', input_shape=(X_train.shape[1],)))\n",
- "model9.add(Dense(16, activation='relu'))\n",
- "model9.add(Dense(1, activation='linear'))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 85,
- "metadata": {
- "id": "ZIf94WLMlv04"
- },
- "outputs": [],
- "source": [
- "# Compile the model\n",
- "model9.compile(loss='mean_squared_error', optimizer='adam')"
- ]
- },
+ },
+ "execution_count": 173,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model\n",
+ "model6.fit(X_train_scaled, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 105,
+ "metadata": {
+ "id": "Bf1m5ukOi2VM"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 86,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "FX5DTKqslxWf",
- "outputId": "9253b26c-1a79-4390-975e-d14c28a5e2a8"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 86,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Train the model\n",
- "model9.fit(X_train_scaled, y_train, epochs=100, batch_size=32, verbose=0)"
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 9.175482477551942\n",
+ "MAE: 7.527617905792734\n",
+ "MAPE: 0.1858930099598583\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model6, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"AdaBoost Regressor\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Q9DzOt3CkWFX"
+ },
+ "source": [
+ "## 7. Decision Tree"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 108,
+ "metadata": {
+ "id": "23DZ2biSjF9a"
+ },
+ "outputs": [],
+ "source": [
+ "model7 = DecisionTreeRegressor()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 175,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 74
},
+ "id": "6mQEQf-ykc9F",
+ "outputId": "f1a62020-4125-4aea-e7e4-11acffdc5169"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 87,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "OVW2qpNsmGVq",
- "outputId": "34343782-f560-4dee-c307-ff0d0c52ab5a"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "45/45 [==============================] - 0s 1ms/step\n"
- ]
- }
+ "data": {
+ "text/html": [
+ "DecisionTreeRegressor() 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. "
],
- "source": [
- "rmse, mae, mape = evaluate_model(model9, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"ANN\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
+ "text/plain": [
+ "DecisionTreeRegressor()"
]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "vjSMQNcOnFPJ"
- },
- "source": [
- "## 10. LSTM(Long Short term Memory)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 92,
- "metadata": {
- "id": "uACvajfImrbB"
- },
- "outputs": [],
- "source": [
- "# Reshape the input data for LSTM\n",
- "n_features = X_train_scaled.shape[1]\n",
- "n_steps = 10\n",
- "n_samples_train = X_train_scaled.shape[0] - n_steps + 1\n",
- "n_samples_test = X_test_scaled.shape[0] - n_steps + 1\n",
- "\n",
- "# Reshape the input data\n",
- "X_train_reshaped = np.array([X_train_scaled[i:i+n_steps, :] for i in range(n_samples_train)])\n",
- "X_test_reshaped = np.array([X_test_scaled[i:i+n_steps, :] for i in range(n_samples_test)])\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 93,
- "metadata": {
- "id": "r066pVYpnXH5"
- },
- "outputs": [],
- "source": [
- "# Create an LSTM model\n",
- "model = Sequential()\n",
- "model.add(LSTM(64, activation='relu', input_shape=(n_steps, n_features)))\n",
- "model.add(Dense(1))\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 94,
- "metadata": {
- "id": "YpSfHu6gov35"
- },
- "outputs": [],
- "source": [
- "# Compile the model\n",
- "model.compile(loss='mean_squared_error', optimizer='adam')\n"
- ]
- },
+ },
+ "execution_count": 175,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model\n",
+ "model7.fit(X_train_scaled, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 112,
+ "metadata": {
+ "id": "BFJ9q_tvkgRC"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 95,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "0vHjcluaoxzP",
- "outputId": "1eaafd31-9f91-4655-f437-e9199c0f7933"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 95,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Train the model\n",
- "model.fit(X_train_reshaped, y_train[n_steps-1:], epochs=100, batch_size=32, verbose=0)"
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 3.12966540689625\n",
+ "MAE: 1.6497286032971983\n",
+ "MAPE: 0.010286427942970355\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model7, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"Decision Tree\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "LH-B-Xd6k5UD"
+ },
+ "source": [
+ "## 8. KNeighborsRegressor(KNN)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 115,
+ "metadata": {
+ "id": "JVDSed7yktFY"
+ },
+ "outputs": [],
+ "source": [
+ "# Create a KNN model\n",
+ "model8 = KNeighborsRegressor()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 177,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 74
},
+ "id": "9fn64o-ZlBka",
+ "outputId": "dc5e6af2-de37-46ee-cde7-e0a3baa31a1f"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": 96,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "gEE06_TjozYv",
- "outputId": "30306af7-2ec8-4733-db96-d3416a7fc6d4"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "44/44 [==============================] - 0s 4ms/step\n"
- ]
- }
+ "data": {
+ "text/html": [
+ "KNeighborsRegressor() 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. "
],
- "source": [
- "rmse, mae, mape = evaluate_model(model10, X_test_scaled, y_test)\n",
- "metrics[\"Model\"].append(\"LSTM\")\n",
- "metrics[\"RMSE\"].append(rmse)\n",
- "metrics[\"MAE\"].append(mae)\n",
- "metrics[\"MAPE\"].append(mape)"
+ "text/plain": [
+ "KNeighborsRegressor()"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Create a DataFrame for metrics\n",
- "metrics_df = pd.DataFrame(metrics)\n",
- "\n",
- "# Plot RMSE, MAE, and MAPE for each model\n",
- "plt.figure(figsize=(15, 5))\n",
- "\n",
- "# RMSE Plot\n",
- "plt.subplot(1, 3, 1)\n",
- "plt.bar(metrics_df['Model'], metrics_df['RMSE'], color='lightblue')\n",
- "plt.xlabel('RMSE')\n",
- "plt.title('RMSE for Different Models')\n",
- "plt.tight_layout()\n",
- "plt.show()"
- ]
- },
+ },
+ "execution_count": 177,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model\n",
+ "model8.fit(X_train_scaled, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 119,
+ "metadata": {
+ "id": "hbfbbjcSlDn7"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# MAE Plot\n",
- "plt.subplot(1, 3, 2)\n",
- "plt.bar(metrics_df['Model'], metrics_df['MAE'], color='lightgreen')\n",
- "plt.xlabel('MAE')\n",
- "plt.title('MAE for Different Models')\n",
- "plt.tight_layout()\n",
- "plt.show()"
- ]
+
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "RMSE: 3.0274590148039873\n",
+ "MAE: 1.7525904376439672\n",
+ "MAPE: 0.013668115353592272\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model8, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"KNN\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "X5XtlzMXljps"
+ },
+ "source": [
+ "## 9. Artificial Neural Networks (ANN)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create an ANN model\n",
+ "model9 = Sequential()\n",
+ "model9.add(Dense(32, activation='relu', input_shape=(X_train.shape[1],)))\n",
+ "model9.add(Dense(16, activation='relu'))\n",
+ "model9.add(Dense(1, activation='linear'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 124,
+ "metadata": {
+ "id": "ZIf94WLMlv04"
+ },
+ "outputs": [],
+ "source": [
+ "# Compile the model\n",
+ "model9.compile(loss='mean_squared_error', optimizer='adam')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 126,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
},
+ "id": "FX5DTKqslxWf",
+ "outputId": "9253b26c-1a79-4390-975e-d14c28a5e2a8"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# MAPE Plot\n",
- "plt.subplot(1, 3, 3)\n",
- "plt.bar(metrics_df['Model'], metrics_df['MAPE'], color='salmon')\n",
- "plt.xlabel('MAPE')\n",
- "plt.title('MAPE for Different Models')\n",
- "plt.tight_layout()\n",
- "plt.show()"
+ "data": {
+ "text/plain": [
+ ""
]
+ },
+ "execution_count": 126,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model\n",
+ "model9.fit(X_train_scaled, y_train, epochs=100, batch_size=32, verbose=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 128,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
},
+ "id": "OVW2qpNsmGVq",
+ "outputId": "34343782-f560-4dee-c307-ff0d0c52ab5a"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m45/45\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step\n",
+ "RMSE: 2.801001091255311\n",
+ "MAE: 1.7605365826618848\n",
+ "MAPE: 0.0126215060590655\n",
+ "\n"
+ ]
+
}
- ],
- "metadata": {
+ ],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model9, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"ANN\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "vjSMQNcOnFPJ"
+ },
+ "source": [
+ "## 10. LSTM(Long Short term Memory)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 131,
+ "metadata": {
+ "id": "uACvajfImrbB"
+ },
+ "outputs": [],
+ "source": [
+ "# Reshape the input data for LSTM\n",
+ "n_features = X_train_scaled.shape[1]\n",
+ "n_steps = 10\n",
+ "n_samples_train = X_train_scaled.shape[0] - n_steps + 1\n",
+ "n_samples_test = X_test_scaled.shape[0] - n_steps + 1\n",
+ "\n",
+ "# Reshape the input data\n",
+ "X_train_reshaped = np.array([X_train_scaled[i:i+n_steps, :] for i in range(n_samples_train)])\n",
+ "X_test_reshaped = np.array([X_test_scaled[i:i+n_steps, :] for i in range(n_samples_test)])\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create an LSTM model\n",
+ "model = Sequential()\n",
+ "model.add(LSTM(64, activation='relu', input_shape=(n_steps, n_features)))\n",
+ "model.add(Dense(1))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 135,
+ "metadata": {
+ "id": "YpSfHu6gov35"
+ },
+ "outputs": [],
+ "source": [
+ "# Compile the model\n",
+ "model.compile(loss='mean_squared_error', optimizer='adam')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 137,
+ "metadata": {
"colab": {
- "provenance": []
- },
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
+ "base_uri": "https://localhost:8080/"
},
- "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.9.16"
+ "id": "0vHjcluaoxzP",
+ "outputId": "1eaafd31-9f91-4655-f437-e9199c0f7933"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 137,
+ "metadata": {},
+ "output_type": "execute_result"
}
+ ],
+ "source": [
+ "# Train the model\n",
+ "model.fit(X_train_reshaped, y_train[n_steps-1:], epochs=100, batch_size=32, verbose=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rmse, mae, mape = evaluate_model(model10, X_test_scaled, y_test)\n",
+ "metrics[\"Model\"].append(\"LSTM\")\n",
+ "metrics[\"RMSE\"].append(rmse)\n",
+ "metrics[\"MAE\"].append(mae)\n",
+ "metrics[\"MAPE\"].append(mape)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create a DataFrame for metrics\n",
+ "metrics_df = pd.DataFrame(metrics)\n",
+ "\n",
+ "# Plot RMSE, MAE, and MAPE for each model\n",
+ "plt.figure(figsize=(15, 5))\n",
+ "\n",
+ "# RMSE Plot\n",
+ "plt.subplot(1, 3, 1)\n",
+ "plt.bar(metrics_df['Model'], metrics_df['RMSE'], color='lightblue')\n",
+ "plt.xlabel('RMSE')\n",
+ "plt.title('RMSE for Different Models')\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# MAE Plot\n",
+ "plt.subplot(1, 3, 2)\n",
+ "plt.bar(metrics_df['Model'], metrics_df['MAE'], color='lightgreen')\n",
+ "plt.xlabel('MAE')\n",
+ "plt.title('MAE for Different Models')\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# MAPE Plot\n",
+ "plt.subplot(1, 3, 3)\n",
+ "plt.bar(metrics_df['Model'], metrics_df['MAPE'], color='salmon')\n",
+ "plt.xlabel('MAPE')\n",
+ "plt.title('MAPE for Different Models')\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Using of LightGBM and CatBoost For Optimizing the model accuracy and time complexity"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import necessary libraries\n",
+ "import lightgbm as lgb\n",
+ "from catboost import CatBoostRegressor\n",
+ "from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error, accuracy_score, precision_score, confusion_matrix, recall_score, f1_score\n",
+ "\n",
+ "# Function to train and evaluate a model\n",
+ "def train_and_evaluate_model(model, X_train, X_test, y_train, y_test):\n",
+ " model.fit(X_train, y_train)\n",
+ " pred = model.predict(X_test)\n",
+ " rmse = np.sqrt(mean_squared_error(y_test, pred))\n",
+ " mae = mean_absolute_error(y_test, pred)\n",
+ " mape = mean_absolute_percentage_error(y_test, pred)\n",
+ " accuracy = accuracy_score(y_test > pred, y_test > pred.round())\n",
+ " precision = precision_score(y_test > pred, y_test > pred.round())\n",
+ " confusion = confusion_matrix(y_test > pred, y_test > pred.round())\n",
+ " recall = recall_score(y_test > pred, y_test > pred.round())\n",
+ " f1 = f1_score(y_test > pred, y_test > pred.round())\n",
+ " return rmse, mae, mape, accuracy, precision, confusion, recall, f1\n",
+ "\n",
+ "# Train and evaluate LightGBM model for from this directly print accuracy \n",
+ "model_lightgbm = lgb.LGBMRegressor()\n",
+ "metrics_lightgbm = train_and_evaluate_model(model_lightgbm, X_train, X_test, y_train, y_test)\n",
+ "print(\"LightGBM Metrics:\", metrics_lightgbm)\n",
+ "\n",
+ "# Train and evaluate CatBoost model\n",
+ "model_catboost = CatBoostRegressor(verbose=0)\n",
+ "metrics_catboost = train_and_evaluate_model(model_catboost, X_train, X_test, y_train, y_test)\n",
+ "print(\"CatBoost Metrics:\", metrics_catboost)"
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
},
- "nbformat": 4,
- "nbformat_minor": 0
+ "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.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
}