Customer-Segmentation / utilfuncs.py
PK03's picture
Update utilfuncs.py
ee4780c verified
import torch
import torch.nn as nn
import joblib
import pandas as pd
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import seaborn as sns
import io
import numpy as np
from PIL import Image
class FixedNeuronsNetwork(nn.Module):
def __init__(self, num_features, num_classes, num_hidden_layers, hidden_neurons, layer_activation=nn.ReLU, final_activation=nn.Sigmoid):
super(FixedNeuronsNetwork, self).__init__()
layers = []
layers.append(nn.Linear(num_features, hidden_neurons))
layers.append(layer_activation())
for _ in range(num_hidden_layers - 1):
layers.append(nn.Linear(hidden_neurons, hidden_neurons))
layers.append(layer_activation())
layers.append(nn.Linear(hidden_neurons, num_classes))
self.final_activation = final_activation()
self.network = nn.Sequential(*layers)
def forward(self, x):
x = self.network(x)
output = self.final_activation(x)
return output
def load_kmeans_model(model_path):
kmeans_loaded = joblib.load(model_path)
return kmeans_loaded
def load_churn_model(model_path):
model = FixedNeuronsNetwork(num_features=11,num_classes=1,num_hidden_layers=3,hidden_neurons=64).to('cpu')
model.load_state_dict(torch.load(model_path))
return model
def load_encoder(model_path):
label_encoders = joblib.load(model_path)
return label_encoders
def load_scaler(model_path):
scaler = joblib.load(model_path)
return scaler
def encode_and_scale(new_sample_df, encoders, scaler):
numerical_cols = ['Age', 'Subscription_Length_Months', 'Monthly_Bill','Average_Internet_Usage', 'No_of_Tickets', 'Average_Talktime_Usage','Social_Class', 'Base_Charge']
new_sample_df[numerical_cols] = scaler.transform(new_sample_df[numerical_cols])
for col, le in encoders.items():
new_sample_df[col] = le.transform(new_sample_df[col])
return new_sample_df
def get_cluster(sample, kmeans_loaded):
group = kmeans_loaded.predict(sample)
return group
def get_churn_label(sample, model):
sample_tensor = torch.tensor(sample.values, dtype=torch.float32)
model.eval()
with torch.no_grad():
predictions = model(sample_tensor)
predictions = (predictions > 0.5).float()
return predictions
def create_tsne_plot(df, clusters):
tsne = TSNE(n_components=2, random_state=42)
tsne_results = tsne.fit_transform(df)
df_tsne = pd.DataFrame(tsne_results, columns=['TSNE1', 'TSNE2'])
df_tsne['Cluster'] = clusters
plt.figure(figsize=(10, 8))
sns.scatterplot(
x='TSNE1', y='TSNE2',
hue='Cluster',
palette=sns.color_palette('hsv', len(set(clusters))),
data=df_tsne,
legend='full'
)
plt.title('t-SNE Visualization of K Means Clustering')
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
plot_image = np.asarray(Image.open(buf))
return plot_image