You are on page 1of 7

import

pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow import keras
from sklearn.metrics import confusion_matrix , classification_report
import seaborn as sn
from sklearn.linear_model import LogisticRegression

df=pd.read_csv('Churn_Modelling.csv')
df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000 entries, 0 to 9999
Data columns (total 14 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 RowNumber 10000 non-null int64
1 CustomerId 10000 non-null int64
2 Surname 10000 non-null object
3 CreditScore 10000 non-null int64
4 Geography 10000 non-null object
5 Gender 10000 non-null object
6 Age 10000 non-null int64
7 Tenure 10000 non-null int64
8 Balance 10000 non-null float64
9 NumOfProducts 10000 non-null int64
10 HasCrCard 10000 non-null int64
11 IsActiveMember 10000 non-null int64
12 EstimatedSalary 10000 non-null float64
13 Exited 10000 non-null int64
dtypes: float64(2), int64(9), object(3)
memory usage: 1.1+ MB

df=df.drop(['RowNumber','CustomerId','Surname'], axis=1)

df.head()

CreditScore Geography Gender Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited

0 619 France Female 42 2 0.00 1 1 1 101348.88 1

1 608 Spain Female 41 1 83807.86 1 0 1 112542.58 0

2 502 France Female 42 8 159660.80 3 1 0 113931.57 1

3 699 France Female 39 1 0.00 2 0 0 93826.63 0

4 850 Spain Female 43 2 125510.82 1 1 1 79084.10 0

def print_unique_col_values(df):
for column in df:
if df[column].dtypes=='object':
print(f'{column}: {df[column].unique()}')

print_unique_col_values(df)

Geography: ['France' 'Spain' 'Germany']


Gender: ['Female' 'Male']

df['Gender'].replace({'Female': 1,'Male': 0},inplace=True)

print_unique_col_values(df)

Geography: ['France' 'Spain' 'Germany']

df=pd.get_dummies(data=df,columns=['Geography','NumOfProducts'])

tenure_churn_no = df[df.Exited==0].Tenure
tenure_churn_yes = df[df.Exited==1].Tenure

plt.xlabel("tenure")
plt.ylabel("Number Of Customers")
plt.title("Customer Churn Prediction Visualiztion")

plt.hist([tenure_churn_yes, tenure_churn_no], rwidth=0.95, color=['green','red'],label=['Churn=Yes','Churn=No'])


plt.legend()

<matplotlib.legend.Legend at 0x251b7c8ce90>
cols_to_scale = ['Tenure','CreditScore','Age','Balance','EstimatedSalary']
scaler = MinMaxScaler()
df[cols_to_scale] = scaler.fit_transform(df[cols_to_scale])

df.head()

CreditScore Gender Age Tenure Balance HasCrCard IsActiveMember EstimatedSalary Exited Geography_France Geography_Germany

0 0.538 1 0.324324 0.2 0.000000 1 1 0.506735 1 1

1 0.516 1 0.310811 0.1 0.334031 0 1 0.562709 0 0

2 0.304 1 0.324324 0.8 0.636357 1 0 0.569654 1 1

3 0.698 1 0.283784 0.1 0.000000 0 0 0.469120 0 1

4 1.000 1 0.337838 0.2 0.500246 1 1 0.395400 0 0

df.drop('HasCrCard',axis=1,inplace=True)

x = df.drop('Exited',axis=1)
y = df['Exited']

x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2,random_state=2)

Creating the Neural Network Model


model = keras.Sequential([
keras.layers.Dense(10,input_shape=(14,),activation='relu'),
keras.layers.Dense(5,activation='tanh'),
keras.layers.Dense(1,activation='sigmoid')
])

model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])

model.fit(x_train,y_train,epochs=100)

Epoch 1/100
250/250 [==============================] - 2s 2ms/step - loss: 0.5016 - accuracy: 0.7920
Epoch 2/100
250/250 [==============================] - 1s 2ms/step - loss: 0.4396 - accuracy: 0.8079
Epoch 3/100
250/250 [==============================] - 1s 2ms/step - loss: 0.4077 - accuracy: 0.8240
Epoch 4/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3939 - accuracy: 0.8330
Epoch 5/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3847 - accuracy: 0.8376
Epoch 6/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3778 - accuracy: 0.8403
Epoch 7/100
250/250 [==============================] - 1s 3ms/step - loss: 0.3736 - accuracy: 0.8401
Epoch 8/100
250/250 [==============================] - 1s 3ms/step - loss: 0.3705 - accuracy: 0.8434
Epoch 9/100
250/250 [==============================] - 1s 3ms/step - loss: 0.3682 - accuracy: 0.8445
Epoch 10/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3656 - accuracy: 0.8461
Epoch 11/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3639 - accuracy: 0.8462
Epoch 12/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3617 - accuracy: 0.8487
Epoch 13/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3589 - accuracy: 0.8499
Epoch 14/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3565 - accuracy: 0.8505
Epoch 15/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3549 - accuracy: 0.8510
Epoch 16/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3529 - accuracy: 0.8553
Epoch 17/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3513 - accuracy: 0.8561
Epoch 18/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3496 - accuracy: 0.8546
Epoch 19/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3480 - accuracy: 0.8585
Epoch 20/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3472 - accuracy: 0.8553
Epoch 21/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3462 - accuracy: 0.8572
Epoch 22/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3447 - accuracy: 0.8583
Epoch 23/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3440 - accuracy: 0.8577
Epoch 24/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3430 - accuracy: 0.8581
Epoch 25/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3426 - accuracy: 0.8586
Epoch 26/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3420 - accuracy: 0.8585
Epoch 27/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3415 - accuracy: 0.8584
Epoch 28/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3411 - accuracy: 0.8605
Epoch 29/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3403 - accuracy: 0.8586
Epoch 30/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3401 - accuracy: 0.8620
Epoch 31/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3392 - accuracy: 0.8601
Epoch 32/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3390 - accuracy: 0.8599
Epoch 33/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3382 - accuracy: 0.8602
Epoch 34/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3380 - accuracy: 0.8601
Epoch 35/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3376 - accuracy: 0.8608
Epoch 36/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3375 - accuracy: 0.8619
Epoch 37/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3368 - accuracy: 0.8608
Epoch 38/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3364 - accuracy: 0.8606
Epoch 39/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3366 - accuracy: 0.8629
Epoch 40/100
250/250 [==============================] - 1s 3ms/step - loss: 0.3355 - accuracy: 0.8644
Epoch 41/100
250/250 [==============================] - 1s 3ms/step - loss: 0.3357 - accuracy: 0.8602
Epoch 42/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3356 - accuracy: 0.8619
Epoch 43/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3349 - accuracy: 0.8633
Epoch 44/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3354 - accuracy: 0.8629
Epoch 45/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3338 - accuracy: 0.8601
Epoch 46/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3345 - accuracy: 0.8611
Epoch 47/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3337 - accuracy: 0.8639
Epoch 48/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3348 - accuracy: 0.8636
Epoch 49/100
250/250 [==============================] - 1s 3ms/step - loss: 0.3333 - accuracy: 0.8627
Epoch 50/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3326 - accuracy: 0.8622
Epoch 51/100
250/250 [==============================] - 1s 3ms/step - loss: 0.3323 - accuracy: 0.8625
Epoch 52/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3322 - accuracy: 0.8626
Epoch 53/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3318 - accuracy: 0.8635
Epoch 54/100
250/250 [==============================] - 1s 3ms/step - loss: 0.3321 - accuracy: 0.8640
Epoch 55/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3319 - accuracy: 0.8624
Epoch 56/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3307 - accuracy: 0.8650
Epoch 57/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3316 - accuracy: 0.8636
Epoch 58/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3306 - accuracy: 0.8645
Epoch 59/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3304 - accuracy: 0.8651
Epoch 60/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3310 - accuracy: 0.8636
Epoch 61/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3297 - accuracy: 0.8656
Epoch 62/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3304 - accuracy: 0.8649
Epoch 63/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3295 - accuracy: 0.8652
Epoch 64/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3289 - accuracy: 0.8646
Epoch 65/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3295 - accuracy: 0.8643
Epoch 66/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3295 - accuracy: 0.8649
Epoch 67/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3292 - accuracy: 0.8643
Epoch 68/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3292 - accuracy: 0.8641
Epoch 69/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3290 - accuracy: 0.8658
Epoch 70/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3292 - accuracy: 0.8637
Epoch 71/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3281 - accuracy: 0.8644
Epoch 72/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3285 - accuracy: 0.8650
Epoch 73/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3281 - accuracy: 0.8649
Epoch 74/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3282 - accuracy: 0.8634
Epoch 75/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3277 - accuracy: 0.8666
Epoch 76/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3279 - accuracy: 0.8643
Epoch 77/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3274 - accuracy: 0.8655
Epoch 78/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3283 - accuracy: 0.8645
Epoch 79/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3279 - accuracy: 0.8643
Epoch 80/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3273 - accuracy: 0.8652
Epoch 81/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3281 - accuracy: 0.8646
Epoch 82/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3268 - accuracy: 0.8645
Epoch 83/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3269 - accuracy: 0.8669
Epoch 84/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3269 - accuracy: 0.8658
Epoch 85/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3276 - accuracy: 0.8656
Epoch 86/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3274 - accuracy: 0.8644
Epoch 87/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3267 - accuracy: 0.8630
Epoch 88/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3262 - accuracy: 0.8648
Epoch 89/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3266 - accuracy: 0.8643
Epoch 90/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3264 - accuracy: 0.8660
Epoch 91/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3262 - accuracy: 0.8662
Epoch 92/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3256 - accuracy: 0.8650
Epoch 93/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3264 - accuracy: 0.8664
Epoch 94/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3264 - accuracy: 0.8650
Epoch 95/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3257 - accuracy: 0.8646
Epoch 96/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3261 - accuracy: 0.8643
Epoch 97/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3254 - accuracy: 0.8651
Epoch 98/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3258 - accuracy: 0.8661
Epoch 99/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3249 - accuracy: 0.8654
Epoch 100/100
250/250 [==============================] - 1s 2ms/step - loss: 0.3253 - accuracy: 0.8662
<keras.src.callbacks.History at 0x251b7cc1790>

model.evaluate(x_test, y_test)

63/63 [==============================] - 0s 2ms/step - loss: 0.3464 - accuracy: 0.8590


[0.34639090299606323, 0.859000027179718]

yp = model.predict(x_test)
yp[:5]

63/63 [==============================] - 0s 2ms/step


array([[0.20089829],
[0.5349295 ],
[0.31899092],
[0.0096462 ],
[0.02925511]], dtype=float32)

y_pred = []
for element in yp:
if element > 0.5:
y_pred.append(1)
else:
y_pred.append(0)

y_pred[:5]

[0, 1, 0, 0, 0]

print(classification_report(y_test,y_pred))

precision recall f1-score support

0 0.88 0.96 0.92 1617


1 0.71 0.44 0.55 383

accuracy 0.86 2000


macro avg 0.80 0.70 0.73 2000
weighted avg 0.85 0.86 0.85 2000

cm = tf.math.confusion_matrix(labels=y_test,predictions=y_pred)

plt.figure(figsize = (10,7))
sn.heatmap(cm, annot=True, fmt='d')
plt.xlabel('Predicted')
plt.ylabel('Truth')

Text(95.72222222222221, 0.5, 'Truth')


Creating the Logistic Regression Model to compare with Neural
Network
model1=LogisticRegression()
model1.fit(x_train,y_train)
model1.score(x_test,y_test)

0.843

yp1 = model1.predict(x_test)
yp1[:5]

array([0, 1, 0, 0, 0], dtype=int64)

y_pred1 = []
for element in yp1:
if element > 0.5:
y_pred1.append(1)
else:
y_pred1.append(0)

cm = tf.math.confusion_matrix(labels=y_test,predictions=y_pred1)

plt.figure(figsize = (10,7))
sn.heatmap(cm, annot=True, fmt='d')
plt.xlabel('Predicted')
plt.ylabel('Truth')

Text(95.72222222222221, 0.5, 'Truth')

print(classification_report(y_test,y_pred1))

precision recall f1-score support

0 0.86 0.96 0.91 1617


1 0.68 0.34 0.45 383

accuracy 0.84 2000


macro avg 0.77 0.65 0.68 2000
weighted avg 0.83 0.84 0.82 2000


Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/fontdata.js

You might also like