| | --- |
| | language: en |
| | library_name: tensorflow |
| | tags: |
| | - keras |
| | - tensorflow |
| | - tabular |
| | - iris |
| | - multiclass-classification |
| | pipeline_tag: tabular-classification |
| | license: mit |
| | --- |
| | |
| | # Iris MLP Classifier (Keras / TensorFlow) |
| |
|
| | This repository contains a simple **multiclass classifier** for the classic **Iris** dataset, implemented as a small **MLP (Multi-Layer Perceptron)** in **TensorFlow / Keras**. |
| | The model predicts one of three classes based on four numerical features. |
| |
|
| | ## Task |
| |
|
| | **Tabular multiclass classification** |
| | Given the 4 iris measurements, predict the class: |
| |
|
| | - `0` → setosa |
| | - `1` → versicolor |
| | - `2` → virginica |
| |
|
| | ## Dataset |
| |
|
| | **Iris dataset** (from `sklearn.datasets.load_iris`) |
| |
|
| | ### Input features (4) |
| | The model expects **4 float features** in this exact order: |
| |
|
| | 1. `sepal length (cm)` |
| | 2. `sepal width (cm)` |
| | 3. `petal length (cm)` |
| | 4. `petal width (cm)` |
| |
|
| | ### Target (3 classes) |
| | - integer labels `y ∈ {0,1,2}` |
| | - no one-hot encoding required (training uses `sparse_categorical_crossentropy`) |
| |
|
| | --- |
| |
|
| | ## Model architecture |
| |
|
| | A small feed-forward network with built-in feature normalization: |
| |
|
| |
|
| | ### Why `Normalization` layer? |
| | The `tf.keras.layers.Normalization` layer learns feature-wise mean and variance from the training set via `adapt(...)`. |
| | This makes inference easier and safer: **the same scaling used during training is embedded inside the saved model**. |
| |
|
| | --- |
| |
|
| | ## Training configuration |
| |
|
| | - **Optimizer:** Adam (`learning_rate=1e-3`) |
| | - **Loss:** `sparse_categorical_crossentropy` |
| | - **Metric:** accuracy |
| | - **Train/test split:** 80/20 (`stratify=y`, `random_state=42`) |
| | - **Validation split (from train):** 20% (`validation_split=0.2`) |
| | - **Epochs:** 100 |
| | - **Batch size:** 16 |
| | - **Reproducibility:** |
| | - `tf.random.set_seed(42)` |
| | - `np.random.seed(42)` |
| |
|
| | > Note: Exact accuracy may vary slightly across environments due to numerical differences and nondeterminism in some TF ops. |
| |
|
| | --- |
| |
|
| | ## Example: training script (reference) |
| |
|
| | The model was trained using the following core logic (simplified): |
| |
|
| | ```python |
| | normalizer = tf.keras.layers.Normalization(axis=-1) |
| | normalizer.adapt(X_train.to_numpy()) |
| | |
| | model = tf.keras.Sequential([ |
| | tf.keras.Input(shape=(4,)), |
| | normalizer, |
| | tf.keras.layers.Dense(16, activation="relu"), |
| | tf.keras.layers.Dense(16, activation="relu"), |
| | tf.keras.layers.Dense(3, activation="softmax"), |
| | ]) |
| | |
| | model.compile( |
| | optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3), |
| | loss="sparse_categorical_crossentropy", |
| | metrics=["accuracy"] |
| | ) |
| | |
| | model.fit( |
| | X_train.to_numpy(), y_train.to_numpy(), |
| | validation_split=0.2, |
| | epochs=100, |
| | batch_size=16, |
| | verbose=0 |
| | ) |
| | |
| | ``` |
| | ## Example |
| |
|
| | ```python |
| | import numpy as np |
| | import pandas as pd |
| | import tensorflow as tf |
| | from huggingface_hub import hf_hub_download |
| | |
| | filename = "iris_mlp.keras" |
| | repo_id = "studentscolab/iris_keras" |
| | |
| | model_path = hf_hub_download(repo_id=repo_id, filename=filename) |
| | |
| | model = tf.keras.models.load_model(model_path) |
| | |
| | x_new = pd.DataFrame([{ |
| | "sepal length (cm)": 5.1, |
| | "sepal width (cm)": 3.5, |
| | "petal length (cm)": 1.4, |
| | "petal width (cm)": 0.2, |
| | }]) |
| | |
| | proba = model.predict(x_new.to_numpy(), verbose=0)[0] # shape: (3,) |
| | pred = int(np.argmax(proba)) |
| | |
| | print("Probabilities:", proba) |
| | print("Predicted class:", pred) |
| | |
| | ``` |