SmartSeg-AI / train.py
mallelamanoj75's picture
Upload 13 files
a36604b verified
Raw
History Blame Contribute Delete
2.45 kB
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.metrics import silhouette_score
import pickle
import os
# Create directories if they don't exist
os.makedirs('model', exist_ok=True)
os.makedirs('outputs', exist_ok=True)
def train_model():
print("Loading dataset...")
df = pd.read_csv('data/Mall_Customers.csv')
# 1. Data Preprocessing
print("Preprocessing data...")
# Drop CustomerID
df_processed = df.drop('CustomerID', axis=1)
# Encode Gender
le = LabelEncoder()
df_processed['Gender'] = le.fit_transform(df_processed['Gender'])
# Scale features
scaler = StandardScaler()
features = ['Gender', 'Age', 'Annual Income (k$)', 'Spending Score (1-100)']
df_scaled = scaler.fit_transform(df_processed[features])
# 2. Elbow Method
print("Implementing Elbow Method...")
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42, n_init=10)
kmeans.fit(df_scaled)
wcss.append(kmeans.inertia_)
plt.figure(figsize=(10, 6))
plt.plot(range(1, 11), wcss, marker='o', linestyle='--')
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.savefig('outputs/elbow_plot.png')
print("Elbow plot saved to outputs/elbow_plot.png")
# 3. Train with optimal k (default 5 as requested)
k = 5
print(f"Training K-Means with k={k}...")
kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42, n_init=10)
clusters = kmeans.fit_predict(df_scaled)
# 4. Compute Silhouette Score
score = silhouette_score(df_scaled, clusters)
print(f"Silhouette Score for k={k}: {score:.4f}")
# 5. Save model, scaler and encoder
print("Saving model and tools...")
with open('model/kmeans.pkl', 'wb') as f:
pickle.dump(kmeans, f)
with open('model/scaler.pkl', 'wb') as f:
pickle.dump(scaler, f)
with open('model/label_encoder.pkl', 'wb') as f:
pickle.dump(le, f)
# Save the scaled data for visualization in app
df_result = df_processed.copy()
df_result['Cluster'] = clusters
df_result.to_csv('data/clustered_customers.csv', index=False)
print("Training complete!")
if __name__ == "__main__":
train_model()