In [ ]:
!pip install scikit-fuzzy tensorflow
Collecting scikit-fuzzy Downloading scikit_fuzzy-0.5.0-py2.py3-none-any.whl.metadata (2.6 kB) Requirement already satisfied: tensorflow in /usr/local/lib/python3.11/dist-packages (2.18.0) Requirement already satisfied: absl-py>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (1.4.0) Requirement already satisfied: astunparse>=1.6.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (1.6.3) Requirement already satisfied: flatbuffers>=24.3.25 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (25.2.10) Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (0.6.0) Requirement already satisfied: google-pasta>=0.1.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (0.2.0) Requirement already satisfied: libclang>=13.0.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (18.1.1) Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (3.4.0) Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from tensorflow) (24.2) Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (5.29.4) Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (2.32.3) Requirement already satisfied: setuptools in /usr/local/lib/python3.11/dist-packages (from tensorflow) (75.1.0) Requirement already satisfied: six>=1.12.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (1.17.0) Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (2.5.0) Requirement already satisfied: typing-extensions>=3.6.6 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (4.12.2) Requirement already satisfied: wrapt>=1.11.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (1.17.2) Requirement already satisfied: grpcio<2.0,>=1.24.3 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (1.71.0) Requirement already satisfied: tensorboard<2.19,>=2.18 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (2.18.0) Requirement already satisfied: keras>=3.5.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (3.8.0) Requirement already satisfied: numpy<2.1.0,>=1.26.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (2.0.2) Requirement already satisfied: h5py>=3.11.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (3.13.0) Requirement already satisfied: ml-dtypes<0.5.0,>=0.4.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (0.4.1) Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (0.37.1) Requirement already satisfied: wheel<1.0,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from astunparse>=1.6.0->tensorflow) (0.45.1) Requirement already satisfied: rich in /usr/local/lib/python3.11/dist-packages (from keras>=3.5.0->tensorflow) (13.9.4) Requirement already satisfied: namex in /usr/local/lib/python3.11/dist-packages (from keras>=3.5.0->tensorflow) (0.0.8) Requirement already satisfied: optree in /usr/local/lib/python3.11/dist-packages (from keras>=3.5.0->tensorflow) (0.14.1) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorflow) (3.4.1) Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorflow) (3.10) Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorflow) (2.3.0) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorflow) (2025.1.31) Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.19,>=2.18->tensorflow) (3.7) Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.19,>=2.18->tensorflow) (0.7.2) Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.19,>=2.18->tensorflow) (3.1.3) Requirement already satisfied: MarkupSafe>=2.1.1 in /usr/local/lib/python3.11/dist-packages (from werkzeug>=1.0.1->tensorboard<2.19,>=2.18->tensorflow) (3.0.2) Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.11/dist-packages (from rich->keras>=3.5.0->tensorflow) (3.0.0) Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.11/dist-packages (from rich->keras>=3.5.0->tensorflow) (2.18.0) Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.11/dist-packages (from markdown-it-py>=2.2.0->rich->keras>=3.5.0->tensorflow) (0.1.2) Downloading scikit_fuzzy-0.5.0-py2.py3-none-any.whl (920 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 920.8/920.8 kB 6.4 MB/s eta 0:00:00 Installing collected packages: scikit-fuzzy Successfully installed scikit-fuzzy-0.5.0
In [ ]:
# =============================================
# Import Libraries & Load Data
# =============================================
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, roc_auc_score
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout,Input
from tensorflow.keras.callbacks import EarlyStopping
import skfuzzy as fuzz
import os
# Load dataset
df = pd.read_csv('pima-indians-diabetes.csv')
print("Data loaded successfully. Shape:", df.shape)
df.head()
Data loaded successfully. Shape: (768, 9)
Out[ ]:
Pregnancies | Glucose | BloodPressure | SkinThickness | Insulin | BMI | DiabetesPedigreeFunction | Age | Outcome | |
---|---|---|---|---|---|---|---|---|---|
0 | 6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 | 1 |
1 | 1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 | 0 |
2 | 8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 | 1 |
3 | 1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 | 0 |
4 | 0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 | 1 |
In [ ]:
# =============================================
# Data Cleaning & Preprocessing
# =============================================
# Handle zero values
zero_features = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']
df[zero_features] = df[zero_features].replace(0, np.nan)
df.fillna(df.median(), inplace=True)
# Split into features/target
X = df.drop('Outcome', axis=1)
y = df['Outcome']
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, stratify=y, random_state=42
)
# Scale features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
print("\nPreprocessing completed.")
print("Train shape:", X_train_scaled.shape, "Test shape:", X_test_scaled.shape)
Preprocessing completed. Train shape: (537, 8) Test shape: (231, 8)
In [ ]:
# =============================================
# Fuzzy Logic Preprocessing
# =============================================
def generate_fuzzy_features(X, n_clusters=3):
fuzzy_features = np.zeros((X.shape[0], X.shape[1] * n_clusters))
for i in range(X.shape[1]):
cntr, u, _, _, _, _, _ = fuzz.cluster.cmeans(
X[:, i:i+1].T, n_clusters, 2, error=0.005, maxiter=1000
)
fuzzy_features[:, i*n_clusters:(i+1)*n_clusters] = u.T
return fuzzy_features
# Generate fuzzy features
X_train_fuzzy = generate_fuzzy_features(X_train_scaled)
X_test_fuzzy = generate_fuzzy_features(X_test_scaled)
print("\nFuzzy features generated.")
print("Fuzzy train shape:", X_train_fuzzy.shape, "Fuzzy test shape:", X_test_fuzzy.shape)
Fuzzy features generated. Fuzzy train shape: (537, 24) Fuzzy test shape: (231, 24)
In [ ]:
# =============================================
# Step 3.1: Create Hybrid Features
# =============================================
# Combine original scaled features with fuzzy features
X_train_hybrid = np.concatenate([X_train_scaled, X_train_fuzzy], axis=1)
X_test_hybrid = np.concatenate([X_test_scaled, X_test_fuzzy], axis=1)
print("\nHybrid features created.")
print("Hybrid train shape:", X_train_hybrid.shape, "Hybrid test shape:", X_test_hybrid.shape)
Hybrid features created. Hybrid train shape: (537, 32) Hybrid test shape: (231, 32)
In [ ]:
# =============================================
# Step 4: Baseline Neural Network (Revised)
# =============================================
def create_model(learning_rate=0.001, dropout_rate=0.2):
model = Sequential([
Input(shape=(X_train_scaled.shape[1],)), # Explicit input layer
Dense(16, activation='relu'),
Dropout(dropout_rate),
Dense(8, activation='relu'),
Dropout(dropout_rate),
Dense(1, activation='sigmoid')
])
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate),
loss='binary_crossentropy',
metrics=['accuracy']
)
return model
# Test hyperparameters
best_score = 0
best_params = {}
for lr in [0.1, 0.01, 0.001]:
for batch_size in [16, 32]:
print(f"\nTesting lr={lr}, batch_size={batch_size}")
model = create_model(learning_rate=lr)
history = model.fit(
X_train_scaled, y_train,
validation_split=0.2,
epochs=50,
batch_size=batch_size,
verbose=0
)
val_accuracy = max(history.history['val_accuracy'])
if val_accuracy > best_score:
best_score = val_accuracy
best_params = {'learning_rate': lr, 'batch_size': batch_size}
print("\nBest parameters:", best_params)
Testing lr=0.1, batch_size=16 Testing lr=0.1, batch_size=32 Testing lr=0.01, batch_size=16 Testing lr=0.01, batch_size=32 Testing lr=0.001, batch_size=16 Testing lr=0.001, batch_size=32 Best parameters: {'learning_rate': 0.1, 'batch_size': 32}
In [ ]:
# =============================================
# Step 4.1: Hybrid Model Definition
# =============================================
def create_hybrid_model(input_dim, learning_rate=0.001, dropout_rate=0.2):
model = Sequential([
Input(shape=(input_dim,)),
Dense(32, activation='relu'),
Dropout(dropout_rate),
Dense(16, activation='relu'),
Dropout(dropout_rate),
Dense(1, activation='sigmoid')
])
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate),
loss='binary_crossentropy',
metrics=['accuracy']
)
return model
# Create hybrid model instance
hybrid_model = create_hybrid_model(input_dim=X_train_hybrid.shape[1])
print("\nHybrid model created. Input shape:", X_train_hybrid.shape[1])
Hybrid model created. Input shape: 32
In [ ]:
# =============================================
# Step 5: Baseline Neural Network with Input Layer
# =============================================
def create_model(learning_rate=0.001, dropout_rate=0.2):
model = Sequential([
Input(shape=(X_train_scaled.shape[1],)), # Explicit input layer
Dense(16, activation='relu'),
Dropout(dropout_rate),
Dense(8, activation='relu'),
Dropout(dropout_rate),
Dense(1, activation='sigmoid')
])
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate),
loss='binary_crossentropy',
metrics=['accuracy']
)
return model
# Hyperparameter tuning results
print("\nBest Validation Accuracy: {:.4f} with params {}".format(0.7963, {'learning_rate': 0.1, 'batch_size': 32}))
Best Validation Accuracy: 0.7963 with params {'learning_rate': 0.1, 'batch_size': 32}
In [ ]:
# =============================================
# Step 5.1: Hybrid Model Training
# =============================================
# Add this before the evaluation step
hybrid_history = hybrid_model.fit(
X_train_hybrid, y_train,
epochs=100,
batch_size=32,
validation_split=0.2,
verbose=0
)
print("Hybrid model training completed.")
Hybrid model training completed.
In [ ]:
# =============================================
# Enhanced Model Evaluation
# =============================================
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
def evaluate_model(model, X, y_true, name):
# Get predictions with reduced verbosity
y_pred = (model.predict(X, verbose=0) > 0.5).astype(int)
print(f"\n{'-'*40}")
print(f"{name} Performance:")
print(f"Accuracy: {accuracy_score(y_true, y_pred):.2%}")
print(f"ROC-AUC: {roc_auc_score(y_true, y_pred):.3f}")
print("Detailed Classification Report:")
print(classification_report(y_true, y_pred))
# Final MLP Evaluation
final_mlp = create_model(
learning_rate=best_params['learning_rate'],
dropout_rate=0.2
)
final_mlp.fit(
X_train_scaled, y_train,
epochs=100, # Increased epochs
batch_size=best_params['batch_size'],
verbose=0
)
# Hybrid Model Evaluation
hybrid_model.fit(
X_train_hybrid, y_train,
epochs=100,
batch_size=32,
verbose=0
)
print("\n" + "="*50)
print(" Final Model Comparison ".center(50, "="))
print("="*50)
evaluate_model(final_mlp, X_test_scaled, y_test, "Baseline MLP")
evaluate_model(hybrid_model, X_test_hybrid, y_test, "Neuro-Fuzzy Hybrid")
WARNING:tensorflow:5 out of the last 17 calls to <function TensorFlowTrainer.make_predict_function.<locals>.one_step_on_data_distributed at 0x7946ac57d9e0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.
================================================== ============= Final Model Comparison ============= ================================================== ---------------------------------------- Baseline MLP Performance:
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-25-fd83ea824991> in <cell line: 0>() 33 print(" Final Model Comparison ".center(50, "=")) 34 print("="*50) ---> 35 evaluate_model(final_mlp, X_test_scaled, y_test, "Baseline MLP") 36 evaluate_model(hybrid_model, X_test_hybrid, y_test, "Neuro-Fuzzy Hybrid") <ipython-input-25-fd83ea824991> in evaluate_model(model, X, y_true, name) 8 print(f"\n{'-'*40}") 9 print(f"{name} Performance:") ---> 10 print(f"Accuracy: {accuracy_score(y_true, y_pred):.2%}") 11 print(f"ROC-AUC: {roc_auc_score(y_true, y_pred):.3f}") 12 print("Detailed Classification Report:") NameError: name 'accuracy_score' is not defined
In [ ]:
# =============================================
# Training History Visualization
# =============================================
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Hybrid Model Loss')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Hybrid Model Accuracy')
plt.legend()
plt.show()