96 lines
3.5 KiB
Python
96 lines
3.5 KiB
Python
import pandas as pd
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
import seaborn as sns
|
|
import warnings
|
|
import itertools
|
|
from PIL import Image
|
|
from sklearn.ensemble import RandomForestClassifier
|
|
from sklearn.model_selection import train_test_split
|
|
from sklearn.metrics import classification_report,confusion_matrix,accuracy_score,roc_curve,auc
|
|
from sklearn.neural_network import MLPClassifier
|
|
from sklearn.metrics import accuracy_score
|
|
warnings.filterwarnings("ignore")
|
|
|
|
# Reading data using PANDA
|
|
data = pd.read_csv("pulsar_stars.csv")
|
|
data.head()
|
|
#DATA
|
|
targets = data["target_class"]
|
|
features = data.drop("target_class", axis = 1)
|
|
np.random.seed(2018)
|
|
#Split data
|
|
X_train, X_test, y_train, y_test = train_test_split(features, targets, test_size = 0.2, random_state = 66)
|
|
|
|
|
|
# Define the learning rate, hyperparameter using NUMPY
|
|
eta_vals = np.logspace(-5, 1, 7)
|
|
lmbd_vals = np.logspace(-5, 1, 7)
|
|
n_hidden_neurons = 50
|
|
epochs = 100
|
|
|
|
# Use scikit learn for neural network
|
|
DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
|
|
for i, eta in enumerate(eta_vals):
|
|
for j, lmbd in enumerate(lmbd_vals):
|
|
dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',
|
|
alpha=lmbd, learning_rate_init=eta, max_iter=epochs, solver='adam')
|
|
dnn.fit(X_train, y_train)
|
|
DNN_scikit[i][j] = dnn
|
|
print("Learning rate = ", eta)
|
|
print("Lambda = ", lmbd)
|
|
print("Accuracy score on test set: ", dnn.score(X_test, y_test))
|
|
print()
|
|
|
|
|
|
#Plot the accuracy as function of learning rate and hyperparameter
|
|
sns.set()
|
|
train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
|
|
test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
|
|
|
|
for i in range(len(eta_vals)):
|
|
for j in range(len(lmbd_vals)):
|
|
dnn = DNN_scikit[i][j]
|
|
train_pred = dnn.predict(X_train)
|
|
test_pred = dnn.predict(X_test)
|
|
train_accuracy[i][j] = accuracy_score(y_train, train_pred)
|
|
test_accuracy[i][j] = accuracy_score(y_test, test_pred)
|
|
|
|
fig, ax = plt.subplots(figsize = (10, 10))
|
|
sns.heatmap(train_accuracy, annot=True,annot_kws={"size": 18}, ax=ax, cmap="viridis")
|
|
ax.set_title("Training Accuracy",fontsize=18)
|
|
ax.set_ylabel("$\eta$",fontsize=18)
|
|
ax.set_yticklabels(eta_vals)
|
|
ax.set_xlabel("$\lambda$",fontsize=18)
|
|
ax.set_xticklabels(lmbd_vals)
|
|
plt.tick_params(labelsize=18)
|
|
|
|
fig, ax = plt.subplots(figsize = (10, 10))
|
|
sns.heatmap(test_accuracy, annot=True,annot_kws={"size": 18}, ax=ax, cmap="viridis")
|
|
ax.set_title("Test Accuracy",fontsize=18)
|
|
ax.set_ylabel("$\eta$",fontsize=18)
|
|
ax.set_yticklabels(eta_vals)
|
|
ax.set_xlabel("$\lambda$",fontsize=18)
|
|
ax.set_xticklabels(lmbd_vals)
|
|
plt.tick_params(labelsize=18)
|
|
#plt.show()
|
|
|
|
#Plot confusion matrix at optimal values of learning rate and hyperameter
|
|
dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',
|
|
|
|
alpha=0.001, learning_rate_init=0.001, max_iter=epochs, solver='adam')
|
|
dnn.fit(X_train,y_train)
|
|
y_pred=dnn.predict(X_test)
|
|
fig1, ax = plt.subplots(figsize = (13,10))
|
|
sns.heatmap(confusion_matrix(y_test,y_pred),annot=True,fmt = "d",linecolor="k",linewidths=3)
|
|
ax.set_xlabel('True label',fontsize=18)
|
|
ax.set_ylabel('Predicted label',fontsize=18)
|
|
ax.set_title("CONFUSION MATRIX",fontsize=20)
|
|
plt.tick_params(labelsize=18)
|
|
plt.show()
|
|
|
|
# Feature importance -->weights
|
|
coef=dnn.coefs_[0]
|
|
print (coef)
|
|
|