{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Iris Classification with TensorFlow (Python)\\n",
    "This notebook trains a neural network on the Iris dataset using only `iris.json`, splits it into training/testing sets, and plots training/validation accuracy and loss."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install pandas numpy tensorflow scikit-learn matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\\n",
    "import numpy as np\\n",
    "import tensorflow as tf\\n",
    "from tensorflow.keras.models import Sequential\\n",
    "from tensorflow.keras.layers import Dense\\n",
    "from sklearn.preprocessing import LabelBinarizer\\n",
    "from sklearn.model_selection import train_test_split\\n",
    "import matplotlib.pyplot as plt\\n",
    "\\n",
    "# Upload iris.json\\n",
    "from google.colab import files\\n",
    "uploaded = files.upload()  # Upload iris.json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the JSON file\\n",
    "iris_data = json.load(open('iris.json'))\\n",
    "\\n",
    "# Convert to numpy arrays\\n",
    "X = np.array([[item['sepal_length'], item['sepal_width'], item['petal_length'], item['petal_width']] for item in iris_data])\\n",
    "y_raw = [item['species'] for item in iris_data]\\n",
    "\\n",
    "# One-hot encode the labels\\n",
    "encoder = LabelBinarizer()\\n",
    "y = encoder.fit_transform(y_raw)\\n",
    "\\n",
    "# Split into training and testing sets (80/20)\\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Build the neural network\\n",
    "model = Sequential([\\n",
    "    Dense(5, input_shape=(4,), activation='sigmoid'),\\n",
    "    Dense(3, activation='sigmoid'),\\n",
    "    Dense(3, activation='sigmoid')\\n",
    "])\\n",
    "\\n",
    "# Compile the model using categorical_crossentropy for classification\\n",
    "model.compile(\\n",
    "    optimizer=tf.keras.optimizers.Adam(learning_rate=0.06),\\n",
    "    loss='categorical_crossentropy',\\n",
    "    metrics=['accuracy']\\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Train the model\\n",
    "history = model.fit(\\n",
    "    X_train, y_train,\\n",
    "    epochs=100,\\n",
    "    verbose=1,\\n",
    "    validation_data=(X_test, y_test)\\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Plot training & validation accuracy and loss\\n",
    "plt.figure(figsize=(12,5))\\n",
    "\\n",
    "plt.subplot(1,2,1)\\n",
    "plt.plot(history.history['accuracy'], label='Train Accuracy')\\n",
    "plt.plot(history.history['val_accuracy'], label='Validation Accuracy')\\n",
    "plt.title('Model Accuracy')\\n",
    "plt.xlabel('Epoch')\\n",
    "plt.ylabel('Accuracy')\\n",
    "plt.legend()\\n",
    "\\n",
    "plt.subplot(1,2,2)\\n",
    "plt.plot(history.history['loss'], label='Train Loss')\\n",
    "plt.plot(history.history['val_loss'], label='Validation Loss')\\n",
    "plt.title('Model Loss')\\n",
    "plt.xlabel('Epoch')\\n",
    "plt.ylabel('Loss')\\n",
    "plt.legend()\\n",
    "\\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Evaluate / Predict on testing set\\n",
    "predictions = model.predict(X_test)\\n",
    "\\n",
    "print(\\"Predictions (probabilities):\\")\\n",
    "print(predictions)\\n",
    "\\n",
    "# Convert predictions to labels\\n",
    "predicted_labels = encoder.inverse_transform(np.round(predictions))\\n",
    "print(\\"Predicted species:\\")\\n",
    "print(predicted_labels)\\n",
    "\\n",
    "# Compare with actual labels\\n",
    "actual_labels = encoder.inverse_transform(y_test)\\n",
    "print(\\"Actual species:\\")\\n",
    "print(actual_labels)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}