A la main :¶
In [41]:
import pandas as pa
dic = {'S': ['M', 'M', 'M', 'M', 'F', 'F', 'F', 'F'],
'H': [1.82, 1.80, 1.70, 1.80, 1.52, 1.65, 1.68, 1.75],
'W': [82, 86, 77, 75, 45, 68, 59, 68],
'F': [30, 28, 30, 25, 15, 20, 18, 23]}
data = pa.DataFrame(data=dic)
In [42]:
print(data)
S H W F 0 M 1.82 82 30 1 M 1.80 86 28 2 M 1.70 77 30 3 M 1.80 75 25 4 F 1.52 45 15 5 F 1.65 68 20 6 F 1.68 59 18 7 F 1.75 68 23
In [43]:
data = data.sample(frac=1)
print(data)
S H W F 2 M 1.70 77 30 0 M 1.82 82 30 5 F 1.65 68 20 7 F 1.75 68 23 1 M 1.80 86 28 4 F 1.52 45 15 3 M 1.80 75 25 6 F 1.68 59 18
In [44]:
X = data[['H', 'W', 'F']]
y = data['S']
In [45]:
#entrainement : il s'agit essentiellement d'inférer les valeurs des m et s de chaque variable
import numpy as np
means = []
sigmas = []
for c in X.columns:
means.append([np.mean(X[c][y=='M']), np.mean(X[c][y=='F'])])
sigmas.append([np.sqrt(np.var(X[c][y=='M'])), np.sqrt(np.var(X[c][y=='F']))])
print('means: ', means)
print('sigmas: ', sigmas)
#propbas a priori:
probas = [len(y[y=='M'])/len(y), len(y[y=='F'])/len(y)]
print(probas)
means: [[1.78, 1.65], [80.0, 60.0], [28.25, 19.0]] sigmas: [[0.04690415759823434, 0.08336666000266532], [4.301162633521313, 9.40744386111339], [2.0463381929681126, 2.9154759474226504]] [0.5, 0.5]
In [46]:
import scipy.stats as st
def predict(item):
p_m = 1
p_f = 1
for i in range(len(means)):
p_m *= st.norm.pdf(item[i], means[i][0], sigmas[i][0])
p_f *= st.norm.pdf(item[i], means[i][1], sigmas[i][1])
if probas[0] * p_m > probas[1] * p_f :
return 'M'
return 'F'
print(predict([1.81, 59, 21]))
F
Avec sklearn:¶
In [31]:
from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(X, y)
Out[31]:
GaussianNB(priors=None, var_smoothing=1e-09)
In [35]:
print(nb.predict([[1.81, 59, 21]])[0])
F
In [ ]: