diff --git a/ann.py b/ann.py index 1ac39d6..a9589ee 100644 --- a/ann.py +++ b/ann.py @@ -44,24 +44,27 @@ # Part 2 - Now let's make the ANN! # Importing the Keras libraries and packages -import keras from keras.models import Sequential -from keras.layers import Dense +from keras.layers import Dense, Dropout, Conv1D, Masking, Embedding, LSTM +from keras.initializers import RandomNormal # Initialising the ANN classifier = Sequential() -# Adding the input layer and the first hidden layer -classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) +classifier.add(Dense(256, input_dim=11, activation='relu')) -# Adding the second hidden layer -classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) +classifier.add(Dropout(0.5)) -# Adding the output layer -classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) +classifier.add(Dense(256, activation='relu')) + +classifier.add(Dropout(0.5)) + +classifier.add(Dense(1, activation='sigmoid')) # Compiling the ANN -classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) +classifier.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['accuracy']) + +print(classifier.summary()) # Fitting the ANN to the Training set classifier.fit(X_train, y_train, batch_size = 10, epochs = 30) diff --git a/eitlstm.py b/eitlstm.py new file mode 100644 index 0000000..1e47357 --- /dev/null +++ b/eitlstm.py @@ -0,0 +1,155 @@ + +# Artificial Neural Network + +# Installing Theano +# pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git + +# Installing Tensorflow +# pip install tensorflow + +# Installing Keras +# pip install --upgrade keras + +# Part 1 - Data Preprocessing + +# Importing the libraries +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd + +# Importing the dataset +dataset = pd.read_csv('Churn_Modelling.csv') +X = dataset.iloc[:, 3:13].values +y = dataset.iloc[:, 13].values + +# Encoding categorical data +from sklearn.preprocessing import LabelEncoder, OneHotEncoder +labelencoder_X_1 = LabelEncoder() +X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1]) +labelencoder_X_2 = LabelEncoder() +X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2]) +onehotencoder = OneHotEncoder(categorical_features = [1]) +X = onehotencoder.fit_transform(X).toarray() +X = X[:, 1:] + +# Splitting the dataset into the Training set and Test set +from sklearn.model_selection import train_test_split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0) + +# Feature Scaling +from sklearn.preprocessing import StandardScaler +sc = StandardScaler() +X_train = sc.fit_transform(X_train) +X_test = sc.transform(X_test) + +# Part 2 - Now let's make the ANN! + +# Importing the Keras libraries and packages +import keras +from keras.models import Sequential +from keras.layers import Dense +from keras.layers import Dropout + +# Initialising the ANN +classifier = Sequential() + +# Adding the input layer and the first hidden layer +classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) +classifier.add(Dropout(0.5)) +classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu')) +classifier.add(Dropout(0.5)) +classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) + +# Compiling the ANN +classifier.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['accuracy']) + +# Fitting the ANN to the Training set +classifier.fit(X_train, y_train, batch_size = 10, epochs = 10) + + +# Before optimization loss: 0.3864 - acc: 0.8512 + +# Part 3 - Making predictions and evaluating the model + +# Predicting the Test set results +y_pred = classifier.predict(X_test) +y_pred = (y_pred > 0.5) + +# Predicting a single new observation +"""Predict if the customer with the following informations will leave the bank: +Geography: France +Credit Score: 600 +Gender: Male +Age: 40 +Tenure: 3 +Balance: 60000 +Number of Products: 2 +Has Credit Card: Yes +Is Active Member: Yes +Estimated Salary: 50000""" +new_prediction = classifier.predict(sc.transform(np.array([[0.0, 0, 600, 1, 40, 3, 60000, 2, 1, 1, 50000]]))) +new_prediction = (new_prediction > 0.5) + +# Making the Confusion Matrix +from sklearn.metrics import confusion_matrix +cm = confusion_matrix(y_test, y_pred) + +# Part 4 - Evaluating, Improving and Tuning the ANN + +# Evaluating the ANN +from keras.wrappers.scikit_learn import KerasClassifier +from sklearn.model_selection import cross_val_score +from keras.models import Sequential +from keras.layers import Dense +#from keras.layers import Dropout +def build_classifier(): + classifier = Sequential() + classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) + classifier.add(Dropout(rate = 0.5)) + classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu')) + classifier.add(Dropout(rate = 0.5)) + classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) + classifier.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['accuracy']) + return classifier +classifier = KerasClassifier(build_fn = build_classifier, batch_size = 10, epochs = 10) +accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs = -1) +mean = accuracies.mean() +variance = accuracies.std() + +# Improving the ANN +# Dropout Regularization to reduce overfitting if needed + +# Tuning the ANN +from keras.wrappers.scikit_learn import KerasClassifier +from sklearn.model_selection import GridSearchCV +from keras.models import Sequential +from keras.layers import Dense + +def build_classifier(optimizer): + classifier = Sequential() + classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) + classifier.add(Dropout(rate = 0.5)) + classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu')) + classifier.add(Dropout(rate = 0.5)) + classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) + classifier.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy']) + return classifier + +classifier = KerasClassifier(build_fn = build_classifier) + +parameters = {'batch_size': [20,32], + 'epochs': [20, 32], + 'optimizer': ['adam', 'rmsprop']} + +grid_search = GridSearchCV(estimator = classifier, + scoring = 'accuracy', + param_grid = parameters, + cv = 10) + +grid_search = grid_search.fit(X_train, y_train) + +best_parameters = grid_search.best_params_ +best_accuracy = grid_search.best_score_ + +# Best Accuracy: 0.861375 +# Best parameter: {'batch_size': 30, 'epochs': 32, 'optimizer': 'adam'} diff --git a/evaluating_improving_tuning.py b/eitmlp.py similarity index 74% rename from evaluating_improving_tuning.py rename to eitmlp.py index 42a9c67..0260e7f 100644 --- a/evaluating_improving_tuning.py +++ b/eitmlp.py @@ -1,3 +1,4 @@ + # Artificial Neural Network # Installing Theano @@ -53,21 +54,20 @@ classifier = Sequential() # Adding the input layer and the first hidden layer -classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) -# classifier.add(Dropout(rate = 0.1)) - -# Adding the second hidden layer -classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) -# classifier.add(Dropout(rate = 0.1)) - -# Adding the output layer +classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) +classifier.add(Dropout(0.5)) +classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu')) +classifier.add(Dropout(0.5)) classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) # Compiling the ANN -classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) +classifier.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['accuracy']) # Fitting the ANN to the Training set -classifier.fit(X_train, y_train, batch_size = 10, epochs = 100) +classifier.fit(X_train, y_train, batch_size = 10, epochs = 10) + + +# Before optimization loss: 0.3864 - acc: 0.8512 # Part 3 - Making predictions and evaluating the model @@ -104,12 +104,12 @@ #from keras.layers import Dropout def build_classifier(): classifier = Sequential() - classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) - classifier.add(Dropout(rate = 0.1)) - classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) - classifier.add(Dropout(rate = 0.1)) + classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) + classifier.add(Dropout(rate = 0.5)) + classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu')) + classifier.add(Dropout(rate = 0.5)) classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) - classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) + classifier.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['accuracy']) return classifier classifier = KerasClassifier(build_fn = build_classifier, batch_size = 10, epochs = 10) accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs = -1) @@ -127,18 +127,18 @@ def build_classifier(): def build_classifier(optimizer): classifier = Sequential() - classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) - classifier.add(Dropout(rate = 0.1)) - classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) - classifier.add(Dropout(rate = 0.1)) + classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) + classifier.add(Dropout(rate = 0.5)) + classifier.add(Dense(units = 256, kernel_initializer = 'uniform', activation = 'relu')) + classifier.add(Dropout(rate = 0.5)) classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) classifier.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy']) return classifier classifier = KerasClassifier(build_fn = build_classifier) -parameters = {'batch_size': [25, 32], - 'epochs': [10, 50], +parameters = {'batch_size': [10, 12], + 'epochs': [5, 10], 'optimizer': ['adam', 'rmsprop']} grid_search = GridSearchCV(estimator = classifier, @@ -148,5 +148,8 @@ def build_classifier(optimizer): grid_search = grid_search.fit(X_train, y_train) -best_parameters = grid_search.best_params_ -best_accuracy = grid_search.best_score_ \ No newline at end of file +best_parameters = grid_search.best_params_ +best_accuracy = grid_search.best_score_ + +# Best Accuracy: 0.857875 +# Best parameter: {'batch_size': 12, 'epochs': 10, 'optimizer': 'adam'} \ No newline at end of file diff --git a/lstm.py b/lstm.py new file mode 100644 index 0000000..220fd47 --- /dev/null +++ b/lstm.py @@ -0,0 +1,83 @@ +# Artificial Neural Network + +# Installing Theano +# pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git + +# Installing Tensorflow +# pip install tensorflow + +# Installing Keras +# pip install --upgrade keras + +# Part 1 - Data Preprocessing + +# Importing the libraries +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd + +# Importing the dataset +dataset = pd.read_csv('Churn_Modelling.csv') +X = dataset.iloc[:, 3:13].values +y = dataset.iloc[:, 13].values + +# Encoding categorical data +from sklearn.preprocessing import LabelEncoder, OneHotEncoder +labelencoder_X_1 = LabelEncoder() +X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1]) +labelencoder_X_2 = LabelEncoder() +X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2]) +onehotencoder = OneHotEncoder(categorical_features = [1]) +X = onehotencoder.fit_transform(X).toarray() +X = X[:, 1:] + +# Splitting the dataset into the Training set and Test set +from sklearn.model_selection import train_test_split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0) + +# Feature Scaling +from sklearn.preprocessing import StandardScaler +sc = StandardScaler() +X_train = sc.fit_transform(X_train) +X_test = sc.transform(X_test) + +# Convert to 3d (not recommended) +X_test = np.reshape(X_test, X_test.shape + (1,)) +X_train = np.reshape(X_train, X_train.shape + (1,)) + +# Part 2 - Now let's make the ANN! + +# Importing the Keras libraries and packages +from keras.models import Sequential +from keras.layers import Dense, Dropout, Conv1D, Masking, Embedding, LSTM +from keras.initializers import RandomNormal + +# Initialising the ANN + +model = Sequential() + +model.add(LSTM(128)) + +model.add(Dropout(0.5)) + +model.add(Dense(1, activation='sigmoid')) + +# Compiling the ANN +model.compile(loss='binary_crossentropy', + optimizer='rmsprop', + metrics=['accuracy']) + +# Fitting the ANN to the Training set +model.fit(X_train, y_train, batch_size=16, epochs=10) +print(model.summary()) + + +# Part 3 - Making predictions and evaluating the model + +# Predicting the Test set results +y_pred = model.predict(X_test) +y_pred = (y_pred > 0.5) + +# Making the Confusion Matrix +from sklearn.metrics import confusion_matrix +cm = confusion_matrix(y_test, y_pred) \ No newline at end of file