Question: FIll in the code where it is marked #Insert your code begin Implement a Naive Bayes Classifier that implements the SKlearn classifier API with fit,

FIll in the code where it is marked #Insert your code begin

Implement a Naive Bayes Classifier that implements the SKlearn classifier API with fit, predict and score methods. The Naive Bayes Classifer takes as parameter the density function used in the likelihood calcuation: normal: Normal density function knn: K nearest neighbor density function Most of the code already has been written for you. You only need to fill in the missing part between

what code looks like:

FIll in the code where it is marked #Insert your code begin

Implement a Naive Bayes Classifier that implements the SKlearn classifier API with

fit, predict and score methods. The Naive Bayes Classifer takes as parameter

the density function used in the likelihood calcuation: normal: Normal density function

Code transcript for filling in:

from functools import partial

import numpy as np

from sklearn.naive_bayes import GaussianNB

from sklearn.neighbors import KNeighborsClassifier

from sklearn.datasets import load_iris

from sklearn.metrics import accuracy_score

from scipy.stats import norm

class NaiveBayesClassifier: def __init__(self, likelihood='normal', k=None): self.likelihood = likelihood # Let # K = number of unique classes # N = number of test instances # d = number of inputs (input dimensionality)

# Numpy array unique classes, shape = (K,) self.classes = None # Numpy array of class priors, P(C), shape = (K,) self.priors = None # Numpy array of likelihoods, P(x|C), shape = (N, K), self.likelihoods = None

# Numpy array of posterior probabilities, P(C|x), shape = (N, K) self.posteriors = None ## For the Guassian Density # means, shape = (K, d) self.avgs = None # variances, shape = (K, d) self.vars = None ## For the knn Density # number of neighbors to use self.k = k # store training X self.X_train = None # store trainging y self.y_train = None

def generate_classes(self, y): """ Generate the classes based on y, and store in self.classes

:param y: array of class targets """ self.classes = np.unique(y) def generate_priors(self, y): """ Compute the prior probabilities and store self.priors

:param y: array of class targets """ ## Insert your code BEGIN # self.priors = ... ## Insert your code END

def knn_density_function(self, x_train, x_predict): """ Implements k-nearest neighbor density estimate (Alpaydin Eq 8.8)

:param x_train 1d numpy array :param x_predict 1d numpy array :returns probabilities at x_prdict, shape = x_predict.shape """ # Find the distance to kth nearest neighbor result = [] for x0 in x_predict: dist = np.abs(x_train - x0) index = np.argsort(dist) result.append(dist[index[self.k - 1]]) dist_k = np.array(result) # Find the probability at x using knn density # Note: Equation 8.8 may return probabilites greater than 1. # For probabilities greater than 1, set it equal to 1. ## Insert your code BEGIN # Return ... ## Insert your code END # Gaussian part def generate_avgs(self, X, y): """ Return mean for each class and for each attribute """ ## Insert your code BEGIN ## Insert your code END def generate_vars(self, X, y): """ Return variance for each class and for each attribute """ ## Insert your code BEGIN ## Insert your code END ## Insert your code BEGIN # Place any method you need here # def ...

## Insert your code END

def generate_guassian_likelihoods(self, X): ## Insert your code BEGIN

## Insert your code END

def generate_knn_likelihoods(self, X): likelihoods = np.ones([len(self.classes), X.shape[0] ]) for i, aclass in enumerate(self.classes): index = self.y_train == aclass for attr in range(X.shape[1]): ## Insert your code BEGIN

## Insert your code END return likelihood def fit(self, X, y): # define the classes with ascending order self.generate_classes(y) # compute the Priori probability self.generate_priors(y) # different likelihood function if self.likelihood == 'normal': # calculate the avg and var based on X and y self.avgs = self.generate_avgs(X, y) self.vars = self.generate_vars(X, y) elif self.likelihood == 'knn': self.X_train = X self.y_train = y else: raise ValueError('Invalid value for likelihood. Must be "normal" or "knn".') return self

def generate_likelihoods(self, X): """ :param ndarray x :returns probabilities at X (like X.shape[0] * Number of classes -> {Poss for each class} ) """ # Gussian if self.likelihood == "normal": self.likelihoods = self.generate_guassian_likelihoods(X) elif self.likelihood == "knn": self.likelihoods = self.generate_knn_likelihoods(X) else: raise ValueError('Invalid value for likelihood Must be "normal" or "knn".') return self.likelihoods

def predict(self, X): """ :param ndarray x :returns prediction """ self.likelihoods = self.generate_likelihoods(X) ## Insert your code BEGIN # self.posteriors = ...

## Insert your code END return prediction

def score(self, X, y, sample_weight=None): return accuracy_score(self.predict(X), y, sample_weight=sample_weight)

from functools import partial import numpy as np from sklearn.naive_bayes import GaussianNB from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score from scipy.stats import norm [ ]

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!