import pandas as pd
import numpy as np
iris=pd.read_csv('Iris.csv')
iris.head()
iris['Species'].unique()
iris_setosa=iris[iris['Species']=='Iris-setosa']
iris_versicolor=iris[iris['Species']=='Iris-versicolor']
iris_virginica=iris[iris['Species']=='Iris-virginica']
iris_versicolor.head()
Me calculo los $ \#C_k /N$:
N_setosa=len(iris_setosa)/len(iris)
N_versicolor=len(iris_versicolor)/len(iris)
N_virginica=len(iris_virginica)/len(iris)
N_setosa, N_versicolor, N_virginica
iris_setosa.describe()
Me defino la función gauss(x,mu,sigma)
que da
$$
\mathcal{N}(x|\mu,\sigma)=\frac{1}{\sqrt{2\pi\sigma}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}
$$
def gauss(x,mu,sigma):
return np.exp(-(x-mu)**2/(2*sigma**2))/(np.sqrt(2*np.pi*sigma))
Mi nueva instancia $x$ será simplemente la primera fila del dataset
x = iris.iloc[0]
x
iris_setosa['SepalLengthCm'].var()
Me calculo lo que quiero maximizar: $$ \# C_k / N_k \cdot \prod_i \mathcal{N}(x_i|\mu_k^i,\sigma_k^i) $$
iris.columns[1:5]
P_setosa=N_setosa
for i in iris.columns[1:5]:
P_setosa=P_setosa*gauss(x[i],iris_setosa[i].mean(),iris_setosa[i].var())
P_setosa
P_virginica=N_virginica
for i in iris.columns[1:5]:
P_virginica=P_virginica*gauss(x[i],iris_virginica[i].mean(),iris_virginica[i].var())
P_virginica
P_versicolor=N_versicolor
for i in iris.columns[1:5]:
P_versicolor=P_versicolor*gauss(x[i],iris_versicolor[i].mean(),iris_versicolor[i].var())
P_versicolor
Predigo que es de tipo Iris-setosa
Automatizar todo esto.
Hagámoslo ahora automáticamente con sklearn
X=iris[iris.columns[1:5]]
X.head()
y=iris['Species']
Separamos en train y test
from sklearn.model_selection import train_test_split
train_X,val_X,train_y,val_y = train_test_split(X,y,random_state=1)
from sklearn.naive_bayes import GaussianNB
# Definimos
gnb = GaussianNB()
# Ajsutamos
gnb.fit(train_X,train_y)
# Predecimos
y_pred = gnb.predict(val_X)
print('Número de puntos mal asignados de un total de %d puntos: %d' % (len(val_X),(val_y!=y_pred).sum()))
val_y
y_pred
(val_y != y_pred)