Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "SequentialWithCnn",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "code",
"metadata": {
"id": "FAVvkosAMRm3"
},
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"from sklearn.preprocessing import LabelEncoder\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.model_selection import StratifiedShuffleSplit\n",
"from keras.models import Sequential\n",
"from keras.layers import Dense, Activation, Flatten, Convolution1D, Dropout\n",
"from keras.optimizers import SGD\n",
"from keras.utils import np_utils\n",
"import matplotlib.pyplot as plt\n",
"import numpy\n",
"from sklearn.metrics import accuracy_score , precision_score , recall_score , classification_report ,plot_confusion_matrix , confusion_matrix , f1_score\n",
"import itertools"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "drLs2sbyNUS5",
"outputId": "575c1426-5911-4392-b56e-e31dd3b26a6c"
},
"source": [
" wfrom google.colab import drive\n",
"drive.mount('/content/drive')"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Mounted at /content/drive\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "xVf169KyNium"
},
"source": [
"train = pd.read_csv('/content/drive/MyDrive/train.csv')\n",
"test = pd.read_csv('/content/drive/MyDrive/test.csv')"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "fFAg3H8_NngQ"
},
"source": [
"def encode(train, test):\n",
" label_encoder = LabelEncoder().fit(train.species)\n",
" labels = label_encoder.transform(train.species)\n",
" classes = list(label_encoder.classes_)\n",
"\n",
" train = train.drop(['species', 'id'], axis=1)\n",
" test_ids=test.id\n",
" test = test.drop('id', axis=1)\n",
"\n",
" return train, labels, test, classes,test_ids"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "uneDFkLWNsxy"
},
"source": [
"train, labels, test, classes,test_ids = encode(train, test)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "vBjZl-_3NvNt"
},
"source": [
"scaler = StandardScaler().fit(train.values)\n",
"scaled_train = scaler.transform(train.values)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "fpLYRp5eNzA9"
},
"source": [
"sss = StratifiedShuffleSplit(test_size=0.1, random_state=23)\n",
"for train_index, valid_index in sss.split(scaled_train, labels):\n",
" X_train, X_valid = scaled_train[train_index], scaled_train[valid_index]\n",
" y_train, y_valid = labels[train_index], labels[valid_index]"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "3PXMQCNJN3eG"
},
"source": [
"nb_features = 64 # number of features per features type (shape, texture, margin) \n",
"nb_class = len(classes)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "qj0UYCM5N7G-"
},
"source": [
"# reshape train data\n",
"X_train_r = np.zeros((len(X_train), nb_features, 3))\n",
"X_train_r[:, :, 0] = X_train[:, :nb_features]\n",
"X_train_r[:, :, 1] = X_train[:, nb_features:128]\n",
"X_train_r[:, :, 2] = X_train[:, 128:]\n",
"\n",
"# reshape validation data\n",
"X_valid_r = np.zeros((len(X_valid), nb_features, 3))\n",
"X_valid_r[:, :, 0] = X_valid[:, :nb_features]\n",
"X_valid_r[:, :, 1] = X_valid[:, nb_features:128]\n",
"X_valid_r[:, :, 2] = X_valid[:, 128:]"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "M8jnolWmN-cl"
},
"source": [
"model = Sequential()\n",
"model.add(Convolution1D(512, 1, input_shape=(nb_features, 3)))\n",
"model.add(Activation('relu'))\n",
"model.add(Flatten())\n",
"model.add(Dropout(0.4))\n",
"model.add(Dense(2048, activation='relu'))\n",
"model.add(Dense(1024, activation='relu'))\n",
"model.add(Dense(nb_class))\n",
"model.add(Activation('softmax'))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "IBevY0e3v6yO",
"outputId": "c441ea98-2d3a-41b7-ae92-b74cd5eb61a8"
},
"source": [
"model.summary()"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Model: \"sequential\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"conv1d (Conv1D) (None, 64, 512) 2048 \n",
"_________________________________________________________________\n",
"activation (Activation) (None, 64, 512) 0 \n",
"_________________________________________________________________\n",
"flatten (Flatten) (None, 32768) 0 \n",
"_________________________________________________________________\n",
"dropout (Dropout) (None, 32768) 0 \n",
"_________________________________________________________________\n",
"dense (Dense) (None, 2048) 67110912 \n",
"_________________________________________________________________\n",
"dense_1 (Dense) (None, 1024) 2098176 \n",
"_________________________________________________________________\n",
"dense_2 (Dense) (None, 99) 101475 \n",
"_________________________________________________________________\n",
"activation_1 (Activation) (None, 99) 0 \n",
"=================================================================\n",
"Total params: 69,312,611\n",
"Trainable params: 69,312,611\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "708P3Vd3OB8V"
},
"source": [
"y_train = np_utils.to_categorical(y_train, nb_class)\n",
"y_valid = np_utils.to_categorical(y_valid, nb_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "4jc6gtZFOIc7"
},
"source": [
"sgd = SGD(lr=0.01, nesterov=True, decay=1e-6, momentum=0.9)\n",
"model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])\n",
"nb_epoch = 15"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ZQIQkAb4jJUD",
"outputId": "820f66da-1df5-458a-8f61-7ab27b4f0f6a"
},
"source": [
"History = model.fit(X_train_r, y_train, epochs=nb_epoch, validation_data=(X_valid_r, y_valid), batch_size=16)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 1/15\n",
"56/56 [==============================] - 45s 785ms/step - loss: 4.2874 - accuracy: 0.1107 - val_loss: 1.6623 - val_accuracy: 0.6566\n",
"Epoch 2/15\n",
"56/56 [==============================] - 43s 775ms/step - loss: 1.0268 - accuracy: 0.7725 - val_loss: 0.4414 - val_accuracy: 0.8788\n",
"Epoch 3/15\n",
"56/56 [==============================] - 43s 777ms/step - loss: 0.1649 - accuracy: 0.9552 - val_loss: 0.1830 - val_accuracy: 0.9596\n",
"Epoch 4/15\n",
"56/56 [==============================] - 43s 773ms/step - loss: 0.0361 - accuracy: 0.9895 - val_loss: 0.1160 - val_accuracy: 0.9596\n",
"Epoch 5/15\n",
"56/56 [==============================] - 43s 776ms/step - loss: 0.0316 - accuracy: 0.9954 - val_loss: 0.0875 - val_accuracy: 0.9697\n",
"Epoch 6/15\n",
"56/56 [==============================] - 44s 778ms/step - loss: 0.0079 - accuracy: 0.9991 - val_loss: 0.0901 - val_accuracy: 0.9596\n",
"Epoch 7/15\n",
"56/56 [==============================] - 43s 777ms/step - loss: 0.0233 - accuracy: 0.9906 - val_loss: 0.1153 - val_accuracy: 0.9596\n",
"Epoch 8/15\n",
"56/56 [==============================] - 43s 773ms/step - loss: 0.0069 - accuracy: 0.9991 - val_loss: 0.0795 - val_accuracy: 0.9697\n",
"Epoch 9/15\n",
"56/56 [==============================] - 43s 773ms/step - loss: 0.0079 - accuracy: 0.9979 - val_loss: 0.0817 - val_accuracy: 0.9697\n",
"Epoch 10/15\n",
"56/56 [==============================] - 43s 772ms/step - loss: 0.0026 - accuracy: 1.0000 - val_loss: 0.0925 - val_accuracy: 0.9697\n",
"Epoch 11/15\n",
"56/56 [==============================] - 43s 773ms/step - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.0842 - val_accuracy: 0.9697\n",
"Epoch 12/15\n",
"56/56 [==============================] - 43s 773ms/step - loss: 0.0018 - accuracy: 1.0000 - val_loss: 0.0723 - val_accuracy: 0.9697\n",
"Epoch 13/15\n",
"56/56 [==============================] - 43s 773ms/step - loss: 0.0019 - accuracy: 1.0000 - val_loss: 0.1177 - val_accuracy: 0.9596\n",
"Epoch 14/15\n",
"56/56 [==============================] - 43s 774ms/step - loss: 0.0025 - accuracy: 0.9993 - val_loss: 0.1188 - val_accuracy: 0.9596\n",
"Epoch 15/15\n",
"56/56 [==============================] - 43s 775ms/step - loss: 0.0727 - accuracy: 0.9874 - val_loss: 0.0784 - val_accuracy: 0.9697\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 590
},
"id": "CSe7eUkTldK4",
"outputId": "e61cde6e-ff8f-4a40-cf6b-aae7f966a049"
},
"source": [
"# summarize history for accuracy\n",
"print(History.history.keys())\n",
"plt.plot(History.history['accuracy'])\n",
"plt.plot(History.history['val_accuracy'])\n",
"plt.title('model accuracy')\n",
"plt.ylabel('accuracy')\n",
"plt.xlabel('epoch')\n",
"plt.legend(['train', 'validation'], loc='lower right')\n",
"plt.show()\n",
"# summarize history for loss\n",
"plt.plot(History.history['loss'])\n",
"plt.plot(History.history['val_loss'])\n",
"plt.title('model loss')\n",
"plt.ylabel('loss')\n",
"plt.xlabel('epoch')\n",
"plt.legend(['train', 'validation'], loc='upper right')\n",
"plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de3xdZZ3v8c8v9+z0kktT6CVJy8W2pJS2VC4yIIg6BRSogMUDHnHUqqMHOIMzg8yMjh6dgzMcBhFEUVF0EMECggoqKiCMgJTSlt6AcmmblrZpm6SXJM1l/84fayXZTXZubVd2kvV9v177tdflWWv/kqbrt59nPet5zN0REZH4ysp0ACIikllKBCIiMadEICISc0oEIiIxp0QgIhJzSgQiIjGnRCAyQGb2IzP72gDLvmVm7z3c84gMBSUCEZGYUyIQEYk5JQIZVcImmb83s1Vmtt/MfmBmR5nZY2a218x+b2YlKeUvNLM1ZlZvZk+a2ayUffPMbHl43H1AQbfP+oCZrQiP/bOZzTnEmD9lZhvMbLeZPWJmk8PtZmb/aWY7zGyPmb1sZrPDfeeb2dowti1m9oVD+oWJoEQgo9MlwPuAdwAfBB4DbgDKCf7mrwYws3cA9wLXhvseBX5pZnlmlgf8AvgJUAr8PDwv4bHzgLuATwNlwHeBR8wsfzCBmtl7gP8LfBiYBGwEfhbufj9wVvhzjA/L7Ar3/QD4tLuPBWYDfxzM54qkUiKQ0ehb7r7d3bcATwPPu/tL7t4MPATMC8stBn7t7o+7eytwE1AIvAs4DcgFbnH3VndfCryQ8hlLgO+6+/Pu3u7udwMHwuMG4wrgLndf7u4HgC8Cp5vZNKAVGAvMBMzd17n72+FxrcAJZjbO3evcffkgP1ekkxKBjEbbU5ab0qyPCZcnE3wDB8Ddk8BmYEq4b4sfPCrjxpTlKuC6sFmo3szqgYrwuMHoHsM+gm/9U9z9j8BtwO3ADjO708zGhUUvAc4HNprZU2Z2+iA/V6STEoHE2VaCCzoQtMkTXMy3AG8DU8JtHSpTljcDX3f34pRXwt3vPcwYigiamrYAuPut7n4ycAJBE9Hfh9tfcPeLgIkETVj3D/JzRTopEUic3Q9cYGbnmlkucB1B886fgWeBNuBqM8s1sw8Bp6Qc+z3gM2Z2anhTt8jMLjCzsYOM4V7g42Y2N7y/8G8ETVlvmdk7w/PnAvuBZiAZ3sO4wszGh01ae4DkYfweJOaUCCS23P0V4ErgW8BOghvLH3T3FndvAT4EXAXsJrif8GDKscuATxE03dQBG8Kyg43h98C/AA8Q1EKOBS4Pd48jSDh1BM1Hu4D/CPd9FHjLzPYAnyG41yBySEwT04iIxJtqBCIiMadEICISc0oEIiIxp0QgIhJzOZkOYLAmTJjg06ZNy3QYIiIjyosvvrjT3cvT7RtxiWDatGksW7Ys02GIiIwoZraxt31qGhIRiTklAhGRmFMiEBGJuRF3j0BERpfW1lZqampobm7OdCijQkFBAVOnTiU3N3fAxygRiEhG1dTUMHbsWKZNm8bBg73KYLk7u3btoqamhunTpw/4ODUNiUhGNTc3U1ZWpiRwBJgZZWVlg65dKRGISMYpCRw5h/K7jE0iWL9tD9/4zXoamlozHYqIyLASm0SwaVcjdzz5Om/u3J/pUERkGKmvr+fb3/72oI87//zzqa+vjyCioRebRFBVVgTAxl1KBCLSpbdE0NbW1udxjz76KMXFxVGFNaRi02uosjQBBDUDEZEO119/Pa+//jpz584lNzeXgoICSkpKWL9+Pa+++ioXX3wxmzdvprm5mWuuuYYlS5YAXcPd7Nu3j/POO4+/+qu/4s9//jNTpkzh4YcfprCwMMM/2cDFJhEU5mVTPjafTbuVCESGq6/8cg1rt+45ouc8YfI4vvzB6l7333jjjaxevZoVK1bw5JNPcsEFF7B69erO7pd33XUXpaWlNDU18c53vpNLLrmEsrKyg87x2muvce+99/K9732PD3/4wzzwwANceeWVR/TniFJsEgFAVWmCjUoEItKHU0455aA++LfeeisPPfQQAJs3b+a1117rkQimT5/O3LlzATj55JN56623hizeIyFWiaCyLMGfN+zKdBgi0ou+vrkPlaKios7lJ598kt///vc8++yzJBIJzj777LR99PPz8zuXs7OzaWpqGpJYj5TY3CwGqCotYtueZppb2zMdiogME2PHjmXv3r1p9zU0NFBSUkIikWD9+vU899xzQxzd0IhZjSC4eVNT18hxE8dmOBoRGQ7Kyso444wzmD17NoWFhRx11FGd+xYuXMh3vvMdZs2axYwZMzjttNMyGGl04pUISju6kCoRiEiXn/70p2m35+fn89hjj6Xd13EfYMKECaxevbpz+xe+8IUjHl/UImsaMrMCM/uLma00szVm9pU0Za4ys1ozWxG+PhlVPABVZUEX0o3qQioi0inKGsEB4D3uvs/McoFnzOwxd+/eyHafu38+wjg6lRXlUZSXrS6kIiIpIksE7u7AvnA1N3x5VJ83EGZGRWlCiUBEJEWkvYbMLNvMVgA7gMfd/fk0xS4xs1VmttTMKno5zxIzW2Zmy2praw8rpqqyhIaZEBFJEWkicPd2d58LTAVOMbPZ3Yr8Epjm7nOAx4G7eznPne6+wN0XlJeXH1ZMVWVFbK5rIpnMaOVERGTYGJLnCNy9HngCWNht+y53PxCufh84OepYKkoTtLQl2b5X0+KJiEC0vYbKzaw4XC4E3ges71ZmUsrqhcC6qOLpUFWqnkMicujGjBkDwNatW7n00kvTljn77LNZtmxZn+e55ZZbaGzsug5lcljrKGsEk4AnzGwV8ALBPYJfmdlXzezCsMzVYdfSlcDVwFURxgN0dSHVKKQicjgmT57M0qVLD/n47okgk8NaR5YI3H2Vu89z9znuPtvdvxpu/5K7PxIuf9Hdq939JHc/x93X933Wwze5uJDsLFPPIREBgmGob7/99s71f/3Xf+VrX/sa5557LvPnz+fEE0/k4Ycf7nHcW2+9xezZwW3PpqYmLr/8cmbNmsWiRYsOGmvos5/9LAsWLKC6upovf/nLQDCQ3datWznnnHM455xzgGBY6507dwJw8803M3v2bGbPns0tt9zS+XmzZs3iU5/6FNXV1bz//e8/YmMaxerJYoDc7CwmFxdoFFKR4eix62Hby0f2nEefCOfd2OvuxYsXc+211/K5z30OgPvvv5/f/va3XH311YwbN46dO3dy2mmnceGFF/Y6H/Add9xBIpFg3bp1rFq1ivnz53fu+/rXv05paSnt7e2ce+65rFq1iquvvpqbb76ZJ554ggkTJhx0rhdffJEf/vCHPP/887g7p556Ku9+97spKSmJbLjrWA0616GqtIhN6kIqIsC8efPYsWMHW7duZeXKlZSUlHD00Udzww03MGfOHN773veyZcsWtm/f3us5/vSnP3VekOfMmcOcOXM6991///3Mnz+fefPmsWbNGtauXdtnPM888wyLFi2iqKiIMWPG8KEPfYinn34aiG6469jVCCAYjvqxl9/OdBgi0l0f39yjdNlll7F06VK2bdvG4sWLueeee6itreXFF18kNzeXadOmpR1+uj9vvvkmN910Ey+88AIlJSVcddVVh3SeDlENdx3LGkFlaYK6xlb2NLdmOhQRGQYWL17Mz372M5YuXcpll11GQ0MDEydOJDc3lyeeeIKNGzf2efxZZ53VOXDd6tWrWbVqFQB79uyhqKiI8ePHs3379oMGsOtt+OszzzyTX/ziFzQ2NrJ//34eeughzjzzzCP40/YUyxpBVcr8xbOnjM9wNCKSadXV1ezdu5cpU6YwadIkrrjiCj74wQ9y4oknsmDBAmbOnNnn8Z/97Gf5+Mc/zqxZs5g1axYnnxw8EnXSSScxb948Zs6cSUVFBWeccUbnMUuWLGHhwoVMnjyZJ554onP7/PnzueqqqzjllFMA+OQnP8m8efMinfXMgiGBRo4FCxZ4f/1z+7NmawMX3PoMt/+P+VwwZ1L/B4hIZNatW8esWbMyHcaoku53amYvuvuCdOVj2zQEqAupiAgxTQRjC3IpLcpj0271HBIRiWUigKBWoGEmRIaHkdZEPZwdyu8ytomgqkzzEogMBwUFBezatUvJ4Ahwd3bt2kVBQcGgjotlryEIagS/XLmVlrYkeTmxzYciGTd16lRqamo43LlGJFBQUMDUqVMHdUysE0HSYUt9E9MnFGU6HJHYys3NZfr06ZkOI9Zi+1W4qiy4+Gu2MhGJuxgngqAL6WbdJxCRmIttIigfk09+TpZ6DolI7MU2EWRlWdCFVDUCEYm52CYCCJqH1DQkInEX60RQURo8S6D+yyISZ1FOXl9gZn8xs5XhvMRfSVMm38zuM7MNZva8mU2LKp50qkoTNLa0U7vvwFB+rIjIsBJljeAA8B53PwmYCyw0s9O6lfkEUOfuxwH/CXwjwnh66OhCquYhEYmzKCevd3ffF67mhq/ubTAXAXeHy0uBc623SUEjUBl2IVXPIRGJs0jvEZhZtpmtAHYAj7v7892KTAE2A7h7G9AAlKU5zxIzW2Zmy47kY+hTSwoxUyIQkXiLNBG4e7u7zwWmAqeY2exDPM+d7r7A3ReUl5cfsfjyc7KZNK5Ag8+JSKwNSa8hd68HngAWdtu1BagAMLMcYDywayhi6lCpUUhFJOai7DVUbmbF4XIh8D5gfbdijwAfC5cvBf7oQ9yXs6q0SE1DIhJrUY4+Ogm428yyCRLO/e7+KzP7KrDM3R8BfgD8xMw2ALuByyOMJ63KsgQ79x1g/4E2ivJjOxiriMRYZFc+d18FzEuz/Uspy83AZVHFMBAd8xdvrmtk5tHjMhmKiEhGxPrJYugahVTNQyISV7FPBB01gk1KBCISU7FPBMWJPMYV5LBxtyaoEZF4in0igGCoiU27mzIdhohIRigRED5LoCkrRSSmlAgI7hPU1DXR1p7MdCgiIkNOiYBgOOq2pPN2Q3OmQxERGXJKBHSNQqqhJkQkjpQI6OpCqmcJRCSOlAiASeMLyc02dSEVkVhSIgCys4yKEk1kLyLxpEQQqixLqGlIRGJJiSBUWZpg065GhngUbBGRjFMiCFWWJth7oI36xtZMhyIiMqSUCEJVZUUAbNR9AhGJGSWCUFcXUvUcEpF4USIIaThqEYmrKOcsrjCzJ8xsrZmtMbNr0pQ528wazGxF+PpSunMNhcK8bCaOzdfTxSISO1FO0tsGXOfuy81sLPCimT3u7mu7lXva3T8QYRwDVlWW0D0CEYmdyGoE7v62uy8Pl/cC64ApUX3ekVARdiEVEYmTIblHYGbTCCayfz7N7tPNbKWZPWZm1b0cv8TMlpnZstra2sjirCotYtueZppb2yP7DBGR4SbyRGBmY4AHgGvdfU+33cuBKnc/CfgW8It053D3O919gbsvKC8vjyzWjonsa+pUKxCR+Ig0EZhZLkESuMfdH+y+3933uPu+cPlRINfMJkQZU18qNAqpiMRQlL2GDPgBsM7db+6lzNFhOczslDCeXVHF1J+OGoESgYjESZS9hs4APgq8bGYrwm03AJUA7v4d4FLgs2bWBjQBl3sGB/spK8qjKC9bXUhFJFYiSwTu/gxg/ZS5DbgtqhgGy8yoLCtSIhCRWNGTxd1UlhZqmAkRiRUlgm6qyorYXNdEMqnhqEUkHpQIuqksTdDSlmT73uZMhyIiMiSUCLrRRPYiEjdKBN10dCHVUBMiEhdKBN1MLi4kO8vUc0hEYkOJoJvc7CymFBdqFFIRiQ0lgjSCiezVhVRE4kGJII3KsoSahkQkNpQI0qgqTVDX2Mqe5tZMhyIiEjklgjTUc0hE4kSJIA0NRy0icaJEkEZVWRGA7hOISCwoEaQxJj+HsqI8Nu1WzyERGf2UCHpRUZpQ05CIxIISQS+q1IVURGJCiaAXVaUJttY30dKWzHQoIiKRUiLoRWVZEUmHLfVNmQ5FRCRSUU5eX2FmT5jZWjNbY2bXpCljZnarmW0ws1VmNj+qeAarazhq3TAWkdEtysnr24Dr3H25mY0FXjSzx919bUqZ84Djw9epwB3he8Z1PFS2WfcJRGSUi6xG4O5vu/vycHkvsA6Y0q3YRcCPPfAcUGxmk6KKaTAmjs0nPydLPYdEZNQbknsEZjYNmAc8323XFGBzynoNPZMFZrbEzJaZ2bLa2tqowuz+mVSWJjQctYiMegNKBGZ2jZmNC9v0f2Bmy83s/QM8dgzwAHCtu+85lCDd/U53X+DuC8rLyw/lFIekqiyhpiERGfUGWiP4m/Ai/n6gBPgocGN/B5lZLkESuMfdH0xTZAtQkbI+Ndw2LFSWFrFpdyPunulQREQiM9BEYOH7+cBP3H1Nyrb0B5gZ8ANgnbvf3EuxR4D/GdY0TgMa3P3tAcYUuaqyBI0t7dTuO5DpUEREIjPQXkMvmtnvgOnAF8NeQP09aXUGQc3hZTNbEW67AagEcPfvAI8SJJcNQCPw8cGFH62OLqSbdjUycWxBhqMREYnGQBPBJ4C5wBvu3mhmpfRz0Xb3Z+in1uBBm8vnBhjDkKvsmJdgdyMLppVmOBoRkWgMtGnodOAVd683syuBfwYaogtreJhaUoiZ5iUQkdFtoIngDqDRzE4CrgNeB34cWVTDRH5ONpPGFWjwOREZ1QaaCNrCZpyLgNvc/XZgbHRhDR+ayF5ERruBJoK9ZvZFgpu/vzazLCA3urCGj6rSIjUNicioNtBEsBg4QPA8wTaC/v7/EVlUw0hlWYKd+w6w/0BbpkMREYnEgBJBePG/BxhvZh8Amt191N8jgJQupGoeEpFRaqBDTHwY+AtwGfBh4HkzuzTKwIaLqjIlAhEZ3Qb6HME/Ae909x0AZlYO/B5YGlVgw0VVaREQPFQmIjIaDfQeQVZHEgjtGsSxI9r4RC7jCnLYuFsT1IjI6DTQGsFvzOy3wL3h+mKC4SFioaqsiE27NWWliIxOA0oE7v73ZnYJwfhBAHe6+0PRhRWR1mbIHfyYQZVlCdZsGfUPUotITA24ecfdH3D3vwtfIy8JrH0Y/v0YaBj8KNdVpQlq6ppoa+9vnD0RkZGnz0RgZnvNbE+a114zO6RJZjJmYjW07od1jwz60MrSBG1J5+2G5ggCExHJrD4TgbuPdfdxaV5j3X3cUAV5REw4Do46EdYMvjJTqS6kIjKKxaLnT6fqi2Hz89BQM6jDqsqCLqQaakJERqOYJYJFwfvahwd12NHjCsjNNnUhFZFRKV6JoOxYOHrOoJuHsrOMihJNZC8io1NkicDM7jKzHWa2upf9Z5tZg5mtCF9fiiqWg1QvgpoXoH7ToA6rLEuoaUhERqUoawQ/Ahb2U+Zpd58bvr4aYSxdqi8O3gfZPFRVmmDTrkaCaRlEREaPyBKBu/8J2B3V+Q9Z6TEwae6gm4cqShPsPdBGXWNrRIGJiGRGpu8RnG5mK83sMTOr7q2QmS0xs2Vmtqy2tvbwP7V6EWx5Eeo2DviQjp5D6kIqIqNNJhPBcqDK3U8CvgX8oreC7n6nuy9w9wXl5eWH/8mdzUO9fmQPHcNRb9ylnkMiMrpkLBG4+x533xcuPwrkmtmEIfnwkmkwef6gmocqSsKHynTDWERGmYwlAjM72swsXD4ljGXXkAVQvQi2vgS73xxQ8cK8bCaOzVfTkIiMOlF2H70XeBaYYWY1ZvYJM/uMmX0mLHIpsNrMVgK3Apf7UHbJOeGi4H0QvYeqyhJsVCIQkVFmoPMRDJq7f6Sf/bcBt0X1+f0qqYIpJwfNQ3917YAOqSwt4r837Iw4MBGRoZXpXkOZVb0I3l4Bu98YUPHK0gTb9jTT3NoecWAiIkMn3omgo3lozcB6D3X0HKqpU/OQiIwe8U4ExZUw9Z0D7j1U2dmFVIlAREaPeCcCCJqHtq2CXa/3W7SqVIlAREYfJYLO5qH+awWlRXkU5WWrC6mIjCpKBOOnQsWpA7pPYGZUlhUpEYjIqKJEAEHz0PaXYedr/RatKk1omAkRGVWUCGBQvYcqyxJsrmsimdRw1CIyOigRAIybDJWnD+g+QWVpgpa2JNv3Ng9BYCIi0VMi6FC9CHasgdpX+yxWpS6kIjLKKBF0mHUhYP0OTV1VGs5LoEQgIqOEEkGHcZMG1Dw0qbiA7CxTzyERGTWUCFJVL4Ida2HH+l6L5GZnMaW4UKOQisiooUSQ6oQBNg+VJdikLqQiMkooEaQaezRUndFv81BFqeYlEJHRQ4mgu+qLoXY97FjXa5Gq0gT1ja00NLUOYWAiItFQIuhu1oVgWX3WCjq6kG5WrUBERgElgu7GHtXVPNTLzJmVYRdSPUsgIqNBlHMW32VmO8xsdS/7zcxuNbMNZrbKzOZHFcugVS+Cna8GPYjS6JiXQF1IRWQ0iLJG8CNgYR/7zwOOD19LgDsijGVw+mkeGpOfQ1lRHpt2q+eQiIx8kSUCd/8TsLuPIhcBP/bAc0CxmU2KKp5BGVMO087su3moLKGmIREZFTJ5j2AKsDllvSbc1oOZLTGzZWa2rLa2dkiCo3oR7NoA29O2bFFZqkQgIqPDiLhZ7O53uvsCd19QXl4+NB8664Ng2b0OTV1VmuDthiZa2pJDE4+ISEQymQi2ABUp61PDbcND0QSY3nvzUGVZEUmHLfVNGQhOROTIyWQieAT4n2HvodOABnd/O4Px9FS9CHa/Dtte7rGrazhq3TAWkZEtyu6j9wLPAjPMrMbMPmFmnzGzz4RFHgXeADYA3wP+NqpYDtnMjuahnr2HKkv1UJmIjA45UZ3Y3T/Sz34HPhfV5x8RRWVwzLuDRHDul8Csc9fEsfkU5GbphrGIjHgj4mZxRlUvgro34e2VB202s6DnkGoEIjLCKRH0Z+YHICunl+ahIs1UJiIjnhJBfxKlcMzZaXsPVZYm2LS7Ee/loTMRkZFAiWAgqhdB/UbY+tJBm6vKEjS1tlO770CGAhMROXxKBAMx8wLIyu3RPNQ5+Jyah0RkBFMiGIjCEjj2nOAp45RmoI4upBqFVERGMiWCgapeBA2bYMvyzk1TSwox07wEIjKyKREM1Izzg+ahtV3NQ/k52UweX6gagYiMaEoEA1VYDMe+J23zkIaZEJGRTIlgMKoXQcNm2PJi56ZjyotYv20vWzX4nIiMUEoEgzHjPMjOO6j30JKzjsGA/33fCtqTep5AREYeJYLBKCyGY88NmoeSwTwEVWVFfOWi2Tz/5m7u/NMbGQ5QRGTwlAgGq3oR7KmBLcs6N10yfwoXnDiJ//e7V3i5piGDwYmIDJ4SwWDNOA+y8w9qHjIzvr5oNuVj87nmvpdobGnLYIAiIoOjRDBYBePguPce1DwEUJzI4/99+CTe3Lmfr/16XQYDFBEZHCWCQ1G9CPZuhZq/HLT5XcdOYMlZx/DT5zfxuzXbMhSciMjgKBEcihkLezQPdbjufTOYPWUc1z/4Mjv2NGcgOBGRwYk0EZjZQjN7xcw2mNn1afZfZWa1ZrYifH0yyniOmPyxcPz7ejQPAeTlZHHL4nk0trRx3c9XklSXUhEZ5qKcszgbuB04DzgB+IiZnZCm6H3uPjd8fT+qeI646kWwbxtsfq7HruMmjuGfLziBp1/byY/+/NbQxyYiMghR1ghOATa4+xvu3gL8DLgows8bWu9YCDkFQa0gjStOreS9syZy42/Ws37bniEOTkRk4KJMBFOAzSnrNeG27i4xs1VmttTMKtKdyMyWmNkyM1tWW1sbRayDlz8Gjn8/rH0Yku09dpsZ37hkDuMKcrnm3hU0t/YsIyIyHGT6ZvEvgWnuPgd4HLg7XSF3v9PdF7j7gvLy8iENsE/VFwfNQ5t6Ng8BlI3J56bL5vDK9r184zfrhzg4EZGBiTIRbAFSv+FPDbd1cvdd7t4xz+P3gZMjjOfIO/6vIacwbe+hDmfPmMhV75rGD//7LZ56dZjUZkREUkSZCF4Ajjez6WaWB1wOPJJawMwmpaxeCIysJ7Hyx8A7/hpe+i949nZoT/9E8fXnzeQdR43hCz9fyS7Nbywiw0xkicDd24DPA78luMDf7+5rzOyrZnZhWOxqM1tjZiuBq4GrooonMud9A6afBb+9Ab7/Hti6okeRgtxsvnn5PBoaW/nHB17GXV1KRWT4sJF2UVqwYIEvW7as/4JDyT1oHnrsH6FxJ5z2t3D2F4MaQ4rvP/0GX/v1Or6+aDZXnFqVoWBFJI7M7EV3X5BuX6ZvFo8OZjD7Q/D5F2D+x+DZ2+Dbp8Orvzuo2N+cMZ0zj5/A//nVWjbs2JehYEVEDqZEcCQVFsMHb4GP/wZyC+Gnl8HPr4K92wHIyjJuuuwkCnOzufa+l2hpS/Z9PhGRIaBEEIWq0+EzT8M5/wTrfw23vxOW/RCSSY4aV8CNl8xh9ZY93Pz4q5mOVEREiSAyOfnw7n+Azz4LR8+BX10LPzofal/hr6uP5iOnVPDdP73Os6/vynSkIhJzSgRRm3AcfOyXcNHtULse7jgDnvg3/mXhMUwvK+Lv7l9BQ2NrpqMUkRhTIhgKZjDvSvjcC8FgdU99g8QPzuZ7726mdu8BbviFupSKSOYoEQylMeVwyffgygehvYVjf72YRyp/xjOrXuPB5Vv6P15EJAJKBJlw3Lnwt8/BGdcya/uveCrxDzz/8HfYuFNdSkVk6CkRZEpeAt73FezTT5Eon86/Z32L3XdeSNvONzMdmYjEjBJBph19Inmf/gOr5vwzxx9Yg3/7VPjvb0K7biCLyNBQIhgOsrKZ86G/56bjf8IfW0+Ex78Ed54DK++Dt1dBa1OmIxSRUSwn0wFIl7+79BzO/2YOT7U/x9caf0zWQ0vCPQYl06B8JpS/I3yfARNm9BjPSERksJQIhpFxBbncsnguH/5uEy3H/hc3nVMUPHtQ+0rX6/U/QHtL10HjK4KkUD4TJryjK1kUlmTuBxGREUWJYJhZMK2Uz59zHLf+cQMTxh3Le2a+mxPfdSGFedlBgfY2qHsrTBBhktj5Crz139CW0oQ05uiuBNFZi5gJRRMy8nOJjFgdz/i4AwNZBrLzIGvktLxrGOphqLU9yad+vIwnXwlmNMvJMhokw6gAAA29SURBVGZNGsf8ymLmVZYwv7KEitJCzKzroGQSGjaFNYf1Ke+vQsvernKFpTDmqKDGUFgSDJSX+l5QnLIvfOWPG75/1G0HoLkh5VUPzXu6bWuAA9225eRD0UQoKg+e7yjq9hozERJlkJ2b6Z9QDlV7K+x9G/ZshT1boGFLuFwTvm+F/TvBOwZ/9K4LOYd5XbTs4G9ozFEwdhKMPSr4ctb5Hr6KJkL20Hwf72sYaiWCYWzXvgO8tKmelzbXsXxjPStr6mlsaQdgwpg85laUML+qmHkVJZxUMZ5EXpo/KPfgD76z9vBqMGdCU334qgterft7D8SyoGB8V2LokSyKg2QBwX8qTxL8p0oGn9/xjaljn3uaMslu5cL39tQLfZoLfHs/M75l5QSx548L3gvGQ8G4IIHs2xFcCPbvOLi5LVVhaUpy6EgUE4Oa1ZiJByePvKLgKfL+dPxOuv8Ouv/sqettB4Kftb21a7mtJYi7vSXN/pau996WPQlZuUGyy84Nl3PC97yU5dzg95idN4ByuZCTBzkFwb6cgpT1/CP3hSL1It9Q03Wx3xNe7Bu2wL7t9Lig542BcVNg3OTgvWgCZGUD4b+bWbdlgvVel0m/vWVfMOrwvm1d7/vTTVVr4d9SR3Lolig6k8dRwZeXw6BEMEq0tSd5dfs+lm+qCxLEpjre2BlcwLOzjJlHj2VeZTHzw1pDVVni4FpDnyc/ECSG5pTk0FR3cLLoeB1Upp7D/vbUl+y8IPF0XMA7L+bju13giw++0Hcs5yb6vzi7BzWG/TvD5FAbJIf9O4Pl1ISxvzZIQOnkFATfBPu6oEf5u+pLVk5wIc7JCy/e+cHvJdkWXFTbW7qWk60p35IjiCNtkuhYzw9e2fldyzn5we91/46ub/V9XeTHp1zoO1+Tg+354waWrKPQ3hr8LaUmh73ha9/2rvd929P//gtL4PTPw1lfOKSPVyIYxer2t7Bicz3LN9WxfFMdKzc3sO9AMHdyaVEe8yqKO5PDnIpixuQf4WpoMhlcRA/sIfhWlBX8R7Osnusd37b6LNOxzTL3H7Y/bQe6kkTHa9+OoKbl3sfPme5ntj72paznhBfv7Lyu5dSLel/bDqW9OtnelRTaW8Mk0ZKynLKv+3JnzaM5+F111mAOdFtvDms16fZ1W29vDWpg4yaHr6ldF/eOC33B+CP9L50ZyfbwS0mahHHM2XDChf2dIa2+EkGkjVNmthD4JpANfN/db+y2Px/4MXAysAtY7O5vRRnTaFNSlMc5MydyzsyJALQnndd27OWlTfUs3xgkhz+s3wFAlsHxE8dSUpRLXk42edlGbnYWeTlZne95neuWZltqOTtoW37OWArzsinKy6EwL5tEXjYFOdlkZQ3Ti/nhyMkPLkDjp2Q6kuhkZYdNJgWZjiRW3J2mNqe+fRx1XkB91hTqclqoy2+lvq2FubnFnBnB50aWCMwsG7gdeB9QA7xgZo+4+9qUYp8A6tz9ODO7HPgGsDiqmOIgaCIax8yjx/GRUyoBaGhsDe4zbKrn5Zp69h9op6Gplda2JC3tSVrbk53LLZ3bnPbk4dcWC3ODpJDIzyaR25UkglcOibzslG05nfsK83JI5GaTk220tTttySQt7U5be5K2dqc1GcTclnRaw+2t7Ulakx3LTmtK2bZwvTU8FwQ34bPMyM5KeXVfD8vkdCxnWZ/H5WQbOVlZ5ITL2VlBQs3psS8r3NetTFZWWK6rTMdnm0GWWfhi4M1+khFt7Unqm1qpb2yhvrGVusZW6hpbqG9soa4xdXvXe11ja58zF3763cdw5vHlRzzWKGsEpwAb3P0NADP7GXARkJoILgL+NVxeCtxmZuYjrb1qmBufyOXsGRM5e8bEQR3Xngwuni0piaK1zWlpb6el7eB9B9qSNLa009jSRlNre7jcTuOBNhpb22kK9zW2BMt1ja00paw3trYfkcSTG15sO2o0OT3Wg+WOn6/z5V3LyaTTlnSSHrx339aedI5AqEdEVkpy6EoUwTvd1i1lOV0i6Z5XUteNfsoetK9nguqxpY/j+zpPqt4uE2m39vLv5Snn6ewv5ODh2kE9R7t9bl/lm1rb2dvc1mvsOVlGcSKPkkQuxYlcKkoTzJk6npJE3kHbg+VgfXwil/yc7F7PeTiiTARTgM0p6zXAqb2Vcfc2M2sAyoCdqYXMbAmwBKCysjKqeKWb4NtuNgW50fzxpXJ3WtqTNB5oDxNHkCRa273zIt5xkc/JNvLCi3pOtpEbXuiDb81D8y3ZvWcCaU92JY6O2khbMqiBdCy3J7tqW93LtIe1mx5lko47JN1xD5JQMnwP1ru2uUMymboeXKIOKp/sWu/8ebpfKT3tYufP3ktR0l2bB3N8bxsd75GMgPQZpJfNvf1tGF2JzVLKpnYICt4s3Jdarmtf57JBfk42xYnc8MLe831Mfs6wqtGNiAfK3P1O4E4IbhZnOByJgJmRn5NNfk42I+GZaLOwqSfTgYgcAVE+JbQFqEhZnxpuS1vGzHKA8QQ3jUVEZIhEmQheAI43s+lmlgdcDjzSrcwjwMfC5UuBP+r+gIjI0IqsZhu2+X8e+C1B99G73H2NmX0VWObujwA/AH5iZhuA3QTJQkREhlCkTZzu/ijwaLdtX0pZbgYuizIGERHp2zAdSUxERIaKEoGISMwpEYiIxJwSgYhIzI240UfNrBbYeIiHT6DbU8vD3EiKdyTFCiMr3pEUK4yseEdSrHB48Va5e9qBikZcIjgcZrast2FYh6ORFO9IihVGVrwjKVYYWfGOpFghunjVNCQiEnNKBCIiMRe3RHBnpgMYpJEU70iKFUZWvCMpVhhZ8Y6kWCGieGN1j0BERHqKW41ARES6USIQEYm52CQCM1toZq+Y2QYzuz7T8fTGzCrM7AkzW2tma8zsmkzHNBBmlm1mL5nZrzIdS1/MrNjMlprZejNbZ2anZzqmvpjZ/w7/Dlab2b1mNqxmkzezu8xsh5mtTtlWamaPm9lr4fuwmGuol1j/I/xbWGVmD5lZcSZjTJUu3pR915mZm9mEI/FZsUgEZpYN3A6cB5wAfMTMTshsVL1qA65z9xOA04DPDeNYU10DrMt0EAPwTeA37j4TOIlhHLOZTQGuBha4+2yC4dyH21DtPwIWdtt2PfAHdz8e+EO4Phz8iJ6xPg7Mdvc5wKvAF4c6qD78iJ7xYmYVwPuBTUfqg2KRCIBTgA3u/oa7twA/Ay7KcExpufvb7r48XN5LcKGaktmo+mZmU4ELgO9nOpa+mNl44CyCeTBw9xZ3r89sVP3KAQrDGfwSwNYMx3MQd/8TwVwiqS4C7g6X7wYuHtKgepEuVnf/nbt3zDL/HMFMisNCL79bgP8E/oFepns+FHFJBFOAzSnrNQzziyuAmU0D5gHPZzaSft1C8IeZzHQg/ZgO1AI/DJuxvm9mRZkOqjfuvgW4ieCb39tAg7v/LrNRDchR7v52uLwNOCqTwQzC3wCPZTqIvpjZRcAWd195JM8bl0Qw4pjZGOAB4Fp335PpeHpjZh8Adrj7i5mOZQBygPnAHe4+D9jP8Gm26CFsW7+IIIFNBorM7MrMRjU44dSzw76Pupn9E0Gz7D2ZjqU3ZpYAbgC+1F/ZwYpLItgCVKSsTw23DUtmlkuQBO5x9wczHU8/zgAuNLO3CJrc3mNm/5XZkHpVA9S4e0cNaylBYhiu3gu86e617t4KPAi8K8MxDcR2M5sEEL7vyHA8fTKzq4APAFcM8znTjyX4UrAy/P82FVhuZkcf7onjkgheAI43s+lmlkdww+2RDMeUlpkZQRv2One/OdPx9Mfdv+juU919GsHv9Y/uPiy/tbr7NmCzmc0IN50LrM1gSP3ZBJxmZonw7+JchvHN7RSPAB8Llz8GPJzBWPpkZgsJmjUvdPfGTMfTF3d/2d0nuvu08P9bDTA//Ls+LLFIBOHNoM8DvyX4j3S/u6/JbFS9OgP4KME36xXh6/xMBzWK/C/gHjNbBcwF/i3D8fQqrLksBZYDLxP8fx1WQyKY2b3As8AMM6sxs08ANwLvM7PXCGo1N2Yyxg69xHobMBZ4PPy/9p2MBpmil3ij+azhXRMSEZGoxaJGICIivVMiEBGJOSUCEZGYUyIQEYk5JQIRkZhTIhAZQmZ29nAfoVXiR4lARCTmlAhE0jCzK83sL+FDRt8N51vYZ2b/Gc4P8AczKw/LzjWz51LGtC8Jtx9nZr83s5VmttzMjg1PPyZlToR7wqeGRTJGiUCkGzObBSwGznD3uUA7cAVQBCxz92rgKeDL4SE/Bv4xHNP+5ZTt9wC3u/tJBGMEdYzIOQ+4lmBujGMIniYXyZicTAcgMgydC5wMvBB+WS8kGDgtCdwXlvkv4MFwjoNid38q3H438HMzGwtMcfeHANy9GSA831/cvSZcXwFMA56J/scSSU+JQKQnA+5294NmqzKzf+lW7lDHZzmQstyO/h9KhqlpSKSnPwCXmtlE6JyDt4rg/8ulYZn/ATzj7g1AnZmdGW7/KPBUOLtcjZldHJ4jPxxPXmTY0TcRkW7cfa2Z/TPwOzPLAlqBzxFMZHNKuG8HwX0ECIZa/k54oX8D+Hi4/aPAd83sq+E5LhvCH0NkwDT6qMgAmdk+dx+T6ThEjjQ1DYmIxJxqBCIiMacagYhIzCkRiIjEnBKBiEjMKRGIiMScEoGISMz9f5QdDssN2mhKAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "QdP9JrGwq2ty"
},
"source": [
"# reshape train data\n",
"X_train_r = np.zeros((len(scaled_train), nb_features, 3))\n",
"X_train_r[:, :, 0] = scaled_train[:, :nb_features]\n",
"X_train_r[:, :, 1] = scaled_train[:, nb_features:128]\n",
"X_train_r[:, :, 2] = scaled_train[:, 128:]"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "zRcjL_XYrrKq"
},
"source": [
"labels"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "7u3lrRpvrGe7"
},
"source": [
" y_preds_new_ = np.argmax(model.predict(X_train_r), axis = -1)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XZFJB5_KrXii",
"outputId": "5815a27a-2410-47ae-f6e7-adefa49abfd5"
},
"source": [
"print(classification_report(labels, y_preds_new_, target_names = classes))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Acer_Capillipes 1.00 1.00 1.00 10\n",
" Acer_Circinatum 1.00 1.00 1.00 10\n",
" Acer_Mono 1.00 1.00 1.00 10\n",
" Acer_Opalus 1.00 1.00 1.00 10\n",
" Acer_Palmatum 1.00 1.00 1.00 10\n",
" Acer_Pictum 1.00 1.00 1.00 10\n",
" Acer_Platanoids 1.00 1.00 1.00 10\n",
" Acer_Rubrum 1.00 1.00 1.00 10\n",
" Acer_Rufinerve 1.00 1.00 1.00 10\n",
" Acer_Saccharinum 1.00 1.00 1.00 10\n",
" Alnus_Cordata 1.00 1.00 1.00 10\n",
" Alnus_Maximowiczii 1.00 1.00 1.00 10\n",
" Alnus_Rubra 1.00 1.00 1.00 10\n",
" Alnus_Sieboldiana 1.00 1.00 1.00 10\n",
" Alnus_Viridis 1.00 1.00 1.00 10\n",
" Arundinaria_Simonii 1.00 1.00 1.00 10\n",
" Betula_Austrosinensis 1.00 1.00 1.00 10\n",
" Betula_Pendula 1.00 1.00 1.00 10\n",
" Callicarpa_Bodinieri 1.00 1.00 1.00 10\n",
" Castanea_Sativa 1.00 1.00 1.00 10\n",
" Celtis_Koraiensis 1.00 1.00 1.00 10\n",
" Cercis_Siliquastrum 1.00 1.00 1.00 10\n",
" Cornus_Chinensis 1.00 1.00 1.00 10\n",
" Cornus_Controversa 1.00 1.00 1.00 10\n",
" Cornus_Macrophylla 1.00 1.00 1.00 10\n",
" Cotinus_Coggygria 1.00 1.00 1.00 10\n",
" Crataegus_Monogyna 1.00 1.00 1.00 10\n",
" Cytisus_Battandieri 1.00 1.00 1.00 10\n",
" Eucalyptus_Glaucescens 0.91 1.00 0.95 10\n",
" Eucalyptus_Neglecta 1.00 0.90 0.95 10\n",
" Eucalyptus_Urnigera 1.00 1.00 1.00 10\n",
" Fagus_Sylvatica 1.00 1.00 1.00 10\n",
" Ginkgo_Biloba 1.00 1.00 1.00 10\n",
" Ilex_Aquifolium 1.00 1.00 1.00 10\n",
" Ilex_Cornuta 1.00 1.00 1.00 10\n",
" Liquidambar_Styraciflua 1.00 1.00 1.00 10\n",
" Liriodendron_Tulipifera 1.00 1.00 1.00 10\n",
" Lithocarpus_Cleistocarpus 1.00 1.00 1.00 10\n",
" Lithocarpus_Edulis 1.00 1.00 1.00 10\n",
" Magnolia_Heptapeta 1.00 1.00 1.00 10\n",
" Magnolia_Salicifolia 1.00 1.00 1.00 10\n",
" Morus_Nigra 1.00 1.00 1.00 10\n",
" Olea_Europaea 1.00 1.00 1.00 10\n",
" Phildelphus 1.00 1.00 1.00 10\n",
" Populus_Adenopoda 1.00 1.00 1.00 10\n",
" Populus_Grandidentata 1.00 1.00 1.00 10\n",
" Populus_Nigra 1.00 1.00 1.00 10\n",
" Prunus_Avium 1.00 1.00 1.00 10\n",
" Prunus_X_Shmittii 1.00 1.00 1.00 10\n",
" Pterocarya_Stenoptera 1.00 1.00 1.00 10\n",
" Quercus_Afares 1.00 1.00 1.00 10\n",
" Quercus_Agrifolia 1.00 1.00 1.00 10\n",
" Quercus_Alnifolia 1.00 1.00 1.00 10\n",
" Quercus_Brantii 1.00 1.00 1.00 10\n",
" Quercus_Canariensis 1.00 1.00 1.00 10\n",
" Quercus_Castaneifolia 1.00 1.00 1.00 10\n",
" Quercus_Cerris 1.00 1.00 1.00 10\n",
" Quercus_Chrysolepis 1.00 1.00 1.00 10\n",
" Quercus_Coccifera 1.00 1.00 1.00 10\n",
" Quercus_Coccinea 1.00 1.00 1.00 10\n",
" Quercus_Crassifolia 1.00 1.00 1.00 10\n",
" Quercus_Crassipes 1.00 1.00 1.00 10\n",
" Quercus_Dolicholepis 1.00 1.00 1.00 10\n",
" Quercus_Ellipsoidalis 1.00 1.00 1.00 10\n",
" Quercus_Greggii 1.00 1.00 1.00 10\n",
" Quercus_Hartwissiana 1.00 1.00 1.00 10\n",
" Quercus_Ilex 1.00 1.00 1.00 10\n",
" Quercus_Imbricaria 1.00 1.00 1.00 10\n",
" Quercus_Infectoria_sub 1.00 1.00 1.00 10\n",
" Quercus_Kewensis 1.00 1.00 1.00 10\n",
" Quercus_Nigra 1.00 1.00 1.00 10\n",
" Quercus_Palustris 1.00 0.90 0.95 10\n",
" Quercus_Phellos 1.00 1.00 1.00 10\n",
" Quercus_Phillyraeoides 1.00 1.00 1.00 10\n",
" Quercus_Pontica 1.00 1.00 1.00 10\n",
" Quercus_Pubescens 1.00 0.90 0.95 10\n",
" Quercus_Pyrenaica 1.00 1.00 1.00 10\n",
" Quercus_Rhysophylla 1.00 1.00 1.00 10\n",
" Quercus_Rubra 1.00 1.00 1.00 10\n",
" Quercus_Semecarpifolia 1.00 1.00 1.00 10\n",
" Quercus_Shumardii 0.91 1.00 0.95 10\n",
" Quercus_Suber 1.00 1.00 1.00 10\n",
" Quercus_Texana 1.00 1.00 1.00 10\n",
" Quercus_Trojana 1.00 1.00 1.00 10\n",
" Quercus_Variabilis 1.00 1.00 1.00 10\n",
" Quercus_Vulcanica 1.00 1.00 1.00 10\n",
" Quercus_x_Hispanica 1.00 1.00 1.00 10\n",
" Quercus_x_Turneri 1.00 1.00 1.00 10\n",
" Rhododendron_x_Russellianum 1.00 1.00 1.00 10\n",
" Salix_Fragilis 1.00 1.00 1.00 10\n",
" Salix_Intergra 1.00 1.00 1.00 10\n",
" Sorbus_Aria 1.00 1.00 1.00 10\n",
" Tilia_Oliveri 0.91 1.00 0.95 10\n",
" Tilia_Platyphyllos 1.00 1.00 1.00 10\n",
" Tilia_Tomentosa 1.00 1.00 1.00 10\n",
" Ulmus_Bergmanniana 1.00 1.00 1.00 10\n",
" Viburnum_Tinus 1.00 1.00 1.00 10\n",
"Viburnum_x_Rhytidophylloides 1.00 1.00 1.00 10\n",
" Zelkova_Serrata 1.00 1.00 1.00 10\n",
"\n",
" accuracy 1.00 990\n",
" macro avg 1.00 1.00 1.00 990\n",
" weighted avg 1.00 1.00 1.00 990\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Wr0ZhlOysbG8"
},
"source": [
"print(classification_report(labels, y_preds_new_, target_names = classes))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "c3LQuOy7r_iP",
"outputId": "24f62a62-5bae-4c6a-e8e5-8b73266f8a3b"
},
"source": [
"print(accuracy_score(labels, y_preds_new_))\n",
"print(precision_score(labels, y_preds_new_, average='macro'))\n",
"print(precision_score(labels, y_preds_new_, average='micro'))\n",
"print(precision_score(labels, y_preds_new_, average='weighted'))\n",
"print(recall_score(labels, y_preds_new_, average='macro'))\n",
"print(recall_score(labels, y_preds_new_, average='micro'))\n",
"print(recall_score(labels, y_preds_new_, average='weighted'))\n",
"print(f1_score(labels, y_preds_new_ , average='micro'))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"0.996969696969697\n",
"0.9972451790633609\n",
"0.996969696969697\n",
"0.9972451790633609\n",
"0.9969696969696968\n",
"0.996969696969697\n",
"0.996969696969697\n",
"0.996969696969697\n"
],
"name": "stdout"
}
]
}
]
}