#!/usr/bin/env python # coding: utf-8 # In[1]: import numpy as np import pandas as pd import matplotlib.pyplot as plt # In[2]: URL ="https://raw.githubusercontent.com/cagriemreakin/Deep-Learning/master/ANN/musteri_kaybi_modellemesi.csv" dataset = pd.read_csv(URL) dataset.head() # In[3]: ''' RowNumber, CustomerId ve Surname'in sonuca bir etkisi olmayacağı için eğitimde kullanmıyoruz.''' X = dataset.iloc[:,3:13].values y = dataset.iloc[:,13].values # In[4]: # Kategorik Veriler from sklearn.preprocessing import LabelEncoder,OneHotEncoder # Geography print("LabelEncoder Uygulamadan onceki X degerleri: \n") print(X) print ("\n") labelEncoder_X1 = LabelEncoder() X[:,1] = labelEncoder_X1.fit_transform(X[:,1]) # Gender labelEncoder_X2 = LabelEncoder() X[:,2] = labelEncoder_X2.fit_transform(X[:,2]) print("LabelEncoder Uygulandıktan sonraki X degerleri: \n") print(X) print ("\n") ohe = OneHotEncoder(categorical_features = [1]) X = ohe.fit_transform(X).toarray() # Dummy Variable tuzağından kaçınmak için 1 değeri drop ediyoruz. X = X[:,1:] print("OneHotEncoder Uygulandıktan sonraki X[1] degerleri: \n ") print(X) print ("\n") # In[5]: # Eğitim ve Veri Seti Olarak Ayırma 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) # In[6]: # Verileri Belirli Bir Aralığa Sokma from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # In[7]: # Part 2 - ANN! from keras.models import Sequential # ANN'i baslatir from keras.layers import Dense # Dense layer olusturmak icin kullanılır # In[8]: # ANN'i baslatma classifier = Sequential() # In[9]: # İlk katmanın oluşturulması # Units: Node sayısı. Input sayısı + Output Sayısının yarısı. # kernel_initializer: Ağırlıklara random değerler atar. # Activation: Relu classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) # In[10]: # Gizli katmanın eklenmesi classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) # In[11]: # Çıktı katmanını ekleme # Units: Müsteri bankayı terk edecek mi etmeyecek mi? Binary Outcome olduğu için 1 node'a ihtiyaç var. # Activation: Sigmoid -> Binary outcome' lar için kullanılır. classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) # In[12]: # ANN'i derleme # Optimizer: Gradient Descent -> Adam # Loss: Binary outcome olduğu için binary_crossentropy olarak seçtik. Fakat çıktı değerimiz 2 den fazla olsaydı # categorical_crossentropy seçecektik. classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) # In[13]: # ANN Eğitim classifier.fit(X_train, y_train, batch_size = 10, epochs = 100) # In[14]: # Part 3 - Tahmin yapma ve modelin değerlendirilmesi # Test seti sonuçlarının tahmini y_pred = classifier.predict(X_test) y_pred = (y_pred > 0.5) print("Test verisi sonuclari: \n") y_pred # In[15]: # Confusion Matrix from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) print("\n Confusion Matrix: \n") print(cm) # In[16]: """Asagidaki bilgilere sahip musteri bankayı terk edecek mi?: Geography: France Credit Score: 600 Gender: Female Age: 45 Tenure: 3 Balance: 75000 Number of Products: 2 Has Credit Card: Yes Is Active Member: Yes Estimated Salary: 60000""" predict_customer = classifier.predict(sc.transform(np.array([[0.0, 0, 600, 1, 45, 3, 75000, 2, 1, 1, 60000]]))) predict_customer = (predict_customer > 0.5) predict_customer # Musteri bankayla calismaya devam ediyor. # In[17]: # 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 # In[18]: def build_classifier(): classifier = Sequential() classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) return classifier # In[19]: classifier = KerasClassifier(build_fn = build_classifier, batch_size = 10, epochs = 100) # In[21]: accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs=1) # In[22]: mean = accuracies.mean() variance = accuracies.std() print(mean) print(variance) # In[23]: # Doğruluk artırma # Dropout Regularization: Overfitting i azaltmak için # Tuning from keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import GridSearchCV def build_classifier(optimizer): classifier = Sequential() classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) classifier.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy']) return classifier # In[24]: classifier = KerasClassifier(build_fn = build_classifier) parameters = {'batch_size': [25, 32], 'epochs': [100,300], 'optimizer': ['adam', 'rmsprop']} # In[25]: grid_search = GridSearchCV(estimator = classifier, param_grid = parameters, scoring = 'accuracy', cv = 10) # In[26]: grid_search = grid_search.fit(X_train, y_train) # In[27]: best_parameters = grid_search.best_params_ best_accuracy = grid_search.best_score_ print("\n Best Parameters: \n") print(best_parameters) print("\n Best Accuracy: \n") print(best_accuracy)