diff --git a/your-code/bonus.ipynb b/your-code/bonus.ipynb index 92e4a72..f44c1e8 100644 --- a/your-code/bonus.ipynb +++ b/your-code/bonus.ipynb @@ -50,19 +50,17 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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EhMTMWzYMNx77709tke3/RzMihUrkJ+fj7POOgsjRozAu+++a/UqRWTJkiUYNWoUkpOTMWjQIFx99dX47LPPfJYpLi7usU/HjBnjs0xLSwvmzJmD9PR0JCUlYdq0aThw4ICZmxKyBQsW9NiezMxM7/eFEFiwYAGysrKQmJiICRMm4NNPP/V5DZW21yPQOcvhcGD27NkA9NjP77zzDq666ipkZWXB4XDglVde8fm+Ufv22LFjuPnmm+FyueByuXDzzTfj+PHj4a2sIC21tLSIQ4cO+XzdcsstIi8vT3R0dHiXAyAqKip8lvvqq6+8329ubhYZGRli+vTpoq6uTrz44osiOTlZPPzww1ZsVp9yc3PFokWLfLbnxIkT3u+3tbWJgoICUVRUJD766COxYcMGkZWVJUpKSrzLqLTNf/7zn0VxcbF44403xK5du8Qf//hHMWjQIFFWVuaznG77OZB169aJ/v37i6efflps375d3HnnnSIpKUns27fP6lUL26RJk0RFRYXYtm2b+Pjjj8WVV14pcnJyxJdffuldZsaMGWLy5Mk++/To0aM+r3PbbbeJIUOGiA0bNoiPPvpIFBUViW9/+9uira3N7E3q07333iu++c1v+mxPU1OT9/sPPPCASE5OFi+++KKoq6sT119/vRg8eLBwu93eZVTaXo+mpiafbd6wYYMAIDZu3CiE0GM//+lPfxL33HOPePHFFwUA8fLLL/t836h9O3nyZFFQUCA2bdokNm3aJAoKCsTUqVPDWlcGRTbR2toqBg0aJBYtWuTzfKADtLsVK1YIl8slTp065X1uyZIlIisryye4kkVubq549NFHg37/T3/6k4iLixOff/6597n//u//Fk6nUzQ3Nwsh1Ntmfw8++KDIz8/3eU63/RzId7/7XXHbbbf5PPev//qv4u6777ZojYzT1NQkAIi3337b+9yMGTPE97///aA/c/z4cdG/f3+xbt0673Off/65iIuLE3/5y19iuboRuffee8W3v/3tgN/r6OgQmZmZ4oEHHvA+d+rUKeFyucSTTz4phFBve4O58847xbBhw7zvO932s/+5yKh9u337dgFAbN682btMdXW1ACD+/ve/h7x+LJ/ZxKuvvoojR46guLi4x/dKSkqQnp6OUaNG4cknn0RHR4f3e9XV1Rg/frzPjbMmTZqEgwcPYu/evSasefiW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", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -82,20 +80,20 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "0 201\n", - "1 200\n", - "Name: CLASS, dtype: int64" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" + "ename": "AttributeError", + "evalue": "'DataFrame' object has no attribute 'append'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/7n/23tg3_s92h53z9vkzqg5jl2m0000gn/T/ipykernel_96786/2939864048.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mdf2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata_2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"X\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Y\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mdf2\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"CLASS\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'CLASS'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue_counts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m 6200\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_accessors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6201\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6202\u001b[0m ):\n\u001b[1;32m 6203\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 6204\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'append'" + ] } ], "source": [ @@ -120,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -144,7 +142,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/your-code/challenge-1.ipynb b/your-code/challenge-1.ipynb index 2487c5f..71ad406 100644 --- a/your-code/challenge-1.ipynb +++ b/your-code/challenge-1.ipynb @@ -34,11 +34,43 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/slevin/anaconda3/lib/python3.11/site-packages/sklearn/utils/validation.py:767: FutureWarning: is_sparse is deprecated and will be removed in a future version. Check `isinstance(dtype, pd.SparseDtype)` instead.\n", + " if not hasattr(array, \"sparse\") and array.dtypes.apply(is_sparse).any():\n", + "/Users/slevin/anaconda3/lib/python3.11/site-packages/sklearn/utils/validation.py:605: FutureWarning: is_sparse is deprecated and will be removed in a future version. Check `isinstance(dtype, pd.SparseDtype)` instead.\n", + " if is_sparse(pd_dtype):\n", + "/Users/slevin/anaconda3/lib/python3.11/site-packages/sklearn/utils/validation.py:614: FutureWarning: is_sparse is deprecated and will be removed in a future version. Check `isinstance(dtype, pd.SparseDtype)` instead.\n", + " if is_sparse(pd_dtype) or not is_extension_array_dtype(pd_dtype):\n", + "/Users/slevin/anaconda3/lib/python3.11/site-packages/sklearn/utils/validation.py:767: FutureWarning: is_sparse is deprecated and will be removed in a future version. Check `isinstance(dtype, pd.SparseDtype)` instead.\n", + " if not hasattr(array, \"sparse\") and array.dtypes.apply(is_sparse).any():\n", + "/Users/slevin/anaconda3/lib/python3.11/site-packages/sklearn/utils/validation.py:605: FutureWarning: is_sparse is deprecated and will be removed in a future version. Check `isinstance(dtype, pd.SparseDtype)` instead.\n", + " if is_sparse(pd_dtype):\n", + "/Users/slevin/anaconda3/lib/python3.11/site-packages/sklearn/utils/validation.py:614: FutureWarning: is_sparse is deprecated and will be removed in a future version. Check `isinstance(dtype, pd.SparseDtype)` instead.\n", + " if is_sparse(pd_dtype) or not is_extension_array_dtype(pd_dtype):\n" + ] + } + ], "source": [ - "# your code here" + "# your code here\n", + "import pandas as pd\n", + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "tic_tac_toe = pd.read_csv('tic-tac-toe.csv')\n", + "\n", + "mapping = {'x': 1, 'o': -1, 'b': 0}\n", + "tic_tac_toe.replace(mapping, inplace=True)\n", + "\n", + "X = tic_tac_toe.iloc[:, :-1] # All columns except the last one\n", + "y = tic_tac_toe.iloc[:, -1] # Last column (class)\n", + "\n", + "scaler = StandardScaler()\n", + "X_normalized = scaler.fit_transform(X)\n" ] }, { @@ -60,11 +92,150 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n", + "17/17 [==============================] - 0s 7ms/step - loss: 0.6802 - accuracy: 0.5728 - val_loss: 0.6216 - val_accuracy: 0.6493\n", + "Epoch 2/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.6194 - accuracy: 0.6791 - val_loss: 0.5805 - val_accuracy: 0.7313\n", + "Epoch 3/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.5761 - accuracy: 0.7276 - val_loss: 0.5517 - val_accuracy: 0.7463\n", + "Epoch 4/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.5348 - accuracy: 0.7537 - val_loss: 0.5232 - val_accuracy: 0.7612\n", + "Epoch 5/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.4941 - accuracy: 0.7799 - val_loss: 0.5014 - val_accuracy: 0.7761\n", + "Epoch 6/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.4551 - accuracy: 0.7948 - val_loss: 0.4775 - val_accuracy: 0.7836\n", + "Epoch 7/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.4181 - accuracy: 0.8153 - val_loss: 0.4583 - val_accuracy: 0.7836\n", + "Epoch 8/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.3797 - accuracy: 0.8489 - val_loss: 0.4254 - val_accuracy: 0.8209\n", + "Epoch 9/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.3413 - accuracy: 0.8825 - val_loss: 0.3809 - val_accuracy: 0.8284\n", + "Epoch 10/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.3054 - accuracy: 0.8974 - val_loss: 0.3459 - val_accuracy: 0.8433\n", + "Epoch 11/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.2551 - accuracy: 0.9216 - val_loss: 0.3117 - val_accuracy: 0.9328\n", + "Epoch 12/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.2109 - accuracy: 0.9534 - val_loss: 0.2691 - val_accuracy: 0.9403\n", + "Epoch 13/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.1699 - accuracy: 0.9776 - val_loss: 0.2245 - val_accuracy: 0.9478\n", + "Epoch 14/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.1335 - accuracy: 0.9795 - val_loss: 0.1921 - val_accuracy: 0.9627\n", + "Epoch 15/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.1035 - accuracy: 0.9888 - val_loss: 0.1634 - val_accuracy: 0.9701\n", + "Epoch 16/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0807 - accuracy: 0.9907 - val_loss: 0.1521 - val_accuracy: 0.9701\n", + "Epoch 17/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0605 - accuracy: 0.9963 - val_loss: 0.1248 - val_accuracy: 0.9701\n", + "Epoch 18/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0470 - accuracy: 0.9981 - val_loss: 0.1166 - val_accuracy: 0.9701\n", + "Epoch 19/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0368 - accuracy: 0.9981 - val_loss: 0.1077 - val_accuracy: 0.9701\n", + "Epoch 20/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0300 - accuracy: 0.9981 - val_loss: 0.0997 - val_accuracy: 0.9776\n", + "Epoch 21/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0233 - accuracy: 1.0000 - val_loss: 0.0977 - val_accuracy: 0.9776\n", + "Epoch 22/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0194 - accuracy: 1.0000 - val_loss: 0.0923 - val_accuracy: 0.9776\n", + "Epoch 23/50\n", + "17/17 [==============================] - 0s 3ms/step - loss: 0.0161 - accuracy: 1.0000 - val_loss: 0.0899 - val_accuracy: 0.9851\n", + "Epoch 24/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0136 - accuracy: 1.0000 - val_loss: 0.0865 - val_accuracy: 0.9851\n", + "Epoch 25/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0115 - accuracy: 1.0000 - val_loss: 0.0850 - val_accuracy: 0.9851\n", + "Epoch 26/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0100 - accuracy: 1.0000 - val_loss: 0.0862 - val_accuracy: 0.9851\n", + "Epoch 27/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0087 - accuracy: 1.0000 - val_loss: 0.0839 - val_accuracy: 0.9851\n", + "Epoch 28/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0075 - accuracy: 1.0000 - val_loss: 0.0799 - val_accuracy: 0.9851\n", + "Epoch 29/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0067 - accuracy: 1.0000 - val_loss: 0.0810 - val_accuracy: 0.9851\n", + "Epoch 30/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0060 - accuracy: 1.0000 - val_loss: 0.0806 - val_accuracy: 0.9851\n", + "Epoch 31/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0054 - accuracy: 1.0000 - val_loss: 0.0807 - val_accuracy: 0.9851\n", + "Epoch 32/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0049 - accuracy: 1.0000 - val_loss: 0.0805 - val_accuracy: 0.9851\n", + "Epoch 33/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0044 - accuracy: 1.0000 - val_loss: 0.0791 - val_accuracy: 0.9851\n", + "Epoch 34/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0040 - accuracy: 1.0000 - val_loss: 0.0795 - val_accuracy: 0.9851\n", + "Epoch 35/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0037 - accuracy: 1.0000 - val_loss: 0.0787 - val_accuracy: 0.9851\n", + "Epoch 36/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0033 - accuracy: 1.0000 - val_loss: 0.0803 - val_accuracy: 0.9851\n", + "Epoch 37/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0031 - accuracy: 1.0000 - val_loss: 0.0798 - val_accuracy: 0.9851\n", + "Epoch 38/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0028 - accuracy: 1.0000 - val_loss: 0.0791 - val_accuracy: 0.9851\n", + "Epoch 39/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0026 - accuracy: 1.0000 - val_loss: 0.0802 - val_accuracy: 0.9851\n", + "Epoch 40/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.0793 - val_accuracy: 0.9851\n", + "Epoch 41/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0023 - accuracy: 1.0000 - val_loss: 0.0792 - val_accuracy: 0.9851\n", + "Epoch 42/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0021 - accuracy: 1.0000 - val_loss: 0.0801 - val_accuracy: 0.9851\n", + "Epoch 43/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0020 - accuracy: 1.0000 - val_loss: 0.0801 - val_accuracy: 0.9851\n", + "Epoch 44/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0019 - accuracy: 1.0000 - val_loss: 0.0803 - val_accuracy: 0.9851\n", + "Epoch 45/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0017 - accuracy: 1.0000 - val_loss: 0.0803 - val_accuracy: 0.9851\n", + "Epoch 46/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0016 - accuracy: 1.0000 - val_loss: 0.0800 - val_accuracy: 0.9851\n", + "Epoch 47/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0015 - accuracy: 1.0000 - val_loss: 0.0802 - val_accuracy: 0.9851\n", + "Epoch 48/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0015 - accuracy: 1.0000 - val_loss: 0.0815 - val_accuracy: 0.9851\n", + "Epoch 49/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0014 - accuracy: 1.0000 - val_loss: 0.0803 - val_accuracy: 0.9851\n", + "Epoch 50/50\n", + "17/17 [==============================] - 0s 2ms/step - loss: 0.0013 - accuracy: 1.0000 - val_loss: 0.0815 - val_accuracy: 0.9851\n", + "9/9 [==============================] - 0s 721us/step - loss: 0.0305 - accuracy: 0.9896\n", + "Test Accuracy: 0.9895833134651184\n", + "INFO:tensorflow:Assets written to: tic-tac-toe.model/assets\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: tic-tac-toe.model/assets\n" + ] + } + ], "source": [ - "# your code here" + "# your code here\n", + "from sklearn.model_selection import train_test_split\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Dense\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(X_normalized, y, test_size=0.3, random_state=42)\n", + "\n", + "model = Sequential()\n", + "\n", + "model.add(Dense(64, activation='relu', input_shape=(X_train.shape[1],)))\n", + "model.add(Dense(32, activation='relu'))\n", + "model.add(Dense(16, activation='relu'))\n", + "model.add(Dense(1, activation='sigmoid')) # Sigmoid for binary classification\n", + "\n", + "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", + "\n", + "history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.2)\n", + "\n", + "test_loss, test_accuracy = model.evaluate(X_test, y_test)\n", + "print(f\"Test Accuracy: {test_accuracy}\")\n", + "\n", + "# Save the model\n", + "model.save(\"tic-tac-toe.model\")\n" ] }, { @@ -78,11 +249,50 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 40ms/step\n", + "Sample 1:\n", + "Predicted: [0.], Actual: False\n", + "\n", + "Sample 2:\n", + "Predicted: [1.], Actual: True\n", + "\n", + "Sample 3:\n", + "Predicted: [0.], Actual: False\n", + "\n", + "Sample 4:\n", + "Predicted: [1.], Actual: True\n", + "\n", + "Sample 5:\n", + "Predicted: [1.], Actual: True\n", + "\n" + ] + } + ], "source": [ - "# your code here" + "# your code here\n", + "from tensorflow.keras.models import load_model\n", + "import numpy as np\n", + "\n", + "loaded_model = load_model(\"tic-tac-toe.model\")\n", + "\n", + "num_samples_to_predict = 5 # Change this number as needed\n", + "random_indices = np.random.choice(X_test.shape[0], num_samples_to_predict, replace=False)\n", + "random_samples = X_test[random_indices]\n", + "\n", + "predictions = loaded_model.predict(random_samples)\n", + "rounded_predictions = np.round(predictions)\n", + "\n", + "for i, idx in enumerate(random_indices):\n", + " print(f\"Sample {i+1}:\")\n", + " print(f\"Predicted: {rounded_predictions[i]}, Actual: {y_test.iloc[idx]}\")\n", + " print()" ] }, { @@ -104,11 +314,54 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/1 [==============================] - 0s 30ms/step\n", + "Sample 1:\n", + "Predicted: [1.], Actual: True\n", + "\n", + "Sample 2:\n", + "Predicted: [1.], Actual: True\n", + "\n", + "Sample 3:\n", + "Predicted: [1.], Actual: True\n", + "\n", + "Sample 4:\n", + "Predicted: [1.], Actual: True\n", + "\n", + "Sample 5:\n", + "Predicted: [1.], Actual: True\n", + "\n" + ] + } + ], "source": [ - "# your code here" + "# your code here\n", + "from tensorflow.keras.models import load_model\n", + "import numpy as np\n", + "\n", + "# Load the saved model\n", + "loaded_model = load_model(\"tic-tac-toe.model\")\n", + "\n", + "# Make predictions on a few random rows from the test dataset\n", + "num_samples_to_predict = 5 # Change this number as needed\n", + "random_indices = np.random.choice(X_test.shape[0], num_samples_to_predict, replace=False)\n", + "random_samples = X_test[random_indices]\n", + "\n", + "# Predict\n", + "predictions = loaded_model.predict(random_samples)\n", + "rounded_predictions = np.round(predictions)\n", + "\n", + "# Compare predictions with actual labels\n", + "for i, idx in enumerate(random_indices):\n", + " print(f\"Sample {i+1}:\")\n", + " print(f\"Predicted: {rounded_predictions[i]}, Actual: {y_test.iloc[idx]}\")\n", + " print()\n" ] }, { @@ -124,7 +377,11 @@ "metadata": {}, "outputs": [], "source": [ - "# your answer here" + "# your answer here\n", + "\"\"\"\n", + "Improving model performance involves a lot of trial an error. By adjusting the architecture by adding more layers seemed to have a positive impact in this case. \n", + "This model was able to create potentially more complex patterns in the data, which can be beneficial for solving intricate problems.\n", + "\"\"\"\n" ] } ], @@ -144,7 +401,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/your-code/tic-tac-toe.model/fingerprint.pb b/your-code/tic-tac-toe.model/fingerprint.pb new file mode 100644 index 0000000..f5e132f --- /dev/null +++ b/your-code/tic-tac-toe.model/fingerprint.pb @@ -0,0 +1 @@ +󨃳Ѝ𮮥Ϯ ש!(\2 \ No newline at end of file diff --git a/your-code/tic-tac-toe.model/keras_metadata.pb b/your-code/tic-tac-toe.model/keras_metadata.pb new file mode 100644 index 0000000..eac4c00 --- /dev/null +++ b/your-code/tic-tac-toe.model/keras_metadata.pb @@ -0,0 +1,8 @@ + +-root"_tf_keras_sequential*-{"name": "sequential", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": false, "class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 9]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 9]}, "units": 64, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 32, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 16, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}]}, "shared_object_id": 13, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 9]}, "ndim": 2, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 9]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 9]}, "float32", "dense_input"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 9]}, "float32", "dense_input"]}, "keras_version": "2.15.0", "backend": "tensorflow", "model_config": {"class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 9]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}, "shared_object_id": 0}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 9]}, "units": 64, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 32, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 16, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9}, {"class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 10}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 11}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 12}]}}, "training_config": {"loss": "binary_crossentropy", "metrics": [[{"class_name": "MeanMetricWrapper", "config": {"name": "accuracy", "dtype": "float32", "fn": "binary_accuracy"}, "shared_object_id": 15}]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Adam", "config": {"name": "Adam", "learning_rate": 0.0010000000474974513, "decay": 0.0, "beta_1": 0.8999999761581421, "beta_2": 0.9990000128746033, "epsilon": 1e-07, "amsgrad": false}}}}2 +root.layer_with_weights-0"_tf_keras_layer*{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 9]}, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 9]}, "units": 64, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 9}}, "shared_object_id": 16}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 9]}}2 +root.layer_with_weights-1"_tf_keras_layer*{"name": "dense_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 32, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 64}}, "shared_object_id": 17}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 64]}}2 +root.layer_with_weights-2"_tf_keras_layer*{"name": "dense_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 16, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 32}}, "shared_object_id": 18}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 32]}}2 +root.layer_with_weights-3"_tf_keras_layer*{"name": "dense_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 10}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 11}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 12, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 16}}, "shared_object_id": 19}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 16]}}2 +Yroot.keras_api.metrics.0"_tf_keras_metric*{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 20}2 +Zroot.keras_api.metrics.1"_tf_keras_metric*{"class_name": "MeanMetricWrapper", "name": "accuracy", "dtype": "float32", "config": {"name": "accuracy", "dtype": "float32", "fn": "binary_accuracy"}, "shared_object_id": 15}2 \ No newline at end of file diff --git a/your-code/tic-tac-toe.model/saved_model.pb b/your-code/tic-tac-toe.model/saved_model.pb new file mode 100644 index 0000000..3420673 Binary files /dev/null and b/your-code/tic-tac-toe.model/saved_model.pb differ diff --git a/your-code/tic-tac-toe.model/variables/variables.data-00000-of-00001 b/your-code/tic-tac-toe.model/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000..7cf1835 Binary files /dev/null and b/your-code/tic-tac-toe.model/variables/variables.data-00000-of-00001 differ diff --git a/your-code/tic-tac-toe.model/variables/variables.index b/your-code/tic-tac-toe.model/variables/variables.index new file mode 100644 index 0000000..e68001f Binary files /dev/null and b/your-code/tic-tac-toe.model/variables/variables.index differ